@agents24/chat-react 0.5.4 → 0.5.5

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../scaffold/src/index.tsx","../../scaffold/src/app.tsx","../../scaffold/src/components/chat/chat-shell.tsx","../../scaffold/src/components/chat/chat-composer.tsx","../../scaffold/src/components/ui/button.tsx","../../scaffold/src/lib/utils.ts","../../scaffold/src/components/ui/select.tsx","../../scaffold/src/components/theme-provider.tsx","../../scaffold/src/components/ui/textarea.tsx","../../scaffold/src/components/ui/tooltip.tsx","../../scaffold/src/components/chat/chat-message.tsx","../../scaffold/src/components/chat/message-parts.tsx","../../scaffold/src/components/chat/collapsible-user-message.tsx","../../scaffold/src/components/chat/external-link-dialog.tsx","../../scaffold/src/components/ui/dialog.tsx","../../scaffold/src/components/ui/bubble.tsx","../../scaffold/src/components/ui/message.tsx","../../scaffold/src/components/chat/theme-menu.tsx","../../scaffold/src/components/chat/thread-sidebar.tsx","../../scaffold/src/components/chat/identity-control.tsx","../../scaffold/src/components/ui/dropdown-menu.tsx","../../scaffold/src/components/ui/sidebar.tsx","../../scaffold/src/hooks/use-mobile.ts","../../scaffold/src/components/ui/input.tsx","../../scaffold/src/components/ui/separator.tsx","../../scaffold/src/components/ui/sheet.tsx","../../scaffold/src/components/ui/skeleton.tsx","../../scaffold/src/components/chat/turn-outline.tsx","../../scaffold/src/components/ui/message-scroller.tsx","../../scaffold/src/components/chat/timeline-loading.ts","../../scaffold/src/identity.ts"],"sourcesContent":["import * as React from \"react\"\n\nimport { App, type Agents24ChatAppProps } from \"./app\"\nimport {\n ThemeProvider,\n type Agents24ChatAppearanceController,\n type Agents24ChatTheme,\n} from \"./components/theme-provider\"\nimport { TooltipProvider } from \"./components/ui/tooltip\"\n\nexport type Agents24ChatScaffoldProps = Agents24ChatAppProps & {\n appearanceController?: Agents24ChatAppearanceController\n theme?: Agents24ChatTheme\n}\n\nexport function Agents24ChatScaffold({ appearanceController, theme, ...props }: Agents24ChatScaffoldProps) {\n return (\n <ThemeProvider controller={appearanceController} theme={theme}>\n <TooltipProvider>\n <App {...props} />\n </TooltipProvider>\n </ThemeProvider>\n )\n}\n\nexport { App as Agents24ChatScaffoldApp }\nexport { ThemeProvider as Agents24ChatThemeProvider }\nexport type {\n Agents24ChatAppearance,\n Agents24ChatAppearanceController,\n Agents24ChatTheme,\n} from \"./components/theme-provider\"\nexport type { Agents24ChatIdentity, Agents24ChatIdentityState } from \"./identity\"\nexport type {\n ChatHitlResponse,\n Agents24ChatScaffoldComponents,\n Agents24ChatTimelineSlotProps,\n} from \"./app\"\nexport { TooltipProvider as Agents24ChatTooltipProvider }\n","import type { AgentClient, HitlResponse } from \"@agents24/client\"\nimport {\n type AgentChatActiveThreadChangeHandler,\n type AgentChatMcpAuthorizationCompletion,\n type AgentChatRuntimeAgent,\n useAgentChatRuntime,\n} from \"@agents24/chat-react/runtime\"\nimport type { HitlActionState } from \"@agents24/chat-react/ui\"\nimport {\n Agents24Provider,\n type ChatHitlPart,\n type ChatMessage,\n type ChatPart,\n} from \"@agents24/react\"\nimport * as React from \"react\"\n\nimport { ChatShell } from \"./components/chat/chat-shell\"\nimport { GUEST_CHAT_IDENTITY, type Agents24ChatIdentity } from \"./identity\"\n\nconst createBrowserAbortController = () => new AbortController()\n\nexport type Agents24ChatAppProps = {\n activeThreadId?: string | null\n agent?: AgentChatRuntimeAgent\n client: AgentClient\n completeMcpAuthorization?: AgentChatMcpAuthorizationCompletion\n mcpRedirectUri?: string\n modelId?: string | null\n onActiveThreadIdChange?: AgentChatActiveThreadChangeHandler\n onModelChange?: (modelId: string) => void\n identity?: Agents24ChatIdentity\n components?: Agents24ChatScaffoldComponents\n}\n\nexport type Agents24ChatScaffoldComponents = {\n Timeline?: React.ComponentType<Agents24ChatTimelineSlotProps>\n}\n\nexport type ChatHitlResponse = HitlResponse\n\nexport type Agents24ChatTimelineSlotProps = {\n message: ChatMessage\n parts: readonly ChatPart[]\n isLoading: boolean\n getHitlActionState: (part: ChatHitlPart) => HitlActionState | undefined\n onHitlAction: (part: ChatHitlPart, response: ChatHitlResponse) => void\n}\n\nfunction RuntimeChat({\n components,\n identity = GUEST_CHAT_IDENTITY,\n ...props\n}: Agents24ChatAppProps) {\n const runtime = useAgentChatRuntime({\n ...props,\n mcpRedirectUri: props.mcpRedirectUri || (\n typeof window === \"undefined\" ? undefined : window.location.href\n ),\n })\n\n return <ChatShell components={components} identity={identity} runtime={runtime} />\n}\n\nexport function App(props: Agents24ChatAppProps) {\n const identity = props.identity || GUEST_CHAT_IDENTITY\n return (\n <Agents24Provider client={props.client} createAbortController={createBrowserAbortController}>\n <RuntimeChat key={identity.state} {...props} />\n </Agents24Provider>\n )\n}\n","import {\n agentChatRuntimeErrorMessage,\n type AgentChatRuntime,\n} from \"@agents24/chat-react/runtime\"\nimport type { Agents24ChatScaffoldComponents } from \"../../app\"\nimport { CircleAlert, LoaderCircle, SquarePen, X } from \"lucide-react\"\nimport * as React from \"react\"\nimport type { Agents24ChatIdentity } from \"../../identity\"\n\nimport { ChatComposer } from \"./chat-composer\"\nimport { ChatMessage } from \"./chat-message\"\nimport { ThemeMenu } from \"./theme-menu\"\nimport { ThreadSidebar } from \"./thread-sidebar\"\nimport { TurnOutline } from \"./turn-outline\"\nimport { isScaffoldTimelineLoading } from \"./timeline-loading\"\nimport { Button } from \"../ui/button\"\nimport {\n MessageScroller,\n MessageScrollerButton,\n MessageScrollerContent,\n MessageScrollerItem,\n MessageScrollerProvider,\n MessageScrollerViewport,\n} from \"../ui/message-scroller\"\nimport { SidebarInset, SidebarProvider, SidebarTrigger, useSidebar } from \"../ui/sidebar\"\n\nconst LOADING_INPUT_CONTRACT = {\n version: \"agents24.runtime-inputs.v2\" as const,\n modalities: {\n text: { enabled: false, required: false },\n files: { enabled: false, required: false, allowed_mime_types: [] },\n images: { enabled: false, required: false, allowed_mime_types: [] },\n audio: { enabled: false, required: false, allowed_mime_types: [], recording_enabled: false },\n },\n limits: { max_attachments_per_turn: 0, max_file_bytes: 0, max_total_bytes: 0 },\n retention: { mode: \"thread_lifetime\" as const },\n}\n\nfunction PersistentSidebarTrigger() {\n return (\n <div className=\"pointer-events-none fixed start-3 top-0 z-[60] flex h-12 items-center\">\n <SidebarTrigger className=\"pointer-events-auto [&_svg]:size-[18px]\" />\n </div>\n )\n}\n\nfunction CollapsedHeaderActions({ onNew }: { onNew: () => void }) {\n const { isMobile, openMobile, state } = useSidebar()\n const sidebarVisible = isMobile ? openMobile : state === \"expanded\"\n if (sidebarVisible) return null\n return (\n <>\n <div className=\"h-8 w-17 shrink-0\" aria-hidden=\"true\" />\n <div className=\"pointer-events-none fixed start-12 top-0 z-[60] flex h-12 items-center\">\n <Button className=\"pointer-events-auto\" variant=\"ghost\" size=\"icon-sm\" aria-label=\"New chat\" onClick={onNew}>\n <SquarePen />\n </Button>\n </div>\n </>\n )\n}\n\nfunction OperationErrorNotice({ runtime }: { runtime: AgentChatRuntime }) {\n const error = runtime.operationError || runtime.backgroundError\n if (!error) return null\n return (\n <div className=\"pointer-events-none absolute inset-x-0 top-3 z-40 flex justify-center px-4\">\n <div className=\"pointer-events-auto flex max-w-lg items-start gap-2 rounded-lg border border-destructive/20 bg-background px-3 py-2 text-sm shadow-md\" role=\"alert\">\n <CircleAlert className=\"mt-0.5 size-4 shrink-0 text-destructive\" />\n <span className=\"min-w-0 flex-1 wrap-break-word\">\n {agentChatRuntimeErrorMessage(error) || \"The chat could not complete that action.\"}\n </span>\n <Button\n aria-label=\"Dismiss error\"\n onClick={runtime.operationError ? runtime.clearOperationError : runtime.controller.clearBackgroundError}\n size=\"icon-xs\"\n variant=\"ghost\"\n >\n <X />\n </Button>\n </div>\n </div>\n )\n}\n\nexport function ChatShell({\n components,\n identity,\n runtime,\n}: {\n components?: Agents24ChatScaffoldComponents\n identity: Agents24ChatIdentity\n runtime: AgentChatRuntime\n}) {\n const { controller } = runtime\n const isRunning =\n controller.runState === \"streaming\"\n || controller.runState === \"reconnecting\"\n || controller.runState === \"paused\"\n || controller.runState === \"cancelling\"\n || runtime.isSubmitting\n const isCancelling = controller.runState === \"cancelling\"\n const activeTitle = controller.threads.find((thread) => thread.id === controller.activeThreadId)?.title\n const hasBlockingError = Boolean(runtime.fatalError && controller.messages.length === 0)\n const isEmptyState = controller.activeThreadId === null && controller.messages.length === 0 && !hasBlockingError\n\n return (\n <SidebarProvider\n className=\"h-svh min-h-0 overflow-hidden\"\n data-agents24-chat=\"\"\n data-agents24-chat-layout=\"\"\n >\n <PersistentSidebarTrigger />\n <ThreadSidebar\n activeThreadId={controller.activeThreadId}\n hasMore={controller.hasMoreThreads}\n identity={identity}\n isLoading={controller.isLoadingThreads}\n isLoadingMore={controller.isLoadingMoreThreads}\n threads={controller.threads}\n onDelete={runtime.deleteThread}\n onLoadMore={controller.loadMoreThreads}\n onNew={runtime.newThread}\n onOpen={runtime.openThread}\n />\n <SidebarInset className=\"h-svh min-h-0 overflow-hidden bg-background\">\n <header\n className=\"flex h-12 shrink-0 items-center gap-2 border-b border-border/30 px-3 sm:px-4\"\n data-agents24-chat-header=\"\"\n >\n <CollapsedHeaderActions onNew={runtime.newThread} />\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"truncate text-sm font-medium\">{String(activeTitle || \"New chat\")}</h1>\n </div>\n <ThemeMenu />\n </header>\n\n <section\n aria-label=\"Conversation\"\n className=\"relative flex min-h-0 flex-1 flex-col overflow-hidden\"\n data-agents24-chat-transcript=\"\"\n >\n <OperationErrorNotice runtime={runtime} />\n {isEmptyState ? (\n <div className=\"absolute inset-0 flex min-h-0 flex-col justify-center pb-20\">\n <div className=\"mx-auto mb-8 w-full max-w-3xl px-4 text-center sm:px-6\">\n <h2 className=\"text-3xl font-semibold tracking-tight sm:text-4xl\">Ready when you are.</h2>\n </div>\n <ChatComposer\n inputContract={runtime.inputContract || LOADING_INPUT_CONTRACT}\n contextWindow={runtime.contextWindow}\n disabled={runtime.isBootstrapping}\n forceExpanded\n isCancelling={isCancelling}\n isRunning={isRunning}\n onStop={() => { void controller.cancelRun().catch(() => undefined) }}\n modelId={runtime.modelId}\n models={runtime.models}\n onModelChange={runtime.changeModel}\n onSubmit={(text, files) => runtime.submit({\n text,\n files: files.map((file) => ({\n data: file,\n mediaType: file.type || \"application/octet-stream\",\n name: file.name,\n })),\n })}\n />\n </div>\n ) : (\n <>\n <MessageScrollerProvider\n autoScroll\n defaultScrollPosition=\"last-anchor\"\n scrollPreviousItemPeek={64}\n >\n <MessageScroller className=\"relative min-h-0 flex-1\">\n <MessageScrollerViewport preserveScrollOnPrepend>\n <MessageScrollerContent\n className=\"mx-auto w-full max-w-3xl gap-7 px-4 pt-8 pb-16 sm:px-6 sm:pt-12\"\n >\n {controller.hasOlderTurns && (\n <Button className=\"self-center\" variant=\"ghost\" size=\"sm\" disabled={controller.isLoadingOlder} onClick={() => { void controller.loadOlder().catch(() => undefined) }}>\n {controller.isLoadingOlder && <LoaderCircle className=\"animate-spin\" />} Load earlier messages\n </Button>\n )}\n {runtime.isBootstrapping && (\n <div aria-label=\"Loading conversation\" className=\"flex flex-1 items-center justify-center py-24 text-muted-foreground\" role=\"status\">\n <LoaderCircle className=\"size-4 animate-spin\" />\n </div>\n )}\n {hasBlockingError && (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-3 py-24 text-center\">\n <CircleAlert className=\"size-5 text-destructive\" />\n <div><h2 className=\"font-medium\">Couldn’t connect</h2><p className=\"mt-1 max-w-md text-sm text-muted-foreground\">{runtime.errorMessage}</p></div>\n <Button variant=\"outline\" onClick={() => void runtime.retryBootstrap()}>Try again</Button>\n </div>\n )}\n {controller.messages.map((message) => (\n <MessageScrollerItem\n key={message.id}\n messageId={message.id}\n scrollAnchor={message.role === \"user\"}\n className=\"overflow-visible [content-visibility:visible]\"\n >\n <ChatMessage\n allowFeedback={runtime.allowFeedback}\n getHitlActionState={runtime.getHitlActionState}\n isLoading={isScaffoldTimelineLoading({\n activeRunId: controller.activeRunId,\n message,\n runState: controller.runState,\n streamingMessageId: controller.streamingMessageId,\n })}\n message={message}\n onHitlAction={runtime.onHitlAction}\n onRegenerate={() => controller.regenerate(message)}\n onSetFeedback={(input) => controller.setFeedback(message, input)}\n Timeline={components?.Timeline}\n />\n </MessageScrollerItem>\n ))}\n </MessageScrollerContent>\n </MessageScrollerViewport>\n <TurnOutline messages={controller.messages} />\n <MessageScrollerButton />\n </MessageScroller>\n </MessageScrollerProvider>\n <div className=\"relative z-30 shrink-0 bg-background pt-3\">\n <ChatComposer\n inputContract={runtime.inputContract || LOADING_INPUT_CONTRACT}\n contextWindow={runtime.contextWindow}\n disabled={runtime.isBootstrapping || hasBlockingError}\n isCancelling={isCancelling}\n isRunning={isRunning}\n onStop={() => { void controller.cancelRun().catch(() => undefined) }}\n modelId={runtime.modelId}\n models={runtime.models}\n onModelChange={runtime.changeModel}\n onSubmit={(text, files) => runtime.submit({\n text,\n files: files.map((file) => ({\n data: file,\n mediaType: file.type || \"application/octet-stream\",\n name: file.name,\n })),\n })}\n utilityRow=\"below\"\n />\n </div>\n </>\n )}\n </section>\n </SidebarInset>\n </SidebarProvider>\n )\n}\n","import { ArrowUp, LoaderCircle, Mic, Square, X } from \"lucide-react\"\nimport * as React from \"react\"\nimport { AgentChatContextStatus, useAudioRecorder } from \"@agents24/chat-react/ui\"\nimport { canonicalInputMimeType, inputMimeTypes, validateAgentChatSubmission, type AgentChatInputContract } from \"@agents24/chat-react/runtime\"\nimport type { ContextWindow } from \"@agents24/client/protocol\"\n\nimport { Button } from \"../ui/button\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../ui/select\"\nimport { Textarea } from \"../ui/textarea\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\"\nimport { cn } from \"../../lib/utils\"\n\ntype ChatComposerProps = {\n inputContract: AgentChatInputContract\n disabled?: boolean\n contextWindow?: ContextWindow | null\n forceExpanded?: boolean\n isCancelling?: boolean\n isRunning: boolean\n modelId: string | null\n models: Array<{ id: string; label: string }>\n onModelChange: (modelId: string) => void\n onStop: () => void\n onSubmit: (text: string, files: File[]) => Promise<void>\n utilityRow?: \"inline\" | \"below\"\n}\n\nexport function ChatComposer({\n inputContract,\n disabled,\n contextWindow,\n forceExpanded = false,\n isCancelling = false,\n isRunning,\n modelId,\n models,\n onModelChange,\n onStop,\n onSubmit,\n utilityRow = \"inline\",\n}: ChatComposerProps) {\n const [text, setText] = React.useState(\"\")\n const [files, setFiles] = React.useState<File[]>([])\n const [attachmentError, setAttachmentError] = React.useState<string | null>(null)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const textareaRef = React.useRef<HTMLTextAreaElement>(null)\n const submittingRef = React.useRef(false)\n const draftRevisionRef = React.useRef(0)\n const attachmentMimeTypes = inputMimeTypes(inputContract)\n const allowAttachments = attachmentMimeTypes.length > 0\n const recordingAllowed = inputContract.modalities.audio.recording_enabled\n const addRecording = React.useCallback((file: File) => {\n draftRevisionRef.current += 1\n setFiles((current) => [...current, file])\n }, [])\n const recorder = useAudioRecorder(addRecording)\n const isExpanded = forceExpanded || text.includes(\"\\n\") || text.length > 62\n const validationError = validateAgentChatSubmission(\n inputContract,\n text,\n files.map((file) => ({ data: file, mediaType: file.type })),\n )\n\n const modelSelector = models.length > 0 ? (\n <div className=\"w-fit max-w-40\">\n <Select\n disabled={disabled || isRunning}\n onValueChange={onModelChange}\n value={modelId || undefined}\n >\n <SelectTrigger aria-label=\"Runtime model\">\n <SelectValue placeholder=\"Model\" />\n </SelectTrigger>\n <SelectContent align=\"start\">\n {models.map((model) => <SelectItem key={model.id} value={model.id}>{model.label}</SelectItem>)}\n </SelectContent>\n </Select>\n </div>\n ) : null\n const hasContextWindow = Number.isFinite(Number(contextWindow?.max_tokens)) && Number(contextWindow?.max_tokens) > 0\n const showUtilityRow = utilityRow === \"below\"\n\n const submit = async () => {\n if (disabled || isRunning || submittingRef.current || validationError) return\n const value = text\n const selectedFiles = files\n const clearedRevision = draftRevisionRef.current + 1\n draftRevisionRef.current = clearedRevision\n submittingRef.current = true\n setText(\"\")\n setFiles([])\n textareaRef.current?.focus()\n try {\n await onSubmit(value, selectedFiles)\n } catch {\n if (draftRevisionRef.current === clearedRevision) {\n draftRevisionRef.current += 1\n setText(value)\n setFiles(selectedFiles)\n }\n } finally {\n submittingRef.current = false\n }\n }\n\n return (\n <div\n className=\"mx-auto w-full max-w-3xl px-4 pb-[max(1rem,env(safe-area-inset-bottom))] sm:px-6\"\n data-agents24-chat-composer=\"\"\n >\n {allowAttachments && files.length > 0 && (\n <div className=\"mb-2 flex min-w-0 gap-2 overflow-x-auto\">\n {files.map((file, index) => (\n <div key={`${file.name}-${index}`} className=\"flex max-w-48 items-center gap-2 border bg-card px-2 py-1 text-xs\">\n <span className=\"truncate\">{file.name}</span>\n <Button variant=\"ghost\" size=\"icon-xs\" aria-label={`Remove ${file.name}`} onClick={() => {\n draftRevisionRef.current += 1\n setFiles((current) => current.filter((_, itemIndex) => itemIndex !== index))\n }}>\n <X />\n </Button>\n </div>\n ))}\n </div>\n )}\n {attachmentError || recorder.error ? <p className=\"mb-2 text-xs text-destructive\" role=\"alert\">{attachmentError || recorder.error}</p> : null}\n <div\n data-expanded={isExpanded || undefined}\n className={cn(\n \"agents24-composer-grid grid min-w-0 items-center gap-2 rounded-xl border bg-background shadow-sm\",\n isExpanded ? \"p-2\" : \"p-1.5\",\n )}\n >\n {allowAttachments ? (\n <>\n <input\n ref={inputRef}\n className=\"sr-only\"\n type=\"file\"\n multiple\n accept={attachmentMimeTypes.join(\",\")}\n onChange={(event) => {\n const selected = Array.from(event.target.files ?? [])\n const accepted = selected.filter((file) => (\n attachmentMimeTypes.includes(canonicalInputMimeType(file.type))\n ))\n draftRevisionRef.current += 1\n setFiles((current) => [...current, ...accepted])\n setAttachmentError(\n accepted.length === selected.length\n ? null\n : \"One or more selected file types are not supported by this Agent.\",\n )\n event.currentTarget.value = \"\"\n }}\n />\n <div className=\"agents24-composer-attach flex min-w-0 items-center\">\n <Button className=\"bg-muted/50 text-muted-foreground hover:bg-muted hover:text-foreground\" variant=\"ghost\" size=\"icon\" aria-label=\"Attach files\" disabled={disabled || isRunning} onClick={() => inputRef.current?.click()}>\n <span aria-hidden>+</span>\n </Button>\n </div>\n </>\n ) : <span aria-hidden=\"true\" className=\"agents24-composer-attach\" />}\n <Textarea\n ref={textareaRef}\n value={text}\n rows={1}\n placeholder=\"Message the agent\"\n aria-label=\"Message\"\n disabled={disabled}\n className={cn(\n \"agents24-composer-textarea max-h-56 min-h-9 field-sizing-content resize-none overflow-y-auto border-0 bg-transparent px-2 shadow-none focus-visible:ring-0 dark:bg-transparent\",\n isExpanded ? \"py-2\" : \"h-9 py-2\",\n )}\n onChange={(event) => {\n draftRevisionRef.current += 1\n setText(event.target.value)\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey && !event.nativeEvent.isComposing) {\n event.preventDefault()\n void submit()\n }\n }}\n />\n <div className=\"agents24-composer-actions flex items-center gap-1\">\n {utilityRow === \"inline\" ? <AgentChatContextStatus contextWindow={contextWindow} /> : null}\n {utilityRow === \"inline\" ? modelSelector : null}\n {recordingAllowed ? (\n <Button\n variant={recorder.isRecording ? \"default\" : \"ghost\"}\n size=\"icon\"\n aria-label={recorder.isRecording ? \"Stop recording\" : \"Record audio\"}\n disabled={disabled || isRunning}\n onClick={() => { if (recorder.isRecording) recorder.stop(); else void recorder.start() }}\n >\n {recorder.isRecording ? <Square className=\"fill-current\" /> : <Mic />}\n </Button>\n ) : null}\n {isRunning ? (\n <Button\n size=\"icon\"\n aria-label={isCancelling ? \"Cancelling response\" : \"Stop response\"}\n disabled={disabled || isCancelling}\n onClick={onStop}\n >\n {isCancelling\n ? <LoaderCircle className=\"animate-spin\" />\n : <Square className=\"fill-current\" />}\n </Button>\n ) : (\n validationError ? (\n <Tooltip tabIndex={0}>\n <TooltipTrigger asChild>\n <Button size=\"icon\" aria-label=\"Send message\" disabled onClick={() => void submit()}><ArrowUp /></Button>\n </TooltipTrigger>\n <TooltipContent>{validationError}</TooltipContent>\n </Tooltip>\n ) : (\n <Button size=\"icon\" aria-label=\"Send message\" disabled={disabled} onClick={() => void submit()}><ArrowUp /></Button>\n )\n )}\n </div>\n </div>\n {showUtilityRow ? (\n <div\n aria-hidden={!modelSelector && !hasContextWindow ? \"true\" : undefined}\n className=\"mt-2 flex min-h-8 items-center justify-between gap-2 px-1\"\n data-agents24-chat-composer-utility=\"\"\n >\n <div className=\"min-w-0\">{modelSelector}</div>\n <AgentChatContextStatus contextWindow={contextWindow} />\n </div>\n ) : null}\n </div>\n )\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-4xl border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/30 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:bg-transparent dark:hover:bg-input/30\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-9 gap-1.5 px-3 has-data-[icon=inline-end]:pr-2.5 has-data-[icon=inline-start]:pl-2.5\",\n xs: \"h-6 gap-1 px-2.5 text-xs has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 px-3 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n lg: \"h-10 gap-1.5 px-4 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3\",\n icon: \"size-9\",\n \"icon-xs\": \"size-6 [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { CheckIcon, ChevronDownIcon } from \"lucide-react\"\nimport * as React from \"react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { useThemePortalContainer } from \"../theme-provider\"\n\nfunction Select(props: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectValue(props: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n children,\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger>) {\n return (\n <SelectPrimitive.Trigger\n className={cn(\n \"flex h-8 w-full items-center justify-between gap-2 rounded-lg bg-transparent px-2.5 text-xs text-foreground outline-none transition-colors hover:bg-muted/50 focus-visible:bg-muted/50 disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-muted-foreground [&>span]:min-w-0 [&>span]:truncate\",\n className,\n )}\n data-slot=\"select-trigger\"\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-3.5 shrink-0 text-muted-foreground\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n align = \"start\",\n children,\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n const container = useThemePortalContainer()\n\n return (\n <SelectPrimitive.Portal container={container || undefined}>\n <SelectPrimitive.Content\n align={align}\n className={cn(\n \"z-50 max-h-64 min-w-[var(--radix-select-trigger-width)] overflow-hidden rounded-xl border border-border/50 bg-popover p-1 text-popover-foreground shadow-md data-[side=bottom]:animate-in data-[side=bottom]:fade-in-0 data-[side=bottom]:slide-in-from-top-1 data-[side=top]:animate-in data-[side=top]:fade-in-0 data-[side=top]:slide-in-from-bottom-1\",\n className,\n )}\n data-slot=\"select-content\"\n position=\"popper\"\n sideOffset={sideOffset}\n {...props}\n >\n <SelectPrimitive.Viewport className=\"max-h-60 overflow-y-auto p-0.5\">\n {children}\n </SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectItem({\n children,\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-lg py-1.5 pr-8 pl-2 text-sm outline-none data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n data-slot=\"select-item\"\n {...props}\n >\n <SelectPrimitive.ItemText className=\"min-w-0 truncate\">{children}</SelectPrimitive.ItemText>\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-3.5\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n </SelectPrimitive.Item>\n )\n}\n\nexport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue }\n","import * as React from \"react\"\n\nexport type Agents24ChatAppearance = \"system\" | \"light\" | \"dark\"\nexport type Agents24ChatTheme = \"soft\" | \"sharp\"\n\nexport type Agents24ChatAppearanceController = {\n appearance: Agents24ChatAppearance\n setAppearance: (appearance: Agents24ChatAppearance) => void\n}\n\ntype ThemeContextValue = {\n appearance: Agents24ChatAppearance\n portalContainer: HTMLElement | null\n setAppearance: (appearance: Agents24ChatAppearance) => void\n}\n\nconst ThemeContext = React.createContext<ThemeContextValue | null>(null)\nconst storageKey = \"agents24-chat-appearance\"\n\nfunction storedAppearance(): Agents24ChatAppearance {\n try {\n const stored = window.localStorage.getItem(storageKey)\n return stored === \"light\" || stored === \"dark\" || stored === \"system\" ? stored : \"system\"\n } catch {\n return \"system\"\n }\n}\n\nexport function ThemeProvider({\n children,\n controller,\n theme = \"soft\",\n}: {\n children: React.ReactNode\n controller?: Agents24ChatAppearanceController\n theme?: Agents24ChatTheme\n}) {\n const [internalAppearance, setInternalAppearance] = React.useState<Agents24ChatAppearance>(\"system\")\n const [resolvedAppearance, setResolvedAppearance] = React.useState<\"light\" | \"dark\">(\"light\")\n const [mounted, setMounted] = React.useState(false)\n const [portalContainer, setPortalContainer] = React.useState<HTMLDivElement | null>(null)\n const appearance = controller?.appearance ?? internalAppearance\n\n React.useEffect(() => {\n if (!controller) setInternalAppearance(storedAppearance())\n setMounted(true)\n }, [controller])\n\n React.useEffect(() => {\n if (!mounted || typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\")\n const apply = () => setResolvedAppearance(\n appearance === \"system\" ? media.matches ? \"dark\" : \"light\" : appearance,\n )\n apply()\n media.addEventListener(\"change\", apply)\n return () => media.removeEventListener(\"change\", apply)\n }, [appearance, mounted])\n\n const change = React.useCallback((next: Agents24ChatAppearance) => {\n if (controller) {\n controller.setAppearance(next)\n return\n }\n try { window.localStorage.setItem(storageKey, next) } catch { /* storage is optional */ }\n setInternalAppearance(next)\n }, [controller])\n\n return (\n <ThemeContext.Provider value={{ appearance, portalContainer, setAppearance: change }}>\n <div\n ref={setPortalContainer}\n className={`${resolvedAppearance} size-full`}\n data-agents24-theme={theme}\n data-agents24-theme-root=\"\"\n >\n {children}\n </div>\n </ThemeContext.Provider>\n )\n}\n\nexport function useTheme() {\n const context = React.useContext(ThemeContext)\n if (!context) throw new Error(\"useTheme must be used inside ThemeProvider\")\n return context\n}\n\nexport function useThemePortalContainer() {\n return useTheme().portalContainer\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full resize-none rounded-2xl border border-transparent bg-input/50 px-3 py-3 text-base transition-[color,box-shadow,background-color] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/30 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","import * as React from \"react\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({ children }: { children: React.ReactNode }) {\n return children\n}\n\nfunction Tooltip({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"tooltip\"\n className={cn(\"group/tooltip relative inline-flex\", className)}\n {...props}\n />\n )\n}\n\nfunction TooltipTrigger({\n asChild: _asChild,\n ...props\n}: React.ComponentProps<typeof Slot.Root> & { asChild?: boolean }) {\n return <Slot.Root data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n align: _align,\n side = \"top\",\n sideOffset: _sideOffset,\n ...props\n}: React.ComponentProps<\"span\"> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n sideOffset?: number\n align?: \"start\" | \"center\" | \"end\"\n}) {\n return (\n <span\n role=\"tooltip\"\n data-side={side}\n data-slot=\"tooltip-content\"\n className={cn(\n \"pointer-events-none absolute z-50 hidden w-max max-w-xs items-center gap-1.5 rounded-xl bg-foreground px-3 py-1.5 text-xs text-background group-hover/tooltip:inline-flex group-focus-within/tooltip:inline-flex\",\n \"data-[side=top]:bottom-full data-[side=top]:left-1/2 data-[side=top]:mb-2 data-[side=top]:-translate-x-1/2\",\n \"data-[side=bottom]:top-full data-[side=bottom]:left-1/2 data-[side=bottom]:mt-2 data-[side=bottom]:-translate-x-1/2\",\n \"data-[side=left]:end-full data-[side=left]:top-1/2 data-[side=left]:me-2 data-[side=left]:-translate-y-1/2\",\n \"data-[side=right]:start-full data-[side=right]:top-1/2 data-[side=right]:ms-2 data-[side=right]:-translate-y-1/2\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","import type { ChatHitlPart, ChatMessage as ChatMessageModel } from \"@agents24/react\"\nimport type { FeedbackReason, HitlResponse } from \"@agents24/client\"\nimport type { AgentChatRuntimeHitlActionState } from \"@agents24/chat-react/runtime\"\nimport { AgentChatDefaultActions, ChatAttachment, ChatAttachments } from \"@agents24/chat-react/ui\"\nimport * as React from \"react\"\n\nimport { MessageParts } from \"./message-parts\"\nimport { Bubble, BubbleContent } from \"../ui/bubble\"\nimport { Message, MessageContent, MessageFooter } from \"../ui/message\"\nimport type { Agents24ChatTimelineSlotProps } from \"../../app\"\n\ntype Props = {\n message: ChatMessageModel\n getHitlActionState: (part: ChatHitlPart) => AgentChatRuntimeHitlActionState | undefined\n isLoading: boolean\n onHitlAction: (part: ChatHitlPart, response: HitlResponse) => Promise<void>\n onRegenerate: () => Promise<void>\n allowFeedback: boolean\n onSetFeedback: (\n input: { rating: \"like\" | \"dislike\" | null; reason?: FeedbackReason | null; comment?: string | null },\n ) => Promise<void>\n Timeline?: React.ComponentType<Agents24ChatTimelineSlotProps>\n}\n\nexport function ChatMessage({\n allowFeedback,\n getHitlActionState,\n isLoading,\n message,\n onHitlAction,\n onRegenerate,\n onSetFeedback,\n Timeline,\n}: Props) {\n const isUser = message.role === \"user\"\n return (\n <Message align={isUser ? \"end\" : \"start\"}>\n <MessageContent>\n {isUser && message.attachments?.length ? (\n <ChatAttachments className=\"mb-2 justify-end\">\n {message.attachments.map((attachment, index) => (\n <ChatAttachment\n data={attachment}\n key={String(attachment.id || attachment.url || attachment.filename || index)}\n />\n ))}\n </ChatAttachments>\n ) : null}\n <Bubble variant={isUser ? \"secondary\" : \"ghost\"} align={isUser ? \"end\" : \"start\"} className={isUser ? \"max-w-[min(75%,42rem)]\" : \"max-w-full overflow-visible\"}>\n <BubbleContent className={isUser ? \"px-4 py-2.5\" : \"w-full overflow-visible\"}>\n <MessageParts\n getHitlActionState={getHitlActionState}\n isLoading={isLoading}\n message={message}\n onHitlAction={onHitlAction}\n Timeline={Timeline}\n />\n </BubbleContent>\n </Bubble>\n {!isUser && message.isFinal !== false && (\n <MessageFooter className=\"gap-1 opacity-70 transition-opacity group-hover/message:opacity-100\">\n <AgentChatDefaultActions\n handlers={{\n feedback: message.feedback,\n onCopy: (content) => { void navigator.clipboard.writeText(content).catch(() => undefined) },\n onRetry: () => onRegenerate(),\n onSetFeedback: allowFeedback ? (_message, input) => onSetFeedback(input) : undefined,\n }}\n message={message}\n />\n </MessageFooter>\n )}\n </MessageContent>\n </Message>\n )\n}\n","import type { ChatHitlPart, ChatMessage } from \"@agents24/react\"\nimport type { HitlResponse } from \"@agents24/client\"\nimport {\n AgentChatPart,\n AgentResponseTimeline,\n} from \"@agents24/chat-react/ui\"\nimport type { AgentChatRuntimeHitlActionState } from \"@agents24/chat-react/runtime\"\nimport * as React from \"react\"\nimport type { LinkSafetyConfig } from \"streamdown\"\n\nimport { CollapsibleUserMessage } from \"./collapsible-user-message\"\nimport { ExternalLinkDialog } from \"./external-link-dialog\"\nimport type { Agents24ChatTimelineSlotProps } from \"../../app\"\n\nconst linkSafety = {\n enabled: true,\n renderModal: (props) => <ExternalLinkDialog {...props} />,\n} satisfies LinkSafetyConfig\n\nfunction ScaffoldTimeline(props: Agents24ChatTimelineSlotProps) {\n return (\n <AgentResponseTimeline\n {...props}\n responseProps={{\n className: \"text-[15px] leading-7\",\n linkSafety,\n }}\n />\n )\n}\n\nexport function MessageParts({\n message,\n getHitlActionState,\n isLoading,\n onHitlAction,\n Timeline = ScaffoldTimeline,\n}: {\n message: ChatMessage\n getHitlActionState: (part: ChatHitlPart) => AgentChatRuntimeHitlActionState | undefined\n isLoading: boolean\n onHitlAction: (part: ChatHitlPart, response: HitlResponse) => Promise<void>\n Timeline?: React.ComponentType<Agents24ChatTimelineSlotProps>\n}) {\n if (message.role === \"assistant\") {\n return (\n <Timeline\n getHitlActionState={getHitlActionState}\n isLoading={isLoading}\n message={message}\n onHitlAction={(part, response) => {\n void onHitlAction(part, response).catch(() => undefined)\n }}\n parts={message.parts}\n />\n )\n }\n\n const text = message.parts\n .filter((part) => part.kind === \"text\")\n .map((part) => part.kind === \"text\" ? part.text : \"\")\n .join(\"\") || message.content\n const supportingParts = message.parts.filter((part) => (\n part.kind !== \"text\" && part.kind !== \"data\"\n ))\n\n return (\n <>\n {supportingParts.map((part) => (\n <AgentChatPart\n getHitlActionState={getHitlActionState}\n key={part.id}\n message={message}\n onHitlAction={(hitlPart, response) => {\n void onHitlAction(hitlPart, response).catch(() => undefined)\n }}\n part={part}\n />\n ))}\n {text ? <CollapsibleUserMessage content={text} /> : null}\n </>\n )\n}\n","import { ChevronDown, ChevronUp } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { Button } from \"../ui/button\"\n\nconst collapseThreshold = 360\nexport function CollapsibleUserMessage({ content }: { content: string }) {\n const [expanded, setExpanded] = React.useState(false)\n const contentId = React.useId()\n const collapsible = content.length > collapseThreshold\n const Icon = expanded ? ChevronUp : ChevronDown\n\n return (\n <div className=\"flex min-w-0 flex-col gap-2\">\n <div\n id={contentId}\n className={`max-w-none min-w-0 text-[15px] leading-7 whitespace-pre-wrap wrap-break-word ${collapsible && !expanded ? \"agents24-user-message-collapsed\" : \"\"}`}\n >\n {content}\n </div>\n {collapsible && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n aria-controls={contentId}\n aria-expanded={expanded}\n className=\"h-auto w-fit px-0 py-0 text-muted-foreground hover:bg-transparent hover:text-foreground\"\n onClick={() => setExpanded((value) => !value)}\n >\n {expanded ? \"Show less\" : \"Show more\"}\n <Icon />\n </Button>\n )}\n </div>\n )\n}\n","import type { LinkSafetyModalProps } from \"streamdown\"\nimport * as React from \"react\"\n\nimport { Button } from \"../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\"\n\nexport function ExternalLinkDialog({ isOpen, onClose, onConfirm, url }: LinkSafetyModalProps) {\n const [copied, setCopied] = React.useState(false)\n\n React.useEffect(() => {\n if (!isOpen) setCopied(false)\n }, [isOpen])\n\n const copyUrl = async () => {\n await navigator.clipboard.writeText(url)\n setCopied(true)\n }\n\n const openUrl = () => {\n onConfirm()\n onClose()\n }\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => { if (!open) onClose() }}>\n <DialogContent className=\"max-h-[calc(100dvh-2rem)] min-w-0 overflow-hidden sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Open external link?</DialogTitle>\n <DialogDescription>You’re about to visit an external website.</DialogDescription>\n </DialogHeader>\n <div className=\"max-h-32 overflow-auto rounded-md bg-muted p-3 font-mono text-xs wrap-break-word\">\n {url}\n </div>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => void copyUrl()}>{copied ? \"Copied\" : \"Copy link\"}</Button>\n <Button onClick={openUrl}>Open link</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as DialogPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { XIcon } from \"lucide-react\"\nimport { useThemePortalContainer } from \"../theme-provider\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n container,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n const themeContainer = useThemePortalContainer()\n return <DialogPrimitive.Portal container={container || themeContainer || undefined} data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 isolate z-50 bg-black/30 duration-100 supports-backdrop-filter:backdrop-blur-sm data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-6 rounded-4xl bg-popover p-6 text-sm text-popover-foreground shadow-xl ring-1 ring-foreground/5 duration-100 outline-none sm:max-w-md dark:ring-foreground/10 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close data-slot=\"dialog-close\" asChild>\n <Button\n variant=\"ghost\"\n className=\"absolute top-4 right-4 bg-secondary\"\n size=\"icon-sm\"\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </Button>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-1.5\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogPrimitive.Close>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\n \"font-heading text-base leading-none font-medium\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\n \"text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction BubbleGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"bubble-group\"\n className={cn(\"flex min-w-0 flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nconst bubbleVariants = cva(\n \"group/bubble relative flex w-fit max-w-[80%] min-w-0 flex-col gap-1 group-data-[align=end]/message:self-end data-[align=end]:self-end data-[variant=ghost]:max-w-full\",\n {\n variants: {\n variant: {\n default:\n \"*:data-[slot=bubble-content]:bg-primary *:data-[slot=bubble-content]:text-primary-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-primary/80\",\n secondary:\n \"*:data-[slot=bubble-content]:bg-secondary *:data-[slot=bubble-content]:text-secondary-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)]\",\n muted:\n \"*:data-[slot=bubble-content]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--muted),var(--foreground)_5%)]\",\n tinted:\n \"*:data-[slot=bubble-content]:bg-[oklch(from_var(--primary)_0.93_calc(c*0.4)_h)] *:data-[slot=bubble-content]:text-foreground dark:*:data-[slot=bubble-content]:bg-[oklch(from_var(--primary)_0.3_calc(c*0.4)_h)] [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[oklch(from_var(--primary)_0.88_calc(c*0.5)_h)] dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-[oklch(from_var(--primary)_0.35_calc(c*0.5)_h)]\",\n outline:\n \"*:data-[slot=bubble-content]:border-border *:data-[slot=bubble-content]:bg-background [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-input/30\",\n ghost:\n \"border-none *:data-[slot=bubble-content]:rounded-none *:data-[slot=bubble-content]:bg-transparent *:data-[slot=bubble-content]:p-0 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted/50\",\n destructive:\n \"*:data-[slot=bubble-content]:bg-destructive/10 *:data-[slot=bubble-content]:text-destructive dark:*:data-[slot=bubble-content]:bg-destructive/20 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/20 dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/30\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Bubble({\n variant = \"default\",\n align = \"start\",\n className,\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof bubbleVariants> & {\n align?: \"start\" | \"end\"\n }) {\n return (\n <div\n data-slot=\"bubble\"\n data-variant={variant}\n data-align={align}\n className={cn(bubbleVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction BubbleContent({\n asChild = false,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n asChild?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n data-slot=\"bubble-content\"\n className={cn(\n \"w-fit max-w-full min-w-0 overflow-hidden rounded-3xl border border-transparent px-3.5 py-2.5 text-sm leading-relaxed wrap-break-word group-data-[align=end]/bubble:self-end [button]:text-left [button,a]:transition-colors [button,a]:outline-none [button,a]:focus-visible:border-ring [button,a]:focus-visible:ring-3 [button,a]:focus-visible:ring-ring/30\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst bubbleReactionsVariants = cva(\n \"absolute z-10 flex w-fit shrink-0 items-center justify-center gap-1 rounded-full bg-muted px-1.5 py-0.5 text-sm ring-3 ring-card has-[button]:p-0\",\n {\n variants: {\n side: {\n top: \"top-0 -translate-y-3/4\",\n bottom: \"bottom-0 translate-y-3/4\",\n },\n align: {\n start: \"left-3\",\n end: \"right-3\",\n },\n },\n defaultVariants: {\n side: \"bottom\",\n align: \"end\",\n },\n }\n)\n\nfunction BubbleReactions({\n side = \"bottom\",\n align = \"end\",\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n align?: \"start\" | \"end\"\n side?: \"top\" | \"bottom\"\n}) {\n return (\n <div\n data-slot=\"bubble-reactions\"\n data-align={align}\n data-side={side}\n className={cn(bubbleReactionsVariants({ side, align }), className)}\n {...props}\n />\n )\n}\n\nexport { BubbleGroup, Bubble, BubbleContent, BubbleReactions }\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/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.5 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.5 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 { Laptop, Moon, Sun } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { useTheme } from \"../theme-provider\"\nimport { Button } from \"../ui/button\"\n\nconst options = [\n { value: \"system\" as const, label: \"System\", icon: Laptop },\n { value: \"light\" as const, label: \"Light\", icon: Sun },\n { value: \"dark\" as const, label: \"Dark\", icon: Moon },\n]\n\nexport function ThemeMenu() {\n const { appearance, setAppearance } = useTheme()\n const [open, setOpen] = React.useState(false)\n const rootRef = React.useRef<HTMLDivElement>(null)\n const firstItemRef = React.useRef<HTMLButtonElement>(null)\n const menuId = React.useId()\n const ActiveIcon = options.find((item) => item.value === appearance)?.icon ?? Laptop\n\n React.useEffect(() => {\n if (!open) return\n firstItemRef.current?.focus()\n const closeOnOutsidePointer = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false)\n }\n const closeOnEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setOpen(false)\n }\n document.addEventListener(\"pointerdown\", closeOnOutsidePointer)\n document.addEventListener(\"keydown\", closeOnEscape)\n return () => {\n document.removeEventListener(\"pointerdown\", closeOnOutsidePointer)\n document.removeEventListener(\"keydown\", closeOnEscape)\n }\n }, [open])\n\n const label = appearance === \"system\" ? \"System\" : appearance === \"light\" ? \"Light\" : \"Dark\"\n return (\n <div ref={rootRef} className=\"relative\">\n <Button\n aria-controls={menuId}\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-label={`Appearance: ${label}`}\n onClick={() => setOpen((value) => !value)}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n <ActiveIcon />\n </Button>\n {open ? (\n <div\n id={menuId}\n className=\"absolute end-0 top-full z-50 mt-1 flex min-w-44 flex-col rounded-xl border bg-popover p-1 text-popover-foreground shadow-md\"\n role=\"menu\"\n >\n {options.map(({ value, label: optionLabel, icon: Icon }, index) => (\n <Button\n key={value}\n ref={index === 0 ? firstItemRef : undefined}\n aria-current={appearance === value ? \"true\" : undefined}\n className=\"w-full justify-start\"\n onClick={() => {\n setAppearance(value)\n setOpen(false)\n }}\n role=\"menuitem\"\n size=\"sm\"\n variant=\"ghost\"\n >\n <Icon /> {optionLabel}\n </Button>\n ))}\n </div>\n ) : null}\n </div>\n )\n}\n","import { getThreadActivity, type StoredChatThread } from \"@agents24/react\"\nimport { LoaderCircle, SquarePen, Trash2 } from \"lucide-react\"\nimport type { Agents24ChatIdentity } from \"../../identity\"\nimport { IdentityControl } from \"./identity-control\"\n\nimport { Button } from \"../ui/button\"\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarRail,\n useSidebar,\n} from \"../ui/sidebar\"\n\ntype Props = {\n activeThreadId: string | null\n hasMore: boolean\n isLoading: boolean\n isLoadingMore: boolean\n onDelete: (threadId: string) => Promise<void>\n onLoadMore: () => Promise<void>\n onNew: () => void\n onOpen: (threadId: string) => Promise<void>\n threads: StoredChatThread[]\n identity: Agents24ChatIdentity\n}\n\nfunction ThreadStatus({ thread }: { thread: StoredChatThread }) {\n const activity = getThreadActivity(thread)\n if (!activity.isSpinning) return null\n const label = activity.status === \"cancelling\"\n ? \"Cancelling\"\n : activity.status === \"queued\"\n ? \"Queued\"\n : \"Running\"\n return (\n <span\n className=\"pointer-events-none absolute end-1 top-1/2 hidden size-5 -translate-y-1/2 items-center justify-center text-muted-foreground transition-opacity group-hover/menu-item:opacity-0 md:flex\"\n role=\"status\"\n aria-label={label}\n title={label}\n >\n <LoaderCircle className=\"size-3.5 animate-spin\" />\n </span>\n )\n}\n\nexport function ThreadSidebar({ activeThreadId, hasMore, identity, isLoading, isLoadingMore, onDelete, onLoadMore, onNew, onOpen, threads }: Props) {\n const { setOpenMobile } = useSidebar()\n return (\n <Sidebar\n aria-label=\"Conversations\"\n collapsible=\"offcanvas\"\n data-agents24-chat-sidebar=\"\"\n role=\"navigation\"\n >\n <SidebarHeader className=\"gap-1 p-2\">\n <div className=\"h-8 shrink-0\" aria-hidden=\"true\" />\n <Button className=\"w-full justify-start\" variant=\"ghost\" onClick={() => { onNew(); setOpenMobile(false) }}><SquarePen /> New chat</Button>\n </SidebarHeader>\n <SidebarContent>\n <SidebarGroup>\n <SidebarGroupContent>\n <SidebarMenu>\n {threads.map((thread) => (\n <SidebarMenuItem key={thread.id}>\n <SidebarMenuButton\n className=\"pr-8 pl-3\"\n isActive={thread.id === activeThreadId}\n title={String(thread.title || \"New conversation\")}\n onClick={() => { void onOpen(thread.id).catch(() => undefined); setOpenMobile(false) }}\n >\n <span className=\"min-w-0 truncate\">{String(thread.title || \"New conversation\")}</span>\n </SidebarMenuButton>\n <ThreadStatus thread={thread} />\n <SidebarMenuAction\n showOnHover\n className=\"group-focus-within/menu-item:opacity-0 group-hover/menu-item:opacity-100\"\n aria-label={`Delete ${String(thread.title || \"conversation\")}`}\n onClick={(event) => { event.stopPropagation(); if (window.confirm(\"Delete this conversation?\")) void onDelete(thread.id).catch(() => undefined) }}\n >\n <Trash2 />\n </SidebarMenuAction>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n {!isLoading && threads.length === 0 && <p className=\"px-2 py-8 text-center text-xs text-muted-foreground\">No conversations</p>}\n {hasMore && (\n <Button\n className=\"mt-2 w-full\"\n disabled={isLoadingMore}\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => void onLoadMore().catch(() => undefined)}\n >\n {isLoadingMore && <LoaderCircle className=\"animate-spin\" />}\n Load more\n </Button>\n )}\n </SidebarGroupContent>\n </SidebarGroup>\n </SidebarContent>\n <SidebarFooter className=\"w-full min-w-0 p-2\"><IdentityControl identity={identity} /></SidebarFooter>\n <SidebarRail />\n </Sidebar>\n )\n}\n","import { LogIn, LogOut, UserRound } from \"lucide-react\"\n\nimport type { Agents24ChatIdentity } from \"../../identity\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\nimport { SidebarMenu, SidebarMenuButton, SidebarMenuItem } from \"../ui/sidebar\"\n\nfunction identityLabel(identity: Agents24ChatIdentity): string {\n if (identity.displayName) return identity.displayName\n if (identity.state === \"authenticated\") return \"Signed in\"\n if (identity.state === \"loading\") return \"Loading identity\"\n if (identity.state === \"error\") return \"Identity unavailable\"\n if (identity.state === \"signed_out\") return \"Sign in\"\n return \"Guest\"\n}\n\nfunction IdentityAvatar({ identity }: { identity: Agents24ChatIdentity }) {\n const label = identityLabel(identity)\n if (identity.avatarUrl) {\n return <img alt=\"\" className=\"size-6 rounded-full object-cover\" src={identity.avatarUrl} />\n }\n return (\n <span className=\"flex size-6 items-center justify-center rounded-full bg-sidebar-accent text-[10px] font-semibold\" aria-hidden=\"true\">\n {identity.displayName ? identity.displayName.slice(0, 1).toUpperCase() : <UserRound className=\"size-3.5\" />}\n </span>\n )\n}\n\nexport function IdentityControl({ identity }: { identity: Agents24ChatIdentity }) {\n const label = identityLabel(identity)\n const canSignOut = identity.state === \"authenticated\" && Boolean(identity.onSignOut)\n const canSignIn = (identity.state === \"guest\" || identity.state === \"signed_out\" || identity.state === \"error\") && Boolean(identity.onSignIn)\n return (\n <SidebarMenu className=\"w-full min-w-0\">\n <SidebarMenuItem className=\"w-full min-w-0\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton\n size=\"lg\"\n aria-label={`Account: ${label}`}\n className=\"w-full min-w-0 justify-start\"\n >\n <IdentityAvatar identity={identity} />\n <span className=\"min-w-0 flex-1 overflow-hidden text-start\">\n <span className=\"block truncate text-sm font-medium\">{label}</span>\n {identity.secondaryText ? <span className=\"block truncate text-xs text-muted-foreground\">{identity.secondaryText}</span> : null}\n </span>\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" side=\"top\" sideOffset={8}>\n <DropdownMenuLabel>\n <span className=\"block truncate\">{label}</span>\n {identity.secondaryText ? <span className=\"mt-0.5 block truncate text-xs font-normal text-muted-foreground\">{identity.secondaryText}</span> : null}\n </DropdownMenuLabel>\n {(canSignIn || canSignOut) ? <DropdownMenuSeparator /> : null}\n {canSignIn ? <DropdownMenuItem onSelect={() => identity.onSignIn?.()}><LogIn />Sign in</DropdownMenuItem> : null}\n {canSignOut ? <DropdownMenuItem onSelect={() => identity.onSignOut?.()}><LogOut />Sign out</DropdownMenuItem> : null}\n </DropdownMenuContent>\n </DropdownMenu>\n </SidebarMenuItem>\n </SidebarMenu>\n )\n}\n","import * as React from \"react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { CheckIcon, ChevronRightIcon } from \"lucide-react\"\nimport { useThemePortalContainer } from \"../theme-provider\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n container,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n const themeContainer = useThemePortalContainer()\n return (\n <DropdownMenuPrimitive.Portal container={container || themeContainer || undefined} data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n const themeContainer = useThemePortalContainer()\n return (\n <DropdownMenuPrimitive.Portal container={themeContainer || undefined}>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n align={align}\n className={cn(\"z-50 max-h-(--radix-dropdown-menu-content-available-height) w-(--radix-dropdown-menu-trigger-width) min-w-48 origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-3xl bg-popover p-1.5 text-popover-foreground shadow-lg ring-1 ring-foreground/5 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:overflow-hidden dark:ring-foreground/10 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/dropdown-menu-item relative flex cursor-default items-center gap-2.5 rounded-2xl px-3 py-2 text-sm font-medium outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-9.5 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-2.5 rounded-2xl py-2 pr-8 pl-3 text-sm font-medium outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-9.5 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon\n />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-2.5 rounded-2xl py-2 pr-8 pl-3 text-sm font-medium outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-9.5 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-radio-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon\n />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-3 py-2.5 text-xs text-muted-foreground data-inset:pl-9.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1.5 my-1.5 h-px bg-border/50\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-2 rounded-2xl px-3 py-2 text-sm font-medium outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-9.5 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\"z-50 min-w-36 origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-3xl bg-popover p-1.5 text-popover-foreground shadow-lg ring-1 ring-foreground/5 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:ring-foreground/10 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { useIsMobile } from \"../../hooks/use-mobile\"\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Separator } from \"./separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"./sheet\"\nimport { Skeleton } from \"./skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"./tooltip\"\nimport { PanelLeftIcon } from \"lucide-react\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <div\n data-slot=\"sidebar-wrapper\"\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full [--sidebar-width:16rem] [--sidebar-width-icon:3rem] has-data-[variant=inset]:bg-sidebar\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n dir,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n dir={dir}\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [--sidebar-width:18rem] [&>button]:hidden\"\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer hidden text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n data-side={side}\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-2xl group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-2xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"h-8 w-full bg-input/50 shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\n \"flex flex-col gap-2 p-2 [--radius:var(--radius-xl)]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"no-scrollbar flex min-h-0 flex-1 flex-col gap-2 overflow-auto [--radius:var(--radius-xl)] group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-xl px-3 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-xl p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-0.5\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-xl px-3 py-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]\",\n },\n size: {\n default: \"h-9 text-sm\",\n sm: \"h-8 text-xs\",\n lg: \"h-14 px-3 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : \"button\"\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-xl p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-2 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-xl px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-xl px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-xl\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-[70%] flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5 group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-xl px-3 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n if (typeof window.matchMedia !== \"function\") {\n onChange()\n window.addEventListener(\"resize\", onChange)\n return () => window.removeEventListener(\"resize\", onChange)\n }\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n mql.addEventListener(\"change\", onChange)\n onChange()\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-9 w-full min-w-0 rounded-3xl border border-transparent bg-input/50 px-3 py-1 text-base transition-[color,box-shadow,background-color] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/30 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Separator as SeparatorPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { XIcon } from \"lucide-react\"\nimport { useThemePortalContainer } from \"../theme-provider\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n container,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n const themeContainer = useThemePortalContainer()\n return <SheetPrimitive.Portal container={container || themeContainer || undefined} data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/30 duration-100 supports-backdrop-filter:backdrop-blur-sm data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n \"fixed z-50 flex flex-col bg-popover bg-clip-padding text-sm text-popover-foreground shadow-xl transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=right]:data-closed:slide-out-to-right-10 data-[side=top]:data-closed:slide-out-to-top-10\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close data-slot=\"sheet-close\" asChild>\n <Button\n variant=\"ghost\"\n className=\"absolute top-4 right-4 bg-secondary\"\n size=\"icon-sm\"\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </Button>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-6\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-6\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\n \"font-heading text-base font-medium text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import { cn } from \"../../lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"animate-pulse rounded-2xl bg-muted\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n","import type { ChatMessage } from \"@agents24/react\"\nimport { useState } from \"react\"\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\"\nimport { useMessageScroller, useMessageScrollerVisibility } from \"../ui/message-scroller\"\nimport { cn } from \"../../lib/utils\"\n\ntype Turn = { id: string; label: string; messageIds: string[]; response: string }\n\nfunction turnsFromMessages(messages: ChatMessage[]): Turn[] {\n return messages.reduce<Turn[]>((turns, message) => {\n if (message.role === \"user\") {\n turns.push({ id: message.id, label: message.content.trim() || `Turn ${turns.length + 1}`, messageIds: [message.id], response: \"\" })\n } else if (turns.length) {\n const turn = turns[turns.length - 1]\n turn.messageIds.push(message.id)\n if (!turn.response) turn.response = message.content.trim()\n }\n return turns\n }, [])\n}\n\nexport function TurnOutline({ messages }: { messages: ChatMessage[] }) {\n const turns = turnsFromMessages(messages)\n const { scrollToMessage } = useMessageScroller()\n const { currentAnchorId, visibleMessageIds } = useMessageScrollerVisibility()\n const visible = new Set(visibleMessageIds)\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n const focusIndex = hoveredIndex ?? -1\n if (turns.length < 2) return null\n\n return (\n <nav aria-label=\"Transcript outline\" className=\"pointer-events-none absolute end-2 top-1/2 z-20 hidden max-h-72 w-14 -translate-y-1/2 md:block xl:end-5\">\n <div className=\"pointer-events-auto flex flex-col items-end gap-0.5 py-2\">\n {turns.map((turn, index) => {\n const active = turn.messageIds.some((id) => visible.has(id) || currentAnchorId === id)\n const distance = focusIndex >= 0 ? Math.abs(index - focusIndex) : Number.POSITIVE_INFINITY\n const barWidth = focusIndex < 0\n ? 12\n : distance === 0 ? 50 : distance === 1 ? 36 : distance === 2 ? 23 : 10\n const barOpacity = focusIndex < 0\n ? active ? 1 : 0.4\n : distance === 0 ? 1 : distance === 1 ? 0.78 : distance === 2 ? 0.58 : 0.36\n return (\n <Tooltip key={turn.id}>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={`Jump to ${turn.label}`}\n className=\"group relative flex h-2 w-14 items-center justify-end outline-none after:pointer-events-auto after:absolute after:-inset-y-0.5 after:inset-x-0 after:content-['']\"\n onBlur={() => setHoveredIndex(null)}\n onFocus={() => setHoveredIndex(index)}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n onClick={() => scrollToMessage(turn.id, { align: \"start\", behavior: \"smooth\" })}\n >\n <span\n className={cn(\"h-0.5 rounded-full bg-muted-foreground/40 transition-[width,background-color,opacity] duration-150 ease-out group-hover:bg-foreground group-focus-visible:bg-foreground\", active && \"bg-foreground\")}\n style={{ opacity: barOpacity, width: barWidth }}\n />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"left\" className=\"w-64 flex-col items-stretch gap-0 overflow-hidden p-3\">\n <p className=\"line-clamp-2 max-w-full wrap-break-word text-sm font-medium\">{turn.label}</p>\n {turn.response && <p className=\"mt-1 line-clamp-2 max-w-full wrap-break-word text-xs opacity-70\">{turn.response}</p>}\n </TooltipContent>\n </Tooltip>\n )\n })}\n </div>\n </nav>\n )\n}\n","import * as React from \"react\"\nimport {\n MessageScroller as MessageScrollerPrimitive,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n} from \"@shadcn/react/message-scroller\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { ArrowDownIcon } from \"lucide-react\"\n\nfunction MessageScrollerProvider(\n props: React.ComponentProps<typeof MessageScrollerPrimitive.Provider>\n) {\n return <MessageScrollerPrimitive.Provider {...props} />\n}\n\nfunction MessageScroller({\n className,\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Root>) {\n return (\n <MessageScrollerPrimitive.Root\n data-slot=\"message-scroller\"\n className={cn(\n \"group/message-scroller relative flex size-full min-h-0 flex-col overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageScrollerViewport({\n className,\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Viewport>) {\n return (\n <MessageScrollerPrimitive.Viewport\n data-slot=\"message-scroller-viewport\"\n className={cn(\n \"size-full min-h-0 min-w-0 scroll-fade-b overflow-y-auto overscroll-contain contain-content [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageScrollerContent({\n className,\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Content>) {\n return (\n <MessageScrollerPrimitive.Content\n data-slot=\"message-scroller-content\"\n className={cn(\"flex h-max min-h-full flex-col gap-8\", className)}\n {...props}\n />\n )\n}\n\nfunction MessageScrollerItem({\n className,\n scrollAnchor = false,\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Item>) {\n return (\n <MessageScrollerPrimitive.Item\n data-slot=\"message-scroller-item\"\n scrollAnchor={scrollAnchor}\n className={cn(\n \"min-w-0 shrink-0 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageScrollerButton({\n direction = \"end\",\n className,\n children,\n render,\n variant = \"secondary\",\n size = \"icon-sm\",\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Button> &\n Pick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">) {\n return (\n <MessageScrollerPrimitive.Button\n data-slot=\"message-scroller-button\"\n data-direction={direction}\n data-variant={variant}\n data-size={size}\n direction={direction}\n className={cn(\n \"absolute inset-s-1/2 -translate-x-1/2 border-border bg-background text-foreground transition-[translate,scale,opacity] duration-200 hover:bg-muted hover:text-foreground data-[active=false]:pointer-events-none data-[active=false]:scale-95 data-[active=false]:opacity-0 data-[active=false]:duration-400 data-[active=false]:ease-[cubic-bezier(0.7,0,0.84,0)] data-[active=true]:translate-y-0 data-[active=true]:scale-100 data-[active=true]:opacity-100 data-[active=true]:ease-[cubic-bezier(0.23,1,0.32,1)] data-[direction=end]:bottom-4 data-[direction=end]:data-[active=false]:translate-y-full data-[direction=start]:top-4 data-[direction=start]:data-[active=false]:-translate-y-full rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180\",\n className\n )}\n render={render ?? <Button variant={variant} size={size} />}\n {...props}\n >\n {children ?? (\n <>\n <ArrowDownIcon\n />\n <span className=\"sr-only\">\n {direction === \"end\" ? \"Scroll to end\" : \"Scroll to start\"}\n </span>\n </>\n )}\n </MessageScrollerPrimitive.Button>\n )\n}\n\nexport {\n MessageScrollerProvider,\n MessageScroller,\n MessageScrollerViewport,\n MessageScrollerContent,\n MessageScrollerItem,\n MessageScrollerButton,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n}\n","import type { AgentChatRunState, ChatMessage } from \"@agents24/react\"\n\nexport function isScaffoldTimelineLoading({\n activeRunId,\n message,\n runState,\n streamingMessageId,\n}: {\n activeRunId: string | null\n message: ChatMessage\n runState: AgentChatRunState\n streamingMessageId: string | null\n}): boolean {\n if (runState !== \"streaming\" && runState !== \"reconnecting\") return false\n return message.id === streamingMessageId\n || Boolean(message.runId && message.runId === activeRunId)\n}\n","export type Agents24ChatIdentityState =\n | \"loading\"\n | \"guest\"\n | \"authenticated\"\n | \"signed_out\"\n | \"error\"\n\nexport type Agents24ChatIdentity = {\n state: Agents24ChatIdentityState\n displayName?: string\n secondaryText?: string\n avatarUrl?: string\n onSignIn?: () => void | Promise<void>\n onSignOut?: () => void | Promise<void>\n}\n\nexport const GUEST_CHAT_IDENTITY: Agents24ChatIdentity = { state: \"guest\" }\n"],"mappings":"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","names":["import_runtime","import_react","import_runtime","import_lucide_react","import_lucide_react","React","import_radix_ui","import_jsx_runtime","import_jsx_runtime","SelectPrimitive","import_jsx_runtime","import_radix_ui","import_jsx_runtime","import_jsx_runtime","import_ui","import_ui","import_lucide_react","React","import_jsx_runtime","React","import_radix_ui","import_lucide_react","import_jsx_runtime","DialogPrimitive","DialogPrimitive","DialogPrimitive","import_jsx_runtime","import_jsx_runtime","import_class_variance_authority","import_radix_ui","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_lucide_react","React","import_jsx_runtime","import_lucide_react","import_lucide_react","import_radix_ui","import_lucide_react","import_jsx_runtime","DropdownMenuPrimitive","DropdownMenuPrimitive","DropdownMenuPrimitive","DropdownMenuPrimitive","React","import_class_variance_authority","import_radix_ui","React","import_jsx_runtime","import_radix_ui","import_jsx_runtime","import_radix_ui","import_lucide_react","import_jsx_runtime","SheetPrimitive","SheetPrimitive","SheetPrimitive","import_jsx_runtime","import_lucide_react","import_jsx_runtime","open","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","MessageScrollerPrimitive","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../../scaffold/src/index.tsx","../../scaffold/src/app.tsx","../../scaffold/src/components/chat/chat-shell.tsx","../../scaffold/src/components/chat/chat-composer.tsx","../../scaffold/src/components/ui/button.tsx","../../scaffold/src/lib/utils.ts","../../scaffold/src/components/ui/dropdown-menu.tsx","../../scaffold/src/components/theme-provider.tsx","../../scaffold/src/components/ui/select.tsx","../../scaffold/src/components/ui/textarea.tsx","../../scaffold/src/components/ui/tooltip.tsx","../../scaffold/src/components/chat/chat-message.tsx","../../scaffold/src/components/chat/message-parts.tsx","../../scaffold/src/components/chat/collapsible-user-message.tsx","../../scaffold/src/components/chat/external-link-dialog.tsx","../../scaffold/src/components/ui/dialog.tsx","../../scaffold/src/components/ui/bubble.tsx","../../scaffold/src/components/ui/message.tsx","../../scaffold/src/components/chat/theme-menu.tsx","../../scaffold/src/components/chat/thread-sidebar.tsx","../../scaffold/src/components/chat/identity-control.tsx","../../scaffold/src/components/ui/sidebar.tsx","../../scaffold/src/hooks/use-mobile.ts","../../scaffold/src/components/ui/input.tsx","../../scaffold/src/components/ui/separator.tsx","../../scaffold/src/components/ui/sheet.tsx","../../scaffold/src/components/ui/skeleton.tsx","../../scaffold/src/components/chat/turn-outline.tsx","../../scaffold/src/components/ui/message-scroller.tsx","../../scaffold/src/components/chat/timeline-loading.ts","../../scaffold/src/identity.ts"],"sourcesContent":["import * as React from \"react\"\n\nimport { App, type Agents24ChatAppProps } from \"./app\"\nimport {\n ThemeProvider,\n type Agents24ChatAppearanceController,\n type Agents24ChatTheme,\n} from \"./components/theme-provider\"\nimport { TooltipProvider } from \"./components/ui/tooltip\"\n\nexport type Agents24ChatScaffoldProps = Agents24ChatAppProps & {\n appearanceController?: Agents24ChatAppearanceController\n theme?: Agents24ChatTheme\n}\n\nexport function Agents24ChatScaffold({ appearanceController, theme, ...props }: Agents24ChatScaffoldProps) {\n return (\n <ThemeProvider controller={appearanceController} theme={theme}>\n <TooltipProvider>\n <App {...props} />\n </TooltipProvider>\n </ThemeProvider>\n )\n}\n\nexport { App as Agents24ChatScaffoldApp }\nexport { ThemeProvider as Agents24ChatThemeProvider }\nexport type {\n Agents24ChatAppearance,\n Agents24ChatAppearanceController,\n Agents24ChatTheme,\n} from \"./components/theme-provider\"\nexport type { Agents24ChatIdentity, Agents24ChatIdentityState } from \"./identity\"\nexport type {\n ChatHitlResponse,\n Agents24ChatScaffoldComponents,\n Agents24ChatTimelineSlotProps,\n} from \"./app\"\nexport { TooltipProvider as Agents24ChatTooltipProvider }\n","import type { AgentClient, HitlResponse } from \"@agents24/client\"\nimport {\n type AgentChatActiveThreadChangeHandler,\n type AgentChatMcpAuthorizationCompletion,\n type AgentChatRuntimeAgent,\n useAgentChatRuntime,\n} from \"@agents24/chat-react/runtime\"\nimport type { HitlActionState } from \"@agents24/chat-react/ui\"\nimport {\n Agents24Provider,\n type ChatHitlPart,\n type ChatMessage,\n type ChatPart,\n} from \"@agents24/react\"\nimport * as React from \"react\"\n\nimport { ChatShell } from \"./components/chat/chat-shell\"\nimport { GUEST_CHAT_IDENTITY, type Agents24ChatIdentity } from \"./identity\"\n\nconst createBrowserAbortController = () => new AbortController()\n\nexport type Agents24ChatAppProps = {\n activeThreadId?: string | null\n agent?: AgentChatRuntimeAgent\n client: AgentClient\n completeMcpAuthorization?: AgentChatMcpAuthorizationCompletion\n mcpRedirectUri?: string\n modelId?: string | null\n onActiveThreadIdChange?: AgentChatActiveThreadChangeHandler\n onModelChange?: (modelId: string) => void\n identity?: Agents24ChatIdentity\n components?: Agents24ChatScaffoldComponents\n sidebar?: React.ReactNode\n}\n\nexport type Agents24ChatScaffoldComponents = {\n Timeline?: React.ComponentType<Agents24ChatTimelineSlotProps>\n}\n\nexport type ChatHitlResponse = HitlResponse\n\nexport type Agents24ChatTimelineSlotProps = {\n message: ChatMessage\n parts: readonly ChatPart[]\n isLoading: boolean\n getHitlActionState: (part: ChatHitlPart) => HitlActionState | undefined\n onHitlAction: (part: ChatHitlPart, response: ChatHitlResponse) => void\n}\n\nfunction RuntimeChat({\n components,\n identity = GUEST_CHAT_IDENTITY,\n ...props\n}: Agents24ChatAppProps) {\n const runtime = useAgentChatRuntime({\n ...props,\n mcpRedirectUri: props.mcpRedirectUri || (\n typeof window === \"undefined\" ? undefined : window.location.href\n ),\n })\n\n return <ChatShell components={components} identity={identity} runtime={runtime} sidebar={props.sidebar} />\n}\n\nexport function App(props: Agents24ChatAppProps) {\n const identity = props.identity || GUEST_CHAT_IDENTITY\n return (\n <Agents24Provider client={props.client} createAbortController={createBrowserAbortController}>\n <RuntimeChat key={identity.state} {...props} />\n </Agents24Provider>\n )\n}\n","import {\n agentChatRuntimeErrorMessage,\n type AgentChatRuntime,\n} from \"@agents24/chat-react/runtime\"\nimport type { Agents24ChatScaffoldComponents } from \"../../app\"\nimport { CircleAlert, LoaderCircle, SquarePen, X } from \"lucide-react\"\nimport * as React from \"react\"\nimport type { Agents24ChatIdentity } from \"../../identity\"\n\nimport { ChatComposer } from \"./chat-composer\"\nimport { ChatMessage } from \"./chat-message\"\nimport { ThemeMenu } from \"./theme-menu\"\nimport { ThreadSidebar } from \"./thread-sidebar\"\nimport { TurnOutline } from \"./turn-outline\"\nimport { isScaffoldTimelineLoading } from \"./timeline-loading\"\nimport { Button } from \"../ui/button\"\nimport {\n MessageScroller,\n MessageScrollerButton,\n MessageScrollerContent,\n MessageScrollerItem,\n MessageScrollerProvider,\n MessageScrollerViewport,\n} from \"../ui/message-scroller\"\nimport { SidebarInset, SidebarProvider, SidebarTrigger, useSidebar } from \"../ui/sidebar\"\n\nconst LOADING_INPUT_CONTRACT = {\n version: \"agents24.runtime-inputs.v2\" as const,\n modalities: {\n text: { enabled: false, required: false },\n files: { enabled: false, required: false, allowed_mime_types: [] },\n images: { enabled: false, required: false, allowed_mime_types: [] },\n audio: { enabled: false, required: false, allowed_mime_types: [], recording_enabled: false },\n },\n limits: { max_attachments_per_turn: 0, max_file_bytes: 0, max_total_bytes: 0 },\n retention: { mode: \"thread_lifetime\" as const },\n}\n\nfunction PersistentSidebarTrigger() {\n return (\n <div className=\"pointer-events-none fixed start-3 top-0 z-[60] flex h-12 items-center\">\n <SidebarTrigger className=\"pointer-events-auto [&_svg]:size-[18px]\" />\n </div>\n )\n}\n\nfunction CollapsedHeaderActions({ onNew }: { onNew: () => void }) {\n const { isMobile, openMobile, state } = useSidebar()\n const sidebarVisible = isMobile ? openMobile : state === \"expanded\"\n if (sidebarVisible) return null\n return (\n <>\n <div className=\"h-8 w-17 shrink-0\" aria-hidden=\"true\" />\n <div className=\"pointer-events-none fixed start-12 top-0 z-[60] flex h-12 items-center\">\n <Button className=\"pointer-events-auto\" variant=\"ghost\" size=\"icon-sm\" aria-label=\"New chat\" onClick={onNew}>\n <SquarePen />\n </Button>\n </div>\n </>\n )\n}\n\nfunction OperationErrorNotice({ runtime }: { runtime: AgentChatRuntime }) {\n const error = runtime.operationError || runtime.backgroundError\n if (!error) return null\n return (\n <div className=\"pointer-events-none absolute inset-x-0 top-3 z-40 flex justify-center px-4\">\n <div className=\"pointer-events-auto flex max-w-lg items-start gap-2 rounded-lg border border-destructive/20 bg-background px-3 py-2 text-sm shadow-md\" role=\"alert\">\n <CircleAlert className=\"mt-0.5 size-4 shrink-0 text-destructive\" />\n <span className=\"min-w-0 flex-1 wrap-break-word\">\n {agentChatRuntimeErrorMessage(error) || \"The chat could not complete that action.\"}\n </span>\n <Button\n aria-label=\"Dismiss error\"\n onClick={runtime.operationError ? runtime.clearOperationError : runtime.controller.clearBackgroundError}\n size=\"icon-xs\"\n variant=\"ghost\"\n >\n <X />\n </Button>\n </div>\n </div>\n )\n}\n\nexport function ChatShell({\n components,\n identity,\n runtime,\n sidebar,\n}: {\n components?: Agents24ChatScaffoldComponents\n identity: Agents24ChatIdentity\n runtime: AgentChatRuntime\n sidebar?: React.ReactNode\n}) {\n const { controller } = runtime\n const isRunning =\n controller.runState === \"streaming\"\n || controller.runState === \"reconnecting\"\n || controller.runState === \"paused\"\n || controller.runState === \"cancelling\"\n || runtime.isSubmitting\n const isCancelling = controller.runState === \"cancelling\"\n const activeTitle = controller.threads.find((thread) => thread.id === controller.activeThreadId)?.title\n const hasBlockingError = Boolean(runtime.fatalError && controller.messages.length === 0)\n const isEmptyState = controller.activeThreadId === null && controller.messages.length === 0 && !hasBlockingError\n\n return (\n <SidebarProvider\n className=\"h-svh min-h-0 overflow-hidden\"\n data-agents24-chat=\"\"\n data-agents24-chat-layout=\"\"\n >\n <PersistentSidebarTrigger />\n {sidebar || <ThreadSidebar\n activeThreadId={controller.activeThreadId}\n hasMore={controller.hasMoreThreads}\n identity={identity}\n isLoading={controller.isLoadingThreads}\n isLoadingMore={controller.isLoadingMoreThreads}\n threads={controller.threads}\n onDelete={runtime.deleteThread}\n onLoadMore={controller.loadMoreThreads}\n onNew={runtime.newThread}\n onOpen={runtime.openThread}\n />}\n <SidebarInset className=\"h-svh min-h-0 overflow-hidden bg-background\">\n <header\n className=\"flex h-12 shrink-0 items-center gap-2 border-b border-border/30 px-3 sm:px-4\"\n data-agents24-chat-header=\"\"\n >\n <CollapsedHeaderActions onNew={runtime.newThread} />\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"truncate text-sm font-medium\">{String(activeTitle || \"New chat\")}</h1>\n </div>\n <ThemeMenu />\n </header>\n\n <section\n aria-label=\"Conversation\"\n className=\"relative flex min-h-0 flex-1 flex-col overflow-hidden\"\n data-agents24-chat-transcript=\"\"\n >\n <OperationErrorNotice runtime={runtime} />\n {isEmptyState ? (\n <div className=\"absolute inset-0 flex min-h-0 flex-col justify-center pb-20\">\n <div className=\"mx-auto mb-8 w-full max-w-3xl px-4 text-center sm:px-6\">\n <h2 className=\"text-3xl font-semibold tracking-tight sm:text-4xl\">Ready when you are.</h2>\n </div>\n <ChatComposer\n inputContract={runtime.inputContract || LOADING_INPUT_CONTRACT}\n contextWindow={runtime.contextWindow}\n disabled={runtime.isBootstrapping || runtime.isChangingAgent}\n focusKey={controller.activeThreadId}\n forceExpanded\n isCancelling={isCancelling}\n isRunning={isRunning}\n agentId={runtime.agentId}\n agents={runtime.agents}\n onAgentChange={(agentId) => { void runtime.changeAgent(agentId) }}\n onStop={() => { void controller.cancelRun().catch(() => undefined) }}\n modelId={runtime.modelId}\n models={runtime.models}\n onModelChange={runtime.changeModel}\n onSubmit={(text, files) => runtime.submit({\n text,\n files: files.map((file) => ({\n data: file,\n mediaType: file.type || \"application/octet-stream\",\n name: file.name,\n })),\n })}\n />\n </div>\n ) : (\n <>\n <MessageScrollerProvider\n autoScroll\n defaultScrollPosition=\"last-anchor\"\n scrollPreviousItemPeek={64}\n >\n <MessageScroller className=\"relative min-h-0 flex-1\">\n <MessageScrollerViewport preserveScrollOnPrepend>\n <MessageScrollerContent\n className=\"mx-auto w-full max-w-3xl gap-7 px-4 pt-8 pb-16 sm:px-6 sm:pt-12\"\n >\n {controller.hasOlderTurns && (\n <Button className=\"self-center\" variant=\"ghost\" size=\"sm\" disabled={controller.isLoadingOlder} onClick={() => { void controller.loadOlder().catch(() => undefined) }}>\n {controller.isLoadingOlder && <LoaderCircle className=\"animate-spin\" />} Load earlier messages\n </Button>\n )}\n {runtime.isBootstrapping && (\n <div aria-label=\"Loading conversation\" className=\"flex flex-1 items-center justify-center py-24 text-muted-foreground\" role=\"status\">\n <LoaderCircle className=\"size-4 animate-spin\" />\n </div>\n )}\n {hasBlockingError && (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-3 py-24 text-center\">\n <CircleAlert className=\"size-5 text-destructive\" />\n <div><h2 className=\"font-medium\">Couldn’t connect</h2><p className=\"mt-1 max-w-md text-sm text-muted-foreground\">{runtime.errorMessage}</p></div>\n <Button variant=\"outline\" onClick={() => void runtime.retryBootstrap()}>Try again</Button>\n </div>\n )}\n {controller.messages.map((message) => (\n <MessageScrollerItem\n key={message.id}\n messageId={message.id}\n scrollAnchor={message.role === \"user\"}\n className=\"overflow-visible [content-visibility:visible]\"\n >\n <ChatMessage\n allowFeedback={runtime.allowFeedback}\n getHitlActionState={runtime.getHitlActionState}\n isLoading={isScaffoldTimelineLoading({\n activeRunId: controller.activeRunId,\n message,\n runState: controller.runState,\n streamingMessageId: controller.streamingMessageId,\n })}\n message={message}\n onHitlAction={runtime.onHitlAction}\n onRegenerate={() => controller.regenerate(message)}\n onSetFeedback={(input) => controller.setFeedback(message, input)}\n Timeline={components?.Timeline}\n />\n </MessageScrollerItem>\n ))}\n </MessageScrollerContent>\n </MessageScrollerViewport>\n <TurnOutline messages={controller.messages} />\n <MessageScrollerButton />\n </MessageScroller>\n </MessageScrollerProvider>\n <div className=\"relative z-30 shrink-0 bg-background pt-3\">\n <ChatComposer\n inputContract={runtime.inputContract || LOADING_INPUT_CONTRACT}\n contextWindow={runtime.contextWindow}\n disabled={runtime.isBootstrapping || runtime.isChangingAgent || hasBlockingError}\n focusKey={controller.activeThreadId}\n isCancelling={isCancelling}\n isRunning={isRunning}\n agentId={runtime.agentId}\n agents={runtime.agents}\n onAgentChange={(agentId) => { void runtime.changeAgent(agentId) }}\n onStop={() => { void controller.cancelRun().catch(() => undefined) }}\n modelId={runtime.modelId}\n models={runtime.models}\n onModelChange={runtime.changeModel}\n onSubmit={(text, files) => runtime.submit({\n text,\n files: files.map((file) => ({\n data: file,\n mediaType: file.type || \"application/octet-stream\",\n name: file.name,\n })),\n })}\n utilityRow=\"below\"\n />\n </div>\n </>\n )}\n </section>\n </SidebarInset>\n </SidebarProvider>\n )\n}\n","import { ArrowUp, ChevronDown, LoaderCircle, Mic, Square, X } from \"lucide-react\"\nimport * as React from \"react\"\nimport { AgentChatContextStatus, useAudioRecorder } from \"@agents24/chat-react/ui\"\nimport { canonicalInputMimeType, inputMimeTypes, validateAgentChatSubmission, type AgentChatInputContract } from \"@agents24/chat-react/runtime\"\nimport type { ContextWindow } from \"@agents24/client/protocol\"\n\nimport { Button } from \"../ui/button\"\nimport {\n DropdownMenu, DropdownMenuContent, DropdownMenuRadioGroup, DropdownMenuRadioItem,\n DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../ui/select\"\nimport { Textarea } from \"../ui/textarea\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\"\nimport { cn } from \"../../lib/utils\"\n\ntype ChatComposerProps = {\n inputContract: AgentChatInputContract\n disabled?: boolean\n contextWindow?: ContextWindow | null\n focusKey?: string | null\n forceExpanded?: boolean\n isCancelling?: boolean\n isRunning: boolean\n agentId: string | null\n agents: Array<{ id: string; label: string }>\n modelId: string | null\n models: Array<{ id: string; label: string }>\n onModelChange: (modelId: string) => void\n onAgentChange: (agentId: string) => void\n onStop: () => void\n onSubmit: (text: string, files: File[]) => Promise<void>\n utilityRow?: \"inline\" | \"below\"\n}\n\nexport function ChatComposer({\n inputContract,\n disabled,\n contextWindow,\n focusKey,\n forceExpanded = false,\n isCancelling = false,\n isRunning,\n agentId,\n agents,\n modelId,\n models,\n onModelChange,\n onAgentChange,\n onStop,\n onSubmit,\n utilityRow = \"inline\",\n}: ChatComposerProps) {\n const [text, setText] = React.useState(\"\")\n const [files, setFiles] = React.useState<File[]>([])\n const [attachmentError, setAttachmentError] = React.useState<string | null>(null)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const textareaRef = React.useRef<HTMLTextAreaElement>(null)\n const submittingRef = React.useRef(false)\n const draftRevisionRef = React.useRef(0)\n const attachmentMimeTypes = inputMimeTypes(inputContract)\n const allowAttachments = attachmentMimeTypes.length > 0\n const recordingAllowed = inputContract.modalities.audio.recording_enabled\n React.useEffect(() => {\n if (disabled || isRunning) return\n const frame = window.requestAnimationFrame(() => textareaRef.current?.focus({ preventScroll: true }))\n return () => window.cancelAnimationFrame(frame)\n }, [disabled, focusKey, isRunning])\n const addRecording = React.useCallback((file: File) => {\n draftRevisionRef.current += 1\n setFiles((current) => [...current, file])\n }, [])\n const recorder = useAudioRecorder(addRecording)\n const isExpanded = forceExpanded || text.includes(\"\\n\") || text.length > 62\n const validationError = validateAgentChatSubmission(\n inputContract,\n text,\n files.map((file) => ({ data: file, mediaType: file.type })),\n )\n\n const selectedAgent = agents.find((item) => item.id === agentId)\n const selectedModel = models.find((item) => item.id === modelId)\n const modelSelector = models.length > 0 ? (\n <div className=\"w-fit max-w-40\">\n <Select disabled={disabled || isRunning} onValueChange={onModelChange} value={modelId || undefined}>\n <SelectTrigger aria-label=\"Runtime model\">\n <SelectValue placeholder=\"Model\" />\n </SelectTrigger>\n <SelectContent align=\"start\">\n {models.map((model) => <SelectItem key={model.id} value={model.id}>{model.label}</SelectItem>)}\n </SelectContent>\n </Select>\n </div>\n ) : null\n const runtimeSelector = agents.length > 1 ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n className=\"h-8 max-w-64 gap-1.5 bg-transparent px-2.5 text-xs font-normal hover:bg-muted/40 disabled:opacity-100\"\n disabled={disabled || isRunning}\n aria-label=\"Runtime configuration\"\n >\n <span className=\"truncate\">\n {[selectedAgent?.label, selectedModel?.label].filter(Boolean).join(\" · \") || \"Runtime\"}\n </span>\n <ChevronDown className=\"size-3.5 text-muted-foreground\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-64 rounded-lg\">\n <DropdownMenuSub>\n <DropdownMenuSubTrigger className=\"rounded-lg\">\n <span>Agent</span><span className=\"ml-auto max-w-32 truncate text-muted-foreground\">{selectedAgent?.label}</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"w-56 rounded-lg\">\n <DropdownMenuRadioGroup value={agentId || undefined} onValueChange={onAgentChange}>\n {agents.map((agent) => <DropdownMenuRadioItem className=\"rounded-lg\" key={agent.id} value={agent.id}>{agent.label}</DropdownMenuRadioItem>)}\n </DropdownMenuRadioGroup>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n {models.length > 0 ? (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger className=\"rounded-lg\">\n <span>Model</span><span className=\"ml-auto max-w-32 truncate text-muted-foreground\">{selectedModel?.label}</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"max-h-64 w-56 rounded-lg\">\n <DropdownMenuRadioGroup value={modelId || undefined} onValueChange={onModelChange}>\n {models.map((model) => <DropdownMenuRadioItem className=\"rounded-lg\" key={model.id} value={model.id}>{model.label}</DropdownMenuRadioItem>)}\n </DropdownMenuRadioGroup>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : modelSelector\n const hasContextWindow = Number.isFinite(Number(contextWindow?.max_tokens)) && Number(contextWindow?.max_tokens) > 0\n const showUtilityRow = utilityRow === \"below\"\n\n const submit = async () => {\n if (disabled || isRunning || submittingRef.current || validationError) return\n const value = text\n const selectedFiles = files\n const clearedRevision = draftRevisionRef.current + 1\n draftRevisionRef.current = clearedRevision\n submittingRef.current = true\n setText(\"\")\n setFiles([])\n textareaRef.current?.focus()\n try {\n await onSubmit(value, selectedFiles)\n } catch {\n if (draftRevisionRef.current === clearedRevision) {\n draftRevisionRef.current += 1\n setText(value)\n setFiles(selectedFiles)\n }\n } finally {\n submittingRef.current = false\n }\n }\n\n return (\n <div\n className=\"mx-auto w-full max-w-3xl px-4 pb-[max(1rem,env(safe-area-inset-bottom))] sm:px-6\"\n data-agents24-chat-composer=\"\"\n >\n {allowAttachments && files.length > 0 && (\n <div className=\"mb-2 flex min-w-0 gap-2 overflow-x-auto\">\n {files.map((file, index) => (\n <div key={`${file.name}-${index}`} className=\"flex max-w-48 items-center gap-2 border bg-card px-2 py-1 text-xs\">\n <span className=\"truncate\">{file.name}</span>\n <Button variant=\"ghost\" size=\"icon-xs\" aria-label={`Remove ${file.name}`} onClick={() => {\n draftRevisionRef.current += 1\n setFiles((current) => current.filter((_, itemIndex) => itemIndex !== index))\n }}>\n <X />\n </Button>\n </div>\n ))}\n </div>\n )}\n {attachmentError || recorder.error ? <p className=\"mb-2 text-xs text-destructive\" role=\"alert\">{attachmentError || recorder.error}</p> : null}\n <div\n data-expanded={isExpanded || undefined}\n className={cn(\n \"agents24-composer-grid grid min-w-0 items-center gap-2 rounded-xl border bg-background shadow-sm\",\n isExpanded ? \"p-2\" : \"p-1.5\",\n )}\n >\n {allowAttachments ? (\n <>\n <input\n ref={inputRef}\n className=\"sr-only\"\n type=\"file\"\n multiple\n accept={attachmentMimeTypes.join(\",\")}\n onChange={(event) => {\n const selected = Array.from(event.target.files ?? [])\n const accepted = selected.filter((file) => (\n attachmentMimeTypes.includes(canonicalInputMimeType(file.type))\n ))\n draftRevisionRef.current += 1\n setFiles((current) => [...current, ...accepted])\n setAttachmentError(\n accepted.length === selected.length\n ? null\n : \"One or more selected file types are not supported by this Agent.\",\n )\n event.currentTarget.value = \"\"\n }}\n />\n <div className=\"agents24-composer-attach flex min-w-0 items-center\">\n <Button className=\"bg-muted/50 text-muted-foreground hover:bg-muted hover:text-foreground\" variant=\"ghost\" size=\"icon\" aria-label=\"Attach files\" disabled={disabled || isRunning} onClick={() => inputRef.current?.click()}>\n <span aria-hidden>+</span>\n </Button>\n </div>\n </>\n ) : <span aria-hidden=\"true\" className=\"agents24-composer-attach\" />}\n <Textarea\n ref={textareaRef}\n value={text}\n rows={1}\n placeholder=\"Message the agent\"\n aria-label=\"Message\"\n disabled={disabled}\n className={cn(\n \"agents24-composer-textarea max-h-56 min-h-9 field-sizing-content resize-none overflow-y-auto border-0 bg-transparent px-2 shadow-none focus-visible:ring-0 dark:bg-transparent\",\n isExpanded ? \"py-2\" : \"h-9 py-2\",\n )}\n onChange={(event) => {\n draftRevisionRef.current += 1\n setText(event.target.value)\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey && !event.nativeEvent.isComposing) {\n event.preventDefault()\n void submit()\n }\n }}\n />\n <div className=\"agents24-composer-actions flex items-center gap-1\">\n {utilityRow === \"inline\" ? <AgentChatContextStatus contextWindow={contextWindow} /> : null}\n {utilityRow === \"inline\" ? runtimeSelector : null}\n {recordingAllowed ? (\n <Button\n variant={recorder.isRecording ? \"default\" : \"ghost\"}\n size=\"icon\"\n aria-label={recorder.isRecording ? \"Stop recording\" : \"Record audio\"}\n disabled={disabled || isRunning}\n onClick={() => { if (recorder.isRecording) recorder.stop(); else void recorder.start() }}\n >\n {recorder.isRecording ? <Square className=\"fill-current\" /> : <Mic />}\n </Button>\n ) : null}\n {isRunning ? (\n <Button\n size=\"icon\"\n aria-label={isCancelling ? \"Cancelling response\" : \"Stop response\"}\n disabled={disabled || isCancelling}\n onClick={onStop}\n >\n {isCancelling\n ? <LoaderCircle className=\"animate-spin\" />\n : <Square className=\"fill-current\" />}\n </Button>\n ) : (\n validationError ? (\n <Tooltip tabIndex={0}>\n <TooltipTrigger asChild>\n <Button size=\"icon\" aria-label=\"Send message\" disabled onClick={() => void submit()}><ArrowUp /></Button>\n </TooltipTrigger>\n <TooltipContent>{validationError}</TooltipContent>\n </Tooltip>\n ) : (\n <Button size=\"icon\" aria-label=\"Send message\" disabled={disabled} onClick={() => void submit()}><ArrowUp /></Button>\n )\n )}\n </div>\n </div>\n {showUtilityRow ? (\n <div\n aria-hidden={!runtimeSelector && !hasContextWindow ? \"true\" : undefined}\n className=\"mt-2 flex min-h-8 items-center justify-between gap-2 px-1\"\n data-agents24-chat-composer-utility=\"\"\n >\n <div className=\"min-w-0\">{runtimeSelector}</div>\n <AgentChatContextStatus contextWindow={contextWindow} />\n </div>\n ) : null}\n </div>\n )\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-4xl border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:bg-transparent dark:hover:bg-input/30\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-9 gap-1.5 px-3 has-data-[icon=inline-end]:pr-2.5 has-data-[icon=inline-start]:pl-2.5\",\n xs: \"h-6 gap-1 px-2.5 text-xs has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 px-3 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n lg: \"h-10 gap-1.5 px-4 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3\",\n icon: \"size-9\",\n \"icon-xs\": \"size-6 [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { CheckIcon, ChevronRightIcon } from \"lucide-react\"\nimport { useThemePortalContainer } from \"../theme-provider\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n container,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n const themeContainer = useThemePortalContainer()\n return (\n <DropdownMenuPrimitive.Portal container={container || themeContainer || undefined} data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n const themeContainer = useThemePortalContainer()\n return (\n <DropdownMenuPrimitive.Portal container={themeContainer || undefined}>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n align={align}\n className={cn(\"z-50 max-h-(--radix-dropdown-menu-content-available-height) w-(--radix-dropdown-menu-trigger-width) min-w-48 origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-3xl bg-popover p-1.5 text-popover-foreground shadow-lg ring-1 ring-foreground/5 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:overflow-hidden dark:ring-foreground/10 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/dropdown-menu-item relative flex cursor-default items-center gap-2.5 rounded-2xl px-3 py-2 text-sm font-medium outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-9.5 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-2.5 rounded-2xl py-2 pr-8 pl-3 text-sm font-medium outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-9.5 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon\n />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-2.5 rounded-2xl py-2 pr-8 pl-3 text-sm font-medium outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-9.5 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-radio-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon\n />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-3 py-2.5 text-xs text-muted-foreground data-inset:pl-9.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1.5 my-1.5 h-px bg-border/50\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-2 rounded-2xl px-3 py-2 text-sm font-medium outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-9.5 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\"z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-36 origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-3xl bg-popover p-1.5 text-popover-foreground shadow-lg ring-1 ring-foreground/5 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:ring-foreground/10 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","import * as React from \"react\"\n\nexport type Agents24ChatAppearance = \"system\" | \"light\" | \"dark\"\nexport type Agents24ChatTheme = \"soft\" | \"sharp\"\n\nexport type Agents24ChatAppearanceController = {\n appearance: Agents24ChatAppearance\n setAppearance: (appearance: Agents24ChatAppearance) => void\n}\n\ntype ThemeContextValue = {\n appearance: Agents24ChatAppearance\n portalContainer: HTMLElement | null\n setAppearance: (appearance: Agents24ChatAppearance) => void\n}\n\nconst ThemeContext = React.createContext<ThemeContextValue | null>(null)\nconst storageKey = \"agents24-chat-appearance\"\n\nfunction storedAppearance(): Agents24ChatAppearance {\n try {\n const stored = window.localStorage.getItem(storageKey)\n return stored === \"light\" || stored === \"dark\" || stored === \"system\" ? stored : \"system\"\n } catch {\n return \"system\"\n }\n}\n\nexport function ThemeProvider({\n children,\n controller,\n theme = \"soft\",\n}: {\n children: React.ReactNode\n controller?: Agents24ChatAppearanceController\n theme?: Agents24ChatTheme\n}) {\n const [internalAppearance, setInternalAppearance] = React.useState<Agents24ChatAppearance>(\"system\")\n const [resolvedAppearance, setResolvedAppearance] = React.useState<\"light\" | \"dark\">(\"light\")\n const [mounted, setMounted] = React.useState(false)\n const [portalContainer, setPortalContainer] = React.useState<HTMLDivElement | null>(null)\n const appearance = controller?.appearance ?? internalAppearance\n\n React.useEffect(() => {\n if (!controller) setInternalAppearance(storedAppearance())\n setMounted(true)\n }, [controller])\n\n React.useEffect(() => {\n if (!mounted || typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\")\n const apply = () => setResolvedAppearance(\n appearance === \"system\" ? media.matches ? \"dark\" : \"light\" : appearance,\n )\n apply()\n media.addEventListener(\"change\", apply)\n return () => media.removeEventListener(\"change\", apply)\n }, [appearance, mounted])\n\n const change = React.useCallback((next: Agents24ChatAppearance) => {\n if (controller) {\n controller.setAppearance(next)\n return\n }\n try { window.localStorage.setItem(storageKey, next) } catch { /* storage is optional */ }\n setInternalAppearance(next)\n }, [controller])\n\n return (\n <ThemeContext.Provider value={{ appearance, portalContainer, setAppearance: change }}>\n <div\n ref={setPortalContainer}\n className={`${resolvedAppearance} size-full`}\n data-agents24-theme={theme}\n data-agents24-theme-root=\"\"\n >\n {children}\n </div>\n </ThemeContext.Provider>\n )\n}\n\nexport function useTheme() {\n const context = React.useContext(ThemeContext)\n if (!context) throw new Error(\"useTheme must be used inside ThemeProvider\")\n return context\n}\n\nexport function useThemePortalContainer() {\n return useTheme().portalContainer\n}\n","import { CheckIcon, ChevronDownIcon } from \"lucide-react\"\nimport * as React from \"react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { useThemePortalContainer } from \"../theme-provider\"\n\nfunction Select(props: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectValue(props: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n children,\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger>) {\n return (\n <SelectPrimitive.Trigger\n className={cn(\n \"flex h-8 w-full items-center justify-between gap-2 rounded-lg bg-transparent px-2.5 text-xs text-foreground outline-none transition-colors hover:bg-muted/50 focus-visible:bg-muted/50 disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-muted-foreground [&>span]:min-w-0 [&>span]:truncate\",\n className,\n )}\n data-slot=\"select-trigger\"\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-3.5 shrink-0 text-muted-foreground\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n align = \"start\",\n children,\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n const container = useThemePortalContainer()\n\n return (\n <SelectPrimitive.Portal container={container || undefined}>\n <SelectPrimitive.Content\n align={align}\n className={cn(\n \"z-50 max-h-64 min-w-[var(--radix-select-trigger-width)] overflow-hidden rounded-xl border border-border/50 bg-popover p-1 text-popover-foreground shadow-md data-[side=bottom]:animate-in data-[side=bottom]:fade-in-0 data-[side=bottom]:slide-in-from-top-1 data-[side=top]:animate-in data-[side=top]:fade-in-0 data-[side=top]:slide-in-from-bottom-1\",\n className,\n )}\n data-slot=\"select-content\"\n position=\"popper\"\n sideOffset={sideOffset}\n {...props}\n >\n <SelectPrimitive.Viewport className=\"max-h-60 overflow-y-auto p-0.5\">\n {children}\n </SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectItem({\n children,\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-lg py-1.5 pr-8 pl-2 text-sm outline-none data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n data-slot=\"select-item\"\n {...props}\n >\n <SelectPrimitive.ItemText className=\"min-w-0 truncate\">{children}</SelectPrimitive.ItemText>\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-3.5\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n </SelectPrimitive.Item>\n )\n}\n\nexport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue }\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full resize-none rounded-2xl border border-transparent bg-input/50 px-3 py-3 text-base transition-[color,box-shadow,background-color] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/30 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","import * as React from \"react\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({ children }: { children: React.ReactNode }) {\n return children\n}\n\nfunction Tooltip({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"tooltip\"\n className={cn(\"group/tooltip relative inline-flex\", className)}\n {...props}\n />\n )\n}\n\nfunction TooltipTrigger({\n asChild: _asChild,\n ...props\n}: React.ComponentProps<typeof Slot.Root> & { asChild?: boolean }) {\n return <Slot.Root data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n align: _align,\n side = \"top\",\n sideOffset: _sideOffset,\n ...props\n}: React.ComponentProps<\"span\"> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n sideOffset?: number\n align?: \"start\" | \"center\" | \"end\"\n}) {\n return (\n <span\n role=\"tooltip\"\n data-side={side}\n data-slot=\"tooltip-content\"\n className={cn(\n \"pointer-events-none absolute z-50 hidden w-max max-w-xs items-center gap-1.5 rounded-xl bg-foreground px-3 py-1.5 text-xs text-background group-hover/tooltip:inline-flex group-focus-within/tooltip:inline-flex\",\n \"data-[side=top]:bottom-full data-[side=top]:left-1/2 data-[side=top]:mb-2 data-[side=top]:-translate-x-1/2\",\n \"data-[side=bottom]:top-full data-[side=bottom]:left-1/2 data-[side=bottom]:mt-2 data-[side=bottom]:-translate-x-1/2\",\n \"data-[side=left]:end-full data-[side=left]:top-1/2 data-[side=left]:me-2 data-[side=left]:-translate-y-1/2\",\n \"data-[side=right]:start-full data-[side=right]:top-1/2 data-[side=right]:ms-2 data-[side=right]:-translate-y-1/2\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","import type { ChatHitlPart, ChatMessage as ChatMessageModel } from \"@agents24/react\"\nimport type { FeedbackReason, HitlResponse } from \"@agents24/client\"\nimport type { AgentChatRuntimeHitlActionState } from \"@agents24/chat-react/runtime\"\nimport { AgentChatDefaultActions, ChatAttachment, ChatAttachments } from \"@agents24/chat-react/ui\"\nimport * as React from \"react\"\n\nimport { MessageParts } from \"./message-parts\"\nimport { Bubble, BubbleContent } from \"../ui/bubble\"\nimport { Message, MessageContent, MessageFooter } from \"../ui/message\"\nimport type { Agents24ChatTimelineSlotProps } from \"../../app\"\n\ntype Props = {\n message: ChatMessageModel\n getHitlActionState: (part: ChatHitlPart) => AgentChatRuntimeHitlActionState | undefined\n isLoading: boolean\n onHitlAction: (part: ChatHitlPart, response: HitlResponse) => Promise<void>\n onRegenerate: () => Promise<void>\n allowFeedback: boolean\n onSetFeedback: (\n input: { rating: \"like\" | \"dislike\" | null; reason?: FeedbackReason | null; comment?: string | null },\n ) => Promise<void>\n Timeline?: React.ComponentType<Agents24ChatTimelineSlotProps>\n}\n\nexport function ChatMessage({\n allowFeedback,\n getHitlActionState,\n isLoading,\n message,\n onHitlAction,\n onRegenerate,\n onSetFeedback,\n Timeline,\n}: Props) {\n const isUser = message.role === \"user\"\n return (\n <Message align={isUser ? \"end\" : \"start\"}>\n <MessageContent>\n {isUser && message.attachments?.length ? (\n <ChatAttachments className=\"mb-2 justify-end\">\n {message.attachments.map((attachment, index) => (\n <ChatAttachment\n data={attachment}\n key={String(attachment.id || attachment.url || attachment.filename || index)}\n />\n ))}\n </ChatAttachments>\n ) : null}\n <Bubble variant={isUser ? \"secondary\" : \"ghost\"} align={isUser ? \"end\" : \"start\"} className={isUser ? \"max-w-[min(75%,42rem)]\" : \"max-w-full overflow-visible\"}>\n <BubbleContent className={isUser ? \"px-4 py-2.5\" : \"w-full overflow-visible\"}>\n <MessageParts\n getHitlActionState={getHitlActionState}\n isLoading={isLoading}\n message={message}\n onHitlAction={onHitlAction}\n Timeline={Timeline}\n />\n </BubbleContent>\n </Bubble>\n {!isUser && message.isFinal !== false && (\n <MessageFooter className=\"gap-1 opacity-70 transition-opacity group-hover/message:opacity-100\">\n <AgentChatDefaultActions\n handlers={{\n feedback: message.feedback,\n onCopy: (content) => { void navigator.clipboard.writeText(content).catch(() => undefined) },\n onRetry: () => onRegenerate(),\n onSetFeedback: allowFeedback ? (_message, input) => onSetFeedback(input) : undefined,\n }}\n message={message}\n />\n </MessageFooter>\n )}\n </MessageContent>\n </Message>\n )\n}\n","import type { ChatHitlPart, ChatMessage } from \"@agents24/react\"\nimport type { HitlResponse } from \"@agents24/client\"\nimport {\n AgentChatPart,\n AgentResponseTimeline,\n} from \"@agents24/chat-react/ui\"\nimport type { AgentChatRuntimeHitlActionState } from \"@agents24/chat-react/runtime\"\nimport * as React from \"react\"\nimport type { LinkSafetyConfig } from \"streamdown\"\n\nimport { CollapsibleUserMessage } from \"./collapsible-user-message\"\nimport { ExternalLinkDialog } from \"./external-link-dialog\"\nimport type { Agents24ChatTimelineSlotProps } from \"../../app\"\n\nconst linkSafety = {\n enabled: true,\n renderModal: (props) => <ExternalLinkDialog {...props} />,\n} satisfies LinkSafetyConfig\n\nfunction ScaffoldTimeline(props: Agents24ChatTimelineSlotProps) {\n return (\n <AgentResponseTimeline\n {...props}\n responseProps={{\n className: \"text-[15px] leading-7\",\n linkSafety,\n }}\n />\n )\n}\n\nexport function MessageParts({\n message,\n getHitlActionState,\n isLoading,\n onHitlAction,\n Timeline = ScaffoldTimeline,\n}: {\n message: ChatMessage\n getHitlActionState: (part: ChatHitlPart) => AgentChatRuntimeHitlActionState | undefined\n isLoading: boolean\n onHitlAction: (part: ChatHitlPart, response: HitlResponse) => Promise<void>\n Timeline?: React.ComponentType<Agents24ChatTimelineSlotProps>\n}) {\n if (message.role === \"assistant\") {\n return (\n <Timeline\n getHitlActionState={getHitlActionState}\n isLoading={isLoading}\n message={message}\n onHitlAction={(part, response) => {\n void onHitlAction(part, response).catch(() => undefined)\n }}\n parts={message.parts}\n />\n )\n }\n\n const text = message.parts\n .filter((part) => part.kind === \"text\")\n .map((part) => part.kind === \"text\" ? part.text : \"\")\n .join(\"\") || message.content\n const supportingParts = message.parts.filter((part) => (\n part.kind !== \"text\" && part.kind !== \"data\"\n ))\n\n return (\n <>\n {supportingParts.map((part) => (\n <AgentChatPart\n getHitlActionState={getHitlActionState}\n key={part.id}\n message={message}\n onHitlAction={(hitlPart, response) => {\n void onHitlAction(hitlPart, response).catch(() => undefined)\n }}\n part={part}\n />\n ))}\n {text ? <CollapsibleUserMessage content={text} /> : null}\n </>\n )\n}\n","import { ChevronDown, ChevronUp } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { Button } from \"../ui/button\"\n\nconst collapseThreshold = 360\nexport function CollapsibleUserMessage({ content }: { content: string }) {\n const [expanded, setExpanded] = React.useState(false)\n const contentId = React.useId()\n const collapsible = content.length > collapseThreshold\n const Icon = expanded ? ChevronUp : ChevronDown\n\n return (\n <div className=\"flex min-w-0 flex-col gap-2\">\n <div\n id={contentId}\n className={`max-w-none min-w-0 text-[15px] leading-7 whitespace-pre-wrap wrap-break-word ${collapsible && !expanded ? \"agents24-user-message-collapsed\" : \"\"}`}\n >\n {content}\n </div>\n {collapsible && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n aria-controls={contentId}\n aria-expanded={expanded}\n className=\"h-auto w-fit px-0 py-0 text-muted-foreground hover:bg-transparent hover:text-foreground\"\n onClick={() => setExpanded((value) => !value)}\n >\n {expanded ? \"Show less\" : \"Show more\"}\n <Icon />\n </Button>\n )}\n </div>\n )\n}\n","import type { LinkSafetyModalProps } from \"streamdown\"\nimport * as React from \"react\"\n\nimport { Button } from \"../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\"\n\nexport function ExternalLinkDialog({ isOpen, onClose, onConfirm, url }: LinkSafetyModalProps) {\n const [copied, setCopied] = React.useState(false)\n\n React.useEffect(() => {\n if (!isOpen) setCopied(false)\n }, [isOpen])\n\n const copyUrl = async () => {\n await navigator.clipboard.writeText(url)\n setCopied(true)\n }\n\n const openUrl = () => {\n onConfirm()\n onClose()\n }\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => { if (!open) onClose() }}>\n <DialogContent className=\"max-h-[calc(100dvh-2rem)] min-w-0 overflow-hidden sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Open external link?</DialogTitle>\n <DialogDescription>You’re about to visit an external website.</DialogDescription>\n </DialogHeader>\n <div className=\"max-h-32 overflow-auto rounded-md bg-muted p-3 font-mono text-xs wrap-break-word\">\n {url}\n </div>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => void copyUrl()}>{copied ? \"Copied\" : \"Copy link\"}</Button>\n <Button onClick={openUrl}>Open link</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as DialogPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { XIcon } from \"lucide-react\"\nimport { useThemePortalContainer } from \"../theme-provider\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n container,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n const themeContainer = useThemePortalContainer()\n return <DialogPrimitive.Portal container={container || themeContainer || undefined} data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 isolate z-50 bg-black/30 duration-100 supports-backdrop-filter:backdrop-blur-sm data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-6 rounded-4xl bg-popover p-6 text-sm text-popover-foreground shadow-xl ring-1 ring-foreground/5 duration-100 outline-none sm:max-w-md dark:ring-foreground/10 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close data-slot=\"dialog-close\" asChild>\n <Button\n variant=\"ghost\"\n className=\"absolute top-4 right-4 bg-secondary\"\n size=\"icon-sm\"\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </Button>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-1.5\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogPrimitive.Close>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\n \"font-heading text-base leading-none font-medium\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\n \"text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction BubbleGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"bubble-group\"\n className={cn(\"flex min-w-0 flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nconst bubbleVariants = cva(\n \"group/bubble relative flex w-fit max-w-[80%] min-w-0 flex-col gap-1 group-data-[align=end]/message:self-end data-[align=end]:self-end data-[variant=ghost]:max-w-full\",\n {\n variants: {\n variant: {\n default:\n \"*:data-[slot=bubble-content]:bg-primary *:data-[slot=bubble-content]:text-primary-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-primary/80\",\n secondary:\n \"*:data-[slot=bubble-content]:bg-secondary *:data-[slot=bubble-content]:text-secondary-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)]\",\n muted:\n \"*:data-[slot=bubble-content]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--muted),var(--foreground)_5%)]\",\n tinted:\n \"*:data-[slot=bubble-content]:bg-[oklch(from_var(--primary)_0.93_calc(c*0.4)_h)] *:data-[slot=bubble-content]:text-foreground dark:*:data-[slot=bubble-content]:bg-[oklch(from_var(--primary)_0.3_calc(c*0.4)_h)] [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[oklch(from_var(--primary)_0.88_calc(c*0.5)_h)] dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-[oklch(from_var(--primary)_0.35_calc(c*0.5)_h)]\",\n outline:\n \"*:data-[slot=bubble-content]:border-border *:data-[slot=bubble-content]:bg-background [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-input/30\",\n ghost:\n \"border-none *:data-[slot=bubble-content]:rounded-none *:data-[slot=bubble-content]:bg-transparent *:data-[slot=bubble-content]:p-0 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted/50\",\n destructive:\n \"*:data-[slot=bubble-content]:bg-destructive/10 *:data-[slot=bubble-content]:text-destructive dark:*:data-[slot=bubble-content]:bg-destructive/20 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/20 dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/30\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Bubble({\n variant = \"default\",\n align = \"start\",\n className,\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof bubbleVariants> & {\n align?: \"start\" | \"end\"\n }) {\n return (\n <div\n data-slot=\"bubble\"\n data-variant={variant}\n data-align={align}\n className={cn(bubbleVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction BubbleContent({\n asChild = false,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n asChild?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n data-slot=\"bubble-content\"\n className={cn(\n \"w-fit max-w-full min-w-0 overflow-hidden rounded-3xl border border-transparent px-3.5 py-2.5 text-sm leading-relaxed wrap-break-word group-data-[align=end]/bubble:self-end [button]:text-left [button,a]:transition-colors [button,a]:outline-none [button,a]:focus-visible:border-ring [button,a]:focus-visible:ring-3 [button,a]:focus-visible:ring-ring/30\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst bubbleReactionsVariants = cva(\n \"absolute z-10 flex w-fit shrink-0 items-center justify-center gap-1 rounded-full bg-muted px-1.5 py-0.5 text-sm ring-3 ring-card has-[button]:p-0\",\n {\n variants: {\n side: {\n top: \"top-0 -translate-y-3/4\",\n bottom: \"bottom-0 translate-y-3/4\",\n },\n align: {\n start: \"left-3\",\n end: \"right-3\",\n },\n },\n defaultVariants: {\n side: \"bottom\",\n align: \"end\",\n },\n }\n)\n\nfunction BubbleReactions({\n side = \"bottom\",\n align = \"end\",\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n align?: \"start\" | \"end\"\n side?: \"top\" | \"bottom\"\n}) {\n return (\n <div\n data-slot=\"bubble-reactions\"\n data-align={align}\n data-side={side}\n className={cn(bubbleReactionsVariants({ side, align }), className)}\n {...props}\n />\n )\n}\n\nexport { BubbleGroup, Bubble, BubbleContent, BubbleReactions }\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/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.5 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.5 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 { Laptop, Moon, Sun } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { useTheme } from \"../theme-provider\"\nimport { Button } from \"../ui/button\"\n\nconst options = [\n { value: \"system\" as const, label: \"System\", icon: Laptop },\n { value: \"light\" as const, label: \"Light\", icon: Sun },\n { value: \"dark\" as const, label: \"Dark\", icon: Moon },\n]\n\nexport function ThemeMenu() {\n const { appearance, setAppearance } = useTheme()\n const [open, setOpen] = React.useState(false)\n const rootRef = React.useRef<HTMLDivElement>(null)\n const firstItemRef = React.useRef<HTMLButtonElement>(null)\n const menuId = React.useId()\n const ActiveIcon = options.find((item) => item.value === appearance)?.icon ?? Laptop\n\n React.useEffect(() => {\n if (!open) return\n firstItemRef.current?.focus()\n const closeOnOutsidePointer = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false)\n }\n const closeOnEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setOpen(false)\n }\n document.addEventListener(\"pointerdown\", closeOnOutsidePointer)\n document.addEventListener(\"keydown\", closeOnEscape)\n return () => {\n document.removeEventListener(\"pointerdown\", closeOnOutsidePointer)\n document.removeEventListener(\"keydown\", closeOnEscape)\n }\n }, [open])\n\n const label = appearance === \"system\" ? \"System\" : appearance === \"light\" ? \"Light\" : \"Dark\"\n return (\n <div ref={rootRef} className=\"relative\">\n <Button\n aria-controls={menuId}\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-label={`Appearance: ${label}`}\n onClick={() => setOpen((value) => !value)}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n <ActiveIcon />\n </Button>\n {open ? (\n <div\n id={menuId}\n className=\"absolute end-0 top-full z-50 mt-1 flex min-w-44 flex-col rounded-xl border bg-popover p-1 text-popover-foreground shadow-md\"\n role=\"menu\"\n >\n {options.map(({ value, label: optionLabel, icon: Icon }, index) => (\n <Button\n key={value}\n ref={index === 0 ? firstItemRef : undefined}\n aria-current={appearance === value ? \"true\" : undefined}\n className=\"w-full justify-start\"\n onClick={() => {\n setAppearance(value)\n setOpen(false)\n }}\n role=\"menuitem\"\n size=\"sm\"\n variant=\"ghost\"\n >\n <Icon /> {optionLabel}\n </Button>\n ))}\n </div>\n ) : null}\n </div>\n )\n}\n","import { getThreadActivity, type StoredChatThread } from \"@agents24/react\"\nimport { LoaderCircle, SquarePen, Trash2 } from \"lucide-react\"\nimport type { Agents24ChatIdentity } from \"../../identity\"\nimport { IdentityControl } from \"./identity-control\"\n\nimport { Button } from \"../ui/button\"\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarRail,\n useSidebar,\n} from \"../ui/sidebar\"\n\ntype Props = {\n activeThreadId: string | null\n hasMore: boolean\n isLoading: boolean\n isLoadingMore: boolean\n onDelete: (threadId: string) => Promise<void>\n onLoadMore: () => Promise<void>\n onNew: () => void\n onOpen: (threadId: string) => Promise<void>\n threads: StoredChatThread[]\n identity: Agents24ChatIdentity\n}\n\nfunction ThreadStatus({ thread }: { thread: StoredChatThread }) {\n const activity = getThreadActivity(thread)\n if (!activity.isSpinning) return null\n const label = activity.status === \"cancelling\"\n ? \"Cancelling\"\n : activity.status === \"queued\"\n ? \"Queued\"\n : \"Running\"\n return (\n <span\n className=\"pointer-events-none absolute end-1 top-1/2 hidden size-5 -translate-y-1/2 items-center justify-center text-muted-foreground transition-opacity group-hover/menu-item:opacity-0 md:flex\"\n role=\"status\"\n aria-label={label}\n title={label}\n >\n <LoaderCircle className=\"size-3.5 animate-spin\" />\n </span>\n )\n}\n\nexport function ThreadSidebar({ activeThreadId, hasMore, identity, isLoading, isLoadingMore, onDelete, onLoadMore, onNew, onOpen, threads }: Props) {\n const { setOpenMobile } = useSidebar()\n return (\n <Sidebar\n aria-label=\"Conversations\"\n collapsible=\"offcanvas\"\n data-agents24-chat-sidebar=\"\"\n role=\"navigation\"\n >\n <SidebarHeader className=\"gap-1 p-2\">\n <div className=\"h-8 shrink-0\" aria-hidden=\"true\" />\n <Button className=\"w-full justify-start\" variant=\"ghost\" onClick={() => { onNew(); setOpenMobile(false) }}><SquarePen /> New chat</Button>\n </SidebarHeader>\n <SidebarContent>\n <SidebarGroup>\n <SidebarGroupContent>\n <SidebarMenu>\n {threads.map((thread) => (\n <SidebarMenuItem key={thread.id}>\n <SidebarMenuButton\n className=\"pr-8 pl-3\"\n isActive={thread.id === activeThreadId}\n title={String(thread.title || \"New conversation\")}\n onClick={() => { void onOpen(thread.id).catch(() => undefined); setOpenMobile(false) }}\n >\n <span className=\"min-w-0 truncate\">{String(thread.title || \"New conversation\")}</span>\n </SidebarMenuButton>\n <ThreadStatus thread={thread} />\n <SidebarMenuAction\n showOnHover\n className=\"group-focus-within/menu-item:opacity-0 group-hover/menu-item:opacity-100\"\n aria-label={`Delete ${String(thread.title || \"conversation\")}`}\n onClick={(event) => { event.stopPropagation(); if (window.confirm(\"Delete this conversation?\")) void onDelete(thread.id).catch(() => undefined) }}\n >\n <Trash2 />\n </SidebarMenuAction>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n {!isLoading && threads.length === 0 && <p className=\"px-2 py-8 text-center text-xs text-muted-foreground\">No conversations</p>}\n {hasMore && (\n <Button\n className=\"mt-2 w-full\"\n disabled={isLoadingMore}\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => void onLoadMore().catch(() => undefined)}\n >\n {isLoadingMore && <LoaderCircle className=\"animate-spin\" />}\n Load more\n </Button>\n )}\n </SidebarGroupContent>\n </SidebarGroup>\n </SidebarContent>\n <SidebarFooter className=\"w-full min-w-0 p-2\"><IdentityControl identity={identity} /></SidebarFooter>\n <SidebarRail />\n </Sidebar>\n )\n}\n","import { LogIn, LogOut, UserRound } from \"lucide-react\"\n\nimport type { Agents24ChatIdentity } from \"../../identity\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\nimport { SidebarMenu, SidebarMenuButton, SidebarMenuItem } from \"../ui/sidebar\"\n\nfunction identityLabel(identity: Agents24ChatIdentity): string {\n if (identity.displayName) return identity.displayName\n if (identity.state === \"authenticated\") return \"Signed in\"\n if (identity.state === \"loading\") return \"Loading identity\"\n if (identity.state === \"error\") return \"Identity unavailable\"\n if (identity.state === \"signed_out\") return \"Sign in\"\n return \"Guest\"\n}\n\nfunction IdentityAvatar({ identity }: { identity: Agents24ChatIdentity }) {\n const label = identityLabel(identity)\n if (identity.avatarUrl) {\n return <img alt=\"\" className=\"size-6 rounded-full object-cover\" src={identity.avatarUrl} />\n }\n return (\n <span className=\"flex size-6 items-center justify-center rounded-full bg-sidebar-accent text-[10px] font-semibold\" aria-hidden=\"true\">\n {identity.displayName ? identity.displayName.slice(0, 1).toUpperCase() : <UserRound className=\"size-3.5\" />}\n </span>\n )\n}\n\nexport function IdentityControl({ identity }: { identity: Agents24ChatIdentity }) {\n const label = identityLabel(identity)\n const canSignOut = identity.state === \"authenticated\" && Boolean(identity.onSignOut)\n const canSignIn = (identity.state === \"guest\" || identity.state === \"signed_out\" || identity.state === \"error\") && Boolean(identity.onSignIn)\n return (\n <SidebarMenu className=\"w-full min-w-0\">\n <SidebarMenuItem className=\"w-full min-w-0\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton\n size=\"lg\"\n aria-label={`Account: ${label}`}\n className=\"w-full min-w-0 justify-start\"\n >\n <IdentityAvatar identity={identity} />\n <span className=\"min-w-0 flex-1 overflow-hidden text-start\">\n <span className=\"block truncate text-sm font-medium\">{label}</span>\n {identity.secondaryText ? <span className=\"block truncate text-xs text-muted-foreground\">{identity.secondaryText}</span> : null}\n </span>\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" side=\"top\" sideOffset={8}>\n <DropdownMenuLabel>\n <span className=\"block truncate\">{label}</span>\n {identity.secondaryText ? <span className=\"mt-0.5 block truncate text-xs font-normal text-muted-foreground\">{identity.secondaryText}</span> : null}\n </DropdownMenuLabel>\n {(canSignIn || canSignOut) ? <DropdownMenuSeparator /> : null}\n {canSignIn ? <DropdownMenuItem onSelect={() => identity.onSignIn?.()}><LogIn />Sign in</DropdownMenuItem> : null}\n {canSignOut ? <DropdownMenuItem onSelect={() => identity.onSignOut?.()}><LogOut />Sign out</DropdownMenuItem> : null}\n </DropdownMenuContent>\n </DropdownMenu>\n </SidebarMenuItem>\n </SidebarMenu>\n )\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { useIsMobile } from \"../../hooks/use-mobile\"\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Separator } from \"./separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"./sheet\"\nimport { Skeleton } from \"./skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"./tooltip\"\nimport { PanelLeftIcon } from \"lucide-react\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <div\n data-slot=\"sidebar-wrapper\"\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full [--sidebar-width:16rem] [--sidebar-width-icon:3rem] has-data-[variant=inset]:bg-sidebar\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n dir,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n dir={dir}\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [--sidebar-width:18rem] [&>button]:hidden\"\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer hidden text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n data-side={side}\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-2xl group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-2xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"h-8 w-full bg-input/50 shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\n \"flex flex-col gap-2 p-2 [--radius:var(--radius-xl)]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"no-scrollbar flex min-h-0 flex-1 flex-col gap-2 overflow-auto [--radius:var(--radius-xl)] group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-xl px-3 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-xl p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-0.5\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-xl px-3 py-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]\",\n },\n size: {\n default: \"h-9 text-sm\",\n sm: \"h-8 text-xs\",\n lg: \"h-14 px-3 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : \"button\"\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-xl p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-2 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-xl px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-xl px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-xl\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-[70%] flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5 group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-xl px-3 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n if (typeof window.matchMedia !== \"function\") {\n onChange()\n window.addEventListener(\"resize\", onChange)\n return () => window.removeEventListener(\"resize\", onChange)\n }\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n mql.addEventListener(\"change\", onChange)\n onChange()\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-9 w-full min-w-0 rounded-3xl border border-transparent bg-input/50 px-3 py-1 text-base transition-[color,box-shadow,background-color] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/30 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Separator as SeparatorPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { XIcon } from \"lucide-react\"\nimport { useThemePortalContainer } from \"../theme-provider\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n container,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n const themeContainer = useThemePortalContainer()\n return <SheetPrimitive.Portal container={container || themeContainer || undefined} data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/30 duration-100 supports-backdrop-filter:backdrop-blur-sm data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n \"fixed z-50 flex flex-col bg-popover bg-clip-padding text-sm text-popover-foreground shadow-xl transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=right]:data-closed:slide-out-to-right-10 data-[side=top]:data-closed:slide-out-to-top-10\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close data-slot=\"sheet-close\" asChild>\n <Button\n variant=\"ghost\"\n className=\"absolute top-4 right-4 bg-secondary\"\n size=\"icon-sm\"\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </Button>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-6\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-6\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\n \"font-heading text-base font-medium text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import { cn } from \"../../lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"animate-pulse rounded-2xl bg-muted\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n","import type { ChatMessage } from \"@agents24/react\"\nimport { useState } from \"react\"\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\"\nimport { useMessageScroller, useMessageScrollerVisibility } from \"../ui/message-scroller\"\nimport { cn } from \"../../lib/utils\"\n\ntype Turn = { id: string; label: string; messageIds: string[]; response: string }\n\nfunction turnsFromMessages(messages: ChatMessage[]): Turn[] {\n return messages.reduce<Turn[]>((turns, message) => {\n if (message.role === \"user\") {\n turns.push({ id: message.id, label: message.content.trim() || `Turn ${turns.length + 1}`, messageIds: [message.id], response: \"\" })\n } else if (turns.length) {\n const turn = turns[turns.length - 1]\n turn.messageIds.push(message.id)\n if (!turn.response) turn.response = message.content.trim()\n }\n return turns\n }, [])\n}\n\nexport function TurnOutline({ messages }: { messages: ChatMessage[] }) {\n const turns = turnsFromMessages(messages)\n const { scrollToMessage } = useMessageScroller()\n const { currentAnchorId, visibleMessageIds } = useMessageScrollerVisibility()\n const visible = new Set(visibleMessageIds)\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n const focusIndex = hoveredIndex ?? -1\n if (turns.length < 2) return null\n\n return (\n <nav aria-label=\"Transcript outline\" className=\"pointer-events-none absolute end-2 top-1/2 z-20 hidden max-h-72 w-14 -translate-y-1/2 md:block xl:end-5\">\n <div className=\"pointer-events-auto flex flex-col items-end gap-0.5 py-2\">\n {turns.map((turn, index) => {\n const active = turn.messageIds.some((id) => visible.has(id) || currentAnchorId === id)\n const distance = focusIndex >= 0 ? Math.abs(index - focusIndex) : Number.POSITIVE_INFINITY\n const barWidth = focusIndex < 0\n ? 12\n : distance === 0 ? 50 : distance === 1 ? 36 : distance === 2 ? 23 : 10\n const barOpacity = focusIndex < 0\n ? active ? 1 : 0.4\n : distance === 0 ? 1 : distance === 1 ? 0.78 : distance === 2 ? 0.58 : 0.36\n return (\n <Tooltip key={turn.id}>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={`Jump to ${turn.label}`}\n className=\"group relative flex h-2 w-14 items-center justify-end outline-none after:pointer-events-auto after:absolute after:-inset-y-0.5 after:inset-x-0 after:content-['']\"\n onBlur={() => setHoveredIndex(null)}\n onFocus={() => setHoveredIndex(index)}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n onClick={() => scrollToMessage(turn.id, { align: \"start\", behavior: \"smooth\" })}\n >\n <span\n className={cn(\"h-0.5 rounded-full bg-muted-foreground/40 transition-[width,background-color,opacity] duration-150 ease-out group-hover:bg-foreground group-focus-visible:bg-foreground\", active && \"bg-foreground\")}\n style={{ opacity: barOpacity, width: barWidth }}\n />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"left\" className=\"w-64 flex-col items-stretch gap-0 overflow-hidden p-3\">\n <p className=\"line-clamp-2 max-w-full wrap-break-word text-sm font-medium\">{turn.label}</p>\n {turn.response && <p className=\"mt-1 line-clamp-2 max-w-full wrap-break-word text-xs opacity-70\">{turn.response}</p>}\n </TooltipContent>\n </Tooltip>\n )\n })}\n </div>\n </nav>\n )\n}\n","import * as React from \"react\"\nimport {\n MessageScroller as MessageScrollerPrimitive,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n} from \"@shadcn/react/message-scroller\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { ArrowDownIcon } from \"lucide-react\"\n\nfunction MessageScrollerProvider(\n props: React.ComponentProps<typeof MessageScrollerPrimitive.Provider>\n) {\n return <MessageScrollerPrimitive.Provider {...props} />\n}\n\nfunction MessageScroller({\n className,\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Root>) {\n return (\n <MessageScrollerPrimitive.Root\n data-slot=\"message-scroller\"\n className={cn(\n \"group/message-scroller relative flex size-full min-h-0 flex-col overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageScrollerViewport({\n className,\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Viewport>) {\n return (\n <MessageScrollerPrimitive.Viewport\n data-slot=\"message-scroller-viewport\"\n className={cn(\n \"size-full min-h-0 min-w-0 scroll-fade-b overflow-y-auto overscroll-contain contain-content [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageScrollerContent({\n className,\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Content>) {\n return (\n <MessageScrollerPrimitive.Content\n data-slot=\"message-scroller-content\"\n className={cn(\"flex h-max min-h-full flex-col gap-8\", className)}\n {...props}\n />\n )\n}\n\nfunction MessageScrollerItem({\n className,\n scrollAnchor = false,\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Item>) {\n return (\n <MessageScrollerPrimitive.Item\n data-slot=\"message-scroller-item\"\n scrollAnchor={scrollAnchor}\n className={cn(\n \"min-w-0 shrink-0 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageScrollerButton({\n direction = \"end\",\n className,\n children,\n render,\n variant = \"secondary\",\n size = \"icon-sm\",\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Button> &\n Pick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">) {\n return (\n <MessageScrollerPrimitive.Button\n data-slot=\"message-scroller-button\"\n data-direction={direction}\n data-variant={variant}\n data-size={size}\n direction={direction}\n className={cn(\n \"absolute inset-s-1/2 -translate-x-1/2 border-border bg-background text-foreground transition-[translate,scale,opacity] duration-200 hover:bg-muted hover:text-foreground data-[active=false]:pointer-events-none data-[active=false]:scale-95 data-[active=false]:opacity-0 data-[active=false]:duration-400 data-[active=false]:ease-[cubic-bezier(0.7,0,0.84,0)] data-[active=true]:translate-y-0 data-[active=true]:scale-100 data-[active=true]:opacity-100 data-[active=true]:ease-[cubic-bezier(0.23,1,0.32,1)] data-[direction=end]:bottom-4 data-[direction=end]:data-[active=false]:translate-y-full data-[direction=start]:top-4 data-[direction=start]:data-[active=false]:-translate-y-full rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180\",\n className\n )}\n render={render ?? <Button variant={variant} size={size} />}\n {...props}\n >\n {children ?? (\n <>\n <ArrowDownIcon\n />\n <span className=\"sr-only\">\n {direction === \"end\" ? \"Scroll to end\" : \"Scroll to start\"}\n </span>\n </>\n )}\n </MessageScrollerPrimitive.Button>\n )\n}\n\nexport {\n MessageScrollerProvider,\n MessageScroller,\n MessageScrollerViewport,\n MessageScrollerContent,\n MessageScrollerItem,\n MessageScrollerButton,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n}\n","import type { AgentChatRunState, ChatMessage } from \"@agents24/react\"\n\nexport function isScaffoldTimelineLoading({\n activeRunId,\n message,\n runState,\n streamingMessageId,\n}: {\n activeRunId: string | null\n message: ChatMessage\n runState: AgentChatRunState\n streamingMessageId: string | null\n}): boolean {\n if (runState !== \"streaming\" && runState !== \"reconnecting\") return false\n return message.id === streamingMessageId\n || Boolean(message.runId && message.runId === activeRunId)\n}\n","export type Agents24ChatIdentityState =\n | \"loading\"\n | \"guest\"\n | \"authenticated\"\n | \"signed_out\"\n | \"error\"\n\nexport type Agents24ChatIdentity = {\n state: Agents24ChatIdentityState\n displayName?: string\n secondaryText?: string\n avatarUrl?: string\n onSignIn?: () => void | Promise<void>\n onSignOut?: () => void | Promise<void>\n}\n\nexport const GUEST_CHAT_IDENTITY: Agents24ChatIdentity = { state: \"guest\" }\n"],"mappings":"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","names":["import_runtime","import_react","import_runtime","import_lucide_react","import_lucide_react","React","import_radix_ui","import_jsx_runtime","import_jsx_runtime","DropdownMenuPrimitive","DropdownMenuPrimitive","DropdownMenuPrimitive","DropdownMenuPrimitive","DropdownMenuPrimitive","import_lucide_react","import_radix_ui","import_jsx_runtime","SelectPrimitive","import_jsx_runtime","import_radix_ui","import_jsx_runtime","import_jsx_runtime","import_ui","import_ui","import_lucide_react","React","import_jsx_runtime","React","import_radix_ui","import_lucide_react","import_jsx_runtime","DialogPrimitive","DialogPrimitive","DialogPrimitive","import_jsx_runtime","import_jsx_runtime","import_class_variance_authority","import_radix_ui","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_lucide_react","React","import_jsx_runtime","import_lucide_react","import_lucide_react","React","import_class_variance_authority","import_radix_ui","React","import_jsx_runtime","import_radix_ui","import_jsx_runtime","import_radix_ui","import_lucide_react","import_jsx_runtime","SheetPrimitive","SheetPrimitive","SheetPrimitive","import_jsx_runtime","import_lucide_react","import_jsx_runtime","open","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","MessageScrollerPrimitive","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}