@invergent/agent-chat-react 1.8.1 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +957 -70
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +127 -1
- package/dist/index.d.ts +127 -1
- package/dist/index.js +946 -73
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapter-context.tsx","../src/components/ui/button.tsx","../src/components/browser/browser-control-bar.tsx","../src/components/browser/browser-live-view.tsx","../src/components/browser/browser-status-dot.tsx","../src/components/ui/dialog.tsx","../src/components/ui/tooltip.tsx","../src/components/browser/browser-pane.tsx","../src/components/ai-elements/conversation.tsx","../src/components/ai-elements/message.tsx","../src/components/ui/collapsible.tsx","../src/components/ai-elements/shimmer.tsx","../src/components/ai-elements/reasoning.tsx","../src/components/reui/timeline.tsx","../src/components/browser/browser-activity-group.tsx","../src/components/chat/tools/shared.ts","../src/components/chat/tools/terminal-tool.tsx","../src/components/ui/scroll-area.tsx","../src/components/ai-elements/queue.tsx","../src/components/chat/tools/todo-tool.tsx","../src/components/ai-elements/code-block.tsx","../src/components/ui/tabs.tsx","../src/components/ui/badge.tsx","../src/components/ai-elements/tool.tsx","../src/components/ai-elements/sandbox.tsx","../src/components/chat/tools/execute-code-tool.tsx","../src/components/chat/tools/oneliner-tools.tsx","../src/components/chat/tools/web-extract-tool.tsx","../src/components/chat/diff-viewer.tsx","../src/components/chat/tools/file-tools.tsx","../src/components/ai-elements/terminal.tsx","../src/components/chat/tools/process-tool.tsx","../src/components/ui/textarea.tsx","../src/components/chat/tools/expert-tool.tsx","../src/components/chat/tools/skill-tools.tsx","../src/components/ui/input.tsx","../src/components/chat/tools/clarify-tool.tsx","../src/components/chat/tools/artifact-tool.tsx","../src/components/chat/tools/delegate-tool.tsx","../src/components/chat/tools/memory-tool.tsx","../src/components/chat/tools/skill-manage-tool.tsx","../src/components/chat/tools/coordinator-tools.tsx","../src/components/chat/tools/default-tool.tsx","../src/components/chat/tool-call-block.tsx","../src/components/chat/tools/web-search-tool.tsx","../src/components/chat/chat-message.tsx","../src/components/ui/input-group.tsx","../src/components/ui/command.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/hover-card.tsx","../src/components/ui/spinner.tsx","../src/components/ai-elements/prompt-input.tsx","../src/components/ui/progress.tsx","../src/components/ai-elements/context.tsx","../src/components/ui/item.tsx","../src/components/ui/popover.tsx","../src/components/chat/chat-composer.tsx","../src/components/ai-elements/artifact.tsx","../src/components/chat/artifacts/artifact-markdown.tsx","../src/components/chat/artifacts/artifact-table.tsx","../src/components/chat/artifacts/artifact-html.tsx","../src/components/chat/artifacts/artifact-svg.tsx","../src/components/chat/artifacts/artifact-export.ts","../src/components/chat/artifacts/artifact-block.tsx","../src/components/chat/error-message.tsx","../src/components/chat/chat-thread.tsx","../src/components/ai-elements/file-tree.tsx","../src/components/ui/skeleton.tsx","../src/lib/format.ts","../src/components/workspace/file-viewer.tsx","../src/components/workspace/workspace-panel.tsx","../src/lib/sessions.ts","../src/runtime/events.ts","../src/runtime/reducer.ts","../src/runtime/use-agent-chat-runtime.ts","../src/agent-chat.tsx","../src/components/inbox/inbox-panel.tsx","../src/components/inbox/use-inbox-unread-count.ts","../src/components/scheduled/scheduled-work-panel.tsx","../src/components/sessions/session-tree-panel.tsx"],"names":["jsx","DialogPrimitive","jsxs","TooltipPrimitive","useState","Fragment","useCallback","createContext","CollapsiblePrimitive","useMemo","memo","useContext","useEffect","streamdownPlugins","cjk","code","math","mermaid","Streamdown","Slot","ZapIcon","ChevronDownIcon","ScrollAreaPrimitive","useRef","CopyIcon","TabsPrimitive","cva","toolLabel","CheckIcon","XIcon","i","DiffViewer","fileName","parseArgs","parseResult","ClockIcon","Loader2Icon","ChevronRightIcon","firstLine","XCircleIcon","CheckCircle2Icon","parseResultCount","SearchIcon","ChatMessage","FileIcon","CommandPrimitive","DropdownMenuPrimitive","HoverCardPrimitive","ProgressPrimitive","PopoverPrimitive","iconForMime","FileAudio","FileVideo","FileText","FileCode","FileArchive","FileSpreadsheet","formatBytes","DownloadIcon","Maximize2Icon","ErrorMessage","AlertTriangle","ChevronDown","ChevronRight","groupRetry","ImageIcon","ChevronLeftIcon","PlusIcon","SKELETON_WIDTHS","TrashIcon","FolderOpenIcon","AlertCircleIcon","stringValue","findLastAssistantIndex","session","KIND_LABEL","MessageSquareIcon","CircleDotIcon","Trash2Icon","DEFAULT_LIMIT","formatRelative","formatDistanceToNow","SquareIcon"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { AgentChatAdapter } from \"./types\";\n\nexport interface AgentChatAdapterContextValue {\n adapter: AgentChatAdapter;\n sessionId: string | null;\n onFileSelect?: (path: string) => void;\n}\n\nconst AgentChatAdapterContext =\n createContext<AgentChatAdapterContextValue | null>(null);\n\nexport const NO_BROWSER_ADAPTER: Pick<\n AgentChatAdapter,\n | \"getBrowserState\"\n | \"getBrowserPreviewSnapshot\"\n | \"acquireBrowserControl\"\n | \"releaseBrowserControl\"\n | \"browserLiveViewUrl\"\n> = {\n async getBrowserState() {\n return null;\n },\n async getBrowserPreviewSnapshot() {\n return null;\n },\n async acquireBrowserControl() {\n throw new Error(\"Browser control is not supported by this adapter.\");\n },\n async releaseBrowserControl() {\n // Releasing unsupported browser control is intentionally a no-op.\n },\n browserLiveViewUrl() {\n return \"\";\n },\n};\n\nexport const AgentChatAdapterProvider = AgentChatAdapterContext.Provider;\n\nexport function useAgentChatAdapterContext(): AgentChatAdapterContextValue {\n const value = useContext(AgentChatAdapterContext);\n if (!value) {\n throw new Error(\n \"useAgentChatAdapterContext must be used inside AgentChatAdapterProvider\",\n );\n }\n return value;\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-none border border-transparent bg-clip-padding text-xs font-semibold tracking-widest whitespace-nowrap uppercase transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-2 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-2 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-3.5\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-transparent hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-input/30\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 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 underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-10 gap-1.5 px-6 has-data-[icon=inline-end]:pr-4 has-data-[icon=inline-start]:pl-4\",\n xs: \"h-7 gap-1 px-3 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-9 gap-1 px-4 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3\",\n lg: \"h-11 gap-1.5 px-8 has-data-[icon=inline-end]:pr-5 has-data-[icon=inline-start]:pl-5\",\n icon: \"size-10\",\n \"icon-xs\": \"size-7 [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-9\",\n \"icon-lg\": \"size-11\",\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 { MousePointer2Icon, RotateCcwIcon } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Button } from \"../ui/button\";\nimport type { AgentChatAdapter } from \"../../types\";\n\ntype BrowserControlAdapter = Pick<\n AgentChatAdapter,\n \"acquireBrowserControl\" | \"releaseBrowserControl\"\n>;\n\ninterface BrowserControlBarProps {\n sessionId: string;\n hasControl: boolean;\n adapter: BrowserControlAdapter;\n onControlAcquired?: () => void;\n onControlReleased?: () => void;\n}\n\nexport function BrowserControlBar({\n sessionId,\n hasControl,\n adapter,\n onControlAcquired,\n onControlReleased,\n}: BrowserControlBarProps) {\n const [pending, setPending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n async function toggleControl() {\n if (!sessionId || pending) return;\n setPending(true);\n setError(null);\n try {\n if (hasControl) {\n await adapter.releaseBrowserControl(sessionId);\n onControlReleased?.();\n } else {\n await adapter.acquireBrowserControl(sessionId);\n onControlAcquired?.();\n }\n } catch (nextError) {\n setError((nextError as Error).message);\n } finally {\n setPending(false);\n }\n }\n\n return (\n <div className=\"flex min-h-11 items-center gap-2 border-t border-line bg-card px-3 py-2\">\n <Button\n type=\"button\"\n size=\"xs\"\n variant={hasControl ? \"secondary\" : \"default\"}\n disabled={!sessionId || pending}\n onClick={() => void toggleControl()}\n >\n {hasControl ? (\n <RotateCcwIcon className=\"size-3\" aria-hidden=\"true\" />\n ) : (\n <MousePointer2Icon className=\"size-3\" aria-hidden=\"true\" />\n )}\n {hasControl ? \"Return control\" : \"Take control\"}\n </Button>\n <span className=\"ml-auto flex items-center gap-1.5 text-[11px] text-muted-foreground\">\n <span className=\"size-1.5 rounded-full bg-red-500\" aria-hidden=\"true\" />\n Live\n </span>\n {error && (\n <span className=\"max-w-40 truncate text-[11px] text-destructive\">\n {error}\n </span>\n )}\n </div>\n );\n}\n","interface BrowserLiveViewProps {\n src: string;\n testId?: string;\n}\n\nexport function BrowserLiveView({\n src,\n testId = \"browser-iframe\",\n}: BrowserLiveViewProps) {\n return (\n <iframe\n data-testid={testId}\n title=\"Browser live view\"\n src={src}\n className=\"h-full w-full border-0 bg-black\"\n allow=\"clipboard-read; clipboard-write\"\n />\n );\n}\n","import { cn } from \"../../lib/utils\";\nimport type { AgentChatBrowserState } from \"../../types\";\n\nexport function BrowserStatusDot({\n status,\n}: {\n status: AgentChatBrowserState[\"status\"];\n}) {\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"inline-block size-2 shrink-0 rounded-full\",\n status === \"live\" && \"bg-emerald-500\",\n status === \"user-control\" && \"bg-amber-500\",\n status === \"provisioning\" && \"animate-pulse bg-sky-500\",\n status === \"closed\" && \"bg-muted-foreground\",\n )}\n />\n );\n}\n","import * 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\"\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 ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal 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/20 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-none bg-popover p-6 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-md 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-5 right-5 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-2\", 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-lg leading-none font-semibold tracking-wider uppercase\",\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 \"mt-0.5 text-sm leading-relaxed 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 { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-none bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 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-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-none data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 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 <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-none bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Maximize2Icon, ZapIcon } from \"lucide-react\";\nimport { BrowserControlBar } from \"./browser-control-bar\";\nimport { BrowserLiveView } from \"./browser-live-view\";\nimport { BrowserStatusDot } from \"./browser-status-dot\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../ui/tooltip\";\nimport type {\n AgentChatAdapter,\n AgentChatBrowserPreviewSnapshot,\n AgentChatBrowserState,\n} from \"../../types\";\n\ntype BrowserPaneAdapter = Pick<\n AgentChatAdapter,\n | \"browserLiveViewUrl\"\n | \"getBrowserPreviewSnapshot\"\n | \"acquireBrowserControl\"\n | \"releaseBrowserControl\"\n>;\n\ninterface BrowserPaneProps {\n sessionId: string;\n state: AgentChatBrowserState;\n adapter: BrowserPaneAdapter;\n}\n\nexport function BrowserPane({ sessionId, state, adapter }: BrowserPaneProps) {\n const [fullscreenOpen, setFullscreenOpen] = useState(false);\n const [openFullscreenOnControl, setOpenFullscreenOnControl] = useState(false);\n const [localControlActive, setLocalControlActive] = useState(false);\n const [previewSnapshot, setPreviewSnapshot] =\n useState<AgentChatBrowserPreviewSnapshot | null>(null);\n const [previewLoading, setPreviewLoading] = useState(false);\n const [previewError, setPreviewError] = useState<string | null>(null);\n const hasLiveViewAdapter =\n typeof adapter.browserLiveViewUrl === \"function\";\n const hasPreviewAdapter =\n typeof adapter.getBrowserPreviewSnapshot === \"function\";\n const hasControlAdapter =\n typeof adapter.acquireBrowserControl === \"function\" &&\n typeof adapter.releaseBrowserControl === \"function\";\n const liveViewUrl = useMemo(() => {\n if (!hasLiveViewAdapter) return \"\";\n return adapter.browserLiveViewUrl(sessionId);\n }, [adapter, hasLiveViewAdapter, sessionId]);\n const hasLiveView = state.status !== \"provisioning\" && state.status !== \"closed\";\n const hasUserControl = localControlActive;\n const canUseLiveView = hasLiveView && hasUserControl && Boolean(liveViewUrl);\n const canOpenPreview = hasLiveView && (hasPreviewAdapter || canUseLiveView);\n const canOpenFullscreen = canOpenPreview;\n\n const refreshPreview = useCallback(\n async (signal?: AbortSignal) => {\n if (!hasPreviewAdapter || canUseLiveView) return;\n setPreviewLoading(true);\n setPreviewError(null);\n try {\n const snapshot = await adapter.getBrowserPreviewSnapshot?.(sessionId);\n if (signal?.aborted) return;\n setPreviewSnapshot(snapshot ?? null);\n if (!snapshot) {\n setPreviewError(\"Browser preview is unavailable.\");\n }\n } catch (error) {\n if (signal?.aborted) return;\n setPreviewSnapshot(null);\n setPreviewError(\n error instanceof Error ? error.message : \"Browser preview failed.\",\n );\n } finally {\n if (!signal?.aborted) setPreviewLoading(false);\n }\n },\n [adapter, canUseLiveView, hasPreviewAdapter, sessionId],\n );\n\n useEffect(() => {\n setFullscreenOpen(false);\n setOpenFullscreenOnControl(false);\n setLocalControlActive(false);\n setPreviewSnapshot(null);\n setPreviewLoading(false);\n setPreviewError(null);\n }, [sessionId]);\n\n useEffect(() => {\n if (!openFullscreenOnControl) return;\n if (!canUseLiveView) return;\n setFullscreenOpen(true);\n setOpenFullscreenOnControl(false);\n }, [canUseLiveView, openFullscreenOnControl]);\n\n const handleFullscreenOpenChange = useCallback(\n (open: boolean) => {\n setFullscreenOpen(open);\n if (open || !hasUserControl || !hasControlAdapter) return;\n\n setLocalControlActive(false);\n void adapter.releaseBrowserControl(sessionId).catch((error) => {\n console.error(\"Failed to release browser control\", error);\n });\n },\n [adapter, hasControlAdapter, hasUserControl, sessionId],\n );\n\n useEffect(() => {\n if (!hasLiveView || canUseLiveView) {\n setPreviewLoading(false);\n setPreviewError(null);\n return;\n }\n if (!hasPreviewAdapter) return;\n\n const abort = new AbortController();\n void refreshPreview(abort.signal);\n const timer = window.setInterval(() => {\n void refreshPreview(abort.signal);\n }, 5000);\n return () => {\n abort.abort();\n window.clearInterval(timer);\n };\n }, [\n canUseLiveView,\n fullscreenOpen,\n hasLiveView,\n hasPreviewAdapter,\n refreshPreview,\n ]);\n\n return (\n <>\n <div\n data-testid=\"browser-pane\"\n className=\"flex h-full min-h-0 flex-col bg-background\"\n >\n <header className=\"flex min-h-10 items-center gap-2 border-b border-line bg-card px-3 text-xs text-foreground\">\n <ZapIcon className=\"size-3.5 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"font-medium\">Browser</span>\n <BrowserStatusDot status={state.status} />\n {state.controlOwner && (\n <span className=\"min-w-0 truncate text-amber-500\">\n {state.controlOwner} has control\n </span>\n )}\n {canOpenFullscreen && (\n <div className=\"ml-auto flex items-center\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Maximize browser\"\n className=\"inline-flex size-7 items-center justify-center text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={() => setFullscreenOpen(true)}\n >\n <Maximize2Icon className=\"size-3.5\" aria-hidden=\"true\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Full screen</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n )}\n </header>\n <div className=\"min-h-0 flex-1 bg-black\">\n {state.status === \"provisioning\" ? (\n <div className=\"flex h-full items-center justify-center bg-background text-sm text-muted-foreground\">\n Starting browser...\n </div>\n ) : state.status === \"closed\" ? (\n <div className=\"flex h-full items-center justify-center bg-background text-sm text-muted-foreground\">\n Browser closed.\n </div>\n ) : canUseLiveView ? (\n <BrowserLiveView src={liveViewUrl} />\n ) : previewSnapshot ? (\n <BrowserPreviewImage\n src={previewSnapshot.src}\n fit=\"contain\"\n testId=\"browser-preview-image\"\n />\n ) : previewLoading ? (\n <div className=\"flex h-full items-center justify-center bg-background text-sm text-muted-foreground\">\n Loading browser preview...\n </div>\n ) : previewError ? (\n <div className=\"flex h-full items-center justify-center bg-background text-sm text-muted-foreground\">\n {previewError}\n </div>\n ) : (\n <div className=\"flex h-full items-center justify-center bg-background text-sm text-muted-foreground\">\n Browser preview is unavailable.\n </div>\n )}\n </div>\n {hasLiveView && hasControlAdapter && (\n <BrowserControlBar\n sessionId={sessionId}\n hasControl={localControlActive}\n adapter={adapter}\n onControlAcquired={() => {\n setLocalControlActive(true);\n setOpenFullscreenOnControl(true);\n }}\n onControlReleased={() => setLocalControlActive(false)}\n />\n )}\n </div>\n <Dialog open={fullscreenOpen} onOpenChange={handleFullscreenOpenChange}>\n <DialogContent\n aria-describedby={undefined}\n className=\"flex h-screen w-screen max-w-none flex-col gap-0 overflow-hidden rounded-none border-0 bg-background p-0 shadow-none ring-0 sm:max-w-none\"\n >\n <DialogHeader className=\"h-10 shrink-0 flex-row items-center gap-2 border-b border-line bg-card px-4 py-0\">\n <ZapIcon className=\"size-3.5 text-muted-foreground\" aria-hidden=\"true\" />\n <DialogTitle className=\"text-xs normal-case tracking-normal\">\n Browser\n </DialogTitle>\n <BrowserStatusDot status={state.status} />\n {state.controlOwner && (\n <span className=\"min-w-0 truncate text-xs text-amber-500\">\n {state.controlOwner} has control\n </span>\n )}\n </DialogHeader>\n <div className=\"min-h-0 flex-1 bg-black\">\n {canUseLiveView ? (\n <BrowserLiveView\n src={liveViewUrl}\n testId=\"browser-fullscreen-iframe\"\n />\n ) : previewSnapshot ? (\n <BrowserPreviewImage\n src={previewSnapshot.src}\n fit=\"contain\"\n testId=\"browser-fullscreen-preview-image\"\n />\n ) : previewLoading ? (\n <div className=\"flex h-full items-center justify-center bg-background text-sm text-muted-foreground\">\n Loading browser preview...\n </div>\n ) : previewError ? (\n <div className=\"flex h-full items-center justify-center bg-background text-sm text-muted-foreground\">\n {previewError}\n </div>\n ) : (\n <div className=\"flex h-full items-center justify-center bg-background text-sm text-muted-foreground\">\n Browser preview is unavailable.\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n\nfunction BrowserPreviewImage({\n src,\n fit,\n testId,\n}: {\n src: string;\n fit: \"contain\" | \"cover\";\n testId: string;\n}) {\n return (\n <img\n data-testid={testId}\n src={src}\n alt=\"Browser preview\"\n className={`h-full w-full bg-black ${\n fit === \"cover\" ? \"object-cover object-top\" : \"object-contain\"\n }`}\n draggable={false}\n />\n );\n}\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport { cn } from \"../../lib/utils\";\nimport type { UIMessage } from \"ai\";\nimport { ArrowDownIcon, DownloadIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { useCallback } from \"react\";\nimport { StickToBottom, useStickToBottomContext } from \"use-stick-to-bottom\";\n\nexport type ConversationProps = ComponentProps<typeof StickToBottom>;\n\nexport const Conversation = ({ className, ...props }: ConversationProps) => (\n <StickToBottom\n className={cn(\"relative flex-1\", className)}\n initial=\"smooth\"\n resize=\"smooth\"\n role=\"log\"\n {...props}\n />\n);\n\nexport type ConversationContentProps = ComponentProps<\n typeof StickToBottom.Content\n>;\n\nexport const ConversationContent = ({\n className,\n ...props\n}: ConversationContentProps) => (\n <StickToBottom.Content\n className={cn(\"flex flex-col gap-6 py-6 px-6\", className)}\n {...props}\n />\n);\n\nexport type ConversationEmptyStateProps = ComponentProps<\"div\"> & {\n title?: string;\n description?: string;\n icon?: React.ReactNode;\n};\n\nexport const ConversationEmptyState = ({\n className,\n title = \"No messages yet\",\n description = \"Start a conversation to see messages here\",\n icon,\n children,\n ...props\n}: ConversationEmptyStateProps) => (\n <div\n className={cn(\n \"flex size-full flex-col items-center justify-center gap-4 p-8 text-center\",\n className\n )}\n {...props}\n >\n {children ?? (\n <>\n {icon && (\n <div className=\"flex items-center justify-center size-14 rounded-2xl bg-muted/60 text-muted-foreground/60\">\n {icon}\n </div>\n )}\n <div className=\"space-y-1.5\">\n <h3 className=\"font-semibold text-base text-foreground/80\">{title}</h3>\n {description && (\n <p className=\"text-muted-foreground/60 text-sm max-w-sm\">{description}</p>\n )}\n </div>\n </>\n )}\n </div>\n);\n\nexport type ConversationScrollButtonProps = ComponentProps<typeof Button>;\n\nexport const ConversationScrollButton = ({\n className,\n ...props\n}: ConversationScrollButtonProps) => {\n const { isAtBottom, scrollToBottom } = useStickToBottomContext();\n\n const handleScrollToBottom = useCallback(() => {\n scrollToBottom();\n }, [scrollToBottom]);\n\n return (\n !isAtBottom && (\n <Button\n className={cn(\n \"absolute bottom-4 left-[50%] translate-x-[-50%] rounded-full shadow-lg border-border/50 dark:bg-background dark:hover:bg-muted\",\n className\n )}\n onClick={handleScrollToBottom}\n size=\"icon\"\n type=\"button\"\n variant=\"outline\"\n {...props}\n >\n <ArrowDownIcon className=\"size-4\" />\n </Button>\n )\n );\n};\n\nconst getMessageText = (message: UIMessage): string =>\n message.parts\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\");\n\nexport type ConversationDownloadProps = Omit<\n ComponentProps<typeof Button>,\n \"onClick\"\n> & {\n messages: UIMessage[];\n filename?: string;\n formatMessage?: (message: UIMessage, index: number) => string;\n};\n\nconst defaultFormatMessage = (message: UIMessage): string => {\n const roleLabel =\n message.role.charAt(0).toUpperCase() + message.role.slice(1);\n return `**${roleLabel}:** ${getMessageText(message)}`;\n};\n\nexport const messagesToMarkdown = (\n messages: UIMessage[],\n formatMessage: (\n message: UIMessage,\n index: number\n ) => string = defaultFormatMessage\n): string => messages.map((msg, i) => formatMessage(msg, i)).join(\"\\n\\n\");\n\nexport const ConversationDownload = ({\n messages,\n filename = \"conversation.md\",\n formatMessage = defaultFormatMessage,\n className,\n children,\n ...props\n}: ConversationDownloadProps) => {\n const handleDownload = useCallback(() => {\n const markdown = messagesToMarkdown(messages, formatMessage);\n const blob = new Blob([markdown], { type: \"text/markdown\" });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = filename;\n document.body.append(link);\n link.click();\n link.remove();\n URL.revokeObjectURL(url);\n }, [messages, filename, formatMessage]);\n\n return (\n <Button\n className={cn(\n \"absolute top-4 right-4 rounded-full dark:bg-background dark:hover:bg-muted\",\n className\n )}\n onClick={handleDownload}\n size=\"icon\"\n type=\"button\"\n variant=\"outline\"\n {...props}\n >\n {children ?? <DownloadIcon className=\"size-4\" />}\n </Button>\n );\n};\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport {\n ButtonGroup,\n ButtonGroupText,\n} from \"../ui/button-group\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../ui/tooltip\";\nimport { cn } from \"../../lib/utils\";\nimport { cjk } from \"@streamdown/cjk\";\nimport { code } from \"@streamdown/code\";\nimport { math } from \"@streamdown/math\";\nimport { mermaid } from \"@streamdown/mermaid\";\nimport type { UIMessage } from \"ai\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes, ReactElement } from \"react\";\nimport {\n createContext,\n memo,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { Streamdown } from \"streamdown\";\n\nexport type MessageProps = HTMLAttributes<HTMLDivElement> & {\n from: UIMessage[\"role\"];\n};\n\nexport const Message = ({ className, from, ...props }: MessageProps) => (\n <div\n className={cn(\n \"group flex w-full flex-col gap-2\",\n from === \"user\" ? \"is-user max-w-[85%]\" : \"is-assistant max-w-full\",\n className\n )}\n {...props}\n />\n);\n\nexport type MessageContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const MessageContent = ({\n children,\n className,\n ...props\n}: MessageContentProps) => (\n <div\n className={cn(\n \"flex w-full min-w-0 max-w-full flex-col gap-2 overflow-hidden break-words\",\n \"group-[.is-user]:ml-auto group-[.is-user]:rounded-2xl group-[.is-user]:bg-primary/10 group-[.is-user]:px-4 group-[.is-user]:py-3 group-[.is-user]:text-foreground group-[.is-user]:border group-[.is-user]:border-primary/15\",\n \"group-[.is-assistant]:text-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n);\n\nexport type MessageActionsProps = ComponentProps<\"div\">;\n\nexport const MessageActions = ({\n className,\n children,\n ...props\n}: MessageActionsProps) => (\n <div className={cn(\"flex items-center gap-1\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type MessageActionProps = ComponentProps<typeof Button> & {\n tooltip?: string;\n label?: string;\n};\n\nexport const MessageAction = ({\n tooltip,\n children,\n label,\n variant = \"ghost\",\n size = \"icon-sm\",\n ...props\n}: MessageActionProps) => {\n const button = (\n <Button size={size} type=\"button\" variant={variant} {...props}>\n {children}\n <span className=\"sr-only\">{label || tooltip}</span>\n </Button>\n );\n\n if (tooltip) {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent>\n <p>{tooltip}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return button;\n};\n\ninterface MessageBranchContextType {\n currentBranch: number;\n totalBranches: number;\n goToPrevious: () => void;\n goToNext: () => void;\n branches: ReactElement[];\n setBranches: (branches: ReactElement[]) => void;\n}\n\nconst MessageBranchContext = createContext<MessageBranchContextType | null>(\n null\n);\n\nconst useMessageBranch = () => {\n const context = useContext(MessageBranchContext);\n\n if (!context) {\n throw new Error(\n \"MessageBranch components must be used within MessageBranch\"\n );\n }\n\n return context;\n};\n\nexport type MessageBranchProps = HTMLAttributes<HTMLDivElement> & {\n defaultBranch?: number;\n onBranchChange?: (branchIndex: number) => void;\n};\n\nexport const MessageBranch = ({\n defaultBranch = 0,\n onBranchChange,\n className,\n ...props\n}: MessageBranchProps) => {\n const [currentBranch, setCurrentBranch] = useState(defaultBranch);\n const [branches, setBranches] = useState<ReactElement[]>([]);\n\n const handleBranchChange = useCallback(\n (newBranch: number) => {\n setCurrentBranch(newBranch);\n onBranchChange?.(newBranch);\n },\n [onBranchChange]\n );\n\n const goToPrevious = useCallback(() => {\n const newBranch =\n currentBranch > 0 ? currentBranch - 1 : branches.length - 1;\n handleBranchChange(newBranch);\n }, [currentBranch, branches.length, handleBranchChange]);\n\n const goToNext = useCallback(() => {\n const newBranch =\n currentBranch < branches.length - 1 ? currentBranch + 1 : 0;\n handleBranchChange(newBranch);\n }, [currentBranch, branches.length, handleBranchChange]);\n\n const contextValue = useMemo<MessageBranchContextType>(\n () => ({\n branches,\n currentBranch,\n goToNext,\n goToPrevious,\n setBranches,\n totalBranches: branches.length,\n }),\n [branches, currentBranch, goToNext, goToPrevious]\n );\n\n return (\n <MessageBranchContext.Provider value={contextValue}>\n <div\n className={cn(\"grid w-full gap-2 [&>div]:pb-0\", className)}\n {...props}\n />\n </MessageBranchContext.Provider>\n );\n};\n\nexport type MessageBranchContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const MessageBranchContent = ({\n children,\n ...props\n}: MessageBranchContentProps) => {\n const { currentBranch, setBranches, branches } = useMessageBranch();\n const childrenArray = useMemo(\n () => (Array.isArray(children) ? children : [children]),\n [children]\n );\n\n // Use useEffect to update branches when they change\n useEffect(() => {\n if (branches.length !== childrenArray.length) {\n setBranches(childrenArray);\n }\n }, [childrenArray, branches, setBranches]);\n\n return childrenArray.map((branch, index) => (\n <div\n className={cn(\n \"grid gap-2 overflow-hidden [&>div]:pb-0\",\n index === currentBranch ? \"block\" : \"hidden\"\n )}\n key={branch.key}\n {...props}\n >\n {branch}\n </div>\n ));\n};\n\nexport type MessageBranchSelectorProps = ComponentProps<typeof ButtonGroup>;\n\nexport const MessageBranchSelector = ({\n className,\n ...props\n}: MessageBranchSelectorProps) => {\n const { totalBranches } = useMessageBranch();\n\n // Don't render if there's only one branch\n if (totalBranches <= 1) {\n return null;\n }\n\n return (\n <ButtonGroup\n className={cn(\n \"[&>*:not(:first-child)]:rounded-l-md [&>*:not(:last-child)]:rounded-r-md\",\n className\n )}\n orientation=\"horizontal\"\n {...props}\n />\n );\n};\n\nexport type MessageBranchPreviousProps = ComponentProps<typeof Button>;\n\nexport const MessageBranchPrevious = ({\n children,\n ...props\n}: MessageBranchPreviousProps) => {\n const { goToPrevious, totalBranches } = useMessageBranch();\n\n return (\n <Button\n aria-label=\"Previous branch\"\n disabled={totalBranches <= 1}\n onClick={goToPrevious}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <ChevronLeftIcon size={14} />}\n </Button>\n );\n};\n\nexport type MessageBranchNextProps = ComponentProps<typeof Button>;\n\nexport const MessageBranchNext = ({\n children,\n ...props\n}: MessageBranchNextProps) => {\n const { goToNext, totalBranches } = useMessageBranch();\n\n return (\n <Button\n aria-label=\"Next branch\"\n disabled={totalBranches <= 1}\n onClick={goToNext}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <ChevronRightIcon size={14} />}\n </Button>\n );\n};\n\nexport type MessageBranchPageProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const MessageBranchPage = ({\n className,\n ...props\n}: MessageBranchPageProps) => {\n const { currentBranch, totalBranches } = useMessageBranch();\n\n return (\n <ButtonGroupText\n className={cn(\n \"border-none bg-transparent text-muted-foreground shadow-none\",\n className\n )}\n {...props}\n >\n {currentBranch + 1} of {totalBranches}\n </ButtonGroupText>\n );\n};\n\nexport type MessageResponseProps = ComponentProps<typeof Streamdown>;\n\nconst streamdownPlugins = { cjk, code, math, mermaid };\n\nexport const MessageResponse = memo(\n ({ className, ...props }: MessageResponseProps) => (\n <Streamdown\n className={cn(\n \"size-full [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\",\n className\n )}\n plugins={streamdownPlugins}\n {...props}\n />\n ),\n (prevProps, nextProps) =>\n prevProps.children === nextProps.children &&\n nextProps.isAnimating === prevProps.isAnimating\n);\n\nMessageResponse.displayName = \"MessageResponse\";\n\nexport type MessageToolbarProps = ComponentProps<\"div\">;\n\nexport const MessageToolbar = ({\n className,\n children,\n ...props\n}: MessageToolbarProps) => (\n <div\n className={cn(\n \"mt-4 flex w-full items-center justify-between gap-4\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n);\n","import { Collapsible as CollapsiblePrimitive } from \"radix-ui\"\n\nfunction Collapsible({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />\n}\n\nfunction CollapsibleTrigger({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n return (\n <CollapsiblePrimitive.CollapsibleTrigger\n data-slot=\"collapsible-trigger\"\n {...props}\n />\n )\n}\n\nfunction CollapsibleContent({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {\n return (\n <CollapsiblePrimitive.CollapsibleContent\n data-slot=\"collapsible-content\"\n {...props}\n />\n )\n}\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n","\"use client\";\n\nimport { cn } from \"../../lib/utils\";\nimport type { CSSProperties, ElementType } from \"react\";\nimport { memo, useMemo } from \"react\";\n\nexport interface TextShimmerProps {\n children: string;\n as?: ElementType;\n className?: string;\n duration?: number;\n spread?: number;\n}\n\nconst ShimmerComponent = ({\n children,\n as: Component = \"p\",\n className,\n duration = 2,\n spread = 2,\n}: TextShimmerProps) => {\n const dynamicSpread = useMemo(\n () => (children?.length ?? 0) * spread,\n [children, spread]\n );\n\n return (\n <Component\n className={cn(\"shimmer text-muted-foreground\", className)}\n style={\n {\n \"--shimmer-duration\": duration * 1000,\n \"--shimmer-spread\": `${dynamicSpread}px`,\n } as CSSProperties\n }\n >\n {children}\n </Component>\n );\n};\n\nexport const Shimmer = memo(ShimmerComponent);\n","\"use client\";\n\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../ui/collapsible\";\nimport { cn } from \"../../lib/utils\";\nimport { cjk } from \"@streamdown/cjk\";\nimport { code } from \"@streamdown/code\";\nimport { math } from \"@streamdown/math\";\nimport { mermaid } from \"@streamdown/mermaid\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport {\n createContext,\n memo,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { Streamdown } from \"streamdown\";\n\nimport { Shimmer } from \"./shimmer\";\n\ninterface ReasoningContextValue {\n isStreaming: boolean;\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n duration: number | undefined;\n}\n\nconst ReasoningContext = createContext<ReasoningContextValue | null>(null);\n\nexport const useReasoning = () => {\n const context = useContext(ReasoningContext);\n if (!context) {\n throw new Error(\"Reasoning components must be used within Reasoning\");\n }\n return context;\n};\n\nexport type ReasoningProps = ComponentProps<typeof Collapsible> & {\n isStreaming?: boolean;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n duration?: number;\n};\n\nconst MIN_DURATION_MS = 100;\nconst MS_IN_S = 1000;\n\nexport const Reasoning = memo(\n ({\n className,\n isStreaming = false,\n open,\n defaultOpen,\n onOpenChange,\n duration: durationProp,\n children,\n ...props\n }: ReasoningProps) => {\n // Reasoning blocks always start closed and never auto-open -- the user\n // explicitly clicks the trigger to expand. This keeps the chat quiet\n // during streaming and avoids forcing every historical Reasoning's\n // Streamdown to render on session replay.\n const resolvedDefaultOpen = defaultOpen ?? false;\n\n const [isOpen, setIsOpen] = useControllableState<boolean>({\n defaultProp: resolvedDefaultOpen,\n onChange: onOpenChange,\n prop: open,\n });\n const [duration, setDuration] = useControllableState<number | undefined>({\n defaultProp: undefined,\n prop: durationProp,\n });\n\n const startTimeRef = useRef<number | null>(null);\n\n // Track when streaming starts and compute duration. Sub-100ms flickers\n // (from replay) are ignored so stale \"Thought for 1 seconds\" labels\n // don't land on historical messages.\n useEffect(() => {\n if (isStreaming) {\n if (startTimeRef.current === null) {\n startTimeRef.current = Date.now();\n }\n } else if (startTimeRef.current !== null) {\n const elapsed = Date.now() - startTimeRef.current;\n startTimeRef.current = null;\n if (elapsed >= MIN_DURATION_MS) {\n setDuration(Math.ceil(elapsed / MS_IN_S));\n }\n }\n }, [isStreaming, setDuration]);\n\n const handleOpenChange = useCallback(\n (newOpen: boolean) => {\n setIsOpen(newOpen);\n },\n [setIsOpen]\n );\n\n const contextValue = useMemo(\n () => ({ duration, isOpen, isStreaming, setIsOpen }),\n [duration, isOpen, isStreaming, setIsOpen]\n );\n\n return (\n <ReasoningContext.Provider value={contextValue}>\n <Collapsible\n className={cn(\"not-prose\", className)}\n onOpenChange={handleOpenChange}\n open={isOpen}\n {...props}\n >\n {children}\n </Collapsible>\n </ReasoningContext.Provider>\n );\n }\n);\n\nexport type ReasoningTriggerProps = ComponentProps<\n typeof CollapsibleTrigger\n> & {\n getThinkingMessage?: (isStreaming: boolean, duration?: number) => ReactNode;\n};\n\nconst defaultGetThinkingMessage = (isStreaming: boolean, duration?: number) => {\n if (isStreaming || duration === 0) {\n return <Shimmer duration={1}>Thinking...</Shimmer>;\n }\n if (duration === undefined) {\n return <p className=\"text-foreground\">Thought for a few seconds</p>;\n }\n return <p className=\"text-foreground\">Thought for {duration} seconds</p>;\n};\n\nexport const ReasoningTrigger = memo(\n ({\n className,\n children,\n getThinkingMessage = defaultGetThinkingMessage,\n ...props\n }: ReasoningTriggerProps) => {\n const { isStreaming, isOpen, duration } = useReasoning();\n\n return (\n <CollapsibleTrigger\n className={cn(\n \"flex w-full items-center gap-2 text-muted-foreground text-sm transition-colors hover:text-foreground\",\n className\n )}\n {...props}\n >\n {children ?? (\n <>\n <span className=\"text-muted-foregound text-sm\">{getThinkingMessage(isStreaming, duration)}</span>\n <ChevronDownIcon\n className={cn(\n \"size-4 transition-transform\",\n isOpen ? \"rotate-180\" : \"rotate-0\"\n )}\n />\n </>\n )}\n </CollapsibleTrigger>\n );\n }\n);\n\nexport type ReasoningContentProps = ComponentProps<\n typeof CollapsibleContent\n> & {\n children: string;\n};\n\nconst streamdownPlugins = { cjk, code, math, mermaid };\n\nexport const ReasoningContent = memo(\n ({ className, children, ...props }: ReasoningContentProps) => (\n <CollapsibleContent\n className={cn(\n \"mt-4 text-sm\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-foreground/60 italic outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n className\n )}\n {...props}\n >\n <Streamdown plugins={streamdownPlugins}>{children}</Streamdown>\n </CollapsibleContent>\n )\n);\n\nReasoning.displayName = \"Reasoning\";\nReasoningTrigger.displayName = \"ReasoningTrigger\";\nReasoningContent.displayName = \"ReasoningContent\";\n","import {\n createContext,\n type HTMLAttributes,\n useCallback,\n useContext,\n useState,\n} from \"react\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\n// Types\ntype TimelineContextValue = {\n activeStep: number\n setActiveStep: (step: number) => void\n}\n\n// Context\nconst TimelineContext = createContext<TimelineContextValue | undefined>(\n undefined\n)\n\nconst useTimeline = () => {\n const context = useContext(TimelineContext)\n if (!context) {\n throw new Error(\"useTimeline must be used within a Timeline\")\n }\n return context\n}\n\n// Components\ninterface TimelineProps extends HTMLAttributes<HTMLDivElement> {\n defaultValue?: number\n value?: number\n onValueChange?: (value: number) => void\n orientation?: \"horizontal\" | \"vertical\"\n}\n\nfunction Timeline({\n defaultValue = 1,\n value,\n onValueChange,\n orientation = \"vertical\",\n className,\n children,\n ...props\n}: TimelineProps) {\n const [activeStep, setInternalStep] = useState(defaultValue)\n\n const setActiveStep = useCallback(\n (step: number) => {\n if (value === undefined) {\n setInternalStep(step)\n }\n onValueChange?.(step)\n },\n [value, onValueChange]\n )\n\n const currentStep = value ?? activeStep\n\n return (\n <TimelineContext.Provider\n value={{ activeStep: currentStep, setActiveStep }}\n >\n <div\n className={cn(\n \"group/timeline flex flex-col\",\n className\n )}\n data-orientation={orientation}\n data-slot=\"timeline\"\n {...props}\n >\n {children}\n </div>\n </TimelineContext.Provider>\n )\n}\n\n// TimelineContent\nfunction TimelineContent({\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"text-foreground text-sm min-w-0 overflow-hidden\", className)}\n data-slot=\"timeline-content\"\n {...props}\n />\n )\n}\n\n// TimelineDate\ninterface TimelineDateProps extends HTMLAttributes<HTMLTimeElement> {\n asChild?: boolean\n}\n\nfunction TimelineDate({\n asChild = false,\n className,\n ...props\n}: TimelineDateProps) {\n const Comp = asChild ? Slot.Root : \"time\"\n\n return (\n <Comp\n className={cn(\n \"text-muted-foreground mb-1 block text-xs font-medium max-sm:h-4\",\n className\n )}\n data-slot=\"timeline-date\"\n {...props}\n />\n )\n}\n\n// TimelineHeader\nfunction TimelineHeader({\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn(className)} data-slot=\"timeline-header\" {...props} />\n )\n}\n\n// TimelineIndicator\ninterface TimelineIndicatorProps extends HTMLAttributes<HTMLDivElement> {\n asChild?: boolean\n}\n\nfunction TimelineIndicator({\n asChild = false,\n className,\n children,\n ...props\n}: TimelineIndicatorProps) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n aria-hidden=\"true\"\n className={cn(\n \"border-primary/20 group-data-completed/timeline-item:border-primary absolute size-4 rounded-full border-2 top-1.25 -left-6 -translate-x-1/2\",\n className\n )}\n data-slot=\"timeline-indicator\"\n {...props}\n >\n {children}\n </Comp>\n )\n}\n\n// TimelineItem\ninterface TimelineItemProps extends HTMLAttributes<HTMLDivElement> {\n step: number\n}\n\nfunction TimelineItem({ step, className, ...props }: TimelineItemProps) {\n const { activeStep } = useTimeline()\n\n return (\n <div\n className={cn(\n \"group/timeline-item has-[+[data-completed]]:**:data-[slot=timeline-separator]:bg-primary relative flex flex-col gap-0.5 ms-8 not-last:pb-6\",\n className\n )}\n data-completed={step <= activeStep || undefined}\n data-slot=\"timeline-item\"\n {...props}\n />\n )\n}\n\n// TimelineSeparator\nfunction TimelineSeparator({\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n aria-hidden=\"true\"\n className={cn(\n \"bg-primary/10 absolute self-start group-last/timeline-item:hidden -left-6 h-[calc(100%-1rem-0.25rem)] w-0.5 -translate-x-1/2 translate-y-4.5\",\n className\n )}\n data-slot=\"timeline-separator\"\n {...props}\n />\n )\n}\n\n// TimelineTitle\nfunction TimelineTitle({\n className,\n ...props\n}: HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h3\n className={cn(\"text-sm font-medium\", className)}\n data-slot=\"timeline-title\"\n {...props}\n />\n )\n}\n\nexport {\n Timeline,\n TimelineContent,\n TimelineDate,\n TimelineHeader,\n TimelineIndicator,\n TimelineItem,\n TimelineSeparator,\n TimelineTitle,\n}","import { ZapIcon } from \"lucide-react\";\nimport type { ToolCallInfo } from \"../../types\";\n\ninterface BrowserActivityGroupProps {\n calls: ToolCallInfo[];\n}\n\nexport function BrowserActivityGroup({ calls }: BrowserActivityGroupProps) {\n return (\n <div className=\"flex items-center gap-2 border border-line bg-card px-3 py-2 text-xs\">\n <ZapIcon className=\"size-3 shrink-0 text-amber-500\" aria-hidden=\"true\" />\n <span className=\"shrink-0 font-semibold text-foreground\">Browser:</span>\n <span className=\"min-w-0 truncate text-muted-foreground\">\n {calls.map((call, index) => {\n const error = stringValue(parseJson(call.result).error);\n return (\n <span key={call.id}>\n {index > 0 && \", \"}\n <span\n className={error ? \"text-destructive\" : undefined}\n data-testid={error ? `activity-error-${call.id}` : undefined}\n title={error || undefined}\n >\n {summarize(call)}\n </span>\n </span>\n );\n })}\n </span>\n </div>\n );\n}\n\nfunction summarize(call: ToolCallInfo): string {\n const args = parseJson(call.args);\n const handler = ACTION_SUMMARIES[call.toolName];\n return handler ? handler(args) : call.toolName.replace(/^browser_/, \"\");\n}\n\nconst ACTION_SUMMARIES: Record<string, (args: Record<string, unknown>) => string> = {\n browser_navigate: (args) => `navigate to ${stringValue(args.url) || \"?\"}`,\n browser_get_state: () => \"get state\",\n browser_close: () => \"close\",\n browser_click: (args) => {\n const ref = stringValue(args.ref);\n if (ref) return `click ${ref}`;\n const x = asNumber(args.x);\n const y = asNumber(args.y);\n if (x !== null && y !== null) return `click (${x}, ${y})`;\n return \"click\";\n },\n browser_type: (args) => {\n const text = stringValue(args.text);\n const ref = stringValue(args.ref);\n const quoted = text ? `\"${truncateText(text)}\"` : \"\";\n if (!quoted) return ref ? `type into ${ref}` : \"type\";\n return ref ? `type ${quoted} into ${ref}` : `type ${quoted}`;\n },\n browser_press_key: (args) => {\n const keys = Array.isArray(args.keys) ? args.keys.map(String) : [];\n return keys.length ? `press ${keys.join(\"+\")}` : \"press key\";\n },\n browser_scroll: (args) => {\n const x = asNumber(args.x);\n const y = asNumber(args.y);\n const dx = asNumber(args.delta_x) ?? 0;\n const dy = asNumber(args.delta_y) ?? 0;\n const delta = dx || dy ? `Δ(${dx}, ${dy})` : \"\";\n const origin = x !== null && y !== null ? `at (${x}, ${y})` : \"\";\n return [\"scroll\", delta, origin].filter(Boolean).join(\" \");\n },\n browser_drag: (args) => {\n const path = Array.isArray(args.path) ? args.path : [];\n if (path.length < 2) return \"drag\";\n const first = path[0] as unknown[];\n const last = path[path.length - 1] as unknown[];\n const point = (p: unknown[]) =>\n `(${asNumber(p[0]) ?? \"?\"}, ${asNumber(p[1]) ?? \"?\"})`;\n return `drag ${point(first)} → ${point(last)}`;\n },\n browser_wait: (args) => {\n const ms = asNumber(args.ms);\n return ms === null ? \"wait\" : `wait ${ms}ms`;\n },\n browser_screenshot: (args) =>\n args.annotate === true ? \"screenshot (annotated)\" : \"screenshot\",\n};\n\nfunction truncateText(text: string, max = 32): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n\nfunction asNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction parseJson(raw?: string): Record<string, unknown> {\n if (!raw) return {};\n try {\n const parsed = JSON.parse(raw) as unknown;\n return typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : {};\n } catch {\n return {};\n }\n}\n\nfunction stringValue(value: unknown): string {\n return typeof value === \"string\" ? value : \"\";\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Shared utilities for tool call renderers.\n\n/**\n * Map a tool-call status to a Tailwind background-color class for use\n * as a TimelineIndicator color.\n */\nexport function statusColorClass(status: ToolStatus): string {\n if (status === \"running\") return \"bg-primary animate-pulse\";\n if (status === \"error\") return \"bg-red-500\";\n if (status === \"cancelled\") return \"bg-muted-foreground/40\";\n return \"bg-emerald-500\";\n}\n\nexport type ToolStatus = \"running\" | \"complete\" | \"error\" | \"cancelled\";\n\n/**\n * Derive the effective status from a tool call. Cancelled siblings\n * (parallel-batch cancellations) are distinguished from genuine errors\n * so the timeline dot reads as muted rather than red.\n */\nexport function effectiveStatus(tc: {\n status: \"running\" | \"complete\" | \"error\";\n result?: string;\n cancelled?: boolean;\n}): ToolStatus {\n if (tc.cancelled) return \"cancelled\";\n if (tc.status !== \"complete\" || !tc.result) return tc.status;\n try {\n const parsed = JSON.parse(tc.result);\n if (parsed?.exit_code !== undefined && parsed.exit_code !== 0) return \"error\";\n if (parsed?.error) return \"error\";\n if (parsed?.status === \"blocked\" || parsed?.status === \"error\") return \"error\";\n if (parsed?.success === false) return \"error\";\n } catch { /* ignore */ }\n return \"complete\";\n}\n\nexport function formatArgs(args: string): string {\n try {\n return JSON.stringify(JSON.parse(args), null, 2);\n } catch {\n return args;\n }\n}\n\nexport function parseArgs<T = Record<string, unknown>>(args: string): T | null {\n try {\n return JSON.parse(args) as T;\n } catch {\n return null;\n }\n}\n\nexport function truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max) + \"\\n... (truncated)\" : s;\n}\n\nexport function toolErrorSummary(result: string | undefined, max = 180): string {\n if (!result) return \"\";\n try {\n const parsed = JSON.parse(result);\n const error = typeof parsed?.error === \"string\" ? parsed.error : \"\";\n if (error === \"sandbox_unavailable\") {\n return \"Sandbox is unavailable. Workspace commands cannot run right now.\";\n }\n const reason = typeof parsed?.reason === \"string\" ? parsed.reason : \"\";\n const message = typeof parsed?.message === \"string\" ? parsed.message : \"\";\n const detail = reason || message;\n const summary = error && detail && detail !== error\n ? `${error}: ${detail}`\n : error || detail;\n return summary ? summary.replace(/\\s+/g, \" \").slice(0, max) : \"\";\n } catch {\n return \"\";\n }\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\nimport { useState } from \"react\";\nimport {\n CheckCircle2Icon,\n ChevronDownIcon,\n CopyIcon,\n} from \"lucide-react\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../../ui/collapsible\";\nimport { Shimmer } from \"../../ai-elements/shimmer\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ToolCallInfo } from \"../../../types\";\nimport { toolErrorSummary } from \"./shared\";\n\n\nfunction CopyButton({ text }: { text: string }) {\n const [copied, setCopied] = useState(false);\n return (\n <button\n type=\"button\"\n className=\"shrink-0 p-0.5 rounded opacity-0 group-hover/in:opacity-100 transition-opacity text-muted-foreground hover:text-foreground\"\n onClick={(e) => {\n e.stopPropagation();\n void navigator.clipboard.writeText(text).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }}\n aria-label=\"Copy command\"\n >\n {copied ? <CheckCircle2Icon className=\"size-3\" /> : <CopyIcon className=\"size-3\" />}\n </button>\n );\n}\n\ninterface TerminalResult {\n output: string;\n exit_code: number;\n error: string | null;\n command: string;\n}\n\nexport function parseTerminalResult(\n result: string | undefined,\n args: string,\n): TerminalResult | null {\n if (!result) return null;\n try {\n let parsed = JSON.parse(result);\n\n // Unwrap double-wrapped results: the sandbox may return\n // {\"stdout\": \"{\\\"output\\\": \\\"...\\\", \\\"exit_code\\\": 0}\"} where\n // stdout contains the actual tool handler result as a JSON string.\n if (typeof parsed?.stdout === \"string\" && parsed.stdout.startsWith(\"{\")) {\n try {\n const inner = JSON.parse(parsed.stdout);\n if (inner?.output !== undefined || inner?.exit_code !== undefined) {\n parsed = inner;\n }\n } catch { /* not nested JSON, use as-is */ }\n }\n\n const hasOutput = typeof parsed?.output === \"string\";\n const hasStdout = typeof parsed?.stdout === \"string\";\n const hasExitCode = typeof parsed?.exit_code === \"number\";\n const errorSummary = toolErrorSummary(result, 400);\n if (!hasOutput && !hasStdout && !hasExitCode && !errorSummary) {\n return null;\n }\n let command = \"\";\n try {\n const parsedArgs = JSON.parse(args);\n command = parsedArgs?.command ?? \"\";\n } catch { /* ignore */ }\n const output = parsed.output ?? parsed.stdout ?? \"\";\n const stderr = parsed.stderr ?? errorSummary;\n const combined = stderr ? `${output}\\n${stderr}`.trim() : output;\n return {\n output: combined,\n exit_code: parsed.exit_code ?? (errorSummary ? 1 : 0),\n error: errorSummary || null,\n command,\n };\n } catch {\n return null;\n }\n}\n\ninterface TerminalBodyProps {\n command: string;\n output: string;\n isRunning: boolean;\n hasError?: boolean;\n}\n\nfunction TerminalCollapsible({ command, output, isRunning, hasError }: TerminalBodyProps) {\n // Terminal stays collapsed until the user clicks the trigger -- unlike\n // Reasoning, the terminal's output is rarely scannable at a glance and\n // auto-expanding every call floods the chat with noise. The trigger\n // still shows a shimmer while running so progress is visible.\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <Collapsible\n open={isOpen}\n onOpenChange={setIsOpen}\n className=\"not-prose w-full\"\n >\n <CollapsibleTrigger className=\"group/trigger flex w-fit items-center gap-2 text-sm transition-colors\">\n <span className=\"text-left\">\n {isRunning ? (\n <Shimmer as=\"span\" duration={1}>Running command...</Shimmer>\n ) : hasError ? (\n <span className=\"font-semibold text-destructive\">Command failed</span>\n ) : (\n <span className=\"font-semibold text-foreground\">Command</span>\n )}\n </span>\n <ChevronDownIcon\n className={cn(\n \"size-4 shrink-0 transition-transform\",\n isOpen ? \"rotate-180\" : \"rotate-0\",\n )}\n />\n </CollapsibleTrigger>\n <CollapsibleContent\n className={cn(\n \"mt-2 overflow-hidden\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n )}\n >\n <div className=\"rounded-lg border border-border overflow-hidden\">\n {command && (\n <div className=\"group/in flex items-start gap-2 bg-background text-muted-foreground px-3 py-2 font-mono text-sm leading-relaxed\">\n <span className=\"shrink-0 select-none text-emerald-600\">IN</span>\n <pre className=\"whitespace-pre-wrap wrap-break-word text-foreground/90 flex-1\">{command}</pre>\n <CopyButton text={command} />\n </div>\n )}\n <div\n className={cn(\n \"px-3 py-2 bg-background font-mono text-sm leading-relaxed max-h-96 overflow-auto\",\n command && \"border-t border-border\",\n )}\n >\n {(output || !isRunning) && (\n <div className=\"flex gap-2 text-foreground/90\">\n <span className=\"shrink-0 select-none text-sky-600\">OUT</span>\n <pre className=\"whitespace-pre-wrap wrap-break-word flex-1\">\n {output || <span className=\"text-muted-foreground/60\">(no output)</span>}\n </pre>\n </div>\n )}\n {isRunning && !output && (\n <span className=\"ml-0.5 inline-block h-3.5 w-1.5 animate-pulse bg-foreground\" />\n )}\n </div>\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nexport function TerminalToolBlock({ tc }: { tc: ToolCallInfo }) {\n const isRunning = tc.status === \"running\";\n const result = parseTerminalResult(tc.result, tc.args);\n\n if (result) {\n const hasError = result.exit_code !== 0 || Boolean(result.error);\n if (hasError) return null;\n const output = result.output || \"\";\n return (\n <TerminalCollapsible\n command={result.command}\n output={output}\n isRunning={isRunning}\n hasError={false}\n />\n );\n }\n\n if (isRunning) {\n let command = \"\";\n try {\n const parsedArgs = JSON.parse(tc.args);\n command = parsedArgs?.command ?? \"\";\n } catch { /* ignore */ }\n\n return <TerminalCollapsible command={command} output=\"\" isRunning />;\n }\n\n return null;\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { ScrollArea as ScrollAreaPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n )\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n data-orientation={orientation}\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-none bg-border\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n )\n}\n\nexport { ScrollArea, ScrollBar }\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../ui/collapsible\";\nimport { ScrollArea } from \"../ui/scroll-area\";\nimport { cn } from \"../../lib/utils\";\nimport { ChevronDownIcon, PaperclipIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\n\nexport interface QueueMessagePart {\n type: string;\n text?: string;\n url?: string;\n filename?: string;\n mediaType?: string;\n}\n\nexport interface QueueMessage {\n id: string;\n parts: QueueMessagePart[];\n}\n\nexport interface QueueTodo {\n id: string;\n title: string;\n description?: string;\n status?: \"pending\" | \"completed\";\n}\n\nexport type QueueItemProps = ComponentProps<\"li\">;\n\nexport const QueueItem = ({ className, ...props }: QueueItemProps) => (\n <li\n className={cn(\n \"group flex flex-col gap-1 rounded-md px-3 py-1 text-sm transition-colors hover:bg-muted\",\n className\n )}\n {...props}\n />\n);\n\nexport type QueueItemIndicatorProps = ComponentProps<\"span\"> & {\n completed?: boolean;\n};\n\nexport const QueueItemIndicator = ({\n completed = false,\n className,\n ...props\n}: QueueItemIndicatorProps) => (\n <span\n className={cn(\n \"mt-0.5 inline-block size-2.5 rounded-full border\",\n completed\n ? \"border-muted-foreground/20 bg-muted-foreground/10\"\n : \"border-muted-foreground/50\",\n className\n )}\n {...props}\n />\n);\n\nexport type QueueItemContentProps = ComponentProps<\"span\"> & {\n completed?: boolean;\n};\n\nexport const QueueItemContent = ({\n completed = false,\n className,\n ...props\n}: QueueItemContentProps) => (\n <span\n className={cn(\n \"line-clamp-1 grow break-words\",\n completed\n ? \"text-muted-foreground/50 line-through\"\n : \"text-muted-foreground\",\n className\n )}\n {...props}\n />\n);\n\nexport type QueueItemDescriptionProps = ComponentProps<\"div\"> & {\n completed?: boolean;\n};\n\nexport const QueueItemDescription = ({\n completed = false,\n className,\n ...props\n}: QueueItemDescriptionProps) => (\n <div\n className={cn(\n \"ml-6 text-xs\",\n completed\n ? \"text-muted-foreground/40 line-through\"\n : \"text-muted-foreground\",\n className\n )}\n {...props}\n />\n);\n\nexport type QueueItemActionsProps = ComponentProps<\"div\">;\n\nexport const QueueItemActions = ({\n className,\n ...props\n}: QueueItemActionsProps) => (\n <div className={cn(\"flex gap-1\", className)} {...props} />\n);\n\nexport type QueueItemActionProps = Omit<\n ComponentProps<typeof Button>,\n \"variant\" | \"size\"\n>;\n\nexport const QueueItemAction = ({\n className,\n ...props\n}: QueueItemActionProps) => (\n <Button\n className={cn(\n \"size-auto rounded p-1 text-muted-foreground opacity-0 transition-opacity hover:bg-muted-foreground/10 hover:text-foreground group-hover:opacity-100\",\n className\n )}\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n {...props}\n />\n);\n\nexport type QueueItemAttachmentProps = ComponentProps<\"div\">;\n\nexport const QueueItemAttachment = ({\n className,\n ...props\n}: QueueItemAttachmentProps) => (\n <div className={cn(\"mt-1 flex flex-wrap gap-2\", className)} {...props} />\n);\n\nexport type QueueItemImageProps = ComponentProps<\"img\">;\n\nexport const QueueItemImage = ({\n className,\n ...props\n}: QueueItemImageProps) => (\n <img\n alt=\"\"\n className={cn(\"h-8 w-8 rounded border object-cover\", className)}\n height={32}\n width={32}\n {...props}\n />\n);\n\nexport type QueueItemFileProps = ComponentProps<\"span\">;\n\nexport const QueueItemFile = ({\n children,\n className,\n ...props\n}: QueueItemFileProps) => (\n <span\n className={cn(\n \"flex items-center gap-1 rounded border bg-muted px-2 py-1 text-xs\",\n className\n )}\n {...props}\n >\n <PaperclipIcon size={12} />\n <span className=\"max-w-[100px] truncate\">{children}</span>\n </span>\n);\n\nexport type QueueListProps = ComponentProps<typeof ScrollArea>;\n\nexport const QueueList = ({\n children,\n className,\n ...props\n}: QueueListProps) => (\n <ScrollArea className={cn(\"mt-2 -mb-1\", className)} {...props}>\n <div className=\"max-h-40 pr-4\">\n <ul>{children}</ul>\n </div>\n </ScrollArea>\n);\n\n// QueueSection - collapsible section container\nexport type QueueSectionProps = ComponentProps<typeof Collapsible>;\n\nexport const QueueSection = ({\n className,\n defaultOpen = true,\n ...props\n}: QueueSectionProps) => (\n <Collapsible className={cn(className)} defaultOpen={defaultOpen} {...props} />\n);\n\n// QueueSectionTrigger - section header/trigger\nexport type QueueSectionTriggerProps = ComponentProps<\"button\">;\n\nexport const QueueSectionTrigger = ({\n children,\n className,\n ...props\n}: QueueSectionTriggerProps) => (\n <CollapsibleTrigger asChild>\n <button\n className={cn(\n \"group flex w-full items-center justify-between rounded-md bg-muted/40 px-3 py-2 text-left font-medium text-muted-foreground text-sm transition-colors hover:bg-muted\",\n className\n )}\n type=\"button\"\n {...props}\n >\n {children}\n </button>\n </CollapsibleTrigger>\n);\n\n// QueueSectionLabel - label content with icon and count\nexport type QueueSectionLabelProps = ComponentProps<\"span\"> & {\n count?: number;\n label: string;\n icon?: React.ReactNode;\n};\n\nexport const QueueSectionLabel = ({\n count,\n label,\n icon,\n className,\n ...props\n}: QueueSectionLabelProps) => (\n <span className={cn(\"flex items-center gap-2\", className)} {...props}>\n <ChevronDownIcon className=\"size-4 transition-transform group-data-[state=closed]:-rotate-90\" />\n {icon}\n <span>\n {count} {label}\n </span>\n </span>\n);\n\n// QueueSectionContent - collapsible content area\nexport type QueueSectionContentProps = ComponentProps<\n typeof CollapsibleContent\n>;\n\nexport const QueueSectionContent = ({\n className,\n ...props\n}: QueueSectionContentProps) => (\n <CollapsibleContent className={cn(className)} {...props} />\n);\n\nexport type QueueProps = ComponentProps<\"div\">;\n\nexport const Queue = ({ className, ...props }: QueueProps) => (\n <div\n className={cn(\n \"flex flex-col gap-2 rounded-xl border border-border bg-background px-3 pt-2 pb-2 shadow-xs\",\n className\n )}\n {...props}\n />\n);\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\nimport { Loader2Icon, ListTodoIcon } from \"lucide-react\";\nimport {\n Queue,\n QueueItem,\n QueueItemContent,\n QueueItemDescription,\n QueueItemIndicator,\n QueueList,\n QueueSection,\n QueueSectionContent,\n QueueSectionLabel,\n QueueSectionTrigger,\n} from \"../../ai-elements/queue\";\nimport type { ToolCallInfo } from \"../../../types\";\n\ninterface TodoItem {\n id: string;\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n description?: string;\n}\n\nexport function parseTodoResult(result: string | undefined): TodoItem[] | null {\n if (!result) return null;\n try {\n const parsed = JSON.parse(result);\n const todos = parsed?.todos ?? parsed;\n if (!Array.isArray(todos)) return null;\n if (todos.length === 0) return null;\n if (!todos.every((t: unknown) =>\n typeof t === \"object\" && t !== null &&\n \"id\" in t && \"content\" in t && \"status\" in t\n )) return null;\n return todos as TodoItem[];\n } catch {\n return null;\n }\n}\n\nexport function TodoToolBlock({ tc }: { tc: ToolCallInfo }) {\n const todos = parseTodoResult(tc.result);\n if (!todos) return null;\n\n const completed = todos.filter((t) => t.status === \"completed\").length;\n const total = todos.length;\n\n return (\n <Queue>\n <QueueSection>\n <QueueSectionTrigger>\n <QueueSectionLabel\n count={total}\n label={`tasks (${completed}/${total} done)`}\n icon={<ListTodoIcon className=\"size-3.5\" />}\n />\n </QueueSectionTrigger>\n <QueueSectionContent>\n <QueueList>\n {todos.map((todo) => {\n const isCompleted = todo.status === \"completed\";\n const isInProgress = todo.status === \"in_progress\";\n return (\n <QueueItem key={todo.id}>\n <div className=\"flex items-center gap-2\">\n {isInProgress ? (\n <Loader2Icon className=\"size-2.5 animate-spin text-primary shrink-0\" />\n ) : (\n <QueueItemIndicator completed={isCompleted} />\n )}\n <QueueItemContent completed={isCompleted}>\n {todo.content}\n </QueueItemContent>\n </div>\n {todo.description && (\n <QueueItemDescription completed={isCompleted}>\n {todo.description}\n </QueueItemDescription>\n )}\n </QueueItem>\n );\n })}\n </QueueList>\n </QueueSectionContent>\n </QueueSection>\n </Queue>\n );\n}\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport { cn } from \"../../lib/utils\";\nimport { CheckIcon, CopyIcon } from \"lucide-react\";\nimport type { ComponentProps, CSSProperties, HTMLAttributes } from \"react\";\nimport {\n createContext,\n memo,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n BundledLanguage,\n BundledTheme,\n HighlighterGeneric,\n ThemedToken,\n} from \"shiki\";\nimport { createHighlighter } from \"shiki\";\n\n// Shiki uses bitflags for font styles: 1=italic, 2=bold, 4=underline\n// oxlint-disable-next-line eslint(no-bitwise)\nconst isItalic = (fontStyle: number | undefined) => fontStyle && fontStyle & 1;\n// oxlint-disable-next-line eslint(no-bitwise)\nconst isBold = (fontStyle: number | undefined) => fontStyle && fontStyle & 2;\nconst isUnderline = (fontStyle: number | undefined) =>\n // oxlint-disable-next-line eslint(no-bitwise)\n fontStyle && fontStyle & 4;\n\n// Transform tokens to include pre-computed keys to avoid noArrayIndexKey lint\ninterface KeyedToken {\n token: ThemedToken;\n key: string;\n}\ninterface KeyedLine {\n tokens: KeyedToken[];\n key: string;\n}\n\nconst addKeysToTokens = (lines: ThemedToken[][]): KeyedLine[] =>\n lines.map((line, lineIdx) => ({\n key: `line-${lineIdx}`,\n tokens: line.map((token, tokenIdx) => ({\n key: `line-${lineIdx}-${tokenIdx}`,\n token,\n })),\n }));\n\n// Token rendering component\nconst TokenSpan = ({ token }: { token: ThemedToken }) => (\n <span\n className=\"dark:!bg-[var(--shiki-dark-bg)] dark:!text-[var(--shiki-dark)]\"\n style={\n {\n backgroundColor: token.bgColor,\n color: token.color,\n fontStyle: isItalic(token.fontStyle) ? \"italic\" : undefined,\n fontWeight: isBold(token.fontStyle) ? \"bold\" : undefined,\n textDecoration: isUnderline(token.fontStyle) ? \"underline\" : undefined,\n ...token.htmlStyle,\n } as CSSProperties\n }\n >\n {token.content}\n </span>\n);\n\n// Line number styles using CSS counters\nconst LINE_NUMBER_CLASSES = cn(\n \"block\",\n \"before:content-[counter(line)]\",\n \"before:inline-block\",\n \"before:[counter-increment:line]\",\n \"before:w-8\",\n \"before:mr-4\",\n \"before:text-right\",\n \"before:text-muted-foreground/50\",\n \"before:font-mono\",\n \"before:select-none\"\n);\n\n// Line rendering component\nconst LineSpan = ({\n keyedLine,\n showLineNumbers,\n}: {\n keyedLine: KeyedLine;\n showLineNumbers: boolean;\n}) => (\n <span className={showLineNumbers ? LINE_NUMBER_CLASSES : \"block\"}>\n {keyedLine.tokens.length === 0\n ? \"\\n\"\n : keyedLine.tokens.map(({ token, key }) => (\n <TokenSpan key={key} token={token} />\n ))}\n </span>\n);\n\n// Types\ntype CodeBlockProps = HTMLAttributes<HTMLDivElement> & {\n code: string;\n language: BundledLanguage;\n showLineNumbers?: boolean;\n};\n\ninterface TokenizedCode {\n tokens: ThemedToken[][];\n fg: string;\n bg: string;\n}\n\ninterface CodeBlockContextType {\n code: string;\n}\n\n// Context\nconst CodeBlockContext = createContext<CodeBlockContextType>({\n code: \"\",\n});\n\n// Highlighter cache (singleton per language)\nconst highlighterCache = new Map<\n string,\n Promise<HighlighterGeneric<BundledLanguage, BundledTheme>>\n>();\n\n// Token cache\nconst tokensCache = new Map<string, TokenizedCode>();\n\n// Subscribers for async token updates\nconst subscribers = new Map<string, Set<(result: TokenizedCode) => void>>();\n\nconst getTokensCacheKey = (code: string, language: BundledLanguage) => {\n const start = code.slice(0, 100);\n const end = code.length > 100 ? code.slice(-100) : \"\";\n return `${language}:${code.length}:${start}:${end}`;\n};\n\nconst getHighlighter = (\n language: BundledLanguage\n): Promise<HighlighterGeneric<BundledLanguage, BundledTheme>> => {\n const cached = highlighterCache.get(language);\n if (cached) {\n return cached;\n }\n\n const highlighterPromise = createHighlighter({\n langs: [language],\n themes: [\"github-light\", \"github-dark\"],\n });\n\n highlighterCache.set(language, highlighterPromise);\n return highlighterPromise;\n};\n\n// Create raw tokens for immediate display while highlighting loads\nconst createRawTokens = (code: string): TokenizedCode => ({\n bg: \"transparent\",\n fg: \"inherit\",\n tokens: code.split(\"\\n\").map((line) =>\n line === \"\"\n ? []\n : [\n {\n color: \"inherit\",\n content: line,\n } as ThemedToken,\n ]\n ),\n});\n\n// Synchronous highlight with callback for async results\nexport const highlightCode = (\n code: string,\n language: BundledLanguage,\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-callbacks)\n callback?: (result: TokenizedCode) => void\n): TokenizedCode | null => {\n const tokensCacheKey = getTokensCacheKey(code, language);\n\n // Return cached result if available\n const cached = tokensCache.get(tokensCacheKey);\n if (cached) {\n return cached;\n }\n\n // Subscribe callback if provided\n if (callback) {\n if (!subscribers.has(tokensCacheKey)) {\n subscribers.set(tokensCacheKey, new Set());\n }\n subscribers.get(tokensCacheKey)?.add(callback);\n }\n\n // Start highlighting in background - fire-and-forget async pattern\n getHighlighter(language)\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-then)\n .then((highlighter) => {\n const availableLangs = highlighter.getLoadedLanguages();\n const langToUse = availableLangs.includes(language) ? language : \"text\";\n\n const result = highlighter.codeToTokens(code, {\n lang: langToUse,\n themes: {\n dark: \"github-dark\",\n light: \"github-light\",\n },\n });\n\n const tokenized: TokenizedCode = {\n bg: result.bg ?? \"transparent\",\n fg: result.fg ?? \"inherit\",\n tokens: result.tokens,\n };\n\n // Cache the result\n tokensCache.set(tokensCacheKey, tokenized);\n\n // Notify all subscribers\n const subs = subscribers.get(tokensCacheKey);\n if (subs) {\n for (const sub of subs) {\n sub(tokenized);\n }\n subscribers.delete(tokensCacheKey);\n }\n })\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-then), eslint-plugin-promise(prefer-await-to-callbacks)\n .catch((error) => {\n console.error(\"Failed to highlight code:\", error);\n subscribers.delete(tokensCacheKey);\n });\n\n return null;\n};\n\nconst CodeBlockBody = memo(\n ({\n tokenized,\n showLineNumbers,\n className,\n }: {\n tokenized: TokenizedCode;\n showLineNumbers: boolean;\n className?: string;\n }) => {\n const preStyle = useMemo(\n () => ({\n backgroundColor: tokenized.bg,\n color: tokenized.fg,\n }),\n [tokenized.bg, tokenized.fg]\n );\n\n const keyedLines = useMemo(\n () => addKeysToTokens(tokenized.tokens),\n [tokenized.tokens]\n );\n\n return (\n <pre\n className={cn(\n \"dark:!bg-[var(--shiki-dark-bg)] dark:!text-[var(--shiki-dark)] m-0 p-4 text-sm\",\n className\n )}\n style={preStyle}\n >\n <code\n className={cn(\n \"font-mono text-sm\",\n showLineNumbers && \"[counter-increment:line_0] [counter-reset:line]\"\n )}\n >\n {keyedLines.map((keyedLine) => (\n <LineSpan\n key={keyedLine.key}\n keyedLine={keyedLine}\n showLineNumbers={showLineNumbers}\n />\n ))}\n </code>\n </pre>\n );\n },\n (prevProps, nextProps) =>\n prevProps.tokenized === nextProps.tokenized &&\n prevProps.showLineNumbers === nextProps.showLineNumbers &&\n prevProps.className === nextProps.className\n);\n\nCodeBlockBody.displayName = \"CodeBlockBody\";\n\nexport const CodeBlockContainer = ({\n className,\n language,\n style,\n ...props\n}: HTMLAttributes<HTMLDivElement> & { language: string }) => (\n <div\n className={cn(\n \"group relative w-full overflow-hidden rounded-md border bg-background text-foreground\",\n className\n )}\n data-language={language}\n style={{\n containIntrinsicSize: \"auto 200px\",\n contentVisibility: \"auto\",\n ...style,\n }}\n {...props}\n />\n);\n\nexport const CodeBlockHeader = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex items-center justify-between border-b bg-muted/80 px-3 py-2 text-muted-foreground text-xs\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n);\n\nexport const CodeBlockTitle = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex items-center gap-2\", className)} {...props}>\n {children}\n </div>\n);\n\nexport const CodeBlockFilename = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLSpanElement>) => (\n <span className={cn(\"font-mono\", className)} {...props}>\n {children}\n </span>\n);\n\nexport const CodeBlockActions = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"-my-1 -mr-1 flex items-center gap-2\", className)}\n {...props}\n >\n {children}\n </div>\n);\n\nexport const CodeBlockContent = ({\n code,\n language,\n showLineNumbers = false,\n}: {\n code: string;\n language: BundledLanguage;\n showLineNumbers?: boolean;\n}) => {\n // Memoized raw tokens for immediate display\n const rawTokens = useMemo(() => createRawTokens(code), [code]);\n\n // Synchronous cache lookup — avoids setState in effect for cached results\n const syncTokens = useMemo(\n () => highlightCode(code, language) ?? rawTokens,\n [code, language, rawTokens]\n );\n\n // Async highlighting result (populated after shiki loads)\n const [asyncTokens, setAsyncTokens] = useState<TokenizedCode | null>(null);\n const asyncKeyRef = useRef({ code, language });\n\n // Invalidate stale async tokens synchronously during render\n if (\n asyncKeyRef.current.code !== code ||\n asyncKeyRef.current.language !== language\n ) {\n asyncKeyRef.current = { code, language };\n setAsyncTokens(null);\n }\n\n useEffect(() => {\n let cancelled = false;\n\n highlightCode(code, language, (result) => {\n if (!cancelled) {\n setAsyncTokens(result);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [code, language]);\n\n const tokenized = asyncTokens ?? syncTokens;\n\n return (\n <div className=\"relative overflow-auto\">\n <CodeBlockBody showLineNumbers={showLineNumbers} tokenized={tokenized} />\n </div>\n );\n};\n\nexport const CodeBlock = ({\n code,\n language,\n showLineNumbers = false,\n className,\n children,\n ...props\n}: CodeBlockProps) => {\n const contextValue = useMemo(() => ({ code }), [code]);\n\n return (\n <CodeBlockContext.Provider value={contextValue}>\n <CodeBlockContainer className={className} language={language} {...props}>\n {children}\n <CodeBlockContent\n code={code}\n language={language}\n showLineNumbers={showLineNumbers}\n />\n </CodeBlockContainer>\n </CodeBlockContext.Provider>\n );\n};\n\nexport type CodeBlockCopyButtonProps = ComponentProps<typeof Button> & {\n onCopy?: () => void;\n onError?: (error: Error) => void;\n timeout?: number;\n};\n\nexport const CodeBlockCopyButton = ({\n onCopy,\n onError,\n timeout = 2000,\n children,\n className,\n ...props\n}: CodeBlockCopyButtonProps) => {\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<number>(0);\n const { code } = useContext(CodeBlockContext);\n\n const copyToClipboard = useCallback(async () => {\n if (typeof window === \"undefined\" || !navigator?.clipboard?.writeText) {\n onError?.(new Error(\"Clipboard API not available\"));\n return;\n }\n\n try {\n if (!isCopied) {\n await navigator.clipboard.writeText(code);\n setIsCopied(true);\n onCopy?.();\n timeoutRef.current = window.setTimeout(\n () => setIsCopied(false),\n timeout\n );\n }\n } catch (error) {\n onError?.(error as Error);\n }\n }, [code, onCopy, onError, timeout, isCopied]);\n\n useEffect(\n () => () => {\n window.clearTimeout(timeoutRef.current);\n },\n []\n );\n\n const Icon = isCopied ? CheckIcon : CopyIcon;\n\n return (\n <Button\n className={cn(\"shrink-0\", className)}\n onClick={copyToClipboard}\n size=\"icon\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <Icon size={14} />}\n </Button>\n );\n};\n\nexport type CodeBlockLanguageSelectorProps = ComponentProps<typeof Select>;\n\nexport const CodeBlockLanguageSelector = (\n props: CodeBlockLanguageSelectorProps\n) => <Select {...props} />;\n\nexport type CodeBlockLanguageSelectorTriggerProps = ComponentProps<\n typeof SelectTrigger\n>;\n\nexport const CodeBlockLanguageSelectorTrigger = ({\n className,\n ...props\n}: CodeBlockLanguageSelectorTriggerProps) => (\n <SelectTrigger\n className={cn(\n \"h-7 border-none bg-transparent px-2 text-xs shadow-none\",\n className\n )}\n size=\"sm\"\n {...props}\n />\n);\n\nexport type CodeBlockLanguageSelectorValueProps = ComponentProps<\n typeof SelectValue\n>;\n\nexport const CodeBlockLanguageSelectorValue = (\n props: CodeBlockLanguageSelectorValueProps\n) => <SelectValue {...props} />;\n\nexport type CodeBlockLanguageSelectorContentProps = ComponentProps<\n typeof SelectContent\n>;\n\nexport const CodeBlockLanguageSelectorContent = ({\n align = \"end\",\n ...props\n}: CodeBlockLanguageSelectorContentProps) => (\n <SelectContent align={align} {...props} />\n);\n\nexport type CodeBlockLanguageSelectorItemProps = ComponentProps<\n typeof SelectItem\n>;\n\nexport const CodeBlockLanguageSelectorItem = (\n props: CodeBlockLanguageSelectorItemProps\n) => <SelectItem {...props} />;\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Tabs as TabsPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(\n \"group/tabs flex gap-2 data-horizontal:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst tabsListVariants = cva(\n \"group/tabs-list inline-flex w-fit items-center justify-center p-1 text-muted-foreground group-data-horizontal/tabs:h-10 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n line: \"gap-1 bg-transparent\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction TabsList({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List> &\n VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction TabsTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n \"relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-2 border border-transparent px-4 py-1.5 text-xs font-semibold tracking-wider whitespace-nowrap text-foreground/60 uppercase transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start group-data-vertical/tabs:px-4 group-data-vertical/tabs:py-2 hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-2.5 has-data-[icon=inline-start]:pl-2.5 dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5\",\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent\",\n \"data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground\",\n \"after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsContent({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn(\"flex-1 text-sm outline-none\", className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }\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 badgeVariants = cva(\n \"group/badge inline-flex w-fit shrink-0 items-center justify-center gap-1.5 overflow-hidden rounded-none border-0 bg-transparent px-0 py-0 text-[0.625rem] font-semibold tracking-widest whitespace-nowrap uppercase transition-colors focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-0 has-data-[icon=inline-start]:pl-0 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!\",\n {\n variants: {\n variant: {\n default: \"text-foreground [a]:hover:text-foreground/70\",\n secondary: \"text-muted-foreground [a]:hover:text-foreground\",\n destructive:\n \"text-destructive focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:text-destructive/70\",\n outline: \"text-foreground [a]:hover:text-foreground/70\",\n ghost: \"text-muted-foreground hover:text-foreground\",\n link: \"text-foreground underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","\"use client\";\n\nimport { Badge } from \"../ui/badge\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../ui/collapsible\";\nimport { cn } from \"../../lib/utils\";\nimport type { DynamicToolUIPart, ToolUIPart } from \"ai\";\nimport {\n CheckCircleIcon,\n ChevronDownIcon,\n CircleIcon,\n ClockIcon,\n WrenchIcon,\n XCircleIcon,\n} from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { isValidElement } from \"react\";\n\nimport { CodeBlock } from \"./code-block\";\n\nexport type ToolProps = ComponentProps<typeof Collapsible>;\n\nexport const Tool = ({ className, ...props }: ToolProps) => (\n <Collapsible\n className={cn(\"group not-prose mb-4 w-full rounded-md border\", className)}\n {...props}\n />\n);\n\nexport type ToolPart = ToolUIPart | DynamicToolUIPart;\n\nexport type ToolHeaderProps = {\n title?: string;\n className?: string;\n} & (\n | { type: ToolUIPart[\"type\"]; state: ToolUIPart[\"state\"]; toolName?: never }\n | {\n type: DynamicToolUIPart[\"type\"];\n state: DynamicToolUIPart[\"state\"];\n toolName: string;\n }\n);\n\nconst statusLabels: Record<ToolPart[\"state\"], string> = {\n \"approval-requested\": \"Awaiting Approval\",\n \"approval-responded\": \"Responded\",\n \"input-available\": \"Running\",\n \"input-streaming\": \"Pending\",\n \"output-available\": \"Completed\",\n \"output-denied\": \"Denied\",\n \"output-error\": \"Error\",\n};\n\nconst statusIcons: Record<ToolPart[\"state\"], ReactNode> = {\n \"approval-requested\": <ClockIcon className=\"size-4 text-yellow-600\" />,\n \"approval-responded\": <CheckCircleIcon className=\"size-4 text-blue-600\" />,\n \"input-available\": <ClockIcon className=\"size-4 animate-pulse\" />,\n \"input-streaming\": <CircleIcon className=\"size-4\" />,\n \"output-available\": <CheckCircleIcon className=\"size-4 text-green-600\" />,\n \"output-denied\": <XCircleIcon className=\"size-4 text-orange-600\" />,\n \"output-error\": <XCircleIcon className=\"size-4 text-red-600\" />,\n};\n\nexport const getStatusBadge = (status: ToolPart[\"state\"]) => (\n <Badge className=\"gap-1.5 rounded-full text-xs\" variant=\"secondary\">\n {statusIcons[status]}\n {statusLabels[status]}\n </Badge>\n);\n\nexport const ToolHeader = ({\n className,\n title,\n type,\n state,\n toolName,\n ...props\n}: ToolHeaderProps) => {\n const derivedName =\n type === \"dynamic-tool\" ? toolName : type.split(\"-\").slice(1).join(\"-\");\n\n return (\n <CollapsibleTrigger\n className={cn(\n \"flex w-full items-center justify-between gap-4 p-3\",\n className\n )}\n {...props}\n >\n <div className=\"flex items-center gap-2\">\n <WrenchIcon className=\"size-4 text-muted-foreground\" />\n <span className=\"font-medium text-sm\">{title ?? derivedName}</span>\n {getStatusBadge(state)}\n </div>\n <ChevronDownIcon className=\"size-4 text-muted-foreground transition-transform group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n );\n};\n\nexport type ToolContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const ToolContent = ({ className, ...props }: ToolContentProps) => (\n <CollapsibleContent\n className={cn(\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 space-y-4 p-4 text-popover-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n className\n )}\n {...props}\n />\n);\n\nexport type ToolInputProps = ComponentProps<\"div\"> & {\n input: ToolPart[\"input\"];\n};\n\nexport const ToolInput = ({ className, input, ...props }: ToolInputProps) => (\n <div className={cn(\"space-y-2 overflow-hidden\", className)} {...props}>\n <h4 className=\"font-medium text-muted-foreground text-xs uppercase tracking-wide\">\n Parameters\n </h4>\n <div className=\"rounded-md bg-muted/50\">\n <CodeBlock code={JSON.stringify(input, null, 2)} language=\"json\" />\n </div>\n </div>\n);\n\nexport type ToolOutputProps = ComponentProps<\"div\"> & {\n output: ToolPart[\"output\"];\n errorText: ToolPart[\"errorText\"];\n};\n\nexport const ToolOutput = ({\n className,\n output,\n errorText,\n ...props\n}: ToolOutputProps) => {\n if (!(output || errorText)) {\n return null;\n }\n\n let Output = <div>{output as ReactNode}</div>;\n\n if (typeof output === \"object\" && !isValidElement(output)) {\n Output = (\n <CodeBlock code={JSON.stringify(output, null, 2)} language=\"json\" />\n );\n } else if (typeof output === \"string\") {\n Output = <CodeBlock code={output} language=\"json\" />;\n }\n\n return (\n <div className={cn(\"space-y-2\", className)} {...props}>\n <h4 className=\"font-medium text-muted-foreground text-xs uppercase tracking-wide\">\n {errorText ? \"Error\" : \"Result\"}\n </h4>\n <div\n className={cn(\n \"overflow-x-auto rounded-md text-xs [&_table]:w-full\",\n errorText\n ? \"bg-destructive/10 text-destructive\"\n : \"bg-muted/50 text-foreground\"\n )}\n >\n {errorText && <div>{errorText}</div>}\n {Output}\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../ui/collapsible\";\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"../ui/tabs\";\nimport { cn } from \"../../lib/utils\";\nimport type { ToolUIPart } from \"ai\";\nimport { ChevronDownIcon, Code } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\n\nimport { getStatusBadge } from \"./tool\";\n\nexport type SandboxRootProps = ComponentProps<typeof Collapsible>;\n\nexport const Sandbox = ({ className, ...props }: SandboxRootProps) => (\n <Collapsible\n className={cn(\n \"not-prose group mb-4 w-full overflow-hidden rounded-md border border-foreground/20\",\n className\n )}\n defaultOpen\n {...props}\n />\n);\n\nexport interface SandboxHeaderProps {\n title?: string;\n state: ToolUIPart[\"state\"];\n className?: string;\n}\n\nexport const SandboxHeader = ({\n className,\n title,\n state,\n ...props\n}: SandboxHeaderProps) => (\n <CollapsibleTrigger\n className={cn(\n \"flex w-full items-center justify-between gap-4 p-3\",\n className\n )}\n {...props}\n >\n <div className=\"flex items-center gap-2\">\n <Code className=\"size-4 text-muted-foreground\" />\n <span className=\"font-medium text-sm\">{title}</span>\n {getStatusBadge(state)}\n </div>\n <ChevronDownIcon className=\"size-4 text-muted-foreground transition-transform group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n);\n\nexport type SandboxContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const SandboxContent = ({\n className,\n ...props\n}: SandboxContentProps) => (\n <CollapsibleContent\n className={cn(\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n className\n )}\n {...props}\n />\n);\n\nexport type SandboxTabsProps = ComponentProps<typeof Tabs>;\n\nexport const SandboxTabs = ({ className, ...props }: SandboxTabsProps) => (\n <Tabs className={cn(\"w-full gap-0\", className)} {...props} />\n);\n\nexport type SandboxTabsBarProps = ComponentProps<\"div\">;\n\nexport const SandboxTabsBar = ({\n className,\n ...props\n}: SandboxTabsBarProps) => (\n <div\n className={cn(\n \"flex w-full items-center border-border border-t border-b\",\n className\n )}\n {...props}\n />\n);\n\nexport type SandboxTabsListProps = ComponentProps<typeof TabsList>;\n\nexport const SandboxTabsList = ({\n className,\n ...props\n}: SandboxTabsListProps) => (\n <TabsList\n className={cn(\"h-auto rounded-none border-0 bg-transparent p-0\", className)}\n {...props}\n />\n);\n\nexport type SandboxTabsTriggerProps = ComponentProps<typeof TabsTrigger>;\n\nexport const SandboxTabsTrigger = ({\n className,\n ...props\n}: SandboxTabsTriggerProps) => (\n <TabsTrigger\n className={cn(\n \"rounded-none border-0 border-transparent border-b-2 px-4 py-2 font-medium text-muted-foreground text-sm transition-colors data-[state=active]:border-primary data-[state=active]:bg-transparent data-[state=active]:text-foreground data-[state=active]:shadow-none\",\n className\n )}\n {...props}\n />\n);\n\nexport type SandboxTabContentProps = ComponentProps<typeof TabsContent>;\n\nexport const SandboxTabContent = ({\n className,\n ...props\n}: SandboxTabContentProps) => (\n <TabsContent className={cn(\"mt-0 text-sm\", className)} {...props} />\n);\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\nimport { CodeBlock, CodeBlockCopyButton } from \"../../ai-elements/code-block\";\nimport {\n Sandbox,\n SandboxContent,\n SandboxHeader,\n SandboxTabContent,\n SandboxTabs,\n SandboxTabsBar,\n SandboxTabsList,\n SandboxTabsTrigger,\n} from \"../../ai-elements/sandbox\";\nimport type { ToolCallInfo } from \"../../../types\";\n\ninterface ExecuteCodeResult {\n code: string;\n output: string;\n hasError: boolean;\n}\n\nfunction parseExecuteCodeResult(\n result: string | undefined,\n args: string,\n): ExecuteCodeResult | null {\n let code = \"\";\n try {\n const parsedArgs = JSON.parse(args);\n code = parsedArgs?.code ?? \"\";\n } catch { /* ignore */ }\n\n if (!code) return null;\n\n let output = \"\";\n let hasError = false;\n if (result) {\n try {\n const parsed = JSON.parse(result);\n const stdout = parsed?.stdout ?? parsed?.output ?? \"\";\n const stderr = parsed?.stderr ?? parsed?.error ?? \"\";\n const exitCode = parsed?.exit_code ?? 0;\n hasError = exitCode !== 0 || !!stderr;\n output = stderr ? `${stdout}\\n${stderr}`.trim() : stdout;\n } catch {\n output = result;\n }\n }\n\n return { code, output, hasError };\n}\n\nexport function ExecuteCodeToolBlock({ tc }: { tc: ToolCallInfo }) {\n const isRunning = tc.status === \"running\";\n const result = parseExecuteCodeResult(tc.result, tc.args);\n if (!result) return null;\n\n const state = isRunning\n ? \"input-available\"\n : result.hasError\n ? \"output-error\"\n : \"output-available\";\n\n return (\n <Sandbox>\n <SandboxHeader state={state} title=\"Run code\" />\n <SandboxContent>\n <SandboxTabs defaultValue=\"code\">\n <SandboxTabsBar>\n <SandboxTabsList>\n <SandboxTabsTrigger value=\"code\">Code</SandboxTabsTrigger>\n <SandboxTabsTrigger value=\"output\">Output</SandboxTabsTrigger>\n </SandboxTabsList>\n </SandboxTabsBar>\n <SandboxTabContent value=\"code\">\n <div className=\"max-h-60 overflow-auto\">\n <CodeBlock\n className=\"border-0\"\n code={result.code}\n language=\"python\"\n >\n <CodeBlockCopyButton\n className=\"absolute top-2 right-2 opacity-0 transition-opacity duration-200 group-hover:opacity-100\"\n size=\"sm\"\n />\n </CodeBlock>\n </div>\n </SandboxTabContent>\n <SandboxTabContent value=\"output\">\n <div className=\"max-h-60 overflow-auto\">\n <CodeBlock\n className=\"border-0\"\n code={result.output || (isRunning ? \"Running...\" : \"(no output)\")}\n language=\"log\"\n >\n <CodeBlockCopyButton\n className=\"absolute top-2 right-2 opacity-0 transition-opacity duration-200 group-hover:opacity-100\"\n size=\"sm\"\n />\n </CodeBlock>\n </div>\n </SandboxTabContent>\n </SandboxTabs>\n </SandboxContent>\n </Sandbox>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Compact one-liner renderers for lightweight tools:\n// - Session search\n// - Web search / crawl\n// - Vision analyze\n\nimport { SearchIcon, EyeIcon } from \"lucide-react\";\nimport type { ToolCallInfo } from \"../../../types\";\n\n// ── Session search ──────────────────────────────────────────────────\n\nexport function SessionSearchBlock({ tc }: { tc: ToolCallInfo }) {\n let query = \"\";\n try {\n const args = JSON.parse(tc.args);\n query = args.query ?? \"\";\n } catch { /* ignore */ }\n\n return (\n <div className=\"flex items-center gap-2 text-sm py-0.5\">\n <SearchIcon className=\"size-3.5 text-muted-foreground/60 shrink-0\" />\n <span className=\"font-medium text-foreground\">Session Search</span>\n {query && (\n <span className=\"text-muted-foreground/70 truncate text-xs italic\">\n “{query}”\n </span>\n )}\n </div>\n );\n}\n\n// ── Web tools ───────────────────────────────────────────────────────\n\nexport function WebToolBlock({ tc }: { tc: ToolCallInfo }) {\n let displayText = \"\";\n try {\n const args = JSON.parse(tc.args);\n if (tc.toolName === \"web_search\") {\n displayText = args.query ?? \"\";\n } else if (tc.toolName === \"web_crawl\") {\n displayText = args.url ?? \"\";\n }\n } catch { /* ignore */ }\n\n const toolLabel = {\n web_search: \"Web Search\",\n web_crawl: \"Web Crawl\",\n }[tc.toolName] ?? tc.toolName;\n\n return (\n <div className=\"flex items-center gap-2 text-sm py-0.5\">\n <span className=\"font-medium text-foreground\">{toolLabel}</span>\n {displayText && (\n <span className=\"text-muted-foreground/70 truncate text-xs\">\n {displayText}\n </span>\n )}\n </div>\n );\n}\n\n// ── MCP tools ───────────────────────────────────────────────────────\n\nexport function MCPToolBlock({ tc }: { tc: ToolCallInfo }) {\n // Tool names are emitted as `mcp__{server}__{tool}`. Split on the\n // double-underscore separator; the last segment is the tool name.\n const segments = tc.toolName.replace(/^mcp__/, \"\").split(\"__\");\n const toolName = segments[segments.length - 1] ?? tc.toolName;\n const label = toolName\n .split(\"_\")\n .map((p) => p.charAt(0).toUpperCase() + p.slice(1))\n .join(\" \");\n\n let summary = \"\";\n try {\n const args = JSON.parse(tc.args);\n if (args && typeof args === \"object\") {\n const entries = Object.entries(args).filter(([, v]) => v !== undefined && v !== null && v !== \"\");\n if (entries.length > 0) {\n summary = entries\n .map(([k, v]) => {\n const val = typeof v === \"string\" ? v : JSON.stringify(v);\n return `${k}=${val}`;\n })\n .join(\", \");\n }\n }\n } catch { /* ignore */ }\n\n return (\n <div className=\"flex items-center gap-2 text-sm py-0.5\">\n <span className=\"font-medium text-foreground\">{label}</span>\n {summary && (\n <span className=\"text-muted-foreground/60 truncate text-xs\">\n {summary}\n </span>\n )}\n </div>\n );\n}\n\n// ── Vision analyze ──────────────────────────────────────────────────\n\nexport function VisionAnalyzeBlock({ tc }: { tc: ToolCallInfo }) {\n let image = \"\";\n try {\n const args = JSON.parse(tc.args);\n const ref = String(args.image ?? args.image_url ?? args.image_path ?? \"\");\n image = ref.split(\"/\").pop() ?? ref;\n } catch { /* ignore */ }\n\n return (\n <div className=\"flex items-center gap-2 text-sm py-0.5\">\n <EyeIcon className=\"size-3.5 text-muted-foreground/60 shrink-0\" />\n <span className=\"font-medium text-foreground\">Vision Analyze</span>\n {image && (\n <span className=\"text-muted-foreground/70 truncate text-xs\">\n {image}\n </span>\n )}\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Renders a batched web_extract call: the full list of URLs being\n// fetched, with per-URL status sourced from the tool result.\n\nimport { GlobeIcon, CheckIcon, XIcon } from \"lucide-react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../../ui/tooltip\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ToolCallInfo } from \"../../../types\";\n\ninterface ResultEntry {\n url?: string;\n title?: string;\n content?: string;\n error?: string;\n}\n\nfunction parseUrls(rawArgs: string): string[] {\n try {\n const args = JSON.parse(rawArgs);\n if (Array.isArray(args.urls)) {\n return args.urls.filter((u: unknown): u is string => typeof u === \"string\");\n }\n } catch {\n /* ignore */\n }\n return [];\n}\n\nfunction parseResult(rawResult: string | undefined): {\n byUrl: Map<string, ResultEntry>;\n toolError: string | null;\n} {\n const byUrl = new Map<string, ResultEntry>();\n if (!rawResult) return { byUrl, toolError: null };\n try {\n const parsed = JSON.parse(rawResult);\n const entries: ResultEntry[] = Array.isArray(parsed?.results)\n ? parsed.results\n : [];\n for (const entry of entries) {\n if (entry && typeof entry.url === \"string\") {\n byUrl.set(entry.url, entry);\n }\n }\n if (byUrl.size === 0 && typeof parsed?.error === \"string\") {\n return { byUrl, toolError: parsed.error };\n }\n } catch {\n /* ignore */\n }\n return { byUrl, toolError: null };\n}\n\nfunction domain(url: string): string {\n try {\n return new URL(url).hostname.replace(/^www\\./, \"\");\n } catch {\n return url;\n }\n}\n\nexport function WebExtractToolBlock({ tc }: { tc: ToolCallInfo }) {\n const urls = parseUrls(tc.args);\n const { byUrl, toolError } = parseResult(tc.result);\n const isComplete = tc.status === \"complete\" || tc.status === \"error\";\n\n if (urls.length === 0) {\n return (\n <div className=\"flex items-center gap-2 text-sm py-0.5\">\n <GlobeIcon className=\"size-3.5 text-muted-foreground/60 shrink-0\" />\n <span className=\"font-medium text-foreground\">Web Fetch</span>\n </div>\n );\n }\n\n return (\n <div>\n <div className=\"flex items-center gap-2 text-sm\">\n <GlobeIcon className=\"size-3.5 text-muted-foreground/60 shrink-0\" />\n <span className=\"font-medium text-foreground\">Web Fetch</span>\n <span className=\"text-muted-foreground/70 text-xs\">\n {urls.length} URL{urls.length !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n <ul className=\"mt-1 ml-5 space-y-0.5\">\n {urls.map((url, i) => {\n const entry = byUrl.get(url);\n const perUrlError = entry?.error;\n const failure = perUrlError ?? (isComplete && !entry ? toolError : null);\n const fetched = entry && !perUrlError;\n const pending = !isComplete && !entry;\n\n const row = (\n <div className=\"flex items-center gap-2 text-xs\">\n <span\n className={cn(\n \"truncate\",\n pending ? \"text-muted-foreground/50\" : \"text-muted-foreground\",\n )}\n >\n {domain(url)}\n </span>\n {fetched && (\n <CheckIcon className=\"size-3 text-green-500/70 shrink-0\" />\n )}\n {failure && (\n <XIcon className=\"size-3 text-red-500/80 shrink-0\" />\n )}\n </div>\n );\n\n return (\n <li key={`${url}-${i}`}>\n {failure ? (\n <Tooltip>\n <TooltipTrigger asChild>{row}</TooltipTrigger>\n <TooltipContent side=\"top\">{failure}</TooltipContent>\n </Tooltip>\n ) : (\n row\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Unified inline diff viewer component using the `diff` package.\n// Renders removed lines with a red background and added lines with\n// a green background. Within modified line pairs, individual changed\n// words get a stronger highlight layered on top. Unchanged regions\n// beyond the context window are collapsible.\n\nimport { memo, useMemo, useState, useCallback } from \"react\";\nimport { diffLines, diffWordsWithSpace } from \"diff\";\nimport type { Change } from \"diff\";\nimport { cn } from \"../../lib/utils\";\n\n// ── Types ──────────────────────────────────────────────────────────\n\ninterface DiffLine {\n type: \"added\" | \"removed\" | \"unchanged\";\n content: string;\n lineNum: number;\n}\n\ninterface DiffViewerProps {\n /** Original text (left side). */\n oldValue: string;\n /** Modified text (right side). */\n newValue: string;\n /** Number of unchanged context lines to show around changes. */\n contextLines?: number;\n /** Optional filename to display in the header. */\n fileName?: string;\n /** Whether to show word-level highlighting within changed lines. */\n wordDiff?: boolean;\n /** Additional CSS classes for the outer container. */\n className?: string;\n}\n\n// ── Diff computation ───────────────────────────────────────────────\n\n/**\n * Split a Change value into individual line strings, stripping the\n * trailing newline that `diffLines` appends to each chunk.\n */\nfunction splitChangeLines(change: Change): string[] {\n const v = change.value;\n if (v === \"\") return [];\n const stripped = v.endsWith(\"\\n\") ? v.slice(0, -1) : v;\n return stripped.split(\"\\n\");\n}\n\n/**\n * Build a flat array of DiffLines from the raw Change[] produced by\n * `diffLines`. Each line gets a sequential line number (tracking\n * position in the combined output).\n */\nfunction buildDiffLines(changes: Change[]): DiffLine[] {\n const lines: DiffLine[] = [];\n let lineNum = 1;\n\n for (const change of changes) {\n const type: DiffLine[\"type\"] = change.added\n ? \"added\"\n : change.removed\n ? \"removed\"\n : \"unchanged\";\n\n for (const text of splitChangeLines(change)) {\n lines.push({ type, content: text, lineNum: lineNum++ });\n }\n }\n\n return lines;\n}\n\n// ── Sections (context collapsing) ──────────────────────────────────\n\ninterface DiffSection {\n kind: \"lines\" | \"collapsed\";\n lines: DiffLine[];\n hiddenCount?: number;\n}\n\nfunction buildSections(allLines: DiffLine[], contextLines: number): DiffSection[] {\n if (allLines.length === 0) return [];\n\n const visible = new Uint8Array(allLines.length);\n for (let i = 0; i < allLines.length; i++) {\n if (allLines[i].type !== \"unchanged\") {\n const lo = Math.max(0, i - contextLines);\n const hi = Math.min(allLines.length - 1, i + contextLines);\n for (let j = lo; j <= hi; j++) visible[j] = 1;\n }\n }\n\n const sections: DiffSection[] = [];\n let i = 0;\n while (i < allLines.length) {\n if (visible[i]) {\n const start = i;\n while (i < allLines.length && visible[i]) i++;\n sections.push({ kind: \"lines\", lines: allLines.slice(start, i) });\n } else {\n const start = i;\n while (i < allLines.length && !visible[i]) i++;\n sections.push({ kind: \"collapsed\", lines: allLines.slice(start, i), hiddenCount: i - start });\n }\n }\n\n return sections;\n}\n\n// ── Word-diff pairing ──────────────────────────────────────────────\n\n/**\n * Compute the ratio of common characters between two strings (0..1).\n * When the ratio is low the lines are essentially unrelated and\n * word-level highlighting just paints everything, which is noisy.\n */\nfunction similarity(a: string, b: string): number {\n if (a.length === 0 && b.length === 0) return 1;\n if (a.length === 0 || b.length === 0) return 0;\n const changes = diffWordsWithSpace(a, b);\n let common = 0;\n let total = 0;\n for (const c of changes) {\n total += c.value.length;\n if (!c.added && !c.removed) common += c.value.length;\n }\n return total > 0 ? common / total : 0;\n}\n\n/** Minimum similarity (0..1) for word-level highlighting to activate. */\nconst WORD_DIFF_THRESHOLD = 0.35;\n\n/**\n * Pair consecutive removed+added runs for word-level diffing.\n * Only pairs lines that are sufficiently similar — entirely\n * different lines are left unpaired so they render without\n * per-word highlights.\n * Returns a map: line array index → paired line content from opposite side.\n */\nfunction buildWordDiffPairs(lines: DiffLine[]): Map<number, string> {\n const pairs = new Map<number, string>();\n let i = 0;\n while (i < lines.length) {\n const removedStart = i;\n while (i < lines.length && lines[i].type === \"removed\") i++;\n const removedEnd = i;\n\n const addedStart = i;\n while (i < lines.length && lines[i].type === \"added\") i++;\n const addedEnd = i;\n\n const removedCount = removedEnd - removedStart;\n const addedCount = addedEnd - addedStart;\n const pairCount = Math.min(removedCount, addedCount);\n for (let j = 0; j < pairCount; j++) {\n const oldContent = lines[removedStart + j].content;\n const newContent = lines[addedStart + j].content;\n if (similarity(oldContent, newContent) >= WORD_DIFF_THRESHOLD) {\n pairs.set(removedStart + j, newContent);\n pairs.set(addedStart + j, oldContent);\n }\n }\n\n if (i < lines.length && lines[i].type === \"unchanged\") i++;\n }\n return pairs;\n}\n\n// ── Word-diff rendering ────────────────────────────────────────────\n\n/**\n * Render word-level diff spans. Changed tokens get a stronger\n * highlight that layers on top of the line-level background.\n */\nfunction renderWordDiff(\n oldText: string,\n newText: string,\n side: \"old\" | \"new\",\n): React.ReactNode[] {\n const changes = diffWordsWithSpace(oldText, newText);\n const spans: React.ReactNode[] = [];\n\n for (let i = 0; i < changes.length; i++) {\n const c = changes[i];\n if (side === \"old\") {\n if (c.added) continue;\n spans.push(\n c.removed ? (\n <span key={i} className=\"bg-red-500/30 rounded-sm\">{c.value}</span>\n ) : (\n <span key={i}>{c.value}</span>\n ),\n );\n } else {\n if (c.removed) continue;\n spans.push(\n c.added ? (\n <span key={i} className=\"bg-green-500/30 rounded-sm\">{c.value}</span>\n ) : (\n <span key={i}>{c.value}</span>\n ),\n );\n }\n }\n\n return spans;\n}\n\n// ── Sub-components ─────────────────────────────────────────────────\n\nfunction DiffLineRow({\n line,\n wordDiffContent,\n}: {\n line: DiffLine;\n wordDiffContent?: React.ReactNode[];\n}) {\n const bgClass =\n line.type === \"added\"\n ? \"bg-green-500/15\"\n : line.type === \"removed\"\n ? \"bg-red-500/15\"\n : \"\";\n\n const textClass =\n line.type === \"added\"\n ? \"text-green-800 dark:text-green-300\"\n : line.type === \"removed\"\n ? \"text-red-800 dark:text-red-300\"\n : \"text-foreground/80\";\n\n const gutterClass =\n line.type === \"added\"\n ? \"text-green-500/40 bg-green-500/10\"\n : line.type === \"removed\"\n ? \"text-red-500/40 bg-red-500/10\"\n : \"text-muted-foreground/30\";\n\n return (\n <div className={cn(\"flex text-sm leading-5\", bgClass)}>\n <span\n className={cn(\n \"w-10 shrink-0 select-none text-right pr-2 tabular-nums\",\n gutterClass,\n )}\n >\n {line.lineNum}\n </span>\n <span className={cn(\"flex-1 whitespace-pre-wrap break-all px-3\", textClass)}>\n {wordDiffContent ?? line.content}\n </span>\n </div>\n );\n}\n\nfunction CollapsedBlock({\n count,\n onExpand,\n}: {\n count: number;\n onExpand: () => void;\n}) {\n return (\n <div className=\"flex text-sm leading-5 bg-muted/30 border-y border-border/30\">\n <span className=\"w-10 shrink-0\" />\n <button\n type=\"button\"\n onClick={onExpand}\n className=\"flex-1 text-left px-3 py-0.5 text-muted-foreground hover:text-foreground hover:bg-muted/50 transition-colors cursor-pointer\"\n >\n ↕ {count} unchanged line{count !== 1 ? \"s\" : \"\"}\n </button>\n </div>\n );\n}\n\n// ── Stats ──────────────────────────────────────────────────────────\n\nfunction DiffStats({ lines }: { lines: DiffLine[] }) {\n let additions = 0;\n let deletions = 0;\n for (const l of lines) {\n if (l.type === \"added\") additions++;\n if (l.type === \"removed\") deletions++;\n }\n\n if (additions === 0 && deletions === 0) return null;\n\n return (\n <span className=\"text-sm text-muted-foreground font-mono\">\n {additions > 0 && (\n <span className=\"text-green-600 dark:text-green-400\">+{additions}</span>\n )}\n {additions > 0 && deletions > 0 && \" \"}\n {deletions > 0 && (\n <span className=\"text-red-600 dark:text-red-400\">−{deletions}</span>\n )}\n </span>\n );\n}\n\n// ── Header label ───────────────────────────────────────────────────\n\nfunction HeaderLabel({ lines }: { lines: DiffLine[] }) {\n const additions = lines.filter((l) => l.type === \"added\").length;\n const deletions = lines.filter((l) => l.type === \"removed\").length;\n\n const parts: string[] = [];\n if (additions > 0 && deletions > 0) {\n parts.push(`Modified ${Math.max(additions, deletions)} line${Math.max(additions, deletions) !== 1 ? \"s\" : \"\"}`);\n } else if (additions > 0) {\n parts.push(`Added ${additions} line${additions !== 1 ? \"s\" : \"\"}`);\n } else if (deletions > 0) {\n parts.push(`Removed ${deletions} line${deletions !== 1 ? \"s\" : \"\"}`);\n }\n\n if (parts.length === 0) return null;\n\n return (\n <span className=\"text-xs text-muted-foreground text-muted-foregound\">{parts[0]}</span>\n );\n}\n\n// ── Main component ─────────────────────────────────────────────────\n\nexport const DiffViewer = memo(function DiffViewer({\n oldValue,\n newValue,\n contextLines = 3,\n fileName,\n wordDiff: enableWordDiff = true,\n className,\n}: DiffViewerProps) {\n const diffResult = useMemo(() => {\n const changes = diffLines(oldValue, newValue);\n const lines = buildDiffLines(changes);\n const sections = buildSections(lines, contextLines);\n return { lines, sections };\n }, [oldValue, newValue, contextLines]);\n\n const [expandedSections, setExpandedSections] = useState<Set<number>>(\n () => new Set(),\n );\n\n const toggleSection = useCallback((idx: number) => {\n setExpandedSections((prev) => {\n const next = new Set(prev);\n if (next.has(idx)) next.delete(idx);\n else next.add(idx);\n return next;\n });\n }, []);\n\n if (oldValue === newValue) {\n return (\n <div className={cn(\"rounded border bg-muted/30 p-3 text-sm text-muted-foreground font-mono\", className)}>\n No changes\n </div>\n );\n }\n\n return (\n <div className={cn(\"space-y-1\", className)}>\n {/* Summary label above the diff block */}\n <HeaderLabel lines={diffResult.lines} />\n\n <div className=\"rounded border border-border bg-muted/20 overflow-hidden font-mono\">\n {/* File header with stats */}\n {fileName && (\n <div className=\"flex items-center justify-between px-3 py-1.5 border-b border-border/50 bg-muted/40\">\n <span className=\"text-sm text-foreground/80 truncate\">{fileName}</span>\n <DiffStats lines={diffResult.lines} />\n </div>\n )}\n\n {/* Diff body */}\n <div className=\"overflow-x-auto\">\n {diffResult.sections.map((section, sIdx) => {\n if (section.kind === \"collapsed\" && !expandedSections.has(sIdx)) {\n return (\n <CollapsedBlock\n key={sIdx}\n count={section.hiddenCount!}\n onExpand={() => toggleSection(sIdx)}\n />\n );\n }\n\n const wordPairs = enableWordDiff\n ? buildWordDiffPairs(section.lines)\n : null;\n\n return (\n <div key={sIdx}>\n {section.lines.map((line, lIdx) => {\n let wordContent: React.ReactNode[] | undefined;\n if (wordPairs?.has(lIdx)) {\n const pairedContent = wordPairs.get(lIdx)!;\n if (line.type === \"removed\") {\n wordContent = renderWordDiff(line.content, pairedContent, \"old\");\n } else if (line.type === \"added\") {\n wordContent = renderWordDiff(pairedContent, line.content, \"new\");\n }\n }\n return (\n <DiffLineRow\n key={`${sIdx}-${lIdx}`}\n line={line}\n wordDiffContent={wordContent}\n />\n );\n })}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n});\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Renderers for file operation tools:\n// - read_file: one-liner with file name\n// - write_file: one-liner with file name\n// - patch: diff view showing old_string → new_string\n// - search_files: one-liner with pattern + result count\n// - list_files: one-liner with path + result count\n\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../../ui/tooltip\";\nimport { Button } from \"../../ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"../../ui/dialog\";\nimport { ScrollArea } from \"../../ui/scroll-area\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ToolCallInfo } from \"../../../types\";\nimport { DiffViewer } from \"../diff-viewer\";\n\n// ── Shared path helpers ─────────────────────────────────────────────\n\nfunction displayPath(filePath: string): string {\n if (filePath.startsWith(\"__WORKSPACE__\")) {\n return filePath.replace(/^__WORKSPACE__\\/?/, \"\");\n }\n if (filePath.startsWith(\"/\")) {\n const parts = filePath.split(\"/\").filter(Boolean);\n const uuidRe = /^[0-9a-f]{8}-/;\n const skip = new Set([\"home\", \"tmp\", \"work\", \"var\", \"opt\", \"data\", \"surogates\", \"workspaces\"]);\n for (let i = 0; i < parts.length - 1; i++) {\n if (!skip.has(parts[i]) && !uuidRe.test(parts[i])) {\n return parts.slice(i).join(\"/\");\n }\n }\n return parts.slice(-2).join(\"/\");\n }\n return filePath;\n}\n\nfunction fileName(path: string): string {\n return displayPath(path).split(\"/\").pop() || path;\n}\n\nfunction FileNameWithTooltip({\n filePath,\n onFileSelect,\n}: {\n filePath: string;\n onFileSelect?: (path: string) => void;\n}) {\n const display = displayPath(filePath);\n const name = fileName(filePath);\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n {onFileSelect ? (\n <button\n type=\"button\"\n onClick={() => onFileSelect(filePath)}\n className=\"text-primary hover:underline truncate text-left cursor-pointer underline\"\n >\n {name}\n </button>\n ) : (\n <span className=\"text-muted-foreground truncate\">{name}</span>\n )}\n </TooltipTrigger>\n <TooltipContent side=\"top\">{display}</TooltipContent>\n </Tooltip>\n );\n}\n\n// ── Result count helper ─────────────────────────────────────────────\n\nfunction parseResultCount(result: string | undefined): number | null {\n if (!result) return null;\n try {\n const parsed = JSON.parse(result);\n // search_files returns {matches: [...]} or {results: [...]}\n if (Array.isArray(parsed?.matches)) return parsed.matches.length;\n if (Array.isArray(parsed?.results)) return parsed.results.length;\n // list_files returns {entries: [...]} or an array directly\n if (Array.isArray(parsed?.entries)) return parsed.entries.length;\n if (Array.isArray(parsed)) return parsed.length;\n // Count lines in output string\n if (typeof parsed?.output === \"string\" && parsed.output.trim()) {\n return parsed.output.trim().split(\"\\n\").length;\n }\n } catch { /* ignore */ }\n return null;\n}\n\n// ── Read file ───────────────────────────────────────────────────────\n\nexport function ReadFileBlock({ tc, onFileSelect }: { tc: ToolCallInfo; onFileSelect?: (path: string) => void }) {\n let filePath = \"\";\n let detail = \"\";\n try {\n const args = JSON.parse(tc.args);\n filePath = args.path ?? args.file_path ?? \"\";\n const parts: string[] = [];\n if (args.offset != null || args.limit != null) {\n const start = (args.offset ?? 0) + 1;\n const end = args.limit ? start + args.limit - 1 : undefined;\n parts.push(end ? `lines ${start}-${end}` : `from line ${start}`);\n }\n if (parts.length) detail = `(${parts.join(\", \")})`;\n } catch { /* ignore */ }\n\n return (\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">Read</span>\n <FileNameWithTooltip filePath={filePath} onFileSelect={onFileSelect} />\n {detail && <span className=\"text-muted-foreground ml-1\">{detail}</span>}\n </div>\n );\n}\n\n// ── Write file ──────────────────────────────────────────────────────\n\nexport function WriteFileBlock({ tc, onFileSelect }: { tc: ToolCallInfo; onFileSelect?: (path: string) => void }) {\n let filePath = \"\";\n try {\n const args = JSON.parse(tc.args);\n filePath = args.path ?? args.file_path ?? \"\";\n } catch { /* ignore */ }\n\n return (\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">Write</span>\n <FileNameWithTooltip filePath={filePath} onFileSelect={onFileSelect} />\n </div>\n );\n}\n\n// ── Patch ───────────────────────────────────────────────────────────\n\nconst PATCH_COLLAPSED_HEIGHT = 192;\n\nexport function PatchBlock({ tc, onFileSelect }: { tc: ToolCallInfo; onFileSelect?: (path: string) => void }) {\n let filePath = \"\";\n let oldString = \"\";\n let newString = \"\";\n try {\n const args = JSON.parse(tc.args);\n filePath = args.path ?? args.file_path ?? \"\";\n oldString = args.old_string ?? \"\";\n newString = args.new_string ?? \"\";\n } catch { /* ignore */ }\n\n const contentRef = useRef<HTMLDivElement>(null);\n const [overflows, setOverflows] = useState(false);\n const [dialogOpen, setDialogOpen] = useState(false);\n\n useEffect(() => {\n if (contentRef.current) {\n setOverflows(contentRef.current.scrollHeight > PATCH_COLLAPSED_HEIGHT);\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps -- measure DOM after mount\n\n const hasDiff = oldString || newString;\n const fName = fileName(filePath);\n\n return (\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">Patch</span>\n <FileNameWithTooltip filePath={filePath} onFileSelect={onFileSelect} />\n </div>\n {hasDiff && (\n <div className=\"group/patch relative\">\n <div\n ref={contentRef}\n role={overflows ? \"button\" : undefined}\n tabIndex={overflows ? 0 : undefined}\n onClick={() => overflows && setDialogOpen(true)}\n onKeyDown={(e) => { if (e.key === \"Enter\" && overflows) setDialogOpen(true); }}\n className={cn(\n \"overflow-hidden\",\n overflows && \"cursor-pointer\",\n )}\n style={{ maxHeight: PATCH_COLLAPSED_HEIGHT }}\n >\n <DiffViewer\n oldValue={oldString}\n newValue={newString}\n fileName={fName}\n contextLines={3}\n />\n </div>\n {overflows && (\n <Button\n variant=\"outline\"\n size=\"xs\"\n onClick={() => setDialogOpen(true)}\n className=\"absolute bottom-1.5 right-2 opacity-0 group-hover/patch:opacity-100 transition-opacity backdrop-blur-sm\"\n >\n Expand\n </Button>\n )}\n </div>\n )}\n\n <Dialog open={dialogOpen} onOpenChange={setDialogOpen}>\n <DialogContent className=\"sm:max-w-[50vw] w-full h-[70vh] flex flex-col p-0 gap-0 overflow-hidden\">\n <DialogHeader className=\"px-4 py-3 border-b border-border shrink-0\">\n <DialogTitle className=\"text-sm \">Patch {fName}</DialogTitle>\n </DialogHeader>\n <ScrollArea className=\"flex-1 min-h-0\">\n <div className=\"p-4\">\n <DiffViewer\n oldValue={oldString}\n newValue={newString}\n fileName={fName}\n contextLines={3}\n />\n </div>\n </ScrollArea>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n\n// ── Search files ────────────────────────────────────────────────────\n\nexport function SearchFilesBlock({ tc }: { tc: ToolCallInfo }) {\n let pattern = \"\";\n let path = \"\";\n try {\n const args = JSON.parse(tc.args);\n pattern = args.pattern ?? \"\";\n path = args.path ?? \"\";\n } catch { /* ignore */ }\n\n const count = parseResultCount(tc.result);\n\n return (\n <div>\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">Search</span>\n {pattern && <span className=\"text-muted-foreground truncate\">"{pattern}"</span>}\n {path && path !== \".\" && (\n <span className=\"text-muted-foreground/60 truncate\">in {displayPath(path)}</span>\n )}\n </div>\n {count !== null && tc.status === \"complete\" && (\n <span className={cn(\n \"text-xs shrink-0\",\n count === 0 ? \"text-muted-foreground/50\" : \"text-muted-foreground\",\n )}>\n {count} result{count !== 1 ? \"s\" : \"\"}\n </span>\n )}\n </div>\n );\n}\n\n// ── List files ──────────────────────────────────────────────────────\n\nexport function ListFilesBlock({ tc }: { tc: ToolCallInfo }) {\n let path = \"\";\n let pattern = \"\";\n try {\n const args = JSON.parse(tc.args);\n path = args.path ?? \"\";\n pattern = args.pattern ?? \"\";\n } catch { /* ignore */ }\n\n const count = parseResultCount(tc.result);\n\n return (\n <div>\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">List</span>\n {path && <span className=\"text-muted-foreground truncate\">{displayPath(path)}</span>}\n {pattern && pattern !== \"*\" && (\n <span className=\"text-muted-foreground/60 truncate\">"{pattern}"</span>\n )}\n </div>\n {count !== null && tc.status === \"complete\" && (\n <span className={cn(\n \"text-xs shrink-0\",\n count === 0 ? \"text-muted-foreground/50\" : \"text-muted-foreground\",\n )}>\n {count} file{count !== 1 ? \"s\" : \"\"}\n </span>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport { cn } from \"../../lib/utils\";\nimport Ansi from \"ansi-to-react\";\nimport { CheckIcon, CopyIcon, TerminalIcon, Trash2Icon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes } from \"react\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\ninterface TerminalContextType {\n output: string;\n isStreaming: boolean;\n autoScroll: boolean;\n onClear?: () => void;\n}\n\nconst TerminalContext = createContext<TerminalContextType>({\n autoScroll: true,\n isStreaming: false,\n output: \"\",\n});\n\nexport type TerminalHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const TerminalHeader = ({\n className,\n children,\n ...props\n}: TerminalHeaderProps) => (\n <div\n className={cn(\n \"flex items-center justify-between border-border border-b p-0\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n);\n\nexport type TerminalTitleProps = HTMLAttributes<HTMLDivElement>;\n\nexport const TerminalTitle = ({\n className,\n children,\n ...props\n}: TerminalTitleProps) => (\n <div\n className={cn(\"flex items-center gap-2 text-sm text-muted-foreground\", className)}\n {...props}\n >\n <TerminalIcon className=\"size-4\" />\n {children ?? \"Terminal\"}\n </div>\n);\n\nexport type TerminalStatusProps = HTMLAttributes<HTMLDivElement>;\n\nexport const TerminalStatus = ({\n className,\n children,\n ...props\n}: TerminalStatusProps) => {\n const { isStreaming } = useContext(TerminalContext);\n\n if (!isStreaming) {\n return null;\n }\n\n return (\n <div\n className={cn(\"flex items-center gap-2 text-xs text-muted-foreground\", className)}\n {...props}\n >\n {children}\n </div>\n );\n};\n\nexport type TerminalActionsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const TerminalActions = ({\n className,\n children,\n ...props\n}: TerminalActionsProps) => (\n <div className={cn(\"flex items-center gap-1\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type TerminalCopyButtonProps = ComponentProps<typeof Button> & {\n onCopy?: () => void;\n onError?: (error: Error) => void;\n timeout?: number;\n};\n\nexport const TerminalCopyButton = ({\n onCopy,\n onError,\n timeout = 2000,\n children,\n className,\n ...props\n}: TerminalCopyButtonProps) => {\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<number>(0);\n const { output } = useContext(TerminalContext);\n\n const copyToClipboard = useCallback(async () => {\n if (typeof window === \"undefined\" || !navigator?.clipboard?.writeText) {\n onError?.(new Error(\"Clipboard API not available\"));\n return;\n }\n\n try {\n await navigator.clipboard.writeText(output);\n setIsCopied(true);\n onCopy?.();\n timeoutRef.current = window.setTimeout(() => setIsCopied(false), timeout);\n } catch (error) {\n onError?.(error as Error);\n }\n }, [output, onCopy, onError, timeout]);\n\n useEffect(\n () => () => {\n window.clearTimeout(timeoutRef.current);\n },\n []\n );\n\n const Icon = isCopied ? CheckIcon : CopyIcon;\n\n return (\n <Button\n className={cn(\n \"size-7 shrink-0 text-muted-foreground hover:bg-accent hover:text-foreground\",\n className\n )}\n onClick={copyToClipboard}\n size=\"icon\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <Icon size={14} />}\n </Button>\n );\n};\n\nexport type TerminalClearButtonProps = ComponentProps<typeof Button>;\n\nexport const TerminalClearButton = ({\n children,\n className,\n ...props\n}: TerminalClearButtonProps) => {\n const { onClear } = useContext(TerminalContext);\n\n if (!onClear) {\n return null;\n }\n\n return (\n <Button\n className={cn(\n \"size-7 shrink-0 text-muted-foreground hover:bg-accent hover:text-foreground\",\n className\n )}\n onClick={onClear}\n size=\"icon\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <Trash2Icon size={14} />}\n </Button>\n );\n};\n\nexport type TerminalContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const TerminalContent = ({\n className,\n children,\n ...props\n}: TerminalContentProps) => {\n const { output, isStreaming, autoScroll } = useContext(TerminalContext);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (autoScroll && containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight;\n }\n }, [output, autoScroll]);\n\n return (\n <div\n className={cn(\n \"max-h-96 overflow-auto p-4 font-mono text-sm leading-relaxed\",\n className\n )}\n ref={containerRef}\n {...props}\n >\n {children ?? (\n <pre className=\"whitespace-pre-wrap break-words\">\n <Ansi>{output}</Ansi>\n {isStreaming && (\n <span className=\"ml-0.5 inline-block h-4 w-2 animate-pulse bg-foreground\" />\n )}\n </pre>\n )}\n </div>\n );\n};\n\nexport type TerminalProps = HTMLAttributes<HTMLDivElement> & {\n output: string;\n isStreaming?: boolean;\n autoScroll?: boolean;\n onClear?: () => void;\n};\n\nexport const Terminal = ({\n output,\n isStreaming = false,\n autoScroll = true,\n onClear,\n className,\n children,\n ...props\n}: TerminalProps) => {\n const contextValue = useMemo(\n () => ({ autoScroll, isStreaming, onClear, output }),\n [autoScroll, isStreaming, onClear, output]\n );\n\n return (\n <TerminalContext.Provider value={contextValue}>\n <div\n className={cn(\n \"flex flex-col overflow-hidden rounded-lg text-foreground\",\n className\n )}\n {...props}\n >\n {children ?? (\n <>\n <TerminalHeader>\n <TerminalTitle />\n <div className=\"flex items-center gap-1\">\n <TerminalStatus />\n <TerminalActions>\n <TerminalCopyButton />\n {onClear && <TerminalClearButton />}\n </TerminalActions>\n </div>\n </TerminalHeader>\n <TerminalContent />\n </>\n )}\n </div>\n </TerminalContext.Provider>\n );\n};\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Renderer for the \"process\" tool — manages background processes started\n// via terminal(background=true). Handles all 7 actions: list, poll, log,\n// wait, kill, write, submit.\n\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n ActivityIcon,\n CircleCheckIcon,\n CircleDotIcon,\n CircleXIcon,\n ClockIcon,\n Loader2Icon,\n SkullIcon,\n} from \"lucide-react\";\nimport {\n Terminal,\n TerminalHeader,\n} from \"../../ai-elements/terminal\";\nimport { Button } from \"../../ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"../../ui/dialog\";\nimport { ScrollArea } from \"../../ui/scroll-area\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ToolCallInfo } from \"../../../types\";\n\n// ── Types ───────────────────────────────────────────────────────────\n\ninterface ProcessEntry {\n session_id: string;\n command: string;\n cwd?: string;\n pid?: number;\n started_at?: string;\n uptime_seconds?: number;\n status: \"running\" | \"exited\";\n output_preview?: string;\n exit_code?: number | null;\n detached?: boolean;\n}\n\ninterface ProcessArgs {\n action: string;\n session_id?: string;\n data?: string;\n timeout?: number;\n offset?: number;\n limit?: number;\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────\n\nfunction parseArgs(args: string): ProcessArgs {\n try {\n return JSON.parse(args) as ProcessArgs;\n } catch {\n return { action: \"unknown\" };\n }\n}\n\nfunction parseResult(result: string | undefined): Record<string, unknown> | null {\n if (!result) return null;\n try {\n return JSON.parse(result) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction formatUptime(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n return `${h}h ${m}m`;\n}\n\nfunction truncateCommand(cmd: string, max = 80): string {\n return cmd.length > max ? cmd.slice(0, max) + \"...\" : cmd;\n}\n\n// ── Status badge ────────────────────────────────────────────────────\n\nfunction StatusBadge({ status, exitCode }: { status: string; exitCode?: number | null }) {\n if (status === \"running\") {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-emerald-600 dark:text-emerald-400\">\n <CircleDotIcon className=\"size-3 animate-pulse\" />\n running\n </span>\n );\n }\n if (status === \"exited\") {\n const ok = exitCode === 0;\n return (\n <span className={cn(\n \"inline-flex items-center gap-1 text-xs font-medium\",\n ok ? \"text-muted-foreground\" : \"text-red-500 dark:text-red-400\",\n )}>\n {ok\n ? <CircleCheckIcon className=\"size-3\" />\n : <CircleXIcon className=\"size-3\" />}\n exited({exitCode ?? \"?\"})\n </span>\n );\n }\n if (status === \"killed\") {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-orange-500 dark:text-orange-400\">\n <SkullIcon className=\"size-3\" />\n killed\n </span>\n );\n }\n if (status === \"timeout\") {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-amber-500 dark:text-amber-400\">\n <ClockIcon className=\"size-3\" />\n timeout\n </span>\n );\n }\n if (status === \"interrupted\") {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-amber-500 dark:text-amber-400\">\n <CircleXIcon className=\"size-3\" />\n interrupted\n </span>\n );\n }\n // not_found, error, ok, already_exited, etc.\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground\">\n {status}\n </span>\n );\n}\n\n// ── Action: list ────────────────────────────────────────────────────\n\nfunction ProcessListView({ processes }: { processes: ProcessEntry[] }) {\n if (processes.length === 0) {\n return (\n <div className=\"flex items-center gap-2 px-3 py-2 text-sm text-muted-foreground \">\n <ActivityIcon className=\"size-3.5 shrink-0\" />\n No background processes\n </div>\n );\n }\n\n return (\n <div className=\"space-y-px\">\n {processes.map((p) => (\n <div\n key={p.session_id}\n className=\"flex items-start gap-3 px-3 py-1.5 text-sm\"\n >\n <div className=\"flex flex-col gap-0.5 min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <StatusBadge status={p.status} exitCode={p.exit_code} />\n <span className=\"text-muted-foreground text-xs shrink-0\">\n {p.session_id}\n </span>\n {p.pid != null && (\n <span className=\"text-muted-foreground/60 text-xs shrink-0\">\n pid:{p.pid}\n </span>\n )}\n {p.uptime_seconds != null && (\n <span className=\"text-muted-foreground/60 text-xs shrink-0\">\n {formatUptime(p.uptime_seconds)}\n </span>\n )}\n {p.detached && (\n <span className=\"text-xs text-amber-500/80\">detached</span>\n )}\n </div>\n <pre className=\"text-foreground/80 whitespace-pre-wrap wrap-break-word text-xs\">\n {truncateCommand(p.command, 120)}\n </pre>\n </div>\n </div>\n ))}\n </div>\n );\n}\n\n// ── Action: poll ────────────────────────────────────────────────────\n\nfunction ProcessPollView({ data }: { data: Record<string, unknown> }) {\n const status = (data.status as string) ?? \"unknown\";\n const command = (data.command as string) ?? \"\";\n const sessionId = (data.session_id as string) ?? \"\";\n const pid = data.pid as number | undefined;\n const uptime = data.uptime_seconds as number | undefined;\n const exitCode = data.exit_code as number | null | undefined;\n const preview = (data.output_preview as string) ?? \"\";\n\n return (\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-2 px-3 pt-1.5 text-sm\">\n <StatusBadge status={status} exitCode={exitCode} />\n <span className=\"text-muted-foreground text-xs\">{sessionId}</span>\n {pid != null && (\n <span className=\"text-muted-foreground/60 text-xs\">pid:{pid}</span>\n )}\n {uptime != null && (\n <span className=\"text-muted-foreground/60 text-xs\">{formatUptime(uptime)}</span>\n )}\n </div>\n {command && (\n <pre className=\"px-3 text-xs text-foreground/80 whitespace-pre-wrap wrap-break-word\">\n {truncateCommand(command, 120)}\n </pre>\n )}\n {preview && (\n <OutputPreview output={preview} />\n )}\n </div>\n );\n}\n\n// ── Action: log ─────────────────────────────────────────────────────\n\nconst LOG_COLLAPSED_HEIGHT = 96;\n\nfunction ProcessLogView({ data }: { data: Record<string, unknown> }) {\n const output = (data.output as string) ?? \"\";\n const status = (data.status as string) ?? \"\";\n const totalLines = data.total_lines as number | undefined;\n const showing = (data.showing as string) ?? \"\";\n const sessionId = (data.session_id as string) ?? \"\";\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n const [overflows, setOverflows] = useState(false);\n\n useEffect(() => {\n if (contentRef.current) {\n setOverflows(contentRef.current.scrollHeight > LOG_COLLAPSED_HEIGHT);\n }\n }, [output]);\n\n return (\n <>\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-2 px-3 pt-1.5 text-sm\">\n <StatusBadge status={status} />\n <span className=\"text-muted-foreground text-xs\">{sessionId}</span>\n {totalLines != null && (\n <span className=\"text-muted-foreground/60 text-xs\">\n {showing} of {totalLines}\n </span>\n )}\n </div>\n <div\n ref={contentRef}\n role=\"button\"\n tabIndex={0}\n onClick={() => overflows && setDialogOpen(true)}\n onKeyDown={(e) => { if (e.key === \"Enter\" && overflows) setDialogOpen(true); }}\n className={cn(\n \"overflow-hidden px-3 py-1.5 text-xs leading-relaxed\",\n overflows && \"cursor-pointer max-h-24\",\n )}\n >\n <pre className=\"whitespace-pre-wrap wrap-break-word text-foreground/80\">\n {output || <span className=\"text-muted-foreground/60\">(empty)</span>}\n </pre>\n </div>\n {overflows && (\n <div className=\"px-3 pb-1\">\n <Button\n variant=\"outline\"\n size=\"xs\"\n onClick={() => setDialogOpen(true)}\n >\n Expand log\n </Button>\n </div>\n )}\n </div>\n\n <Dialog open={dialogOpen} onOpenChange={setDialogOpen}>\n <DialogContent className=\"sm:max-w-[50vw] w-full h-[70vh] flex flex-col p-0 gap-0 overflow-hidden\">\n <DialogHeader className=\"px-4 py-3 border-b border-border shrink-0\">\n <DialogTitle className=\" text-sm\">\n Process log — {sessionId}\n </DialogTitle>\n </DialogHeader>\n <ScrollArea className=\"flex-1 min-h-0\">\n <pre className=\"px-4 py-3 text-sm leading-relaxed whitespace-pre-wrap wrap-break-word\">\n {output || \"(empty)\"}\n </pre>\n </ScrollArea>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n\n// ── Action: wait ────────────────────────────────────────────────────\n\nfunction ProcessWaitView({ data }: { data: Record<string, unknown> }) {\n const status = (data.status as string) ?? \"unknown\";\n const exitCode = data.exit_code as number | null | undefined;\n const output = (data.output as string) ?? \"\";\n const note = (data.timeout_note as string) ?? (data.note as string) ?? \"\";\n\n return (\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-2 px-3 pt-1.5 text-sm\">\n <StatusBadge status={status} exitCode={exitCode} />\n {note && (\n <span className=\"text-muted-foreground/60 text-xs\">{note}</span>\n )}\n </div>\n {output && <OutputPreview output={output} />}\n </div>\n );\n}\n\n// ── Action: kill ────────────────────────────────────────────────────\n\nfunction ProcessKillView({ data }: { data: Record<string, unknown> }) {\n const status = (data.status as string) ?? \"unknown\";\n const sessionId = (data.session_id as string) ?? \"\";\n const exitCode = data.exit_code as number | null | undefined;\n const error = (data.error as string) ?? \"\";\n\n return (\n <div className=\"flex items-center gap-2 px-3 py-1.5 text-sm\">\n <StatusBadge status={status} exitCode={exitCode} />\n {sessionId && (\n <span className=\"text-muted-foreground text-xs\">{sessionId}</span>\n )}\n {error && (\n <span className=\"text-red-500 text-xs\">{error}</span>\n )}\n </div>\n );\n}\n\n// ── Action: write / submit ──────────────────────────────────────────\n\nfunction ProcessStdinView({ action, data }: { action: string; data: Record<string, unknown> }) {\n const status = (data.status as string) ?? \"unknown\";\n const bytesWritten = data.bytes_written as number | undefined;\n const error = (data.error as string) ?? \"\";\n\n const ok = status === \"ok\";\n return (\n <div className=\"flex items-center gap-2 px-3 py-1.5 text-sm\">\n <span className={cn(\n \"text-xs font-medium\",\n ok ? \"text-emerald-600 dark:text-emerald-400\" : \"text-red-500 dark:text-red-400\",\n )}>\n {action === \"submit\" ? \"stdin submit\" : \"stdin write\"}\n </span>\n {ok\n ? <span className=\"text-muted-foreground/60 text-xs\">{bytesWritten} bytes</span>\n : <span className=\"text-red-500 text-xs\">{error || status}</span>}\n </div>\n );\n}\n\n// ── Shared output preview ───────────────────────────────────────────\n\nfunction OutputPreview({ output }: { output: string }) {\n return (\n <div className=\"px-3 py-1.5 text-xs leading-relaxed max-h-20 overflow-hidden\">\n <div className=\"flex gap-2 text-muted-foreground\">\n <span className=\"shrink-0 select-none text-sky-600\">OUT</span>\n <pre className=\"whitespace-pre-wrap wrap-break-word text-foreground/70\">\n {output}\n </pre>\n </div>\n </div>\n );\n}\n\n// ── Main renderer ───────────────────────────────────────────────────\n\nexport function ProcessToolBlock({ tc }: { tc: ToolCallInfo }) {\n const isRunning = tc.status === \"running\";\n const args = parseArgs(tc.args);\n const result = parseResult(tc.result);\n const action = args.action || \"unknown\";\n\n const actionLabel: Record<string, string> = {\n list: \"Process List\",\n poll: \"Process Poll\",\n log: \"Process Log\",\n wait: \"Process Wait\",\n kill: \"Process Kill\",\n write: \"Process Stdin\",\n submit: \"Process Stdin\",\n };\n\n // Running state — show action header with spinner\n if (isRunning && !result) {\n return (\n <Terminal output=\"\" isStreaming className=\"w-full text-sm\">\n <TerminalHeader>\n <div className=\"flex items-center gap-1.5 min-w-0 text-sm \">\n <ActivityIcon className=\"size-3.5 shrink-0\" />\n <span className=\"font-semibold text-foreground shrink-0\">\n {actionLabel[action] ?? \"Process\"}\n </span>\n {args.session_id && (\n <span className=\"text-muted-foreground text-xs truncate\">\n {args.session_id}\n </span>\n )}\n </div>\n </TerminalHeader>\n <div className=\"px-3 py-2 bg-background text-sm flex items-center gap-2 text-muted-foreground\">\n <Loader2Icon className=\"size-3 animate-spin\" />\n <span className=\"text-xs\">\n {action === \"wait\" ? `Waiting${args.timeout ? ` (${args.timeout}s timeout)` : \"\"}...` : \"(no output)\"}\n </span>\n </div>\n </Terminal>\n );\n }\n\n if (!result) return null;\n\n // Error result (not_found, generic error)\n const resultStatus = result.status as string | undefined;\n const resultError = result.error as string | undefined;\n if (resultStatus === \"not_found\" || (resultStatus === \"error\" && ![\"list\", \"poll\", \"log\"].includes(action))) {\n return (\n <Terminal output=\"\" className=\"w-full text-sm\">\n <TerminalHeader>\n <div className=\"flex items-center gap-1.5 min-w-0 text-sm \">\n <ActivityIcon className=\"size-3.5 shrink-0\" />\n <span className=\"font-semibold text-foreground shrink-0\">\n {actionLabel[action] ?? \"Process\"}\n </span>\n </div>\n </TerminalHeader>\n <div className=\"px-3 py-2 bg-background text-xs text-red-500 dark:text-red-400\">\n {resultError || resultStatus}\n </div>\n </Terminal>\n );\n }\n\n // Dispatch to action-specific view\n let content: React.ReactNode;\n switch (action) {\n case \"list\":\n content = <ProcessListView processes={(result.processes as ProcessEntry[]) ?? []} />;\n break;\n case \"poll\":\n content = <ProcessPollView data={result} />;\n break;\n case \"log\":\n content = <ProcessLogView data={result} />;\n break;\n case \"wait\":\n content = <ProcessWaitView data={result} />;\n break;\n case \"kill\":\n content = <ProcessKillView data={result} />;\n break;\n case \"write\":\n case \"submit\":\n content = <ProcessStdinView action={action} data={result} />;\n break;\n default:\n content = (\n <pre className=\"px-3 py-2 text-xs text-muted-foreground whitespace-pre-wrap\">\n {JSON.stringify(result, null, 2)}\n </pre>\n );\n }\n\n return (\n <Terminal output=\"\" className=\"w-full text-sm\">\n <TerminalHeader>\n <div className=\"flex items-center gap-1.5 min-w-0 text-sm \">\n <ActivityIcon className=\"size-3.5 shrink-0\" />\n <span className=\"font-semibold text-foreground shrink-0\">\n {actionLabel[action] ?? \"Process\"}\n </span>\n {args.session_id && ![\"list\"].includes(action) && (\n <span className=\"text-muted-foreground text-xs truncate\">\n {args.session_id}\n </span>\n )}\n </div>\n </TerminalHeader>\n <div className=\"bg-background pb-1\">\n {content}\n </div>\n </Terminal>\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-none border border-transparent border-b-input bg-transparent px-0 py-3 text-base transition-[color,border-color] outline-none placeholder:text-muted-foreground focus-visible:border-b-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-b-destructive md:text-sm dark:aria-invalid:border-b-destructive/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Renders consult_expert tool calls with thumbs-up / thumbs-down\n// feedback buttons. Thumbs-up posts immediately; thumbs-down opens a\n// comment form so the user can record why the response was\n// unsatisfactory. Submission hits\n// POST /v1/sessions/{id}/events/{event_id}/feedback (where event_id\n// is the id of the expert.result turn being rated) which emits\n// EXPERT_ENDORSE or EXPERT_OVERRIDE into the event log.\n\nimport { useState } from \"react\";\nimport { ChevronRightIcon, ThumbsDownIcon, ThumbsUpIcon } from \"lucide-react\";\nimport { cn } from \"../../../lib/utils\";\nimport { Textarea } from \"../../ui/textarea\";\nimport { Button } from \"../../ui/button\";\nimport { parseArgs } from \"./shared\";\nimport type { ToolCallInfo } from \"../../../types\";\nimport type { AgentChatExpertFeedbackRating } from \"../../../types\";\nimport { useAgentChatAdapterContext } from \"../../../adapter-context\";\n\n// Keep in sync with _MAX_REASON_LENGTH in api/routes/feedback.py.\nconst MAX_REASON_LENGTH = 500;\n\ninterface ExpertArgs {\n expert?: string;\n question?: string;\n prompt?: string;\n}\n\ninterface ExpertResult {\n summary?: string;\n response?: string;\n content?: string;\n error?: string | null;\n}\n\nexport function ExpertToolBlock({ tc }: { tc: ToolCallInfo }) {\n const [expanded, setExpanded] = useState(false);\n const { adapter, sessionId } = useAgentChatAdapterContext();\n // Optimistic marker: set the moment the user clicks, cleared when the\n // server responds. Authoritative rating arrives via the SSE stream as\n // tc.expertFeedback; we prefer it once present.\n const [pending, setPending] = useState<AgentChatExpertFeedbackRating | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [reasonDraft, setReasonDraft] = useState<string | null>(null);\n\n const rating = tc.expertFeedback?.rating ?? pending;\n const alreadyRated = tc.expertFeedback !== undefined;\n const canRate =\n tc.expertResultEventId !== undefined &&\n sessionId !== null &&\n adapter.submitExpertFeedback !== undefined &&\n tc.status !== \"running\";\n\n const submit = async (next: AgentChatExpertFeedbackRating, reason?: string) => {\n if (\n sessionId === null ||\n tc.expertResultEventId === undefined ||\n adapter.submitExpertFeedback === undefined\n ) return;\n setPending(next);\n setError(null);\n try {\n await adapter.submitExpertFeedback({\n sessionId,\n expertResultEventId: tc.expertResultEventId,\n rating: next,\n reason,\n });\n setReasonDraft(null);\n } catch (e) {\n setPending(null);\n setError(e instanceof Error ? e.message : \"Failed to submit feedback\");\n }\n };\n\n const handleRate = (next: AgentChatExpertFeedbackRating) => {\n if (!canRate || alreadyRated || pending !== null) return;\n if (next === \"down\") {\n setReasonDraft(\"\");\n return;\n }\n void submit(\"up\");\n };\n\n const args = parseArgs<ExpertArgs>(tc.args) ?? {};\n const expertName = args.expert ?? null;\n const question = args.question ?? args.prompt ?? \"\";\n const result = parseExpertResult(tc.result);\n const failed = Boolean(result?.error);\n\n return (\n <div className=\"space-y-1\">\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className={cn(\n \"flex w-fit max-w-full items-center gap-1.5 rounded-md px-0 py-0.5\",\n \"text-sm text-muted-foreground hover:text-foreground transition-colors\"\n )}\n >\n <ChevronRightIcon\n className={cn(\n \"size-3 shrink-0 transition-transform duration-150\",\n expanded && \"rotate-90\",\n )}\n />\n <span className=\"font-semibold text-foreground\">Consulted expert</span>\n {expertName && (\n <span className=\"text-muted-foreground\">· {expertName}</span>\n )}\n {failed && <span className=\"text-red-500\">· failed</span>}\n </button>\n\n {result?.summary && !expanded && (\n <div className=\"ml-6 rounded-md border-l-2 border-primary/50 bg-muted/30 px-3 py-2 text-sm text-foreground/90\">\n {result.summary}\n </div>\n )}\n\n {expanded && (\n <div className=\"ml-6 mt-0.5 space-y-1.5 text-sm\">\n {question && (\n <ExpertDetail label=\"Question\" content={question} />\n )}\n {result?.summary && (\n <ExpertDetail\n label={failed ? \"Error\" : \"Response\"}\n content={result.summary}\n tone={failed ? \"error\" : \"default\"}\n />\n )}\n </div>\n )}\n\n {canRate && (\n <div className=\"ml-6 mt-1 space-y-1.5\">\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <span>Rate this expert's response:</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Good response\"\n title={alreadyRated && rating === \"up\" ? \"Good response (recorded)\" : \"Good response\"}\n disabled={pending !== null || (alreadyRated && rating !== \"up\")}\n onClick={() => handleRate(\"up\")}\n className={cn(\n rating === \"up\" ? \"text-foreground\" : \"text-muted-foreground/60\",\n )}\n >\n <ThumbsUpIcon className=\"size-3.5\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Poor response\"\n title={alreadyRated && rating === \"down\" ? \"Poor response (recorded)\" : \"Poor response\"}\n disabled={\n pending !== null ||\n reasonDraft !== null ||\n (alreadyRated && rating !== \"down\")\n }\n onClick={() => handleRate(\"down\")}\n className={cn(\n rating === \"down\" ? \"text-foreground\" : \"text-muted-foreground/60\",\n )}\n >\n <ThumbsDownIcon className=\"size-3.5\" />\n </Button>\n {alreadyRated && tc.expertFeedback?.reason && (\n <span\n className=\"text-muted-foreground/70 truncate max-w-xs\"\n title={tc.expertFeedback.reason}\n >\n · \"{tc.expertFeedback.reason}\"\n </span>\n )}\n {error && <span className=\"text-red-500 ml-1\">{error}</span>}\n </div>\n\n {reasonDraft !== null && !alreadyRated && (\n <ReasonForm\n initialValue={reasonDraft}\n busy={pending !== null}\n onSubmit={(reason) => void submit(\"down\", reason)}\n onCancel={() => {\n setReasonDraft(null);\n setError(null);\n }}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction parseExpertResult(result: string | undefined): ExpertResult | null {\n if (!result) return null;\n const parsed = parseArgs<ExpertResult>(result);\n if (parsed) {\n return {\n ...parsed,\n summary: parsed.summary ?? parsed.response ?? parsed.content,\n };\n }\n return { summary: result };\n}\n\nfunction ExpertDetail({\n label,\n content,\n tone = \"default\",\n}: {\n label: string;\n content: string;\n tone?: \"default\" | \"error\";\n}) {\n return (\n <div\n className={cn(\n \"rounded-md border-l-2 px-3 py-2\",\n tone === \"error\"\n ? \"border-red-500/50 bg-red-500/5\"\n : \"border-primary/50 bg-muted/30\",\n )}\n >\n <div className=\"mb-1 text-[10px] uppercase tracking-wide text-muted-foreground/70\">\n {label}\n </div>\n <div className=\"whitespace-pre-wrap wrap-break-word text-foreground/90\">\n {content}\n </div>\n </div>\n );\n}\n\nfunction ReasonForm({\n initialValue,\n busy,\n onSubmit,\n onCancel,\n}: {\n initialValue: string;\n busy: boolean;\n onSubmit: (reason: string) => void;\n onCancel: () => void;\n}) {\n // State is local so keystrokes don't re-render the parent tool block.\n const [value, setValue] = useState(initialValue);\n const trimmed = value.trim();\n const charsLeft = MAX_REASON_LENGTH - value.length;\n\n const submit = () => {\n if (trimmed && !busy) onSubmit(trimmed);\n };\n\n return (\n <div className=\"rounded-md border border-border bg-muted/30 p-2 space-y-1.5\">\n <label className=\"text-xs text-muted-foreground\" htmlFor=\"expert-reason\">\n What was wrong with the response?\n </label>\n <Textarea\n id=\"expert-reason\"\n autoFocus\n rows={3}\n value={value}\n maxLength={MAX_REASON_LENGTH}\n placeholder=\"e.g. wrong WHERE clause, missed an edge case, hallucinated a column name…\"\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n submit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n onCancel();\n }\n }}\n className=\"text-xs min-h-12\"\n disabled={busy}\n />\n <div className=\"flex items-center justify-between gap-2\">\n <span\n className={cn(\n \"text-[10px] tabular-nums\",\n charsLeft < 50 ? \"text-amber-500\" : \"text-muted-foreground/60\",\n )}\n >\n {charsLeft} characters left\n </span>\n <div className=\"flex items-center gap-1.5\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"xs\"\n onClick={onCancel}\n disabled={busy}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"xs\"\n onClick={submit}\n disabled={busy || !trimmed}\n >\n {busy ? \"Sending…\" : \"Send feedback\"}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Compact one-liner renderers for the read-only skill discovery tools:\n// - skills_list: enumerate available skills (optionally filtered by category)\n// - skill_view: load a skill's SKILL.md (or one of its linked files)\n\nimport type { ToolCallInfo } from \"../../../types\";\nimport { parseArgs } from \"./shared\";\n\n// ── skills_list ─────────────────────────────────────────────────────\n\ninterface SkillsListArgs {\n category?: string;\n}\n\ninterface SkillsListResult {\n success?: boolean;\n count?: number;\n categories?: string[];\n}\n\nexport function SkillsListBlock({ tc }: { tc: ToolCallInfo }) {\n const args = parseArgs<SkillsListArgs>(tc.args) ?? {};\n const filter = args.category ? `category: ${args.category}` : \"all\";\n\n let summary = \"\";\n if (tc.result) {\n const parsed = parseArgs<SkillsListResult>(tc.result);\n if (parsed?.count !== undefined) {\n summary = `${parsed.count} skill${parsed.count === 1 ? \"\" : \"s\"}`;\n }\n }\n\n return (\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">Skills List</span>\n <span className=\"text-muted-foreground truncate\">{filter}</span>\n {summary && (\n <span className=\"text-muted-foreground/70 ml-1\">→ {summary}</span>\n )}\n </div>\n );\n}\n\n// ── skill_view ──────────────────────────────────────────────────────\n\ninterface SkillViewArgs {\n name?: string;\n file_path?: string;\n}\n\ninterface SkillViewResult {\n success?: boolean;\n name?: string;\n staged_at?: string;\n token_estimate?: number;\n}\n\nexport function SkillViewBlock({ tc }: { tc: ToolCallInfo }) {\n const args = parseArgs<SkillViewArgs>(tc.args) ?? {};\n const target = args.file_path\n ? `${args.name ?? \"?\"}/${args.file_path}`\n : (args.name ?? \"?\");\n\n let summary = \"\";\n if (tc.result) {\n const parsed = parseArgs<SkillViewResult>(tc.result);\n if (parsed?.staged_at) {\n summary = `staged at ${parsed.staged_at}`;\n } else if (parsed?.token_estimate) {\n summary = `${parsed.token_estimate} tokens`;\n }\n }\n\n return (\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">Skill View</span>\n <span className=\"text-muted-foreground truncate\">{target}</span>\n {summary && (\n <span className=\"text-muted-foreground/70 ml-1\">→ {summary}</span>\n )}\n </div>\n );\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-10 w-full min-w-0 border border-transparent border-b-input bg-transparent px-0 py-1 text-base transition-[color,border-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-b-ring disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-b-destructive md:text-sm dark:aria-invalid:border-b-destructive/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Clarify tool widget -- tabs for each question, radio choices with\n// labels + descriptions, an optional \"Other\" free-form row, and a single\n// Submit that batches every answer back to the worker. Esc pauses the\n// session (= user chose to stop the chat instead of answering).\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { XIcon } from \"lucide-react\";\nimport { cn } from \"../../../lib/utils\";\nimport { Input } from \"../../ui/input\";\nimport { useAgentChatAdapterContext } from \"../../../adapter-context\";\nimport { parseArgs } from \"./shared\";\nimport type { ToolCallInfo } from \"../../../types\";\nimport type {\n ClarifyAnswer,\n ClarifyArgs,\n ClarifyChoice,\n ClarifyQuestion,\n} from \"../../../types\";\n\n// Sentinel choice index for the \"Other\" option. Indexes into `choices`\n// are 0..(N-1); OTHER_INDEX is N so pickers can round-trip cleanly.\nconst OTHER_INDEX_OFFSET = 1_000_000;\n\ntype Selection = {\n // Index into question.choices, or a value >= OTHER_INDEX_OFFSET when\n // the user picked the \"Other\" row. -1 = no selection yet.\n index: number;\n other: string;\n};\n\nfunction emptySelection(): Selection {\n return { index: -1, other: \"\" };\n}\n\nfunction buildAnswer(q: ClarifyQuestion, sel: Selection): ClarifyAnswer | null {\n if (sel.index < 0) return null;\n if (sel.index >= OTHER_INDEX_OFFSET) {\n const text = sel.other.trim();\n if (!text) return null;\n return { question: q.prompt, answer: text, is_other: true };\n }\n const choice = q.choices?.[sel.index];\n if (!choice) return null;\n return { question: q.prompt, answer: choice.label, is_other: false };\n}\n\nexport function ClarifyToolBlock({ tc }: { tc: ToolCallInfo }) {\n const { adapter, sessionId } = useAgentChatAdapterContext();\n const args = useMemo(() => parseArgs<ClarifyArgs>(tc.args), [tc.args]);\n const questions = args?.questions ?? [];\n\n const [active, setActive] = useState(0);\n const [selections, setSelections] = useState<Selection[]>(() =>\n questions.map(emptySelection),\n );\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const locked = tc.clarifyAnswers !== undefined || tc.status !== \"running\";\n\n // Clamp active tab when questions change (shouldn't, but defensive).\n useEffect(() => {\n if (active >= questions.length && questions.length > 0) setActive(0);\n }, [active, questions.length]);\n\n const updateSelection = useCallback(\n (next: Partial<Selection>) => {\n setSelections((prev) => {\n const copy = prev.slice();\n copy[active] = { ...copy[active], ...next };\n return copy;\n });\n },\n [active],\n );\n\n const answers: (ClarifyAnswer | null)[] = useMemo(\n () => questions.map((q, i) => buildAnswer(q, selections[i] ?? emptySelection())),\n [questions, selections],\n );\n const allAnswered = answers.every((a) => a !== null);\n\n const handleSubmit = useCallback(async () => {\n if (!sessionId || locked || submitting) return;\n if (!allAnswered) {\n setError(\"Answer every question before submitting.\");\n return;\n }\n setError(null);\n setSubmitting(true);\n try {\n await adapter.submitClarifyResponse({\n sessionId,\n toolCallId: tc.id,\n responses: answers as ClarifyAnswer[],\n });\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Submit failed.\");\n } finally {\n setSubmitting(false);\n }\n }, [adapter, sessionId, tc.id, answers, allAnswered, locked, submitting]);\n\n const handleCancel = useCallback(() => {\n if (!sessionId || locked) return;\n // Cancel = stop chat: pause the session. The worker's clarify handler\n // sees the session.pause event and returns with ``cancelled: true``.\n void adapter.pauseSession({ sessionId }).catch(() => {\n // Best-effort; the user may press Esc again.\n });\n }, [adapter, sessionId, locked]);\n\n // Keyboard shortcuts: Esc cancels, Enter submits when all questions answered.\n useEffect(() => {\n if (locked) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n handleCancel();\n } else if (e.key === \"Enter\" && !e.shiftKey) {\n const tgt = e.target as HTMLElement | null;\n // Let textareas and the \"Other\" input consume Enter normally --\n // the global Enter only fires when focus is on the widget shell.\n if (tgt?.tagName === \"TEXTAREA\" || tgt?.tagName === \"INPUT\") return;\n e.preventDefault();\n void handleSubmit();\n }\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [handleCancel, handleSubmit, locked]);\n\n if (questions.length === 0) {\n return (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/5 px-3 py-2 text-xs text-destructive\">\n clarify: no questions provided\n </div>\n );\n }\n\n if (locked) {\n return <ClarifyLocked tc={tc} questions={questions} />;\n }\n\n const current = questions[active];\n const currentSel = selections[active] ?? emptySelection();\n\n return (\n <div\n className={cn(\n \"rounded-md border border-border bg-background/80 shadow-sm\",\n \"max-w-2xl\",\n )}\n role=\"group\"\n aria-label=\"Clarifying questions\"\n >\n {/* Tab bar + close */}\n <div className=\"flex items-center justify-between border-b border-border px-3 pt-2\">\n <div className=\"flex items-center gap-3 overflow-x-auto text-sm\">\n {questions.map((_, i) => {\n const isActive = i === active;\n const answered = answers[i] !== null;\n return (\n <button\n key={i}\n type=\"button\"\n onClick={() => setActive(i)}\n className={cn(\n \"relative pb-2 transition-colors whitespace-nowrap\",\n isActive\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n <span>Question {i + 1}</span>\n {answered && !isActive && (\n <span className=\"ml-1 text-[10px] text-emerald-500\">●</span>\n )}\n {isActive && (\n <span className=\"absolute inset-x-0 bottom-0 h-px bg-foreground\" />\n )}\n </button>\n );\n })}\n </div>\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"ml-2 rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n aria-label=\"Cancel clarification and stop chat\"\n title=\"Esc — cancel and stop the chat\"\n >\n <XIcon className=\"size-4\" />\n </button>\n </div>\n\n {/* Prompt */}\n <div className=\"px-3 pt-3\">\n <p className=\"text-sm text-foreground\">{current.prompt}</p>\n </div>\n\n {/* Choices */}\n <div className=\"mt-3 px-1 pb-2\">\n {(current.choices ?? []).map((choice, i) => (\n <ChoiceRow\n key={i}\n choice={choice}\n selected={currentSel.index === i}\n onSelect={() => updateSelection({ index: i })}\n />\n ))}\n\n {(current.allow_other ?? true) && (\n <OtherRow\n selected={currentSel.index >= OTHER_INDEX_OFFSET}\n value={currentSel.other}\n onSelect={() =>\n updateSelection({ index: OTHER_INDEX_OFFSET })\n }\n onChange={(v) =>\n updateSelection({ index: OTHER_INDEX_OFFSET, other: v })\n }\n />\n )}\n </div>\n\n {/* Submit */}\n <div className=\"border-t border-border px-3 py-2\">\n <button\n type=\"button\"\n disabled={!allAnswered || submitting}\n onClick={() => void handleSubmit()}\n className={cn(\n \"w-full rounded border border-border px-2 py-1.5 text-left text-sm \",\n \"text-muted-foreground hover:bg-muted/40\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n )}\n >\n <span className=\"mr-2 text-muted-foreground/70\">\n {answers.filter((a) => a !== null).length}\n </span>\n {submitting\n ? \"Submitting…\"\n : allAnswered\n ? \"Submit answers\"\n : `Answer ${questions.length - answers.filter((a) => a !== null).length} more to submit`}\n </button>\n <div className=\"mt-1 flex items-center justify-between text-[10px] text-muted-foreground/70\">\n <span>Esc to cancel</span>\n {error && <span className=\"text-destructive\">{error}</span>}\n </div>\n </div>\n </div>\n );\n}\n\n// ── Choice row ───────────────────────────────────────────────────────\n\nfunction ChoiceRow({\n choice,\n selected,\n onSelect,\n}: {\n choice: ClarifyChoice;\n selected: boolean;\n onSelect: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={cn(\n \"flex w-full items-start gap-3 rounded px-2 py-1.5 text-left transition-colors\",\n selected ? \"bg-muted\" : \"hover:bg-muted/40\",\n )}\n >\n <Radio selected={selected} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm text-foreground\">{choice.label}</div>\n {choice.description && (\n <div className=\"text-xs text-muted-foreground\">\n {choice.description}\n </div>\n )}\n </div>\n </button>\n );\n}\n\nfunction OtherRow({\n selected,\n value,\n onSelect,\n onChange,\n}: {\n selected: boolean;\n value: string;\n onSelect: () => void;\n onChange: (v: string) => void;\n}) {\n return (\n <div\n className={cn(\n \"flex items-start gap-3 rounded px-2 py-1.5 transition-colors\",\n selected ? \"bg-muted\" : \"hover:bg-muted/40\",\n )}\n >\n <button\n type=\"button\"\n onClick={onSelect}\n className=\"flex shrink-0 items-center pt-0.5\"\n aria-label=\"Choose Other\"\n >\n <Radio selected={selected} />\n </button>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm text-foreground\">Other</div>\n <Input\n placeholder=\"Type your answer…\"\n value={value}\n onFocus={onSelect}\n onChange={(e) => onChange(e.target.value)}\n className=\"mt-0.5 h-7 px-0 text-xs\"\n />\n </div>\n </div>\n );\n}\n\nfunction Radio({ selected }: { selected: boolean }) {\n return (\n <span\n aria-hidden\n className={cn(\n \"mt-[3px] size-3.5 shrink-0 rounded-full border\",\n selected\n ? \"border-foreground bg-foreground\"\n : \"border-muted-foreground/60 bg-transparent\",\n )}\n />\n );\n}\n\n// ── Locked (after submit / during replay) ────────────────────────────\n\nfunction ClarifyLocked({\n tc,\n questions,\n}: {\n tc: ToolCallInfo;\n questions: ClarifyQuestion[];\n}) {\n const answers = tc.clarifyAnswers;\n // Map answer question text back to the widget's question index so the\n // order matches the tabs (LLM-submitted order, not user navigation).\n const byPrompt = new Map(\n answers?.map((a) => [a.question, a]) ?? [],\n );\n\n const cancelled = !answers && tc.status !== \"running\";\n\n return (\n <div className=\"rounded-md border border-border bg-muted/20 px-3 py-2 text-sm max-w-2xl\">\n <div className=\"mb-1 text-xs text-muted-foreground\">\n {cancelled ? \"Clarification cancelled\" : \"Clarification answered\"}\n </div>\n <ul className=\"space-y-1.5\">\n {questions.map((q, i) => {\n const a = byPrompt.get(q.prompt);\n return (\n <li key={i} className=\"text-sm\">\n <div className=\"text-muted-foreground\">\n <span className=\"text-muted-foreground/70\">\n Q{i + 1}.\n </span>{\" \"}\n {q.prompt}\n </div>\n {a ? (\n <div className=\"ml-5 text-foreground\">\n <span className=\"text-emerald-500\">→</span>{\" \"}\n {a.answer}\n {a.is_other && (\n <span className=\"ml-1 text-[10px] text-muted-foreground/70\">\n (other)\n </span>\n )}\n </div>\n ) : (\n <div className=\"ml-5 text-muted-foreground/60 italic\">\n — no answer —\n </div>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Minimal renderer for the ``create_artifact`` tool call. The actual\n// artifact content is rendered below by ``ArtifactBlock`` from the\n// ``artifact.created`` event — so the tool call itself is just a\n// compact status line, matching Claude's \"creating …\" artifact UX.\n//\n// Failures here are almost always transient: the LLM occasionally\n// emits a malformed call (flat shape, stringified spec, missing\n// fields) and immediately retries with the right shape. Surfacing\n// the failed attempt as a red \"Tried to create\" + raw error text\n// confuses users who only care about the final rendered chart, and\n// nudges the model into post-hoc \"fix\" loops. We collapse the\n// failed attempt into the same \"still working\" status as the running\n// state instead.\n\nimport type { ToolCallInfo } from \"../../../types\";\nimport { parseArgs, effectiveStatus } from \"./shared\";\n\nexport function ArtifactToolBlock({\n tc,\n resolvedName,\n}: {\n tc: ToolCallInfo;\n // Name resolved by the caller (``args.name`` or the matching\n // ``artifact.created`` fallback). When omitted, the component parses\n // ``tc.args`` inline so it remains self-contained for callers that\n // don't pre-resolve.\n resolvedName?: string;\n}) {\n const status = effectiveStatus(tc);\n\n const label =\n status === \"running\"\n ? \"Creating artifact…\"\n : status === \"error\"\n ? \"Creating artifact…\"\n : \"Created\";\n\n const name = resolvedName\n ?? parseArgs<{ name?: string }>(tc.args)?.name;\n\n return (\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">{label}</span>\n {name && (\n <span className=\"text-muted-foreground truncate\">{name}</span>\n )}\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Renderer for the `delegate_task` tool — sub-agent delegation.\n// Header shows the goal as the primary signal; expanding reveals the\n// full goal, context, agent_type/model overrides, and the child\n// session's final response.\n\nimport { useState } from \"react\";\nimport { ChevronRightIcon, GitBranchIcon } from \"lucide-react\";\nimport { cn } from \"../../../lib/utils\";\nimport { parseArgs, truncate } from \"./shared\";\nimport type { ToolCallInfo } from \"../../../types\";\n\ninterface DelegateArgs {\n goal?: string;\n context?: string;\n model?: string;\n agent_type?: string;\n}\n\nfunction firstLine(s: string): string {\n const idx = s.indexOf(\"\\n\");\n return idx === -1 ? s : s.slice(0, idx);\n}\n\nexport function DelegateToolBlock({ tc }: { tc: ToolCallInfo }) {\n const [expanded, setExpanded] = useState(false);\n const args = parseArgs<DelegateArgs>(tc.args);\n\n const goal = args?.goal ?? \"\";\n const context = args?.context ?? \"\";\n const agentType = args?.agent_type;\n const model = args?.model;\n\n const summary = firstLine(goal).trim();\n\n // The result is usually plain text from the child's final response,\n // but errors come back as `{\"error\": \"...\"}`.\n let resultError: string | null = null;\n if (tc.result) {\n try {\n const parsed = JSON.parse(tc.result);\n if (parsed?.error) resultError = String(parsed.error);\n } catch {\n /* not JSON — treat as plain response text */\n }\n }\n\n return (\n <div>\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className={cn(\n \"flex w-full items-center gap-1.5 rounded-md px-2 py-1\",\n \"text-sm text-muted-foreground hover:bg-muted/50 transition-colors\"\n )}\n >\n <ChevronRightIcon\n className={cn(\n \"size-3 shrink-0 transition-transform duration-150\",\n expanded && \"rotate-90\",\n )}\n />\n <GitBranchIcon className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"font-medium text-foreground/80\">delegate_task</span>\n {agentType && (\n <span className=\"text-muted-foreground\">· {agentType}</span>\n )}\n {summary && (\n <span className=\"text-muted-foreground truncate min-w-0\">\n · {summary}\n </span>\n )}\n </button>\n\n {expanded && (\n <div className=\"ml-6 mt-0.5 space-y-1.5 text-sm font-mono\">\n {(agentType || model) && (\n <div className=\"flex flex-wrap gap-x-3 gap-y-0.5 text-xs text-muted-foreground\">\n {agentType && (\n <span>\n <span className=\"text-muted-foreground/70\">agent:</span>{\" \"}\n {agentType}\n </span>\n )}\n {model && (\n <span>\n <span className=\"text-muted-foreground/70\">model:</span>{\" \"}\n {model}\n </span>\n )}\n </div>\n )}\n\n {goal && (\n <div className=\"rounded bg-muted/40 px-2 py-1\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground/70\">\n Goal\n </div>\n <pre className=\"mt-0.5 whitespace-pre-wrap break-words text-foreground/90\">\n {goal}\n </pre>\n </div>\n )}\n\n {context && (\n <div className=\"rounded bg-muted/40 px-2 py-1\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground/70\">\n Context\n </div>\n <pre className=\"mt-0.5 whitespace-pre-wrap break-words text-muted-foreground\">\n {truncate(context, 2000)}\n </pre>\n </div>\n )}\n\n {tc.status === \"running\" && !tc.result && (\n <div className=\"text-xs text-muted-foreground italic\">\n Sub-agent running…\n </div>\n )}\n\n {tc.result && (\n <div\n className={cn(\n \"rounded px-2 py-1 max-h-64 overflow-y-auto\",\n resultError\n ? \"bg-destructive/10\"\n : \"bg-muted/40\",\n )}\n >\n <div\n className={cn(\n \"text-[10px] uppercase tracking-wide\",\n resultError\n ? \"text-destructive/80\"\n : \"text-emerald-600 dark:text-emerald-400\",\n )}\n >\n {resultError ? \"Error\" : \"Sub-agent response\"}\n </div>\n <pre className=\"mt-0.5 whitespace-pre-wrap break-words text-foreground/90\">\n {truncate(resultError ?? tc.result, 4000)}\n </pre>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Memory tool widget -- compact one-liner that summarises the action\n// (add / replace / remove) against the chosen store (memory / user\n// profile). Expands to show the actual entry content (and the old\n// text for replace / remove).\n\nimport { useState } from \"react\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../../ui/collapsible\";\nimport { cn } from \"../../../lib/utils\";\nimport { parseArgs } from \"./shared\";\nimport type { ToolCallInfo } from \"../../../types\";\n\ninterface MemoryArgs {\n action?: \"add\" | \"replace\" | \"remove\";\n target?: \"memory\" | \"user\";\n content?: string;\n old_text?: string;\n}\n\ninterface MemoryResult {\n success?: boolean;\n message?: string;\n error?: string | null;\n entries?: string[];\n usage?: string;\n entry_count?: number;\n}\n\nconst ACTION_VERB: Record<string, string> = {\n add: \"Saved\",\n replace: \"Updated\",\n remove: \"Removed\",\n};\n\nconst ACTION_PREP: Record<string, string> = {\n add: \"to\",\n replace: \"in\",\n remove: \"from\",\n};\n\nconst TARGET_LABEL: Record<string, string> = {\n memory: \"memory\",\n user: \"user profile\",\n};\n\nexport function MemoryToolBlock({ tc }: { tc: ToolCallInfo }) {\n const [isOpen, setIsOpen] = useState(false);\n const args = parseArgs<MemoryArgs>(tc.args) ?? {};\n const result = tc.result ? parseArgs<MemoryResult>(tc.result) : null;\n\n const action = args.action ?? \"add\";\n const target = args.target ?? \"memory\";\n const verb = ACTION_VERB[action] ?? action;\n const prep = ACTION_PREP[action] ?? \"to\";\n const targetLabel = TARGET_LABEL[target] ?? target;\n const failed = result?.success === false || !!result?.error;\n\n return (\n <Collapsible open={isOpen} onOpenChange={setIsOpen} className=\"not-prose w-full\">\n <CollapsibleTrigger className=\"group/trigger flex w-fit items-center gap-2 text-sm transition-colors\">\n <span className=\"text-left\">\n <span className=\"font-semibold text-foreground\">{verb}</span>{\" \"}\n <span className=\"text-muted-foreground\">\n {prep} {targetLabel}\n </span>\n {result?.usage && !failed && (\n <span className=\"text-muted-foreground/60 ml-1.5 text-xs\">\n {result.usage}\n </span>\n )}\n {failed && (\n <span className=\"text-red-500 ml-1.5\">· failed</span>\n )}\n </span>\n <ChevronDownIcon\n className={cn(\n \"size-4 shrink-0 transition-transform\",\n isOpen ? \"rotate-180\" : \"rotate-0\",\n )}\n />\n </CollapsibleTrigger>\n <CollapsibleContent\n className={cn(\n \"mt-2 overflow-hidden\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n )}\n >\n <div className=\"space-y-1.5\">\n {action === \"add\" && args.content && (\n <MemoryEntry content={args.content} variant=\"added\" />\n )}\n {action === \"replace\" && (\n <>\n {args.old_text && (\n <MemoryEntry content={args.old_text} label=\"Old\" variant=\"removed\" />\n )}\n {args.content && (\n <MemoryEntry content={args.content} label=\"New\" variant=\"added\" />\n )}\n </>\n )}\n {action === \"remove\" && args.old_text && (\n <MemoryEntry content={args.old_text} variant=\"removed\" />\n )}\n {result?.error && (\n <div className=\"rounded bg-red-500/10 px-2 py-1 text-xs text-red-500\">\n {result.error}\n </div>\n )}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nfunction MemoryEntry({\n content,\n label,\n variant = \"added\",\n}: {\n content: string;\n label?: string;\n variant?: \"added\" | \"removed\";\n}) {\n return (\n <div\n className={cn(\n \"rounded-md border-l-2 px-3 py-2 text-sm\",\n variant === \"added\"\n ? \"border-emerald-500/50 bg-emerald-500/5\"\n : \"border-red-500/50 bg-red-500/5\",\n )}\n >\n {label && (\n <div className=\"mb-1 text-[10px] uppercase tracking-wide text-muted-foreground/70\">\n {label}\n </div>\n )}\n <div className=\"whitespace-pre-wrap wrap-break-word text-foreground/90\">\n {content}\n </div>\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Compact renderer for skill_manage CRUD calls.\n\nimport { parseArgs } from \"./shared\";\nimport type { ToolCallInfo } from \"../../../types\";\n\ninterface SkillManageArgs {\n action?: string;\n name?: string;\n file_path?: string;\n}\n\ninterface SkillManageResult {\n success?: boolean;\n error?: string;\n message?: string;\n path?: string;\n}\n\nconst ACTION_LABEL: Record<string, string> = {\n create: \"Create skill\",\n patch: \"Patch skill\",\n edit: \"Edit skill\",\n delete: \"Delete skill\",\n write_file: \"Write skill file\",\n remove_file: \"Remove skill file\",\n};\n\nexport function SkillManageToolBlock({ tc }: { tc: ToolCallInfo }) {\n const args = parseArgs<SkillManageArgs>(tc.args) ?? {};\n const result = tc.result ? parseArgs<SkillManageResult>(tc.result) : null;\n const action = args.action ?? \"manage\";\n const label = ACTION_LABEL[action] ?? \"Manage skill\";\n const target = args.file_path ? `${args.name ?? \"?\"}/${args.file_path}` : (args.name ?? \"?\");\n const failed = result?.success === false || Boolean(result?.error);\n const summary = result?.error ?? result?.message ?? result?.path;\n\n return (\n <div className=\"flex items-center gap-1.5 text-sm\">\n <span className=\"font-semibold text-foreground\">{label}</span>\n <span className=\"text-muted-foreground truncate\">{target}</span>\n {summary && (\n <span className={failed ? \"text-red-500 truncate\" : \"text-muted-foreground/70 truncate\"}>\n → {summary}\n </span>\n )}\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Compact renderers for coordinator worker-management tools.\n\nimport { parseArgs } from \"./shared\";\nimport type { ToolCallInfo } from \"../../../types\";\n\ninterface CoordinatorArgs {\n goal?: string;\n context?: string;\n worker_id?: string;\n message?: string;\n reason?: string;\n agent_type?: string;\n model?: string;\n}\n\ninterface CoordinatorResult {\n worker_id?: string;\n session_id?: string;\n status?: string;\n error?: string;\n}\n\nfunction firstLine(value: string | undefined) {\n if (!value) return \"\";\n const index = value.indexOf(\"\\n\");\n return (index === -1 ? value : value.slice(0, index)).trim();\n}\n\nexport function CoordinatorToolBlock({ tc }: { tc: ToolCallInfo }) {\n const args = parseArgs<CoordinatorArgs>(tc.args) ?? {};\n const result = tc.result ? parseArgs<CoordinatorResult>(tc.result) : null;\n const failed = Boolean(result?.error);\n\n let label = \"Worker\";\n let target = \"\";\n let detail = \"\";\n\n if (tc.toolName === \"spawn_worker\") {\n label = tc.status === \"running\" ? \"Spawning worker\" : \"Spawned worker\";\n target = args.agent_type ?? args.model ?? \"\";\n detail = firstLine(args.goal);\n } else if (tc.toolName === \"send_worker_message\") {\n label = \"Message worker\";\n target = args.worker_id ?? \"\";\n detail = firstLine(args.message);\n } else if (tc.toolName === \"stop_worker\") {\n label = \"Stop worker\";\n target = args.worker_id ?? \"\";\n detail = firstLine(args.reason);\n }\n\n const resultId = result?.worker_id ?? result?.session_id;\n const summary = result?.error ?? resultId ?? result?.status;\n\n return (\n <div className=\"flex items-center gap-1.5 text-sm\">\n <span className=\"font-semibold text-foreground\">{label}</span>\n {target && <span className=\"text-muted-foreground truncate\">{target}</span>}\n {detail && <span className=\"text-muted-foreground/70 truncate\">· {detail}</span>}\n {summary && (\n <span className={failed ? \"text-red-500 truncate\" : \"text-muted-foreground/70 truncate\"}>\n → {summary}\n </span>\n )}\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Generic collapsible tool call renderer — used for tools without\n// a dedicated renderer.\n\nimport { useState } from \"react\";\nimport { ChevronRightIcon, CheckCircle2Icon, Loader2Icon, XCircleIcon } from \"lucide-react\";\nimport { cn } from \"../../../lib/utils\";\nimport { formatArgs, truncate, effectiveStatus } from \"./shared\";\nimport type { ToolCallInfo } from \"../../../types\";\n\nconst TOOL_LABELS: Record<string, string> = {\n kb_list_pages: \"Knowledge Base\",\n kb_read_page: \"Read KB Page\",\n consult_expert: \"Expert\",\n delegate_task: \"Delegate\",\n memory: \"Memory\",\n skills_list: \"Skills\",\n skill_view: \"Skill\",\n create_artifact: \"Artifact\",\n process: \"Process\",\n};\n\nfunction toolLabel(name: string): string {\n return TOOL_LABELS[name] ?? name.replace(/_/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction toolSummary(tc: ToolCallInfo): string {\n try {\n const args = JSON.parse(tc.args);\n if (tc.toolName === \"kb_list_pages\") return args.kb_id ? `Listing pages` : \"\";\n if (tc.toolName === \"kb_read_page\") return args.path ?? \"\";\n if (tc.toolName === \"consult_expert\") return args.question?.slice(0, 60) ?? \"\";\n if (tc.toolName === \"memory\") return args.action ?? \"\";\n return \"\";\n } catch {\n return \"\";\n }\n}\n\nfunction StatusIcon({ tc }: { tc: ToolCallInfo }) {\n const status = effectiveStatus(tc);\n if (status === \"running\") return <Loader2Icon className=\"size-3.5 animate-spin text-primary\" />;\n if (status === \"error\") return <XCircleIcon className=\"size-3.5 text-red-500\" />;\n if (status === \"cancelled\") return <XCircleIcon className=\"size-3.5 text-muted-foreground/40\" />;\n return <CheckCircle2Icon className=\"size-3.5 text-emerald-500\" />;\n}\n\nexport function DefaultToolBlock({ tc }: { tc: ToolCallInfo }) {\n const [expanded, setExpanded] = useState(false);\n const summary = toolSummary(tc);\n\n return (\n <div className=\"rounded-lg border border-border/60 bg-muted/20 overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className={cn(\n \"flex w-full items-center gap-2 px-3 py-2\",\n \"text-sm hover:bg-muted/40 transition-colors cursor-pointer\",\n )}\n >\n <StatusIcon tc={tc} />\n <span className=\"font-medium text-foreground\">{toolLabel(tc.toolName)}</span>\n {summary && (\n <span className=\"text-muted-foreground/70 truncate text-xs flex-1 text-left\">\n {summary}\n </span>\n )}\n <ChevronRightIcon\n className={cn(\n \"size-3.5 shrink-0 text-muted-foreground/50 transition-transform duration-150 ml-auto\",\n expanded && \"rotate-90\",\n )}\n />\n </button>\n\n {expanded && (\n <div className=\"border-t border-border/40 px-3 py-2 space-y-2\">\n <pre className=\"overflow-x-auto rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground font-mono whitespace-pre-wrap break-all\">\n {formatArgs(tc.args)}\n </pre>\n {tc.result && (\n <pre className=\"overflow-x-auto rounded-md bg-muted/50 px-3 py-2 text-xs font-mono whitespace-pre-wrap break-all max-h-48 overflow-y-auto\">\n <span className=\"text-emerald-600 dark:text-emerald-400 font-semibold\">\n Result\n </span>\n {\"\\n\"}\n <span className=\"text-muted-foreground\">{truncate(tc.result, 2000)}</span>\n </pre>\n )}\n </div>\n )}\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Main tool call block — dispatches to the appropriate renderer\n// based on tool name.\n\nimport type { ToolCallInfo } from \"../../types\";\n\nimport { TerminalToolBlock } from \"./tools/terminal-tool\";\nimport { TodoToolBlock } from \"./tools/todo-tool\";\nimport { ExecuteCodeToolBlock } from \"./tools/execute-code-tool\";\nimport { SessionSearchBlock, WebToolBlock, VisionAnalyzeBlock, MCPToolBlock } from \"./tools/oneliner-tools\";\nimport { WebExtractToolBlock } from \"./tools/web-extract-tool\";\nimport { ReadFileBlock, WriteFileBlock, PatchBlock, SearchFilesBlock, ListFilesBlock } from \"./tools/file-tools\";\nimport { ProcessToolBlock } from \"./tools/process-tool\";\nimport { ExpertToolBlock } from \"./tools/expert-tool\";\nimport { SkillsListBlock, SkillViewBlock } from \"./tools/skill-tools\";\nimport { ClarifyToolBlock } from \"./tools/clarify-tool\";\nimport { ArtifactToolBlock } from \"./tools/artifact-tool\";\nimport { DelegateToolBlock } from \"./tools/delegate-tool\";\nimport { MemoryToolBlock } from \"./tools/memory-tool\";\nimport { SkillManageToolBlock } from \"./tools/skill-manage-tool\";\nimport { CoordinatorToolBlock } from \"./tools/coordinator-tools\";\nimport { DefaultToolBlock } from \"./tools/default-tool\";\n\nexport function ToolCallBlock({\n tc,\n resolvedArtifactName,\n onFileSelect,\n}: {\n tc: ToolCallInfo;\n resolvedArtifactName?: string;\n onFileSelect?: (path: string) => void;\n}) {\n if (tc.toolName.startsWith(\"mcp__\")) {\n return <MCPToolBlock tc={tc} />;\n }\n\n switch (tc.toolName) {\n case \"terminal\":\n return <TerminalToolBlock tc={tc} />;\n\n case \"todo\":\n return <TodoToolBlock tc={tc} />;\n\n case \"execute_code\":\n return <ExecuteCodeToolBlock tc={tc} />;\n\n case \"session_search\":\n return <SessionSearchBlock tc={tc} />;\n\n case \"web_extract\":\n return <WebExtractToolBlock tc={tc} />;\n\n case \"web_search\":\n case \"web_crawl\":\n return <WebToolBlock tc={tc} />;\n\n case \"vision_analyze\":\n return <VisionAnalyzeBlock tc={tc} />;\n\n case \"read_file\":\n return <ReadFileBlock tc={tc} onFileSelect={onFileSelect} />;\n\n case \"write_file\":\n return <WriteFileBlock tc={tc} onFileSelect={onFileSelect} />;\n\n case \"patch\":\n return <PatchBlock tc={tc} onFileSelect={onFileSelect} />;\n\n case \"search_files\":\n return <SearchFilesBlock tc={tc} />;\n\n case \"list_files\":\n return <ListFilesBlock tc={tc} />;\n\n case \"process\":\n return <ProcessToolBlock tc={tc} />;\n\n case \"consult_expert\":\n return <ExpertToolBlock tc={tc} />;\n\n case \"skills_list\":\n return <SkillsListBlock tc={tc} />;\n\n case \"skill_view\":\n return <SkillViewBlock tc={tc} />;\n\n case \"skill_manage\":\n return <SkillManageToolBlock tc={tc} />;\n\n case \"clarify\":\n return <ClarifyToolBlock tc={tc} />;\n\n case \"create_artifact\":\n return <ArtifactToolBlock tc={tc} resolvedName={resolvedArtifactName} />;\n\n case \"delegate_task\":\n return <DelegateToolBlock tc={tc} />;\n\n case \"memory\":\n return <MemoryToolBlock tc={tc} />;\n\n case \"spawn_worker\":\n case \"send_worker_message\":\n case \"stop_worker\":\n return <CoordinatorToolBlock tc={tc} />;\n\n default:\n return <DefaultToolBlock tc={tc} />;\n }\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Renders a run of consecutive web_search calls as one grouped card,\n// with each query on its own row plus an optional result count.\n\nimport { SearchIcon } from \"lucide-react\";\nimport type { ToolCallInfo } from \"../../../types\";\n\nfunction parseQuery(rawArgs: string): string {\n try {\n const args = JSON.parse(rawArgs);\n return typeof args.query === \"string\" ? args.query : \"\";\n } catch {\n return \"\";\n }\n}\n\nfunction parseResultCount(rawResult: string | undefined): number | null {\n if (!rawResult) return null;\n try {\n const parsed = JSON.parse(rawResult);\n if (Array.isArray(parsed?.data?.web)) return parsed.data.web.length;\n if (Array.isArray(parsed?.results)) return parsed.results.length;\n } catch {\n /* ignore */\n }\n return null;\n}\n\nfunction WebSearchRow({ tc }: { tc: ToolCallInfo }) {\n const query = parseQuery(tc.args);\n const count = parseResultCount(tc.result);\n const showCount = count !== null && tc.status === \"complete\";\n\n return (\n <div className=\"flex items-center gap-2 text-xs min-w-0\">\n <span className=\"text-muted-foreground truncate\">{query || \"—\"}</span>\n {showCount && (\n <span className=\"text-muted-foreground/50 shrink-0\">\n {count} result{count !== 1 ? \"s\" : \"\"}\n </span>\n )}\n </div>\n );\n}\n\nexport function WebSearchGroupBlock({ tcs }: { tcs: ToolCallInfo[] }) {\n return (\n <div>\n <div className=\"flex items-center gap-2 text-sm\">\n <SearchIcon className=\"size-3.5 text-muted-foreground/60 shrink-0\" />\n <span className=\"font-medium text-foreground\">Web Search</span>\n <span className=\"text-muted-foreground/70 text-xs\">\n {tcs.length} {tcs.length === 1 ? \"query\" : \"queries\"}\n </span>\n </div>\n <ul className=\"mt-1 ml-5 space-y-0.5\">\n {tcs.map((tc) => (\n <li key={tc.id}>\n <WebSearchRow tc={tc} />\n </li>\n ))}\n </ul>\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\nimport { memo } from \"react\";\nimport {\n File as FileIcon,\n FileArchive,\n FileAudio,\n FileCode,\n FileImage,\n FileSpreadsheet,\n FileText,\n FileVideo,\n} from \"lucide-react\";\nimport {\n Message,\n MessageContent,\n MessageResponse,\n} from \"../ai-elements/message\";\nimport {\n Reasoning,\n ReasoningContent,\n ReasoningTrigger,\n} from \"../ai-elements/reasoning\";\nimport { ToolCallBlock } from \"./tool-call-block\";\nimport type {\n AgentChatDisplayAttachment,\n ChatMessage as ChatMessageType,\n} from \"../../types\";\n\ninterface ChatMessageProps {\n message: ChatMessageType;\n isLast: boolean;\n onFileSelect?: (path: string) => void;\n}\n\nexport const ChatMessage = memo(function ChatMessage({\n message,\n isLast,\n onFileSelect,\n}: ChatMessageProps) {\n if (message.role === \"user\") {\n return (\n <Message from=\"user\">\n <MessageContent>\n {message.content}\n {message.images && message.images.length > 0 && (\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {message.images.map((img, i) => (\n <img\n key={i}\n src={img.data}\n alt=\"Attached\"\n className=\"max-w-64 max-h-48 rounded-lg border border-border object-contain\"\n />\n ))}\n </div>\n )}\n {message.attachments && message.attachments.length > 0 && (\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {message.attachments.map((a, i) => (\n <AttachmentChip\n // Stable key across the optimistic → confirmed\n // transition: the local chip starts without a path\n // and gains one when the user.message SSE event\n // arrives; falling back to the array index keeps the\n // chip in place across that swap.\n key={a.path ?? `pending-${i}`}\n attachment={a}\n onSelect={onFileSelect}\n />\n ))}\n </div>\n )}\n </MessageContent>\n </Message>\n );\n }\n\n return <AssistantMessage message={message} isLast={isLast} onFileSelect={onFileSelect} />;\n});\n\n// ── Attachment chip ──────────────────────────────────────────────────\n\nfunction iconForMime(mime?: string) {\n if (!mime) return FileIcon;\n if (mime.startsWith(\"image/\")) return FileImage;\n if (mime.startsWith(\"audio/\")) return FileAudio;\n if (mime.startsWith(\"video/\")) return FileVideo;\n if (mime === \"application/pdf\") return FileText;\n if (mime.startsWith(\"text/\")) return FileText;\n if (\n mime === \"application/json\" ||\n mime === \"application/xml\" ||\n mime.endsWith(\"+xml\") ||\n mime.endsWith(\"+json\") ||\n mime.includes(\"javascript\") ||\n mime.includes(\"typescript\")\n ) {\n return FileCode;\n }\n if (\n mime === \"application/zip\" ||\n mime === \"application/x-7z-compressed\" ||\n mime === \"application/x-tar\" ||\n mime === \"application/gzip\" ||\n mime === \"application/x-rar-compressed\"\n ) {\n return FileArchive;\n }\n if (\n mime === \"text/csv\" ||\n mime === \"application/vnd.ms-excel\" ||\n mime.includes(\"spreadsheet\")\n ) {\n return FileSpreadsheet;\n }\n return FileIcon;\n}\n\nfunction formatBytes(n?: number): string {\n if (n == null || !Number.isFinite(n) || n < 0) return \"\";\n for (const [unit, divisor] of [\n [\"GB\", 1_000_000_000],\n [\"MB\", 1_000_000],\n [\"KB\", 1_000],\n ] as const) {\n if (n >= divisor) return `${(n / divisor).toFixed(1)} ${unit}`;\n }\n return `${n} B`;\n}\n\nfunction AttachmentChip({\n attachment,\n onSelect,\n}: {\n attachment: AgentChatDisplayAttachment;\n onSelect?: (path: string) => void;\n}) {\n const Icon = iconForMime(attachment.mimeType);\n const clickable = !!attachment.path && !!onSelect;\n const sizeLabel = formatBytes(attachment.size);\n return (\n <button\n type=\"button\"\n onClick={\n clickable ? () => onSelect!(attachment.path!) : undefined\n }\n disabled={!clickable}\n title={attachment.filename}\n aria-label={\n clickable\n ? `Open ${attachment.filename}`\n : `${attachment.filename} (uploading)`\n }\n className={\n \"inline-flex items-center gap-2 rounded-md border border-border \" +\n \"bg-muted/40 px-2 py-1 text-xs max-w-[16rem] \" +\n (clickable\n ? \"hover:bg-muted cursor-pointer\"\n : \"opacity-60 cursor-default\")\n }\n >\n <Icon className=\"size-3.5 shrink-0\" />\n <span className=\"truncate\">{attachment.filename}</span>\n {sizeLabel && (\n <span className=\"text-muted-foreground shrink-0\">{sizeLabel}</span>\n )}\n </button>\n );\n}\n\nfunction AssistantMessage({\n message,\n isLast,\n onFileSelect,\n}: {\n message: ChatMessageType;\n isLast: boolean;\n onFileSelect?: (path: string) => void;\n}) {\n const hasReasoning = !!message.reasoning;\n const hasToolCalls = !!(message.toolCalls && message.toolCalls.length > 0);\n const isStreaming = message.status === \"streaming\" && isLast;\n // Guard: if content is identical to reasoning, skip it (dedup).\n const hasContent = !!(\n message.content &&\n message.content !== message.reasoning\n );\n\n return (\n <Message from=\"assistant\">\n <MessageContent>\n {hasReasoning && (\n <Reasoning isStreaming={isStreaming && !hasContent && !hasToolCalls}>\n <ReasoningTrigger />\n <ReasoningContent>{message.reasoning!}</ReasoningContent>\n </Reasoning>\n )}\n\n {hasToolCalls && (\n <div className=\"w-full flex flex-col gap-8\">\n {message.toolCalls!.map((tc) => (\n <ToolCallBlock key={tc.id} tc={tc} onFileSelect={onFileSelect} />\n ))}\n </div>\n )}\n\n {hasContent && (\n <MessageResponse>{message.content}</MessageResponse>\n )}\n\n {isStreaming && !hasContent && !hasToolCalls && !hasReasoning && (\n <div className=\"flex items-center gap-1.5 py-1 text-muted-foreground\">\n <span className=\"inline-block size-1.5 animate-pulse rounded-full bg-primary\" />\n <span className=\"text-xs\">Thinking...</span>\n </div>\n )}\n </MessageContent>\n </Message>\n );\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Textarea } from \"./textarea\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-10 w-full min-w-0 items-center rounded-none border border-transparent border-b-input bg-transparent transition-[color,border-color] outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-data-[align=block-end]:rounded-none has-data-[align=block-start]:rounded-none has-[[data-slot=input-group-control]:focus-visible]:border-b-ring has-[[data-slot][aria-invalid=true]]:border-b-destructive has-[textarea]:rounded-none has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:has-[[data-slot][aria-invalid=true]]:border-b-destructive/50 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-2 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 **:data-[slot=kbd]:rounded-none **:data-[slot=kbd]:bg-muted-foreground/10 **:data-[slot=kbd]:px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n {\n variants: {\n align: {\n \"inline-start\": \"order-first\",\n \"inline-end\": \"order-last\",\n \"block-start\":\n \"order-first w-full justify-start pt-3 group-has-[>input]/input-group:pt-3.5 [.border-b]:pb-3.5\",\n \"block-end\":\n \"order-last w-full justify-start pb-3 group-has-[>input]/input-group:pb-3.5 [.border-t]:pt-3.5\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 rounded-none text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-none px-1.5 text-xs [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"\",\n \"icon-xs\": \"size-6 p-0 text-xs has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-3.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 border-0 bg-transparent ring-0 group-has-[>[data-align=inline-end]]/input-group:pr-2 group-has-[>[data-align=inline-start]]/input-group:pl-2 focus-visible:ring-0 aria-invalid:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none border-0 bg-transparent py-2.5 ring-0 focus-visible:ring-0 aria-invalid:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Command as CommandPrimitive } from \"cmdk\"\n\nimport { cn } from \"../../lib/utils\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"./dialog\"\nimport {\n InputGroup,\n InputGroupAddon,\n} from \"./input-group\"\nimport { SearchIcon, CheckIcon } from \"lucide-react\"\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"flex size-full flex-col overflow-hidden bg-popover text-popover-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandDialog({\n title = \"Command Palette\",\n description = \"Search for a command to run...\",\n children,\n className,\n showCloseButton = false,\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string\n description?: string\n className?: string\n showCloseButton?: boolean\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent\n className={cn(\"top-1/3 translate-y-0 overflow-hidden p-0\", className)}\n showCloseButton={showCloseButton}\n >\n {children}\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div data-slot=\"command-input-wrapper\" className=\"p-1\">\n <InputGroup className=\"border-transparent border-b-input bg-transparent px-3\">\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"w-full px-2 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n <InputGroupAddon>\n <SearchIcon className=\"size-3.5 shrink-0 opacity-50\" />\n </InputGroupAddon>\n </InputGroup>\n </div>\n )\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n \"no-scrollbar max-h-72 scroll-py-1 overflow-x-hidden overflow-y-auto outline-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandEmpty({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className={cn(\"py-6 text-center text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"overflow-hidden p-1.5 text-foreground **:[[cmdk-group-heading]]:px-3 **:[[cmdk-group-heading]]:py-2 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-semibold **:[[cmdk-group-heading]]:tracking-wider **:[[cmdk-group-heading]]:text-muted-foreground **:[[cmdk-group-heading]]:uppercase\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"-mx-1.5 my-1.5 h-px bg-border/50\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"group/command-item relative flex cursor-default items-center gap-2 rounded-none px-3 py-2 text-sm outline-hidden select-none in-data-[slot=dialog-content]:rounded-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-muted data-selected:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5 data-selected:*:[svg]:text-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <CheckIcon className=\"ml-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-data-[checked=true]/command-item:opacity-100\" />\n </CommandPrimitive.Item>\n )\n}\n\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-data-selected/command-item:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { CheckIcon, ChevronRightIcon } from \"lucide-react\"\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 ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal 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 return (\n <DropdownMenuPrimitive.Portal>\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-none bg-popover p-1.5 text-popover-foreground shadow-md ring-1 ring-foreground/10 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 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-none px-3 py-2 text-xs font-medium tracking-wider uppercase 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-3.5 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-none py-2 pr-8 pl-3 text-xs font-medium tracking-wider uppercase 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-3.5\",\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-none py-2 pr-8 pl-3 text-xs font-medium tracking-wider uppercase 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-3.5\",\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 text-xs font-semibold tracking-wider text-muted-foreground uppercase 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-none px-3 py-2 text-xs font-medium tracking-wider uppercase 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-3.5\",\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-none bg-popover p-1.5 text-popover-foreground shadow-md ring-1 ring-foreground/10 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-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 { HoverCard as HoverCardPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction HoverCard({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Root>) {\n return <HoverCardPrimitive.Root data-slot=\"hover-card\" {...props} />\n}\n\nfunction HoverCardTrigger({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {\n return (\n <HoverCardPrimitive.Trigger data-slot=\"hover-card-trigger\" {...props} />\n )\n}\n\nfunction HoverCardContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Content>) {\n return (\n <HoverCardPrimitive.Portal data-slot=\"hover-card-portal\">\n <HoverCardPrimitive.Content\n data-slot=\"hover-card-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 origin-(--radix-hover-card-content-transform-origin) bg-popover p-4 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden 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-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 </HoverCardPrimitive.Portal>\n )\n}\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n","import { cn } from \"../../lib/utils\"\nimport { Loader2Icon } from \"lucide-react\"\n\nfunction Spinner({ className, ...props }: React.ComponentProps<\"svg\">) {\n return (\n <Loader2Icon role=\"status\" aria-label=\"Loading\" className={cn(\"size-4 animate-spin\", className)} {...props} />\n )\n}\n\nexport { Spinner }\n","\"use client\";\n\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from \"../ui/command\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\";\nimport {\n HoverCard,\n HoverCardContent,\n HoverCardTrigger,\n} from \"../ui/hover-card\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupTextarea,\n} from \"../ui/input-group\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport { Spinner } from \"../ui/spinner\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../ui/tooltip\";\nimport { cn } from \"../../lib/utils\";\nimport type { ChatStatus, FileUIPart, SourceDocumentUIPart } from \"ai\";\n\n/**\n * Local extension of FileUIPart that retains the original ``File`` object.\n *\n * Downstream consumers (e.g. the chat runtime) need the raw ``File`` to\n * upload a non-image attachment to the session workspace via\n * ``adapter.uploadWorkspaceFile``. Keeping it on the FileUIPart avoids\n * having to refetch the blob URL or otherwise reconstruct the file.\n *\n * The field is optional because attachments synthesised from other paths\n * (e.g. an HTTP source) may legitimately not have a backing ``File``.\n * We extend locally rather than mutating the upstream ``FileUIPart``\n * type so future AI SDK upgrades don't fight with this.\n */\nexport type PromptInputFileUIPart = FileUIPart & {\n id: string;\n file?: File;\n};\nimport {\n CornerDownLeftIcon,\n ImageIcon,\n Monitor,\n PlusIcon,\n SquareIcon,\n XIcon,\n} from \"lucide-react\";\nimport { nanoid } from \"nanoid\";\nimport type {\n ChangeEvent,\n ChangeEventHandler,\n ClipboardEventHandler,\n ComponentProps,\n FormEvent,\n FormEventHandler,\n HTMLAttributes,\n KeyboardEventHandler,\n PropsWithChildren,\n ReactNode,\n RefObject,\n} from \"react\";\nimport {\n Children,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst convertBlobUrlToDataUrl = async (url: string): Promise<string | null> => {\n try {\n const response = await fetch(url);\n const blob = await response.blob();\n // FileReader uses callback-based API, wrapping in Promise is necessary\n // oxlint-disable-next-line eslint-plugin-promise(avoid-new)\n return new Promise((resolve) => {\n const reader = new FileReader();\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n reader.onloadend = () => resolve(reader.result as string);\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n reader.onerror = () => resolve(null);\n reader.readAsDataURL(blob);\n });\n } catch {\n return null;\n }\n};\n\nconst captureScreenshot = async (): Promise<File | null> => {\n if (\n typeof navigator === \"undefined\" ||\n !navigator.mediaDevices?.getDisplayMedia\n ) {\n return null;\n }\n\n let stream: MediaStream | null = null;\n const video = document.createElement(\"video\");\n video.muted = true;\n video.playsInline = true;\n\n try {\n stream = await navigator.mediaDevices.getDisplayMedia({\n audio: false,\n video: true,\n });\n\n video.srcObject = stream;\n\n // Video element uses callback-based API, wrapping in Promise is necessary\n // oxlint-disable-next-line eslint-plugin-promise(avoid-new)\n await new Promise<void>((resolve, reject) => {\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n video.onloadedmetadata = () => resolve();\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n video.onerror = () => reject(new Error(\"Failed to load screen stream\"));\n });\n\n await video.play();\n\n const width = video.videoWidth;\n const height = video.videoHeight;\n if (!width || !height) {\n return null;\n }\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n\n context.drawImage(video, 0, 0, width, height);\n // canvas.toBlob uses callback-based API, wrapping in Promise is necessary\n // oxlint-disable-next-line eslint-plugin-promise(avoid-new)\n const blob = await new Promise<Blob | null>((resolve) => {\n canvas.toBlob(resolve, \"image/png\");\n });\n if (!blob) {\n return null;\n }\n\n const timestamp = new Date()\n .toISOString()\n .replaceAll(/[:.]/g, \"-\")\n .replace(\"T\", \"_\")\n .replace(\"Z\", \"\");\n\n return new File([blob], `screenshot-${timestamp}.png`, {\n lastModified: Date.now(),\n type: \"image/png\",\n });\n } finally {\n if (stream) {\n for (const track of stream.getTracks()) {\n track.stop();\n }\n }\n video.pause();\n video.srcObject = null;\n }\n};\n\n// ============================================================================\n// Provider Context & Types\n// ============================================================================\n\nexport interface AttachmentsContext {\n files: PromptInputFileUIPart[];\n add: (files: File[] | FileList) => void;\n remove: (id: string) => void;\n clear: () => void;\n openFileDialog: () => void;\n fileInputRef: RefObject<HTMLInputElement | null>;\n}\n\nexport interface TextInputContext {\n value: string;\n setInput: (v: string) => void;\n clear: () => void;\n}\n\nexport interface PromptInputControllerProps {\n textInput: TextInputContext;\n attachments: AttachmentsContext;\n /** INTERNAL: Allows PromptInput to register its file textInput + \"open\" callback */\n __registerFileInput: (\n ref: RefObject<HTMLInputElement | null>,\n open: () => void\n ) => void;\n}\n\nconst PromptInputController = createContext<PromptInputControllerProps | null>(\n null\n);\nconst ProviderAttachmentsContext = createContext<AttachmentsContext | null>(\n null\n);\n\nexport const usePromptInputController = () => {\n const ctx = useContext(PromptInputController);\n if (!ctx) {\n throw new Error(\n \"Wrap your component inside <PromptInputProvider> to use usePromptInputController().\"\n );\n }\n return ctx;\n};\n\n// Optional variants (do NOT throw). Useful for dual-mode components.\nconst useOptionalPromptInputController = () =>\n useContext(PromptInputController);\n\nexport const useProviderAttachments = () => {\n const ctx = useContext(ProviderAttachmentsContext);\n if (!ctx) {\n throw new Error(\n \"Wrap your component inside <PromptInputProvider> to use useProviderAttachments().\"\n );\n }\n return ctx;\n};\n\nconst useOptionalProviderAttachments = () =>\n useContext(ProviderAttachmentsContext);\n\nexport type PromptInputProviderProps = PropsWithChildren<{\n initialInput?: string;\n}>;\n\n/**\n * Optional global provider that lifts PromptInput state outside of PromptInput.\n * If you don't use it, PromptInput stays fully self-managed.\n */\nexport const PromptInputProvider = ({\n initialInput: initialTextInput = \"\",\n children,\n}: PromptInputProviderProps) => {\n // ----- textInput state\n const [textInput, setTextInput] = useState(initialTextInput);\n const clearInput = useCallback(() => setTextInput(\"\"), []);\n\n // ----- attachments state (global when wrapped)\n const [attachmentFiles, setAttachmentFiles] = useState<\n PromptInputFileUIPart[]\n >([]);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n // oxlint-disable-next-line eslint(no-empty-function)\n const openRef = useRef<() => void>(() => {});\n\n const add = useCallback((files: File[] | FileList) => {\n const incoming = [...files];\n if (incoming.length === 0) {\n return;\n }\n\n setAttachmentFiles((prev) => [\n ...prev,\n ...incoming.map<PromptInputFileUIPart>((file) => ({\n filename: file.name,\n id: nanoid(),\n mediaType: file.type,\n type: \"file\" as const,\n url: URL.createObjectURL(file),\n file,\n })),\n ]);\n }, []);\n\n const remove = useCallback((id: string) => {\n setAttachmentFiles((prev) => {\n const found = prev.find((f) => f.id === id);\n if (found?.url) {\n URL.revokeObjectURL(found.url);\n }\n return prev.filter((f) => f.id !== id);\n });\n }, []);\n\n const clear = useCallback(() => {\n setAttachmentFiles((prev) => {\n for (const f of prev) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n return [];\n });\n }, []);\n\n // Keep a ref to attachments for cleanup on unmount (avoids stale closure)\n const attachmentsRef = useRef(attachmentFiles);\n\n useEffect(() => {\n attachmentsRef.current = attachmentFiles;\n }, [attachmentFiles]);\n\n // Cleanup blob URLs on unmount to prevent memory leaks\n useEffect(\n () => () => {\n for (const f of attachmentsRef.current) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n },\n []\n );\n\n const openFileDialog = useCallback(() => {\n openRef.current?.();\n }, []);\n\n const attachments = useMemo<AttachmentsContext>(\n () => ({\n add,\n clear,\n fileInputRef,\n files: attachmentFiles,\n openFileDialog,\n remove,\n }),\n [attachmentFiles, add, remove, clear, openFileDialog]\n );\n\n const __registerFileInput = useCallback(\n (ref: RefObject<HTMLInputElement | null>, open: () => void) => {\n fileInputRef.current = ref.current;\n openRef.current = open;\n },\n []\n );\n\n const controller = useMemo<PromptInputControllerProps>(\n () => ({\n __registerFileInput,\n attachments,\n textInput: {\n clear: clearInput,\n setInput: setTextInput,\n value: textInput,\n },\n }),\n [textInput, clearInput, attachments, __registerFileInput]\n );\n\n return (\n <PromptInputController.Provider value={controller}>\n <ProviderAttachmentsContext.Provider value={attachments}>\n {children}\n </ProviderAttachmentsContext.Provider>\n </PromptInputController.Provider>\n );\n};\n\n// ============================================================================\n// Component Context & Hooks\n// ============================================================================\n\nconst LocalAttachmentsContext = createContext<AttachmentsContext | null>(null);\n\nexport const usePromptInputAttachments = () => {\n // Prefer local context (inside PromptInput) as it has validation, fall back to provider\n const provider = useOptionalProviderAttachments();\n const local = useContext(LocalAttachmentsContext);\n const context = local ?? provider;\n if (!context) {\n throw new Error(\n \"usePromptInputAttachments must be used within a PromptInput or PromptInputProvider\"\n );\n }\n return context;\n};\n\n// ============================================================================\n// Referenced Sources (Local to PromptInput)\n// ============================================================================\n\nexport interface ReferencedSourcesContext {\n sources: (SourceDocumentUIPart & { id: string })[];\n add: (sources: SourceDocumentUIPart[] | SourceDocumentUIPart) => void;\n remove: (id: string) => void;\n clear: () => void;\n}\n\nexport const LocalReferencedSourcesContext =\n createContext<ReferencedSourcesContext | null>(null);\n\nexport const usePromptInputReferencedSources = () => {\n const ctx = useContext(LocalReferencedSourcesContext);\n if (!ctx) {\n throw new Error(\n \"usePromptInputReferencedSources must be used within a LocalReferencedSourcesContext.Provider\"\n );\n }\n return ctx;\n};\n\nexport type PromptInputActionAddAttachmentsProps = ComponentProps<\n typeof DropdownMenuItem\n> & {\n label?: string;\n};\n\nexport const PromptInputActionAddAttachments = ({\n label = \"Add photos or files\",\n ...props\n}: PromptInputActionAddAttachmentsProps) => {\n const attachments = usePromptInputAttachments();\n\n const handleSelect = useCallback(\n (e: Event) => {\n e.preventDefault();\n attachments.openFileDialog();\n },\n [attachments]\n );\n\n return (\n <DropdownMenuItem {...props} onSelect={handleSelect}>\n <ImageIcon className=\"mr-2 size-4\" /> {label}\n </DropdownMenuItem>\n );\n};\n\nexport type PromptInputActionAddScreenshotProps = ComponentProps<\n typeof DropdownMenuItem\n> & {\n label?: string;\n};\n\nexport const PromptInputActionAddScreenshot = ({\n label = \"Take screenshot\",\n onSelect,\n ...props\n}: PromptInputActionAddScreenshotProps) => {\n const attachments = usePromptInputAttachments();\n\n const handleSelect = useCallback(\n async (event: Event) => {\n onSelect?.(event);\n if (event.defaultPrevented) {\n return;\n }\n\n try {\n const screenshot = await captureScreenshot();\n if (screenshot) {\n attachments.add([screenshot]);\n }\n } catch (error) {\n if (\n error instanceof DOMException &&\n (error.name === \"NotAllowedError\" || error.name === \"AbortError\")\n ) {\n return;\n }\n throw error;\n }\n },\n [onSelect, attachments]\n );\n\n return (\n <DropdownMenuItem {...props} onSelect={handleSelect}>\n <Monitor className=\"mr-2 size-4\" />\n {label}\n </DropdownMenuItem>\n );\n};\n\nexport interface PromptInputMessage {\n text: string;\n files: PromptInputFileUIPart[];\n}\n\nexport type PromptInputProps = Omit<\n HTMLAttributes<HTMLFormElement>,\n \"onSubmit\" | \"onError\"\n> & {\n // e.g., \"image/*\" or leave undefined for any\n accept?: string;\n multiple?: boolean;\n // When true, accepts drops anywhere on document. Default false (opt-in).\n globalDrop?: boolean;\n // Render a hidden input with given name and keep it in sync for native form posts. Default false.\n syncHiddenInput?: boolean;\n // Minimal constraints\n maxFiles?: number;\n // bytes\n maxFileSize?: number;\n onError?: (err: {\n code: \"max_files\" | \"max_file_size\" | \"accept\";\n message: string;\n }) => void;\n onSubmit: (\n message: PromptInputMessage,\n event: FormEvent<HTMLFormElement>\n ) => void | Promise<void>;\n};\n\nexport const PromptInput = ({\n className,\n accept,\n multiple,\n globalDrop,\n syncHiddenInput,\n maxFiles,\n maxFileSize,\n onError,\n onSubmit,\n children,\n ...props\n}: PromptInputProps) => {\n // Try to use a provider controller if present\n const controller = useOptionalPromptInputController();\n const usingProvider = !!controller;\n\n // Refs\n const inputRef = useRef<HTMLInputElement | null>(null);\n const formRef = useRef<HTMLFormElement | null>(null);\n\n // ----- Local attachments (only used when no provider)\n const [items, setItems] = useState<PromptInputFileUIPart[]>([]);\n const files = usingProvider ? controller.attachments.files : items;\n\n // ----- Local referenced sources (always local to PromptInput)\n const [referencedSources, setReferencedSources] = useState<\n (SourceDocumentUIPart & { id: string })[]\n >([]);\n\n // Keep a ref to files for cleanup on unmount (avoids stale closure)\n const filesRef = useRef(files);\n\n useEffect(() => {\n filesRef.current = files;\n }, [files]);\n\n const openFileDialogLocal = useCallback(() => {\n inputRef.current?.click();\n }, []);\n\n const matchesAccept = useCallback(\n (f: File) => {\n if (!accept || accept.trim() === \"\") {\n return true;\n }\n\n const patterns = accept\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n return patterns.some((pattern) => {\n if (pattern.endsWith(\"/*\")) {\n // e.g: image/* -> image/\n const prefix = pattern.slice(0, -1);\n return f.type.startsWith(prefix);\n }\n return f.type === pattern;\n });\n },\n [accept]\n );\n\n const addLocal = useCallback(\n (fileList: File[] | FileList) => {\n const incoming = [...fileList];\n const accepted = incoming.filter((f) => matchesAccept(f));\n if (incoming.length && accepted.length === 0) {\n onError?.({\n code: \"accept\",\n message: \"No files match the accepted types.\",\n });\n return;\n }\n const withinSize = (f: File) =>\n maxFileSize ? f.size <= maxFileSize : true;\n const sized = accepted.filter(withinSize);\n if (accepted.length > 0 && sized.length === 0) {\n onError?.({\n code: \"max_file_size\",\n message: \"All files exceed the maximum size.\",\n });\n return;\n }\n\n setItems((prev) => {\n const capacity =\n typeof maxFiles === \"number\"\n ? Math.max(0, maxFiles - prev.length)\n : undefined;\n const capped =\n typeof capacity === \"number\" ? sized.slice(0, capacity) : sized;\n if (typeof capacity === \"number\" && sized.length > capacity) {\n onError?.({\n code: \"max_files\",\n message: \"Too many files. Some were not added.\",\n });\n }\n const next: PromptInputFileUIPart[] = [];\n for (const file of capped) {\n next.push({\n filename: file.name,\n id: nanoid(),\n mediaType: file.type,\n type: \"file\",\n url: URL.createObjectURL(file),\n file,\n });\n }\n return [...prev, ...next];\n });\n },\n [matchesAccept, maxFiles, maxFileSize, onError]\n );\n\n const removeLocal = useCallback(\n (id: string) =>\n setItems((prev) => {\n const found = prev.find((file) => file.id === id);\n if (found?.url) {\n URL.revokeObjectURL(found.url);\n }\n return prev.filter((file) => file.id !== id);\n }),\n []\n );\n\n // Wrapper that validates files before calling provider's add\n const addWithProviderValidation = useCallback(\n (fileList: File[] | FileList) => {\n const incoming = [...fileList];\n const accepted = incoming.filter((f) => matchesAccept(f));\n if (incoming.length && accepted.length === 0) {\n onError?.({\n code: \"accept\",\n message: \"No files match the accepted types.\",\n });\n return;\n }\n const withinSize = (f: File) =>\n maxFileSize ? f.size <= maxFileSize : true;\n const sized = accepted.filter(withinSize);\n if (accepted.length > 0 && sized.length === 0) {\n onError?.({\n code: \"max_file_size\",\n message: \"All files exceed the maximum size.\",\n });\n return;\n }\n\n const currentCount = files.length;\n const capacity =\n typeof maxFiles === \"number\"\n ? Math.max(0, maxFiles - currentCount)\n : undefined;\n const capped =\n typeof capacity === \"number\" ? sized.slice(0, capacity) : sized;\n if (typeof capacity === \"number\" && sized.length > capacity) {\n onError?.({\n code: \"max_files\",\n message: \"Too many files. Some were not added.\",\n });\n }\n\n if (capped.length > 0) {\n controller?.attachments.add(capped);\n }\n },\n [matchesAccept, maxFileSize, maxFiles, onError, files.length, controller]\n );\n\n const clearAttachments = useCallback(\n () =>\n usingProvider\n ? controller?.attachments.clear()\n : setItems((prev) => {\n for (const file of prev) {\n if (file.url) {\n URL.revokeObjectURL(file.url);\n }\n }\n return [];\n }),\n [usingProvider, controller]\n );\n\n const clearReferencedSources = useCallback(\n () => setReferencedSources([]),\n []\n );\n\n const add = usingProvider ? addWithProviderValidation : addLocal;\n const remove = usingProvider ? controller.attachments.remove : removeLocal;\n const openFileDialog = usingProvider\n ? controller.attachments.openFileDialog\n : openFileDialogLocal;\n\n const clear = useCallback(() => {\n clearAttachments();\n clearReferencedSources();\n }, [clearAttachments, clearReferencedSources]);\n\n // Let provider know about our hidden file input so external menus can call openFileDialog()\n useEffect(() => {\n if (!usingProvider) {\n return;\n }\n controller.__registerFileInput(inputRef, () => inputRef.current?.click());\n }, [usingProvider, controller]);\n\n // Note: File input cannot be programmatically set for security reasons\n // The syncHiddenInput prop is no longer functional\n useEffect(() => {\n if (syncHiddenInput && inputRef.current && files.length === 0) {\n inputRef.current.value = \"\";\n }\n }, [files, syncHiddenInput]);\n\n // Attach drop handlers on nearest form and document (opt-in)\n useEffect(() => {\n const form = formRef.current;\n if (!form) {\n return;\n }\n if (globalDrop) {\n // when global drop is on, let the document-level handler own drops\n return;\n }\n\n const onDragOver = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes(\"Files\")) {\n e.preventDefault();\n }\n };\n const onDrop = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes(\"Files\")) {\n e.preventDefault();\n }\n if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n add(e.dataTransfer.files);\n }\n };\n form.addEventListener(\"dragover\", onDragOver);\n form.addEventListener(\"drop\", onDrop);\n return () => {\n form.removeEventListener(\"dragover\", onDragOver);\n form.removeEventListener(\"drop\", onDrop);\n };\n }, [add, globalDrop]);\n\n useEffect(() => {\n if (!globalDrop) {\n return;\n }\n\n const onDragOver = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes(\"Files\")) {\n e.preventDefault();\n }\n };\n const onDrop = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes(\"Files\")) {\n e.preventDefault();\n }\n if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n add(e.dataTransfer.files);\n }\n };\n document.addEventListener(\"dragover\", onDragOver);\n document.addEventListener(\"drop\", onDrop);\n return () => {\n document.removeEventListener(\"dragover\", onDragOver);\n document.removeEventListener(\"drop\", onDrop);\n };\n }, [add, globalDrop]);\n\n useEffect(\n () => () => {\n if (!usingProvider) {\n for (const f of filesRef.current) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n }\n },\n [usingProvider]\n );\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = useCallback(\n (event) => {\n if (event.currentTarget.files) {\n add(event.currentTarget.files);\n }\n // Reset input value to allow selecting files that were previously removed\n event.currentTarget.value = \"\";\n },\n [add]\n );\n\n const attachmentsCtx = useMemo<AttachmentsContext>(\n () => ({\n add,\n clear: clearAttachments,\n fileInputRef: inputRef,\n files: files.map((item) => ({ ...item, id: item.id })),\n openFileDialog,\n remove,\n }),\n [files, add, remove, clearAttachments, openFileDialog]\n );\n\n const refsCtx = useMemo<ReferencedSourcesContext>(\n () => ({\n add: (incoming: SourceDocumentUIPart[] | SourceDocumentUIPart) => {\n const array = Array.isArray(incoming) ? incoming : [incoming];\n setReferencedSources((prev) => [\n ...prev,\n ...array.map((s) => ({ ...s, id: nanoid() })),\n ]);\n },\n clear: clearReferencedSources,\n remove: (id: string) => {\n setReferencedSources((prev) => prev.filter((s) => s.id !== id));\n },\n sources: referencedSources,\n }),\n [referencedSources, clearReferencedSources]\n );\n\n const handleSubmit: FormEventHandler<HTMLFormElement> = useCallback(\n async (event) => {\n event.preventDefault();\n\n const form = event.currentTarget;\n const text = usingProvider\n ? controller.textInput.value\n : (() => {\n const formData = new FormData(form);\n return (formData.get(\"message\") as string) || \"\";\n })();\n\n // Reset form immediately after capturing text to avoid race condition\n // where user input during async blob conversion would be lost\n if (!usingProvider) {\n form.reset();\n }\n\n try {\n // Convert blob URLs to data URLs asynchronously for image-like\n // attachments only. Non-image files (PDFs, archives, etc.)\n // skip the base64 round-trip because the consumer reads them\n // via ``file: File`` and uploads to a workspace, not inline as\n // a data URL. For 50 MB attachments this avoids ~67 MB of\n // pointless base64 expansion per submit.\n const convertedFiles: PromptInputFileUIPart[] = await Promise.all(\n files.map(async (entry) => {\n const isBlob = entry.url?.startsWith(\"blob:\");\n const isImage = entry.mediaType?.startsWith(\"image/\");\n if (isBlob && isImage && entry.url) {\n const dataUrl = await convertBlobUrlToDataUrl(entry.url);\n return {\n ...entry,\n url: dataUrl ?? entry.url,\n };\n }\n return entry;\n })\n );\n\n const result = onSubmit({ files: convertedFiles, text }, event);\n\n // Handle both sync and async onSubmit\n if (result instanceof Promise) {\n try {\n await result;\n clear();\n if (usingProvider) {\n controller.textInput.clear();\n }\n } catch {\n // Don't clear on error - user may want to retry\n }\n } else {\n // Sync function completed without throwing, clear inputs\n clear();\n if (usingProvider) {\n controller.textInput.clear();\n }\n }\n } catch {\n // Don't clear on error - user may want to retry\n }\n },\n [usingProvider, controller, files, onSubmit, clear]\n );\n\n // Render with or without local provider\n const inner = (\n <>\n <input\n accept={accept}\n aria-label=\"Upload files\"\n className=\"hidden\"\n multiple={multiple}\n onChange={handleChange}\n ref={inputRef}\n title=\"Upload files\"\n type=\"file\"\n />\n <form\n className={cn(\"w-full\", className)}\n onSubmit={handleSubmit}\n ref={formRef}\n {...props}\n >\n <InputGroup className=\"overflow-hidden\">{children}</InputGroup>\n </form>\n </>\n );\n\n const withReferencedSources = (\n <LocalReferencedSourcesContext.Provider value={refsCtx}>\n {inner}\n </LocalReferencedSourcesContext.Provider>\n );\n\n // Always provide LocalAttachmentsContext so children get validated add function\n return (\n <LocalAttachmentsContext.Provider value={attachmentsCtx}>\n {withReferencedSources}\n </LocalAttachmentsContext.Provider>\n );\n};\n\nexport type PromptInputBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputBody = ({\n className,\n ...props\n}: PromptInputBodyProps) => (\n <div className={cn(\"contents\", className)} {...props} />\n);\n\nexport type PromptInputTextareaProps = ComponentProps<\n typeof InputGroupTextarea\n>;\n\nexport const PromptInputTextarea = ({\n onChange,\n onKeyDown,\n className,\n placeholder = \"What would you like to know?\",\n ...props\n}: PromptInputTextareaProps) => {\n const controller = useOptionalPromptInputController();\n const attachments = usePromptInputAttachments();\n const [isComposing, setIsComposing] = useState(false);\n\n const handleKeyDown: KeyboardEventHandler<HTMLTextAreaElement> = useCallback(\n (e) => {\n // Call the external onKeyDown handler first\n onKeyDown?.(e);\n\n // If the external handler prevented default, don't run internal logic\n if (e.defaultPrevented) {\n return;\n }\n\n if (e.key === \"Enter\") {\n if (isComposing || e.nativeEvent.isComposing) {\n return;\n }\n if (e.shiftKey) {\n return;\n }\n e.preventDefault();\n\n // Check if the submit button is disabled before submitting\n const { form } = e.currentTarget;\n const submitButton = form?.querySelector(\n 'button[type=\"submit\"]'\n ) as HTMLButtonElement | null;\n if (submitButton?.disabled) {\n return;\n }\n\n form?.requestSubmit();\n }\n\n // Remove last attachment when Backspace is pressed and textarea is empty\n if (\n e.key === \"Backspace\" &&\n e.currentTarget.value === \"\" &&\n attachments.files.length > 0\n ) {\n e.preventDefault();\n const lastAttachment = attachments.files.at(-1);\n if (lastAttachment) {\n attachments.remove(lastAttachment.id);\n }\n }\n },\n [onKeyDown, isComposing, attachments]\n );\n\n const handlePaste: ClipboardEventHandler<HTMLTextAreaElement> = useCallback(\n (event) => {\n const items = event.clipboardData?.items;\n\n if (!items) {\n return;\n }\n\n const files: File[] = [];\n\n for (const item of items) {\n if (item.kind === \"file\") {\n const file = item.getAsFile();\n if (file) {\n files.push(file);\n }\n }\n }\n\n if (files.length > 0) {\n event.preventDefault();\n attachments.add(files);\n }\n },\n [attachments]\n );\n\n const handleCompositionEnd = useCallback(() => setIsComposing(false), []);\n const handleCompositionStart = useCallback(() => setIsComposing(true), []);\n\n const controlledProps = controller\n ? {\n onChange: (e: ChangeEvent<HTMLTextAreaElement>) => {\n controller.textInput.setInput(e.currentTarget.value);\n onChange?.(e);\n },\n value: controller.textInput.value,\n }\n : {\n onChange,\n };\n\n return (\n <InputGroupTextarea\n className={cn(\"field-sizing-content max-h-48 min-h-16\", className)}\n name=\"message\"\n onCompositionEnd={handleCompositionEnd}\n onCompositionStart={handleCompositionStart}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder}\n {...props}\n {...controlledProps}\n />\n );\n};\n\nexport type PromptInputHeaderProps = Omit<\n ComponentProps<typeof InputGroupAddon>,\n \"align\"\n>;\n\nexport const PromptInputHeader = ({\n className,\n ...props\n}: PromptInputHeaderProps) => (\n <InputGroupAddon\n align=\"block-end\"\n className={cn(\"order-first flex-wrap gap-1\", className)}\n {...props}\n />\n);\n\nexport type PromptInputFooterProps = Omit<\n ComponentProps<typeof InputGroupAddon>,\n \"align\"\n>;\n\nexport const PromptInputFooter = ({\n className,\n ...props\n}: PromptInputFooterProps) => (\n <InputGroupAddon\n align=\"block-end\"\n className={cn(\"justify-between gap-1\", className)}\n {...props}\n />\n);\n\nexport type PromptInputToolsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTools = ({\n className,\n ...props\n}: PromptInputToolsProps) => (\n <div\n className={cn(\"flex min-w-0 items-center gap-1\", className)}\n {...props}\n />\n);\n\nexport type PromptInputButtonTooltip =\n | string\n | {\n content: ReactNode;\n shortcut?: string;\n side?: ComponentProps<typeof TooltipContent>[\"side\"];\n };\n\nexport type PromptInputButtonProps = ComponentProps<typeof InputGroupButton> & {\n tooltip?: PromptInputButtonTooltip;\n};\n\nexport const PromptInputButton = ({\n variant = \"ghost\",\n className,\n size,\n tooltip,\n ...props\n}: PromptInputButtonProps) => {\n const newSize =\n size ?? (Children.count(props.children) > 1 ? \"sm\" : \"icon-sm\");\n\n const button = (\n <InputGroupButton\n className={cn(className)}\n size={newSize}\n type=\"button\"\n variant={variant}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n const tooltipContent =\n typeof tooltip === \"string\" ? tooltip : tooltip.content;\n const shortcut = typeof tooltip === \"string\" ? undefined : tooltip.shortcut;\n const side = typeof tooltip === \"string\" ? \"top\" : (tooltip.side ?? \"top\");\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side={side}>\n {tooltipContent}\n {shortcut && (\n <span className=\"ml-2 text-muted-foreground\">{shortcut}</span>\n )}\n </TooltipContent>\n </Tooltip>\n );\n};\n\nexport type PromptInputActionMenuProps = ComponentProps<typeof DropdownMenu>;\nexport const PromptInputActionMenu = (props: PromptInputActionMenuProps) => (\n <DropdownMenu {...props} />\n);\n\nexport type PromptInputActionMenuTriggerProps = PromptInputButtonProps;\n\nexport const PromptInputActionMenuTrigger = ({\n className,\n children,\n ...props\n}: PromptInputActionMenuTriggerProps) => (\n <DropdownMenuTrigger asChild>\n <PromptInputButton className={className} {...props}>\n {children ?? <PlusIcon className=\"size-4\" />}\n </PromptInputButton>\n </DropdownMenuTrigger>\n);\n\nexport type PromptInputActionMenuContentProps = ComponentProps<\n typeof DropdownMenuContent\n>;\nexport const PromptInputActionMenuContent = ({\n className,\n ...props\n}: PromptInputActionMenuContentProps) => (\n <DropdownMenuContent align=\"start\" className={cn(className)} {...props} />\n);\n\nexport type PromptInputActionMenuItemProps = ComponentProps<\n typeof DropdownMenuItem\n>;\nexport const PromptInputActionMenuItem = ({\n className,\n ...props\n}: PromptInputActionMenuItemProps) => (\n <DropdownMenuItem className={cn(className)} {...props} />\n);\n\n// Note: Actions that perform side-effects (like opening a file dialog)\n// are provided in opt-in modules (e.g., prompt-input-attachments).\n\nexport type PromptInputSubmitProps = ComponentProps<typeof InputGroupButton> & {\n status?: ChatStatus;\n onStop?: () => void;\n};\n\nexport const PromptInputSubmit = ({\n className,\n variant = \"default\",\n size = \"icon-sm\",\n status,\n onStop,\n onClick,\n children,\n ...props\n}: PromptInputSubmitProps) => {\n const isGenerating = status === \"submitted\" || status === \"streaming\";\n\n let Icon = <CornerDownLeftIcon className=\"size-4\" />;\n\n if (status === \"submitted\") {\n Icon = <Spinner />;\n } else if (status === \"streaming\") {\n Icon = <SquareIcon className=\"size-4\" />;\n } else if (status === \"error\") {\n Icon = <XIcon className=\"size-4\" />;\n }\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n if (isGenerating && onStop) {\n e.preventDefault();\n onStop();\n return;\n }\n onClick?.(e);\n },\n [isGenerating, onStop, onClick]\n );\n\n return (\n <InputGroupButton\n aria-label={isGenerating ? \"Stop\" : \"Submit\"}\n className={cn(className)}\n onClick={handleClick}\n size={size}\n type={isGenerating && onStop ? \"button\" : \"submit\"}\n variant={variant}\n {...props}\n >\n {children ?? Icon}\n </InputGroupButton>\n );\n};\n\nexport type PromptInputSelectProps = ComponentProps<typeof Select>;\n\nexport const PromptInputSelect = (props: PromptInputSelectProps) => (\n <Select {...props} />\n);\n\nexport type PromptInputSelectTriggerProps = ComponentProps<\n typeof SelectTrigger\n>;\n\nexport const PromptInputSelectTrigger = ({\n className,\n ...props\n}: PromptInputSelectTriggerProps) => (\n <SelectTrigger\n className={cn(\n \"border-none bg-transparent font-medium text-muted-foreground shadow-none transition-colors\",\n \"hover:bg-accent hover:text-foreground aria-expanded:bg-accent aria-expanded:text-foreground\",\n className\n )}\n {...props}\n />\n);\n\nexport type PromptInputSelectContentProps = ComponentProps<\n typeof SelectContent\n>;\n\nexport const PromptInputSelectContent = ({\n className,\n ...props\n}: PromptInputSelectContentProps) => (\n <SelectContent className={cn(className)} {...props} />\n);\n\nexport type PromptInputSelectItemProps = ComponentProps<typeof SelectItem>;\n\nexport const PromptInputSelectItem = ({\n className,\n ...props\n}: PromptInputSelectItemProps) => (\n <SelectItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputSelectValueProps = ComponentProps<typeof SelectValue>;\n\nexport const PromptInputSelectValue = ({\n className,\n ...props\n}: PromptInputSelectValueProps) => (\n <SelectValue className={cn(className)} {...props} />\n);\n\nexport type PromptInputHoverCardProps = ComponentProps<typeof HoverCard>;\n\nexport const PromptInputHoverCard = ({\n openDelay = 0,\n closeDelay = 0,\n ...props\n}: PromptInputHoverCardProps) => (\n <HoverCard closeDelay={closeDelay} openDelay={openDelay} {...props} />\n);\n\nexport type PromptInputHoverCardTriggerProps = ComponentProps<\n typeof HoverCardTrigger\n>;\n\nexport const PromptInputHoverCardTrigger = (\n props: PromptInputHoverCardTriggerProps\n) => <HoverCardTrigger {...props} />;\n\nexport type PromptInputHoverCardContentProps = ComponentProps<\n typeof HoverCardContent\n>;\n\nexport const PromptInputHoverCardContent = ({\n align = \"start\",\n ...props\n}: PromptInputHoverCardContentProps) => (\n <HoverCardContent align={align} {...props} />\n);\n\nexport type PromptInputTabsListProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabsList = ({\n className,\n ...props\n}: PromptInputTabsListProps) => <div className={cn(className)} {...props} />;\n\nexport type PromptInputTabProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTab = ({\n className,\n ...props\n}: PromptInputTabProps) => <div className={cn(className)} {...props} />;\n\nexport type PromptInputTabLabelProps = HTMLAttributes<HTMLHeadingElement>;\n\nexport const PromptInputTabLabel = ({\n className,\n ...props\n}: PromptInputTabLabelProps) => (\n // Content provided via children in props\n // oxlint-disable-next-line eslint-plugin-jsx-a11y(heading-has-content)\n <h3\n className={cn(\n \"mb-2 px-3 font-medium text-muted-foreground text-xs\",\n className\n )}\n {...props}\n />\n);\n\nexport type PromptInputTabBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabBody = ({\n className,\n ...props\n}: PromptInputTabBodyProps) => (\n <div className={cn(\"space-y-1\", className)} {...props} />\n);\n\nexport type PromptInputTabItemProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabItem = ({\n className,\n ...props\n}: PromptInputTabItemProps) => (\n <div\n className={cn(\n \"flex items-center gap-2 px-3 py-2 text-xs hover:bg-accent\",\n className\n )}\n {...props}\n />\n);\n\nexport type PromptInputCommandProps = ComponentProps<typeof Command>;\n\nexport const PromptInputCommand = ({\n className,\n ...props\n}: PromptInputCommandProps) => <Command className={cn(className)} {...props} />;\n\nexport type PromptInputCommandInputProps = ComponentProps<typeof CommandInput>;\n\nexport const PromptInputCommandInput = ({\n className,\n ...props\n}: PromptInputCommandInputProps) => (\n <CommandInput className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandListProps = ComponentProps<typeof CommandList>;\n\nexport const PromptInputCommandList = ({\n className,\n ...props\n}: PromptInputCommandListProps) => (\n <CommandList className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandEmptyProps = ComponentProps<typeof CommandEmpty>;\n\nexport const PromptInputCommandEmpty = ({\n className,\n ...props\n}: PromptInputCommandEmptyProps) => (\n <CommandEmpty className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandGroupProps = ComponentProps<typeof CommandGroup>;\n\nexport const PromptInputCommandGroup = ({\n className,\n ...props\n}: PromptInputCommandGroupProps) => (\n <CommandGroup className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandItemProps = ComponentProps<typeof CommandItem>;\n\nexport const PromptInputCommandItem = ({\n className,\n ...props\n}: PromptInputCommandItemProps) => (\n <CommandItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandSeparatorProps = ComponentProps<\n typeof CommandSeparator\n>;\n\nexport const PromptInputCommandSeparator = ({\n className,\n ...props\n}: PromptInputCommandSeparatorProps) => (\n <CommandSeparator className={cn(className)} {...props} />\n);\n","import * as React from \"react\"\nimport { Progress as ProgressPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Progress({\n className,\n value,\n ...props\n}: React.ComponentProps<typeof ProgressPrimitive.Root>) {\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n className={cn(\n \"relative flex h-0.5 w-full items-center overflow-x-hidden rounded-none bg-muted\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className=\"size-full flex-1 bg-primary transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n )\n}\n\nexport { Progress }\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport {\n HoverCard,\n HoverCardContent,\n HoverCardTrigger,\n} from \"../ui/hover-card\";\nimport { Progress } from \"../ui/progress\";\nimport { cn } from \"../../lib/utils\";\nimport type { LanguageModelUsage } from \"ai\";\nimport type { ComponentProps } from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\nimport { getUsage } from \"tokenlens\";\n\nconst PERCENT_MAX = 100;\nconst ICON_RADIUS = 10;\nconst ICON_VIEWBOX = 24;\nconst ICON_CENTER = 12;\nconst ICON_STROKE_WIDTH = 2;\n\ntype ModelId = string;\n\ninterface ContextSchema {\n usedTokens: number;\n maxTokens: number;\n usage?: LanguageModelUsage;\n modelId?: ModelId;\n}\n\nconst ContextContext = createContext<ContextSchema | null>(null);\n\nconst useContextValue = () => {\n const context = useContext(ContextContext);\n\n if (!context) {\n throw new Error(\"Context components must be used within Context\");\n }\n\n return context;\n};\n\nexport type ContextProps = ComponentProps<typeof HoverCard> & ContextSchema;\n\nexport const Context = ({\n usedTokens,\n maxTokens,\n usage,\n modelId,\n ...props\n}: ContextProps) => {\n const contextValue = useMemo(\n () => ({ maxTokens, modelId, usage, usedTokens }),\n [maxTokens, modelId, usage, usedTokens]\n );\n\n return (\n <ContextContext.Provider value={contextValue}>\n <HoverCard closeDelay={100} openDelay={0} {...props} />\n </ContextContext.Provider>\n );\n};\n\nconst ContextIcon = () => {\n const { usedTokens, maxTokens } = useContextValue();\n const circumference = 2 * Math.PI * ICON_RADIUS;\n const usedPercent = usedTokens / maxTokens;\n const dashOffset = circumference * (1 - usedPercent);\n\n return (\n <svg\n aria-label=\"Model context usage\"\n height=\"20\"\n role=\"img\"\n style={{ color: \"currentcolor\" }}\n viewBox={`0 0 ${ICON_VIEWBOX} ${ICON_VIEWBOX}`}\n width=\"20\"\n >\n <circle\n cx={ICON_CENTER}\n cy={ICON_CENTER}\n fill=\"none\"\n opacity=\"0.25\"\n r={ICON_RADIUS}\n stroke=\"currentColor\"\n strokeWidth={ICON_STROKE_WIDTH}\n />\n <circle\n cx={ICON_CENTER}\n cy={ICON_CENTER}\n fill=\"none\"\n opacity=\"0.7\"\n r={ICON_RADIUS}\n stroke=\"currentColor\"\n strokeDasharray={`${circumference} ${circumference}`}\n strokeDashoffset={dashOffset}\n strokeLinecap=\"round\"\n strokeWidth={ICON_STROKE_WIDTH}\n style={{ transform: \"rotate(-90deg)\", transformOrigin: \"center\" }}\n />\n </svg>\n );\n};\n\nexport type ContextTriggerProps = ComponentProps<typeof Button>;\n\nexport const ContextTrigger = ({ children, ...props }: ContextTriggerProps) => { \n return (\n <HoverCardTrigger asChild>\n {children ?? (\n <Button type=\"button\" variant=\"ghost\" {...props}>\n <ContextIcon />\n </Button>\n )}\n </HoverCardTrigger>\n );\n};\n\nexport type ContextContentProps = ComponentProps<typeof HoverCardContent>;\n\nexport const ContextContent = ({\n className,\n ...props\n}: ContextContentProps) => (\n <HoverCardContent\n className={cn(\"min-w-60 divide-y overflow-hidden p-0\", className)}\n {...props}\n />\n);\n\nexport type ContextContentHeaderProps = ComponentProps<\"div\">;\n\nexport const ContextContentHeader = ({\n children,\n className,\n ...props\n}: ContextContentHeaderProps) => {\n const { usedTokens, maxTokens } = useContextValue();\n const usedPercent = usedTokens / maxTokens;\n const displayPct = new Intl.NumberFormat(\"en-US\", {\n maximumFractionDigits: 1,\n style: \"percent\",\n }).format(usedPercent);\n const used = new Intl.NumberFormat(\"en-US\", {\n notation: \"compact\",\n }).format(usedTokens);\n const total = new Intl.NumberFormat(\"en-US\", {\n notation: \"compact\",\n }).format(maxTokens);\n\n return (\n <div className={cn(\"w-full space-y-2 p-3\", className)} {...props}>\n {children ?? (\n <>\n <div className=\"flex items-center justify-between gap-3 text-xs\">\n <p>{displayPct}</p>\n <p className=\" text-muted-foreground\">\n {used} / {total}\n </p>\n </div>\n <div className=\"space-y-2\">\n <Progress className=\"bg-muted\" value={usedPercent * PERCENT_MAX} />\n </div>\n </>\n )}\n </div>\n );\n};\n\nexport type ContextContentBodyProps = ComponentProps<\"div\">;\n\nexport const ContextContentBody = ({\n children,\n className,\n ...props\n}: ContextContentBodyProps) => (\n <div className={cn(\"w-full p-3\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type ContextContentFooterProps = ComponentProps<\"div\">;\n\nexport const ContextContentFooter = ({\n children,\n className,\n ...props\n}: ContextContentFooterProps) => {\n const { modelId, usage } = useContextValue();\n const costUSD = modelId\n ? getUsage({\n modelId,\n usage: {\n input: usage?.inputTokens ?? 0,\n output: usage?.outputTokens ?? 0,\n },\n }).costUSD?.totalUSD\n : undefined;\n const totalCost = new Intl.NumberFormat(\"en-US\", {\n currency: \"USD\",\n style: \"currency\",\n }).format(costUSD ?? 0);\n\n return (\n <div\n className={cn(\n \"flex w-full items-center justify-between gap-3 bg-secondary p-3 text-xs\",\n className\n )}\n {...props}\n >\n {children ?? (\n <>\n <span className=\"text-muted-foreground\">Total cost</span>\n <span>{totalCost}</span>\n </>\n )}\n </div>\n );\n};\n\nconst TokensWithCost = ({\n tokens,\n costText,\n}: {\n tokens?: number;\n costText?: string;\n}) => (\n <span>\n {tokens === undefined\n ? \"—\"\n : new Intl.NumberFormat(\"en-US\", {\n notation: \"compact\",\n }).format(tokens)}\n {costText ? (\n <span className=\"ml-2 text-muted-foreground\">• {costText}</span>\n ) : null}\n </span>\n);\n\nexport type ContextInputUsageProps = ComponentProps<\"div\">;\n\nexport const ContextInputUsage = ({\n className,\n children,\n ...props\n}: ContextInputUsageProps) => {\n const { usage, modelId } = useContextValue();\n const inputTokens = usage?.inputTokens ?? 0;\n\n if (children) {\n return children;\n }\n\n if (!inputTokens) {\n return null;\n }\n\n const inputCost = modelId\n ? getUsage({\n modelId,\n usage: { input: inputTokens, output: 0 },\n }).costUSD?.totalUSD\n : undefined;\n const inputCostText = new Intl.NumberFormat(\"en-US\", {\n currency: \"USD\",\n style: \"currency\",\n }).format(inputCost ?? 0);\n\n return (\n <div\n className={cn(\"flex items-center justify-between text-xs\", className)}\n {...props}\n >\n <span className=\"text-muted-foreground\">Input</span>\n <TokensWithCost costText={inputCostText} tokens={inputTokens} />\n </div>\n );\n};\n\nexport type ContextOutputUsageProps = ComponentProps<\"div\">;\n\nexport const ContextOutputUsage = ({\n className,\n children,\n ...props\n}: ContextOutputUsageProps) => {\n const { usage, modelId } = useContextValue();\n const outputTokens = usage?.outputTokens ?? 0;\n\n if (children) {\n return children;\n }\n\n if (!outputTokens) {\n return null;\n }\n\n const outputCost = modelId\n ? getUsage({\n modelId,\n usage: { input: 0, output: outputTokens },\n }).costUSD?.totalUSD\n : undefined;\n const outputCostText = new Intl.NumberFormat(\"en-US\", {\n currency: \"USD\",\n style: \"currency\",\n }).format(outputCost ?? 0);\n\n return (\n <div\n className={cn(\"flex items-center justify-between text-xs\", className)}\n {...props}\n >\n <span className=\"text-muted-foreground\">Output</span>\n <TokensWithCost costText={outputCostText} tokens={outputTokens} />\n </div>\n );\n};\n\nexport type ContextReasoningUsageProps = ComponentProps<\"div\">;\n\nexport const ContextReasoningUsage = ({\n className,\n children,\n ...props\n}: ContextReasoningUsageProps) => {\n const { usage, modelId } = useContextValue();\n const reasoningTokens = usage?.reasoningTokens ?? 0;\n\n if (children) {\n return children;\n }\n\n if (!reasoningTokens) {\n return null;\n }\n\n const reasoningCost = modelId\n ? getUsage({\n modelId,\n usage: { reasoningTokens },\n }).costUSD?.totalUSD\n : undefined;\n const reasoningCostText = new Intl.NumberFormat(\"en-US\", {\n currency: \"USD\",\n style: \"currency\",\n }).format(reasoningCost ?? 0);\n\n return (\n <div\n className={cn(\"flex items-center justify-between text-xs\", className)}\n {...props}\n >\n <span className=\"text-muted-foreground\">Reasoning</span>\n <TokensWithCost costText={reasoningCostText} tokens={reasoningTokens} />\n </div>\n );\n};\n\nexport type ContextCacheUsageProps = ComponentProps<\"div\">;\n\nexport const ContextCacheUsage = ({\n className,\n children,\n ...props\n}: ContextCacheUsageProps) => {\n const { usage, modelId } = useContextValue();\n const cacheTokens = usage?.cachedInputTokens ?? 0;\n\n if (children) {\n return children;\n }\n\n if (!cacheTokens) {\n return null;\n }\n\n const cacheCost = modelId\n ? getUsage({\n modelId,\n usage: { cacheReads: cacheTokens, input: 0, output: 0 },\n }).costUSD?.totalUSD\n : undefined;\n const cacheCostText = new Intl.NumberFormat(\"en-US\", {\n currency: \"USD\",\n style: \"currency\",\n }).format(cacheCost ?? 0);\n\n return (\n <div\n className={cn(\"flex items-center justify-between text-xs\", className)}\n {...props}\n >\n <span className=\"text-muted-foreground\">Cache</span>\n <TokensWithCost costText={cacheCostText} tokens={cacheTokens} />\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\"\nimport { Separator } from \"./separator\"\n\nfunction ItemGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n role=\"list\"\n data-slot=\"item-group\"\n className={cn(\n \"group/item-group flex w-full flex-col gap-4 has-data-[size=sm]:gap-2.5 has-data-[size=xs]:gap-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"item-separator\"\n orientation=\"horizontal\"\n className={cn(\"my-2\", className)}\n {...props}\n />\n )\n}\n\nconst itemVariants = cva(\n \"group/item flex w-full flex-wrap items-center rounded-none border text-sm transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors [a]:hover:bg-muted\",\n {\n variants: {\n variant: {\n default: \"border-transparent\",\n outline: \"border-border\",\n muted: \"border-transparent bg-muted/50\",\n },\n size: {\n default: \"gap-3.5 px-4 py-3.5\",\n sm: \"gap-3.5 px-3.5 py-3\",\n xs: \"gap-2.5 px-3 py-2.5 in-data-[slot=dropdown-menu-content]:p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Item({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof itemVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\"\n return (\n <Comp\n data-slot=\"item\"\n data-variant={variant}\n data-size={size}\n className={cn(itemVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nconst itemMediaVariants = cva(\n \"flex shrink-0 items-center justify-center gap-2 group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start [&_svg]:pointer-events-none\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n icon: \"[&_svg:not([class*='size-'])]:size-4\",\n image:\n \"size-10 overflow-hidden rounded-none group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 group-data-[size=xs]/item:rounded-none [&_img]:size-full [&_img]:object-cover\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction ItemMedia({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof itemMediaVariants>) {\n return (\n <div\n data-slot=\"item-media\"\n data-variant={variant}\n className={cn(itemMediaVariants({ variant, className }))}\n {...props}\n />\n )\n}\n\nfunction ItemContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-content\"\n className={cn(\n \"flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0.5 [&+[data-slot=item-content]]:flex-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-title\"\n className={cn(\n \"line-clamp-1 flex w-fit items-center gap-2 text-xs leading-snug font-semibold uppercase underline-offset-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"item-description\"\n className={cn(\n \"line-clamp-2 text-left text-sm leading-relaxed font-normal text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemActions({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-actions\"\n className={cn(\"flex items-center gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction ItemHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-header\"\n className={cn(\n \"flex basis-full items-center justify-between gap-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-footer\"\n className={cn(\n \"flex basis-full items-center justify-between gap-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Item,\n ItemMedia,\n ItemContent,\n ItemActions,\n ItemGroup,\n ItemSeparator,\n ItemTitle,\n ItemDescription,\n ItemHeader,\n ItemFooter,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 flex w-72 origin-(--radix-popover-content-transform-origin) flex-col gap-4 rounded-none bg-popover p-4 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden 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-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 </PopoverPrimitive.Portal>\n )\n}\n\nfunction PopoverAnchor({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />\n}\n\nfunction PopoverHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"popover-header\"\n className={cn(\"flex flex-col gap-1 text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction PopoverTitle({ className, ...props }: React.ComponentProps<\"h2\">) {\n return (\n <div\n data-slot=\"popover-title\"\n className={cn(\"text-xs font-semibold uppercase\", className)}\n {...props}\n />\n )\n}\n\nfunction PopoverDescription({\n className,\n ...props\n}: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"popover-description\"\n className={cn(\n \"mt-0.5 text-sm leading-relaxed text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverDescription,\n PopoverHeader,\n PopoverTitle,\n PopoverTrigger,\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n File as FileIcon,\n FileArchive,\n FileAudio,\n FileCode,\n FileSpreadsheet,\n FileText,\n FileVideo,\n} from \"lucide-react\";\nimport type { PromptInputMessage } from \"../ai-elements/prompt-input\";\nimport { useProviderAttachments } from \"../ai-elements/prompt-input\";\nimport type {\n AgentChatImageAttachment,\n AgentChatPendingAttachment,\n AgentChatSlashCommand,\n TokenUsage,\n} from \"../../types\";\nimport { useAgentChatAdapterContext } from \"../../adapter-context\";\nimport {\n Context,\n ContextCacheUsage,\n ContextContent,\n ContextContentBody,\n ContextContentHeader,\n ContextInputUsage,\n ContextOutputUsage,\n ContextReasoningUsage,\n ContextTrigger,\n} from \"../ai-elements/context\";\nimport { Button } from \"../ui/button\";\nimport {\n Item,\n ItemActions,\n ItemContent,\n ItemDescription,\n ItemMedia,\n ItemTitle,\n} from \"../ui/item\";\nimport {\n PromptInput,\n PromptInputBody,\n PromptInputFooter,\n PromptInputSubmit,\n PromptInputTextarea,\n PromptInputTools,\n PromptInputActionMenu,\n PromptInputActionMenuTrigger,\n PromptInputActionMenuContent,\n PromptInputActionAddAttachments,\n PromptInputProvider,\n usePromptInputController,\n} from \"../ai-elements/prompt-input\";\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n} from \"../ui/popover\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from \"../ui/command\";\n\n// ── Slash command entry ──────────────────────────────────────────────\n\ntype SlashCommand = AgentChatSlashCommand;\n\n// ── Props ────────────────────────────────────────────────────────────\n\nexport interface ChatComposerError {\n /**\n * Stable error code so callers can route different rejections (e.g.\n * show a different toast variant per code) without parsing the\n * human-readable message.\n */\n code:\n | \"accept\"\n | \"max_files\"\n | \"max_file_size\"\n | \"max_images\"\n | \"max_image_size\"\n | \"max_attachments\"\n | \"max_attachment_size\"\n | \"max_attachments_total\";\n /** Display-ready, single-sentence reason. */\n message: string;\n}\n\ninterface ChatComposerProps {\n onSend: (\n text: string,\n images?: AgentChatImageAttachment[],\n attachments?: AgentChatPendingAttachment[],\n ) => void | Promise<void>;\n onStop: () => void | Promise<void>;\n isRunning: boolean;\n disabled?: boolean;\n disabledReason?: string;\n tokenUsage?: TokenUsage;\n /**\n * Optional handler for client-side rejections (size/count caps,\n * accept-pattern misses). Without it, rejections are silent — pass\n * a toast wiring at the host-app layer if you want them surfaced.\n */\n onComposerError?: (err: ChatComposerError) => void;\n}\n\n// ── Outer wrapper (provides controlled text state) ───────────────────\n\nexport function ChatComposer(props: ChatComposerProps) {\n return (\n <PromptInputProvider>\n <ChatComposerInner {...props} />\n </PromptInputProvider>\n );\n}\n\n// ── Attachment preview strip ─────────────────────────────────────────\n\nfunction iconForMime(mime?: string) {\n if (!mime) return FileIcon;\n if (mime.startsWith(\"audio/\")) return FileAudio;\n if (mime.startsWith(\"video/\")) return FileVideo;\n if (mime === \"application/pdf\" || mime.startsWith(\"text/\")) return FileText;\n if (\n mime === \"application/json\" ||\n mime === \"application/xml\" ||\n mime.endsWith(\"+xml\") ||\n mime.endsWith(\"+json\") ||\n mime.includes(\"javascript\") ||\n mime.includes(\"typescript\")\n ) {\n return FileCode;\n }\n if (\n mime === \"application/zip\" ||\n mime === \"application/x-7z-compressed\" ||\n mime === \"application/x-tar\" ||\n mime === \"application/gzip\" ||\n mime === \"application/x-rar-compressed\"\n ) {\n return FileArchive;\n }\n if (\n mime === \"text/csv\" ||\n mime === \"application/vnd.ms-excel\" ||\n mime.includes(\"spreadsheet\")\n ) {\n return FileSpreadsheet;\n }\n return FileIcon;\n}\n\nfunction formatBytes(n?: number): string {\n if (n == null || !Number.isFinite(n) || n < 0) return \"\";\n for (const [unit, divisor] of [\n [\"GB\", 1_000_000_000],\n [\"MB\", 1_000_000],\n [\"KB\", 1_000],\n ] as const) {\n if (n >= divisor) return `${(n / divisor).toFixed(1)} ${unit}`;\n }\n return `${n} B`;\n}\n\nfunction AttachmentPreviewStrip() {\n const attachments = useProviderAttachments();\n if (attachments.files.length === 0) return null;\n\n return (\n <div className=\"flex gap-2 px-3 pt-2 pb-1 flex-wrap\">\n {attachments.files.map((file) => {\n const isImage =\n file.mediaType?.startsWith(\"image/\") && !!file.url;\n const sizeLabel = formatBytes(file.file?.size);\n const Icon = iconForMime(file.mediaType);\n\n // Single uniform Item layout for both images and non-images:\n // the only thing that differs is the ItemMedia slot (a real\n // thumbnail when we have one, a mime-bucket icon otherwise).\n // Class overrides on the outer Item drop the list-row defaults\n // (``w-full``, ``rounded-none``) so the chips sit inline at\n // intrinsic width.\n return (\n <Item\n key={file.id}\n variant=\"outline\"\n size=\"xs\"\n className=\"group w-auto max-w-[18rem] rounded-md\"\n title={file.filename}\n >\n <ItemMedia variant={isImage ? \"image\" : \"icon\"}>\n {isImage ? (\n <img src={file.url} alt={file.filename} />\n ) : (\n <Icon />\n )}\n </ItemMedia>\n <ItemContent className=\"min-w-0\">\n {/*\n Override ``flex`` (which the shadcn ItemTitle bakes\n into its base classes) with ``block`` so the\n ``truncate`` utility's ``text-overflow: ellipsis``\n actually takes effect. Flex would override the\n ``display: -webkit-box`` that line-clamp-1 relies on\n AND defeat text-overflow. ``min-w-0`` on the parent\n ItemContent is also required: without it, flex's\n default ``min-width: auto`` lets the title push past\n the Item's max-width on filenames with long\n unbreakable runs.\n */}\n <ItemTitle className=\"block w-full truncate normal-case font-medium text-foreground\">\n {file.filename}\n </ItemTitle>\n {sizeLabel && (\n <ItemDescription className=\"text-xs\">\n {sizeLabel}\n </ItemDescription>\n )}\n </ItemContent>\n <ItemActions>\n <button\n type=\"button\"\n onClick={() => attachments.remove(file.id)}\n aria-label={`Remove ${file.filename}`}\n className=\"hidden group-hover:flex items-center justify-center w-4 h-4 rounded-full bg-destructive text-destructive-foreground text-[10px]\"\n >\n ×\n </button>\n </ItemActions>\n </Item>\n );\n })}\n </div>\n );\n}\n\n// ── Inner component (has access to controller) ──────────────────────\n\n// Per-message caps mirror the server-side limits so the composer can\n// reject without a server round-trip. Keep these in sync with\n// _MAX_IMAGES_PER_MESSAGE / _MAX_IMAGE_BYTES /\n// _MAX_ATTACHMENTS_PER_MESSAGE / _MAX_ATTACHMENT_BYTES /\n// _MAX_ATTACHMENTS_TOTAL_BYTES on the harness side.\nconst MAX_IMAGES_PER_MESSAGE = 5;\nconst MAX_IMAGE_BYTES = 20_000_000;\nconst MAX_ATTACHMENTS_PER_MESSAGE = 10;\nconst MAX_ATTACHMENT_BYTES = 50_000_000;\nconst MAX_ATTACHMENTS_TOTAL_BYTES = 200_000_000;\n\nfunction ChatComposerInner({\n onSend,\n onStop,\n isRunning,\n disabled = false,\n disabledReason,\n tokenUsage,\n onComposerError,\n}: ChatComposerProps) {\n const { adapter } = useAgentChatAdapterContext();\n const { textInput } = usePromptInputController();\n const status = isRunning ? \"streaming\" : disabled ? \"error\" : \"ready\";\n\n // ── Load skills from backend ─────────────────────────────────────\n\n const [adapterCommands, setAdapterCommands] = useState<SlashCommand[]>([]);\n const [buttonMenuOpen, setButtonMenuOpen] = useState(false);\n const [menuDismissed, setMenuDismissed] = useState(false);\n const showSlashMenu = !menuDismissed && (textInput.value.startsWith(\"/\") || buttonMenuOpen);\n\n // Re-open when user types a new `/` after dismissal.\n useEffect(() => {\n if (menuDismissed && !textInput.value.startsWith(\"/\") && !buttonMenuOpen) {\n setMenuDismissed(false);\n }\n }, [buttonMenuOpen, menuDismissed, textInput.value]);\n\n // Re-fetch app-provided commands each time the slash menu opens.\n const [wasClosed, setWasClosed] = useState(true);\n useEffect(() => {\n if (showSlashMenu && wasClosed) {\n setWasClosed(false);\n adapter.listSlashCommands?.()\n .then(setAdapterCommands)\n .catch(() => { /* best-effort */ });\n }\n if (!showSlashMenu && !wasClosed) {\n setWasClosed(true);\n }\n }, [adapter, showSlashMenu, wasClosed]);\n\n const builtinCommands = useMemo<SlashCommand[]>(\n () => [\n { value: \"/clear\", label: \"/clear\", description: \"Clear conversation\" },\n { value: \"/compress\", label: \"/compress\", description: \"Compress context\" },\n { value: \"/goal\", label: \"/goal\", description: \"Define an outcome goal\" },\n { value: \"/goal status\", label: \"/goal status\", description: \"Show outcome goal status\" },\n { value: \"/goal pause\", label: \"/goal pause\", description: \"Pause automatic goal continuation\" },\n { value: \"/goal resume\", label: \"/goal resume\", description: \"Resume a paused goal\" },\n { value: \"/goal clear\", label: \"/goal clear\", description: \"Clear the current goal\" },\n { value: \"/loop\", label: \"/loop\", description: \"Schedule recurring prompt\" },\n { value: \"/loop list\", label: \"/loop list\", description: \"List active loops\" },\n { value: \"/loop cancel\", label: \"/loop cancel\", description: \"Cancel a loop by ID\" },\n ],\n [],\n );\n\n // ── Slash menu state ─────────────────────────────────────────────\n\n // The CommandInput inside the popup is the canonical search input\n // while the menu is open. Its value mirrors whatever follows the\n // leading ``/`` in the textarea — typing in either keeps both in\n // sync (onValueChange writes back to the textarea, the textarea's\n // controller updates ``searchQuery`` on every render). cmdk does\n // the filtering + arrow-key navigation + scroll-into-view itself,\n // so no manual ``selectedIndex`` or layout effect is needed: the\n // command palette behaves exactly like the shadcn example.\n const searchQuery = showSlashMenu ? textInput.value.slice(1) : \"\";\n\n const menuOpen = showSlashMenu;\n\n // When the slash popup closes — by command selection, Escape, or\n // click-outside — cmdk + Radix tear down the CommandInput that was\n // holding focus. Without an explicit hand-off, focus falls onto\n // the body and the user has to click back into the chat input.\n // We stash a ref on the textarea below and route every \"the user\n // is done with the popup\" path through this helper.\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n\n const focusTextareaAtEnd = useCallback(() => {\n // requestAnimationFrame waits for Radix's own close-focus step to\n // run first; focusing synchronously inside an onSelect or\n // onEscapeKeyDown handler races Radix and the textarea loses\n // focus on the next tick.\n requestAnimationFrame(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.focus();\n const end = textarea.value.length;\n textarea.setSelectionRange(end, end);\n });\n }, []);\n\n const handleCommandSelect = useCallback(\n (commandValue: string) => {\n textInput.setInput(commandValue + \" \");\n setButtonMenuOpen(false);\n setMenuDismissed(true);\n focusTextareaAtEnd();\n },\n [textInput, focusTextareaAtEnd],\n );\n\n const handleSearchChange = useCallback(\n (next: string) => {\n // Mirror the popup's CommandInput back into the textarea so the\n // two stay in sync and the chat submit picks up exactly what\n // the user sees in the palette.\n textInput.setInput(\"/\" + next);\n },\n [textInput],\n );\n\n // ── Submit ───────────────────────────────────────────────────────\n\n const handleSubmit = useCallback(\n async (message: PromptInputMessage) => {\n const text = message.text.trim();\n if (!text || disabled) return;\n\n // Split incoming files by MIME bucket: images go through the\n // existing vision-inline path (base64 data URL on the message\n // body), everything else becomes a pending attachment uploaded\n // to the workspace by the runtime.\n const images: AgentChatImageAttachment[] = [];\n const pending: AgentChatPendingAttachment[] = [];\n\n for (const file of message.files) {\n if (file.mediaType?.startsWith(\"image/\") && file.url) {\n images.push({ data: file.url, mimeType: file.mediaType });\n continue;\n }\n if (!file.file) {\n // Defensive: PromptInputProvider/local both stamp file: on\n // each item. If a future consumer constructs a FileUIPart\n // without it, drop the entry rather than pretending we can\n // upload nothing.\n continue;\n }\n pending.push({\n file: file.file,\n filename: file.filename ?? file.file.name,\n mimeType: file.mediaType ?? file.file.type ?? undefined,\n size: file.file.size,\n });\n }\n\n // Split-aware caps — the <PromptInput maxFiles/maxFileSize> caps\n // are a coarse first line that ignores the image/non-image\n // distinction; we re-check per bucket here.\n if (images.length > MAX_IMAGES_PER_MESSAGE) {\n onComposerError?.({\n code: \"max_images\",\n message: `Maximum ${MAX_IMAGES_PER_MESSAGE} images per message.`,\n });\n return;\n }\n if (pending.length > MAX_ATTACHMENTS_PER_MESSAGE) {\n onComposerError?.({\n code: \"max_attachments\",\n message: `Maximum ${MAX_ATTACHMENTS_PER_MESSAGE} attachments per message.`,\n });\n return;\n }\n for (const img of images) {\n // Best-effort image-size guard: a base64-encoded image is\n // roughly 4/3 the raw size, so 27 MB of base64 ≈ 20 MB raw.\n if (img.data.length > Math.ceil(MAX_IMAGE_BYTES * 4 / 3)) {\n onComposerError?.({\n code: \"max_image_size\",\n message: `Image exceeds ${MAX_IMAGE_BYTES / 1_000_000} MB.`,\n });\n return;\n }\n }\n let totalAttachmentBytes = 0;\n for (const a of pending) {\n if (a.file.size > MAX_ATTACHMENT_BYTES) {\n onComposerError?.({\n code: \"max_attachment_size\",\n message: `\"${a.filename}\" exceeds ${MAX_ATTACHMENT_BYTES / 1_000_000} MB.`,\n });\n return;\n }\n totalAttachmentBytes += a.file.size;\n }\n if (totalAttachmentBytes > MAX_ATTACHMENTS_TOTAL_BYTES) {\n onComposerError?.({\n code: \"max_attachments_total\",\n message: `Attachments exceed ${MAX_ATTACHMENTS_TOTAL_BYTES / 1_000_000} MB total for this message.`,\n });\n return;\n }\n\n if (isRunning) {\n await onStop();\n }\n await onSend(\n text,\n images.length > 0 ? images : undefined,\n pending.length > 0 ? pending : undefined,\n );\n },\n [onSend, onStop, onComposerError, isRunning, disabled],\n );\n\n const handlePromptInputError = useCallback(\n (err: { code: \"max_files\" | \"max_file_size\" | \"accept\"; message: string }) => {\n onComposerError?.({ code: err.code, message: err.message });\n },\n [onComposerError],\n );\n\n // ── Render ───────────────────────────────────────────────────────\n\n return (\n <Popover\n open={menuOpen}\n onOpenChange={(open) => {\n if (!open) {\n // Radix fires onOpenChange(false) for both Escape and\n // click-outside. Without latching ``menuDismissed`` here\n // the next render would recompute ``showSlashMenu`` from\n // the textarea (which still starts with ``/``) and the\n // popup would immediately reopen, undoing the user's\n // dismissal. ``menuDismissed`` resets in the useEffect\n // at the top of this component as soon as the textarea\n // stops starting with ``/`` (or the button menu fires),\n // so the next genuine ``/`` press reopens the popup.\n setButtonMenuOpen(false);\n setMenuDismissed(true);\n }\n }}\n >\n <AttachmentPreviewStrip />\n <PopoverAnchor asChild>\n <PromptInput\n onSubmit={handleSubmit}\n multiple\n maxFiles={MAX_IMAGES_PER_MESSAGE + MAX_ATTACHMENTS_PER_MESSAGE}\n maxFileSize={MAX_ATTACHMENT_BYTES}\n onError={handlePromptInputError}\n >\n <PromptInputBody>\n <PromptInputTextarea\n ref={textareaRef}\n placeholder={\n disabled\n ? disabledReason ?? \"Session disabled\"\n : \"Send a message...\"\n }\n disabled={disabled}\n />\n </PromptInputBody>\n <PromptInputFooter>\n <PromptInputTools>\n <PromptInputActionMenu>\n <PromptInputActionMenuTrigger />\n <PromptInputActionMenuContent>\n <PromptInputActionAddAttachments />\n </PromptInputActionMenuContent>\n </PromptInputActionMenu>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n className=\"text-muted-foreground\"\n onClick={(e) => {\n e.preventDefault();\n setButtonMenuOpen((v) => !v);\n }}\n aria-label=\"Slash commands\"\n >\n <span className=\"text-xs font-bold\">/</span>\n </Button>\n {tokenUsage && tokenUsage.contextWindow > 0 && (\n <Context\n usedTokens={tokenUsage.totalTokens}\n maxTokens={tokenUsage.contextWindow}\n modelId={tokenUsage.model}\n usage={{\n inputTokens: tokenUsage.inputTokens,\n outputTokens: tokenUsage.outputTokens,\n reasoningTokens: tokenUsage.reasoningTokens,\n cachedInputTokens: tokenUsage.cachedInputTokens,\n totalTokens: tokenUsage.totalTokens,\n inputTokenDetails: undefined as never,\n outputTokenDetails: undefined as never,\n }}\n >\n <ContextTrigger />\n <ContextContent>\n <ContextContentHeader />\n <ContextContentBody>\n {tokenUsage.totalTokens > 0 ? (\n <>\n <ContextInputUsage>\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-muted-foreground\">Input</span>\n <span>{tokenUsage.inputTokens.toLocaleString()}</span>\n </div>\n </ContextInputUsage>\n <ContextOutputUsage>\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-muted-foreground\">Output</span>\n <span>{tokenUsage.outputTokens.toLocaleString()}</span>\n </div>\n </ContextOutputUsage>\n {tokenUsage.reasoningTokens > 0 && (\n <ContextReasoningUsage>\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-muted-foreground\">Reasoning</span>\n <span>{tokenUsage.reasoningTokens.toLocaleString()}</span>\n </div>\n </ContextReasoningUsage>\n )}\n {tokenUsage.cachedInputTokens > 0 && (\n <ContextCacheUsage>\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-muted-foreground\">Cache</span>\n <span>{tokenUsage.cachedInputTokens.toLocaleString()}</span>\n </div>\n </ContextCacheUsage>\n )}\n </>\n ) : (\n <p className=\"text-xs text-muted-foreground text-center py-1\">Empty</p>\n )}\n </ContextContentBody>\n {tokenUsage.totalTokens > 0 && (\n <div className=\"flex w-full items-center justify-end gap-3 bg-secondary p-2\">\n <Button\n type=\"button\"\n size=\"xs\"\n onClick={() => onSend(\"/compress\")}\n >\n Compress\n </Button>\n </div>\n )}\n </ContextContent>\n </Context>\n )}\n </PromptInputTools>\n <PromptInputSubmit status={status} onStop={onStop} />\n </PromptInputFooter>\n </PromptInput>\n </PopoverAnchor>\n <PopoverContent\n side=\"top\"\n align=\"start\"\n className=\"overflow-hidden p-0\"\n style={{ width: \"var(--radix-popover-trigger-width)\" }}\n onCloseAutoFocus={(e) => e.preventDefault()}\n onEscapeKeyDown={() => {\n // Escape is the canonical \"back out of the popup, keep\n // typing in the chat\" gesture. Click-outside is\n // deliberately NOT routed here — if the user clicked some\n // other widget on the page they expect focus to land\n // wherever they clicked, not snap back to the textarea.\n focusTextareaAtEnd();\n }}\n >\n {/*\n Native shadcn / cmdk command palette: the CommandInput owns\n focus while the popup is open, cmdk runs the filter\n (matching ``value`` plus the ``keywords`` we pass per item,\n so descriptions count toward matches), and cmdk handles\n arrow keys / Enter / scroll-into-view itself. The CommandInput\n mirrors the textarea so the chat input still reflects the\n query and sending the message still works the same way.\n */}\n <Command>\n <CommandInput\n placeholder=\"Type a command or search...\"\n value={searchQuery}\n onValueChange={handleSearchChange}\n />\n <CommandList>\n <CommandEmpty>No commands found.</CommandEmpty>\n {builtinCommands.length > 0 && (\n <CommandGroup heading=\"Built-in commands\">\n {builtinCommands.map((cmd) => (\n <CommandItem\n key={cmd.value}\n value={cmd.value}\n keywords={[cmd.description]}\n onSelect={() => handleCommandSelect(cmd.value)}\n className=\"grid grid-cols-[12rem_1fr] items-baseline gap-3 [&_svg]:hidden\"\n >\n <span\n className=\"font-mono text-foreground truncate\"\n title={cmd.label}\n >\n {cmd.label}\n </span>\n <span\n className=\"min-w-0 truncate text-xs text-muted-foreground\"\n title={cmd.description}\n >\n {cmd.description}\n </span>\n </CommandItem>\n ))}\n </CommandGroup>\n )}\n {builtinCommands.length > 0 && adapterCommands.length > 0 && (\n <CommandSeparator />\n )}\n {adapterCommands.length > 0 && (\n <CommandGroup heading=\"Skills\">\n {adapterCommands.map((cmd) => (\n <CommandItem\n key={cmd.value}\n value={cmd.value}\n keywords={[cmd.description]}\n onSelect={() => handleCommandSelect(cmd.value)}\n className=\"grid grid-cols-[12rem_1fr] items-baseline gap-3 [&_svg]:hidden\"\n >\n <span\n className=\"font-mono text-foreground truncate\"\n title={cmd.label}\n >\n {cmd.label}\n </span>\n <span\n className=\"min-w-0 truncate text-xs text-muted-foreground\"\n title={cmd.description}\n >\n {cmd.description}\n </span>\n </CommandItem>\n ))}\n </CommandGroup>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../ui/tooltip\";\nimport { cn } from \"../../lib/utils\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { XIcon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes } from \"react\";\n\nexport type ArtifactProps = HTMLAttributes<HTMLDivElement>;\n\nexport const Artifact = ({ className, ...props }: ArtifactProps) => (\n <div\n className={cn(\n \"flex flex-col overflow-hidden rounded-lg border bg-background shadow-sm\",\n className\n )}\n {...props}\n />\n);\n\nexport type ArtifactHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ArtifactHeader = ({\n className,\n ...props\n}: ArtifactHeaderProps) => (\n <div\n className={cn(\n \"flex items-center justify-between border-b bg-muted/50 px-4 py-3\",\n className\n )}\n {...props}\n />\n);\n\nexport type ArtifactCloseProps = ComponentProps<typeof Button>;\n\nexport const ArtifactClose = ({\n className,\n children,\n size = \"sm\",\n variant = \"ghost\",\n ...props\n}: ArtifactCloseProps) => (\n <Button\n className={cn(\n \"size-8 p-0 text-muted-foreground hover:text-foreground\",\n className\n )}\n size={size}\n type=\"button\"\n variant={variant}\n {...props}\n >\n {children ?? <XIcon className=\"size-4\" />}\n <span className=\"sr-only\">Close</span>\n </Button>\n);\n\nexport type ArtifactTitleProps = HTMLAttributes<HTMLParagraphElement>;\n\nexport const ArtifactTitle = ({ className, ...props }: ArtifactTitleProps) => (\n <p\n className={cn(\"font-medium text-foreground text-sm\", className)}\n {...props}\n />\n);\n\nexport type ArtifactDescriptionProps = HTMLAttributes<HTMLParagraphElement>;\n\nexport const ArtifactDescription = ({\n className,\n ...props\n}: ArtifactDescriptionProps) => (\n <p className={cn(\"text-muted-foreground text-sm\", className)} {...props} />\n);\n\nexport type ArtifactActionsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ArtifactActions = ({\n className,\n ...props\n}: ArtifactActionsProps) => (\n <div className={cn(\"flex items-center gap-1\", className)} {...props} />\n);\n\nexport type ArtifactActionProps = ComponentProps<typeof Button> & {\n tooltip?: string;\n label?: string;\n icon?: LucideIcon;\n};\n\nexport const ArtifactAction = ({\n tooltip,\n label,\n icon: Icon,\n children,\n className,\n size = \"sm\",\n variant = \"ghost\",\n ...props\n}: ArtifactActionProps) => {\n const button = (\n <Button\n className={cn(\n \"size-8 p-0 text-muted-foreground hover:text-foreground\",\n className\n )}\n size={size}\n type=\"button\"\n variant={variant}\n {...props}\n >\n {Icon ? <Icon className=\"size-4\" /> : children}\n <span className=\"sr-only\">{label || tooltip}</span>\n </Button>\n );\n\n if (tooltip) {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent>\n <p>{tooltip}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return button;\n};\n\nexport type ArtifactContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ArtifactContent = ({\n className,\n ...props\n}: ArtifactContentProps) => (\n <div className={cn(\"flex-1 overflow-auto p-4\", className)} {...props} />\n);\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Markdown artifact renderer — reuses the chat's Streamdown pipeline\n// so code blocks, math, mermaid, etc. work identically to assistant\n// messages.\n\nimport { MessageResponse } from \"../../ai-elements/message\";\nimport type { MarkdownArtifactSpec } from \"../../../types\";\n\nexport function ArtifactMarkdown({ spec }: { spec: MarkdownArtifactSpec }) {\n return <MessageResponse>{spec.content ?? \"\"}</MessageResponse>;\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Table artifact renderer — a compact HTML table with a horizontal\n// scroll area for wide datasets. No sorting/filtering yet; just a\n// faithful display of the spec.\n\nimport type { TableArtifactSpec } from \"../../../types\";\n\nfunction formatCell(value: unknown): string {\n if (value == null) return \"\";\n if (typeof value === \"number\" || typeof value === \"string\") return String(value);\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport function ArtifactTable({ spec }: { spec: TableArtifactSpec }) {\n const columns = spec.columns ?? [];\n const rows = spec.rows ?? [];\n\n return (\n <div className=\"overflow-auto\">\n <table className=\"w-full border-collapse text-sm\">\n {spec.caption && (\n <caption className=\"pb-2 text-left text-xs text-muted-foreground\">\n {spec.caption}\n </caption>\n )}\n <thead>\n <tr className=\"border-b border-border\">\n {columns.map((col) => (\n <th\n key={col}\n className=\"px-3 py-2 text-left font-medium text-foreground\"\n >\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, i) => (\n <tr\n key={i}\n className=\"border-b border-border/50 last:border-b-0 hover:bg-muted/50\"\n >\n {columns.map((col) => (\n <td\n key={col}\n className=\"px-3 py-2 align-top text-muted-foreground\"\n >\n {formatCell(row[col])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// HTML artifact renderer — sandboxed iframe with `srcdoc`.\n//\n// Security model: the iframe runs with `sandbox=\"allow-scripts\"` and NO\n// `allow-same-origin`, giving the document a unique opaque origin.\n// Scripts run but cannot reach the parent frame, cookies, localStorage,\n// or any same-origin API. Forms and top-level navigation are also\n// disallowed. The iframe sandbox is the load-bearing security\n// boundary; we intentionally do not sanitise the HTML payload because\n// the whole point of this artifact kind is that it renders as-is.\n\nimport { useState } from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport type { HtmlArtifactSpec } from \"../../../types\";\n\nconst DEFAULT_HEIGHT_PX = 480;\nconst EXPANDED_HEIGHT_PX = 800;\n\nconst MIN_ZOOM = 0.5;\nconst MAX_ZOOM = 2;\nconst ZOOM_STEP = 0.1;\n\nexport function ArtifactHtml({\n spec,\n fill = false,\n}: {\n spec: HtmlArtifactSpec;\n fill?: boolean;\n}) {\n const [expanded, setExpanded] = useState(false);\n const [zoom, setZoom] = useState(1);\n\n const viewportHeight = expanded ? EXPANDED_HEIGHT_PX : DEFAULT_HEIGHT_PX;\n const clamp = (v: number) =>\n Math.round(Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, v)) * 100) / 100;\n\n return (\n <div\n className={cn(\n \"flex flex-col gap-2\",\n fill && \"h-full min-h-0\",\n )}\n >\n <div\n className={cn(\"w-full overflow-hidden\", fill && \"min-h-0 flex-1\")}\n style={fill ? undefined : { height: `${viewportHeight}px` }}\n >\n <iframe\n title=\"artifact-html\"\n srcDoc={spec.html}\n sandbox=\"allow-scripts\"\n className={cn(\"border-0\", fill && \"h-full w-full\")}\n style={\n fill\n ? { zoom }\n : {\n // Keep width at 100% so the HTML's responsive CSS doesn't\n // reflow as the user zooms. Browsers resolve percentage\n // widths against the parent after zoom, so this stays full\n // width regardless of zoom. Pixel heights *are* scaled by\n // zoom, so compensate: at zoom 0.5 we set 960px which\n // renders as 480px (no empty space below), and the inner\n // viewport gets 960px of vertical room to show more\n // content. At zoom 1.5 the inner viewport shrinks to\n // 320px and the iframe's own scrollbar handles overflow.\n width: \"100%\",\n height: `${viewportHeight / zoom}px`,\n zoom,\n }\n }\n />\n </div>\n <div className=\"flex items-center justify-between\">\n {spec.caption ? <span>{spec.caption}</span> : <span />}\n <div className=\"flex items-center gap-2 \">\n <button\n type=\"button\"\n onClick={() => setZoom((z) => clamp(z - ZOOM_STEP))}\n disabled={zoom <= MIN_ZOOM}\n className=\"hover:text-foreground disabled:opacity-40 cursor-pointer\"\n aria-label=\"zoom out\"\n >\n −\n </button>\n <button\n type=\"button\"\n onClick={() => setZoom(1)}\n className=\"tabular-nums hover:text-foreground\"\n aria-label=\"reset zoom\"\n >\n {Math.round(zoom * 100)}%\n </button>\n <button\n type=\"button\"\n onClick={() => setZoom((z) => clamp(z + ZOOM_STEP))}\n disabled={zoom >= MAX_ZOOM}\n className=\"hover:text-foreground disabled:opacity-40\"\n aria-label=\"zoom in\"\n >\n +\n </button>\n {!fill && (\n <>\n <span className=\"text-border\">|</span>\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n className=\"hover:text-foreground\"\n >\n {expanded ? \"collapse\" : \"expand\"}\n </button>\n </>\n )}\n </div>\n </div>\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// SVG artifact renderer.\n//\n// Security model: the SVG is served via `<img src=\"data:image/svg+xml,...\">`.\n// Browsers explicitly disable script execution when an SVG is loaded\n// through an <img> element, which is what makes this safe without a\n// separate sanitisation step. (The same SVG inlined via innerHTML\n// WOULD run any <script> tags it contained — so we never do that.)\n\nimport { useMemo } from \"react\";\nimport type { SvgArtifactSpec } from \"../../../types\";\n\nexport function ArtifactSvg({ spec }: { spec: SvgArtifactSpec }) {\n const dataUrl = useMemo(() => {\n // URL-encode rather than base64 so the payload stays readable in\n // devtools and avoids the ~33% base64 size tax for large SVGs.\n return `data:image/svg+xml;utf8,${encodeURIComponent(spec.svg)}`;\n }, [spec.svg]);\n\n return (\n <div className=\"flex flex-col items-center gap-2\">\n <img\n src={dataUrl}\n alt={spec.caption ?? \"SVG artifact\"}\n className=\"max-h-[600px] w-full object-contain\"\n />\n {spec.caption && (\n <p className=\"text-xs text-muted-foreground\">{spec.caption}</p>\n )}\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Per-kind serialisers for copy-to-clipboard and download actions in\n// the artifact header. Each kind returns a ``{text, mime, extension}``\n// triple so both actions reuse the same canonical serialisation.\n\nimport type { ArtifactPayload } from \"../../../types\";\n\nexport interface ArtifactExport {\n text: string;\n mime: string;\n extension: string;\n}\n\nexport function exportArtifact(payload: ArtifactPayload): ArtifactExport {\n switch (payload.kind) {\n case \"markdown\":\n return {\n text: payload.spec.content,\n mime: \"text/markdown\",\n extension: \"md\",\n };\n case \"table\":\n return {\n text: tableToCsv(payload.spec.columns, payload.spec.rows),\n mime: \"text/csv\",\n extension: \"csv\",\n };\n case \"chart\":\n return {\n text: JSON.stringify(payload.spec.chart_js, null, 2),\n mime: \"application/json\",\n extension: \"json\",\n };\n case \"html\":\n return {\n text: payload.spec.html,\n mime: \"text/html\",\n extension: \"html\",\n };\n case \"svg\":\n return {\n text: payload.spec.svg,\n mime: \"image/svg+xml\",\n extension: \"svg\",\n };\n }\n}\n\nfunction tableToCsv(\n columns: string[],\n rows: Array<Record<string, unknown>>,\n): string {\n const lines: string[] = [];\n lines.push(columns.map(csvCell).join(\",\"));\n for (const row of rows) {\n lines.push(columns.map((c) => csvCell(row[c])).join(\",\"));\n }\n return lines.join(\"\\n\");\n}\n\nfunction csvCell(value: unknown): string {\n if (value == null) return \"\";\n const str =\n typeof value === \"string\" ? value : JSON.stringify(value) ?? String(value);\n // RFC 4180: escape cells containing commas, quotes, or newlines by\n // wrapping in double quotes and doubling any internal quotes.\n if (/[\",\\n\\r]/.test(str)) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n}\n\n/**\n * Build a safe filename slug from the artifact's user-supplied name.\n * Keeps letters, numbers, dashes, underscores, dots; collapses\n * everything else to ``-``.\n */\nexport function safeFilename(name: string): string {\n const slug = name\n .trim()\n .replace(/[^\\w.\\-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return slug || \"artifact\";\n}\n\n/** Download a string payload as a file with the given name + mime. */\nexport function downloadText(filename: string, text: string, mime: string): void {\n const blob = new Blob([text], { type: mime });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n // Revoke after the click so Safari has time to initiate the download.\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\n/** Copy text to the clipboard. Returns true on success. */\nexport async function copyText(text: string): Promise<boolean> {\n if (typeof window === \"undefined\" || !navigator?.clipboard?.writeText) {\n return false;\n }\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n return false;\n }\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Inline artifact block rendered in the chat timeline. Loads the\n// artifact payload on-demand from the API server the first time it\n// renders; the event carries only metadata.\n\nimport { lazy, Suspense, useEffect, useState } from \"react\";\nimport { CheckIcon, CopyIcon, DownloadIcon, Maximize2Icon } from \"lucide-react\";\nimport {\n Artifact,\n ArtifactAction,\n ArtifactActions,\n ArtifactContent,\n ArtifactDescription,\n ArtifactHeader,\n ArtifactTitle,\n} from \"../../ai-elements/artifact\";\nimport { Shimmer } from \"../../ai-elements/shimmer\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"../../ui/dialog\";\nimport { useAgentChatAdapterContext } from \"../../../adapter-context\";\nimport type { ArtifactKind, ArtifactPayload } from \"../../../types\";\nimport { ArtifactMarkdown } from \"./artifact-markdown\";\nimport { ArtifactTable } from \"./artifact-table\";\nimport { ArtifactHtml } from \"./artifact-html\";\nimport { ArtifactSvg } from \"./artifact-svg\";\nimport {\n copyText,\n downloadText,\n exportArtifact,\n safeFilename,\n} from \"./artifact-export\";\n\n// Chart.js ships in a separate chunk — only pay for it when a chart actually\n// appears in the thread.\nconst ArtifactChart = lazy(() =>\n import(\"./artifact-chart\").then((m) => ({ default: m.ArtifactChart })),\n);\n\ninterface ArtifactBlockProps {\n sessionId: string;\n artifactId: string;\n name: string;\n kind: ArtifactKind;\n version: number;\n}\n\nconst KIND_LABEL: Record<ArtifactKind, string> = {\n markdown: \"Markdown document\",\n table: \"Table\",\n chart: \"Chart\",\n html: \"HTML preview\",\n svg: \"SVG\",\n};\n\n// How long the copy icon shows the green check before reverting.\nconst COPY_FEEDBACK_MS = 1500;\n\nexport function ArtifactBlock({\n sessionId,\n artifactId,\n name,\n kind,\n version,\n}: ArtifactBlockProps) {\n const { adapter } = useAgentChatAdapterContext();\n const [payload, setPayload] = useState<ArtifactPayload | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n const [expanded, setExpanded] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n setPayload(null);\n setError(null);\n adapter.getArtifact({ sessionId, artifactId })\n .then((p) => {\n if (!cancelled) setPayload(p);\n })\n .catch((e: unknown) => {\n if (!cancelled) {\n setError(e instanceof Error ? e.message : \"Failed to load artifact\");\n }\n });\n return () => {\n cancelled = true;\n };\n }, [adapter, sessionId, artifactId, version]);\n\n const handleCopy = async () => {\n if (!payload) return;\n const { text } = exportArtifact(payload);\n const ok = await copyText(text);\n if (ok) {\n setCopied(true);\n setTimeout(() => setCopied(false), COPY_FEEDBACK_MS);\n }\n };\n\n const handleDownload = () => {\n if (!payload) return;\n const { text, mime, extension } = exportArtifact(payload);\n downloadText(`${safeFilename(name)}.${extension}`, text, mime);\n };\n\n const description = error ?? (payload ? KIND_LABEL[kind] : \"Loading…\");\n\n return (\n <>\n <Artifact className=\"my-2 w-full overflow-visible border-border\">\n <ArtifactHeader>\n <div className=\"flex min-w-0 flex-col\">\n <ArtifactTitle className=\"truncate\">{name}</ArtifactTitle>\n <ArtifactDescription>{description}</ArtifactDescription>\n </div>\n <ArtifactActions>\n <ArtifactAction\n tooltip={copied ? \"Copied!\" : \"Copy\"}\n label=\"Copy artifact\"\n icon={copied ? CheckIcon : CopyIcon}\n disabled={!payload}\n onClick={handleCopy}\n className={\n copied ? \"text-emerald-500 hover:text-emerald-500\" : \"\"\n }\n />\n <ArtifactAction\n tooltip=\"Download\"\n label=\"Download artifact\"\n icon={DownloadIcon}\n disabled={!payload}\n onClick={handleDownload}\n />\n <ArtifactAction\n tooltip=\"Full screen\"\n label=\"Open artifact in full screen\"\n icon={Maximize2Icon}\n disabled={!payload}\n onClick={() => setExpanded(true)}\n />\n </ArtifactActions>\n </ArtifactHeader>\n <ArtifactContent className=\"p-0 overflow-visible\">\n <ArtifactBody error={error} payload={payload} />\n </ArtifactContent>\n </Artifact>\n <Dialog open={expanded} onOpenChange={setExpanded}>\n <DialogContent className=\"flex h-[95vh] w-[95vw] max-w-[95vw] flex-col gap-4 overflow-hidden p-6 sm:max-w-[95vw]\">\n <DialogHeader>\n <DialogTitle className=\"truncate pr-10\">{name}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <div className=\"flex min-h-0 flex-1 flex-col overflow-auto\">\n <ArtifactBody error={error} payload={payload} fill />\n </div>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n\nfunction ArtifactBody({\n error,\n payload,\n fill = false,\n}: {\n error: string | null;\n payload: ArtifactPayload | null;\n fill?: boolean;\n}) {\n if (error) {\n return <p className=\"text-sm text-destructive\">{error}</p>;\n }\n if (!payload) {\n return (\n <Shimmer duration={5} className=\"text-sm text-muted-foreground\">\n Loading artifact…\n </Shimmer>\n );\n }\n switch (payload.kind) {\n case \"markdown\":\n return <ArtifactMarkdown spec={payload.spec} />;\n case \"table\":\n return <ArtifactTable spec={payload.spec} />;\n case \"chart\":\n return (\n <Suspense\n fallback={\n <Shimmer duration={5} className=\"text-sm text-muted-foreground\">\n Loading chart…\n </Shimmer>\n }\n >\n <ArtifactChart spec={payload.spec} fill={fill} />\n </Suspense>\n );\n case \"html\":\n return <ArtifactHtml spec={payload.spec} fill={fill} />;\n case \"svg\":\n return <ArtifactSvg spec={payload.spec} />;\n }\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Error bubble rendered inline when a session fails or an assistant\n// message lands with status=\"error\". Pairs the classifier's friendly\n// title with a collapsible detail block and an optional Retry action.\n//\n// Used both as a standalone timeline entry (when session.fail arrives\n// with no preceding assistant slot) and inline below an assistant\n// message that failed mid-turn.\n\nimport { memo, useState } from \"react\";\nimport { AlertTriangle, ChevronDown, ChevronRight, RefreshCw } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport { cn } from \"../../lib/utils\";\nimport type { ErrorInfo } from \"../../types\";\n\ninterface ErrorMessageProps {\n errorInfo: ErrorInfo;\n /** Retry handler — omit or leave undefined to hide the Retry button.\n * The button is also hidden when ``errorInfo.retryable`` is false. */\n onRetry?: () => Promise<void>;\n /** Local-only dismiss (hides the bubble without touching server state). */\n onDismiss?: () => void;\n className?: string;\n}\n\nexport const ErrorMessage = memo(function ErrorMessage({\n errorInfo,\n onRetry,\n onDismiss,\n className,\n}: ErrorMessageProps) {\n const [detailOpen, setDetailOpen] = useState(false);\n const [retryPending, setRetryPending] = useState(false);\n const [retryError, setRetryError] = useState<string | null>(null);\n\n const showRetry = errorInfo.retryable && !!onRetry;\n\n const handleRetry = async () => {\n if (!onRetry) return;\n setRetryPending(true);\n setRetryError(null);\n try {\n await onRetry();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(\"Retry failed\", err);\n setRetryError(msg || \"Retry failed.\");\n } finally {\n setRetryPending(false);\n }\n };\n\n return (\n <div\n role=\"alert\"\n className={cn(\n \"flex w-full gap-3 rounded-none border-l-4 border-destructive bg-destructive/5 p-4\",\n className,\n )}\n >\n <AlertTriangle className=\"mt-0.5 size-4 shrink-0 text-destructive\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <div className=\"text-sm font-semibold text-destructive\">\n {errorInfo.title}\n </div>\n\n {errorInfo.detail && (\n <button\n type=\"button\"\n onClick={() => setDetailOpen((open) => !open)}\n className=\"flex items-center gap-1 self-start text-xs text-muted-foreground hover:text-foreground\"\n aria-expanded={detailOpen}\n >\n {detailOpen ? (\n <ChevronDown className=\"size-3\" />\n ) : (\n <ChevronRight className=\"size-3\" />\n )}\n {detailOpen ? \"Hide details\" : \"Show details\"}\n </button>\n )}\n\n {detailOpen && errorInfo.detail && (\n <pre className=\"overflow-x-auto rounded-none border border-destructive/20 bg-background p-2 font-mono text-xs whitespace-pre-wrap wrap-break-word text-muted-foreground\">\n {errorInfo.detail}\n </pre>\n )}\n\n {(showRetry || onDismiss) && (\n <div className=\"flex gap-2 pt-1\">\n {showRetry && (\n <Button\n size=\"xs\"\n variant=\"secondary\"\n onClick={handleRetry}\n disabled={retryPending}\n >\n <RefreshCw\n className={cn(\"size-3\", retryPending && \"animate-spin\")}\n />\n {retryPending ? \"Retrying…\" : \"Retry\"}\n </Button>\n )}\n {onDismiss && (\n <Button size=\"xs\" variant=\"ghost\" onClick={onDismiss}>\n Dismiss\n </Button>\n )}\n </div>\n )}\n\n {retryError && (\n <div className=\"pt-1 text-xs text-destructive\" role=\"status\">\n Retry failed: {retryError}\n </div>\n )}\n </div>\n </div>\n );\n});\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Custom chat thread — uses ai-elements Conversation + Message\n// with a compact, Claude Code-inspired layout.\n//\nimport { useMemo } from \"react\";\nimport {\n Conversation,\n ConversationContent,\n ConversationEmptyState,\n ConversationScrollButton,\n} from \"../ai-elements/conversation\";\nimport {\n Message,\n MessageContent,\n MessageResponse,\n} from \"../ai-elements/message\";\nimport {\n Reasoning,\n ReasoningContent,\n ReasoningTrigger,\n} from \"../ai-elements/reasoning\";\nimport {\n Timeline,\n TimelineContent,\n TimelineHeader,\n TimelineIndicator,\n TimelineItem,\n TimelineSeparator,\n} from \"../reui/timeline\";\nimport { Shimmer } from \"../ai-elements/shimmer\";\nimport { BrowserActivityGroup } from \"../browser/browser-activity-group\";\nimport { ToolCallBlock } from \"./tool-call-block\";\nimport { WebSearchGroupBlock } from \"./tools/web-search-tool\";\nimport { parseTerminalResult } from \"./tools/terminal-tool\";\nimport { statusColorClass, effectiveStatus, toolErrorSummary, parseArgs } from \"./tools/shared\";\nimport { ChatMessage } from \"./chat-message\";\nimport { ChatComposer } from \"./chat-composer\";\nimport { ArtifactBlock } from \"./artifacts/artifact-block\";\nimport { ErrorMessage } from \"./error-message\";\nimport { cn } from \"../../lib/utils\";\nimport { AlertTriangle, ChevronDown, ChevronRight, MessageSquareIcon } from \"lucide-react\";\nimport { useState } from \"react\";\nimport type {\n AgentChatImageAttachment,\n AgentChatPendingAttachment,\n ChatMessage as ChatMessageType,\n RetryIndicator,\n ToolCallInfo,\n TokenUsage,\n} from \"../../types\";\nimport type { ArtifactKind } from \"../../types\";\nimport type { ChatComposerError } from \"./chat-composer\";\n\ninterface ChatThreadProps {\n sessionId: string | null;\n messages: ChatMessageType[];\n isRunning: boolean;\n isLoadingHistory?: boolean;\n onSend: (\n text: string,\n images?: AgentChatImageAttachment[],\n attachments?: AgentChatPendingAttachment[],\n ) => void | Promise<void>;\n onStop: () => void | Promise<void>;\n onFileSelect?: (path: string) => void;\n disabled?: boolean;\n disabledReason?: string;\n tokenUsage?: TokenUsage;\n // Transient indicator shown during provider retries. Cleared by the\n // hook on the next successful llm.request/response or on session.fail.\n retryIndicator?: RetryIndicator | null;\n // User-initiated retry of a failed or paused session. Called from the\n // Retry button on standalone error bubbles.\n onRetry?: () => Promise<void>;\n // Forwarded to the composer to surface client-side rejections. The\n // SDK does not ship a toast subsystem; callers (e.g. surogate-ops)\n // wire their own.\n onComposerError?: (err: ChatComposerError) => void;\n}\n\n// ── Timeline item types ──────────────────────────────────────────────\n\ntype TimelineEntry =\n | { kind: \"reasoning\"; key: string; reasoning: string; isStreaming: boolean }\n | { kind: \"tool\"; key: string; tc: ToolCallInfo; resolvedArtifactName?: string }\n | { kind: \"browser_activity\"; key: string; calls: ToolCallInfo[] }\n | { kind: \"web_search_group\"; key: string; calls: ToolCallInfo[] }\n | { kind: \"text\"; key: string; content: string }\n | { kind: \"thinking\"; key: string }\n | { kind: \"skill_invoked\"; key: string; skill: string; stagedAt: string | null }\n | {\n kind: \"artifact\";\n key: string;\n artifactId: string;\n name: string;\n artifactKind: ArtifactKind;\n version: number;\n };\n\n/**\n * Flatten an assistant message into a list of timeline entries\n * (reasoning, tool calls, text content).\n *\n * ``artifactFallbacks`` maps a ``create_artifact`` tool-call id to the\n * name of the matching ``artifact.created`` system message that has\n * already landed. Used to backfill the timeline label during the brief\n * race where ``tool.result`` arrives before the tool-call args have\n * fully streamed.\n */\nfunction messageToEntries(\n msg: ChatMessageType,\n isLast: boolean,\n artifactFallbacks: Record<string, string>,\n): TimelineEntry[] {\n // System markers (skill.invoked, ...) become their own timeline entry --\n // a single row with a green dot + label, threaded into the assistant's\n // vertical timeline above its first reasoning/tool-call entry.\n if (msg.role === \"system\") {\n if (msg.systemKind === \"skill_invoked\") {\n return [{\n kind: \"skill_invoked\",\n key: msg.id,\n skill: (msg.systemMeta?.skill as string) ?? msg.content,\n stagedAt: (msg.systemMeta?.staged_at as string | null | undefined) ?? null,\n }];\n }\n if (msg.systemKind === \"artifact\") {\n const { artifactId, name, kind, version } = unpackArtifactMeta(\n msg.systemMeta, msg.content,\n );\n return [{\n kind: \"artifact\",\n key: msg.id,\n artifactId,\n name,\n artifactKind: kind,\n version,\n }];\n }\n return [];\n }\n\n const entries: TimelineEntry[] = [];\n const hasToolCalls = !!(msg.toolCalls && msg.toolCalls.length > 0);\n const hasContent = !!(msg.content && msg.content !== msg.reasoning);\n const isStreaming = msg.status === \"streaming\" && isLast;\n\n // When tool calls are present, the content text is just a preamble\n // (\"I'll run both tasks in parallel...\") — fold it into reasoning\n // instead of showing it as a separate text block.\n const effectiveReasoning = hasToolCalls && hasContent\n ? (msg.reasoning ? msg.reasoning + \"\\n\" + msg.content : msg.content)\n : msg.reasoning;\n const effectiveHasContent = hasContent && !hasToolCalls;\n\n if (effectiveReasoning) {\n entries.push({\n kind: \"reasoning\",\n key: `${msg.id}-reasoning`,\n reasoning: effectiveReasoning,\n isStreaming: isStreaming && !effectiveHasContent && !hasToolCalls,\n });\n }\n\n if (hasToolCalls) {\n for (const tc of msg.toolCalls!) {\n if (tc.toolName === \"create_artifact\") {\n // Skip the entry until either ``args.name`` parses or the matching\n // ``artifact.created`` system message has landed. Avoids the brief\n // \"empty green dot\" race where ``tool.result`` flips status to\n // complete before the tool-call args have fully streamed in.\n const resolvedName = parseArgs<{ name?: string }>(tc.args)?.name\n ?? artifactFallbacks[tc.id];\n const status = effectiveStatus(tc);\n if (!resolvedName && status !== \"error\") continue;\n entries.push({\n kind: \"tool\",\n key: tc.id,\n tc,\n resolvedArtifactName: resolvedName,\n });\n continue;\n }\n if (tc.toolName === \"terminal\" && tc.status !== \"running\") {\n const parsed = parseTerminalResult(tc.result, tc.args);\n if (parsed && (parsed.exit_code !== 0 || parsed.error)) continue;\n }\n entries.push({ kind: \"tool\", key: tc.id, tc });\n }\n }\n\n if (effectiveHasContent) {\n entries.push({ kind: \"text\", key: `${msg.id}-text`, content: msg.content });\n }\n\n // Show \"Working on it...\" shimmer whenever the turn is active but\n // nothing visible is progressing:\n // - initial thinking before the first reasoning/tool/content arrives\n // - post-reasoning gap (reasoning has landed but the next tool or\n // content hasn't -- common between llm.response and tool.call, or\n // while the LLM is still composing the next iteration)\n // - between tool rounds once every tool call has completed\n // A running tool call already shows its own shimmer, so skip then.\n const hasRunningTool = hasToolCalls && msg.toolCalls!.some(\n (tc) => tc.status === \"running\",\n );\n if (isStreaming && !effectiveHasContent && !hasRunningTool) {\n entries.push({ kind: \"thinking\", key: `${msg.id}-thinking` });\n }\n\n return entries;\n}\n\nfunction groupBrowserActivityEntries(entries: TimelineEntry[]): TimelineEntry[] {\n const grouped: TimelineEntry[] = [];\n let buffer: ToolCallInfo[] = [];\n\n const flush = () => {\n if (buffer.length === 0) return;\n grouped.push({\n kind: \"browser_activity\",\n key: `browser-activity-${buffer[0]?.id}-${buffer[buffer.length - 1]?.id}`,\n calls: buffer,\n });\n buffer = [];\n };\n\n for (const entry of entries) {\n if (entry.kind === \"tool\" && isBrowserToolCall(entry.tc)) {\n buffer.push(entry.tc);\n continue;\n }\n flush();\n grouped.push(entry);\n }\n\n flush();\n return grouped;\n}\n\nfunction isBrowserToolCall(call: ToolCallInfo): boolean {\n return call.toolName.startsWith(\"browser_\");\n}\n\nfunction groupWebSearchEntries(entries: TimelineEntry[]): TimelineEntry[] {\n const grouped: TimelineEntry[] = [];\n let buffer: ToolCallInfo[] = [];\n\n const flush = () => {\n if (buffer.length === 0) return;\n if (buffer.length === 1) {\n grouped.push({ kind: \"tool\", key: buffer[0].id, tc: buffer[0] });\n } else {\n grouped.push({\n kind: \"web_search_group\",\n key: `web-search-${buffer[0].id}-${buffer[buffer.length - 1].id}`,\n calls: buffer,\n });\n }\n buffer = [];\n };\n\n for (const entry of entries) {\n if (entry.kind === \"tool\" && entry.tc.toolName === \"web_search\") {\n buffer.push(entry.tc);\n continue;\n }\n flush();\n grouped.push(entry);\n }\n\n flush();\n return grouped;\n}\n\n/** A run of consecutive messages grouped by role.\n *\n * System markers (``skill.invoked``) are folded into the *following*\n * assistant group as leading messages, so they render as the first item\n * of the assistant's vertical timeline alongside its reasoning and tool\n * calls -- not as a floating row outside the timeline. Trailing system\n * markers (no assistant turn yet) get their own ``system`` group.\n */\ninterface MessageGroup {\n role: \"user\" | \"assistant\" | \"system\";\n messages: ChatMessageType[];\n lastGlobalIndex: number;\n}\n\nfunction groupMessages(messages: ChatMessageType[]): MessageGroup[] {\n const groups: MessageGroup[] = [];\n let pendingSystem: { msg: ChatMessageType; index: number }[] = [];\n\n const drainPendingAsOrphans = () => {\n for (const { msg, index } of pendingSystem) {\n groups.push({ role: \"system\", messages: [msg], lastGlobalIndex: index });\n }\n pendingSystem = [];\n };\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n\n if (msg.role === \"system\") {\n pendingSystem.push({ msg, index: i });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n const prev = groups[groups.length - 1];\n if (prev && prev.role === \"assistant\" && pendingSystem.length === 0) {\n prev.messages.push(msg);\n prev.lastGlobalIndex = i;\n } else {\n const folded = pendingSystem.map((p) => p.msg);\n pendingSystem = [];\n groups.push({\n role: \"assistant\",\n messages: [...folded, msg],\n lastGlobalIndex: i,\n });\n }\n continue;\n }\n\n // user — drain any orphan system markers (no assistant followed),\n // then push the user turn as its own group.\n drainPendingAsOrphans();\n groups.push({ role: \"user\", messages: [msg], lastGlobalIndex: i });\n }\n\n drainPendingAsOrphans();\n return groups;\n}\n\nfunction unpackArtifactMeta(\n systemMeta: Record<string, unknown> | undefined,\n fallbackName: string,\n): { artifactId: string; name: string; kind: ArtifactKind; version: number } {\n const meta = systemMeta ?? {};\n return {\n artifactId: (meta.artifact_id as string) ?? \"\",\n name: (meta.name as string) ?? fallbackName,\n kind: (meta.kind as ArtifactKind) ?? \"markdown\",\n version: (meta.version as number) ?? 1,\n };\n}\n\n// ── Orphan system marker (no following assistant yet) ───────────────\n//\n// Rendered only when a system event arrives but the LLM has not yet\n// produced an assistant turn to fold it into.\n\nfunction OrphanSystemMarker({\n message,\n sessionId,\n onRetry,\n}: {\n message: ChatMessageType;\n sessionId: string | null;\n onRetry?: () => Promise<void>;\n}) {\n if (message.systemKind === \"skill_invoked\") {\n const skill = (message.systemMeta?.skill as string) ?? message.content;\n return (\n <div className=\"my-2 flex items-center gap-2 px-4 text-xs text-muted-foreground \">\n <span className=\"size-2 rounded-full bg-emerald-500\" />\n <span>\n <span className=\"font-semibold text-foreground\">Skill</span>\n <span className=\"text-muted-foreground truncate\">{skill}</span>\n </span>\n </div>\n );\n }\n\n if (message.systemKind === \"artifact\" && sessionId) {\n const unpacked = unpackArtifactMeta(message.systemMeta, message.content);\n return (\n <ArtifactBlock\n sessionId={sessionId}\n artifactId={unpacked.artifactId}\n name={unpacked.name}\n kind={unpacked.kind}\n version={unpacked.version}\n />\n );\n }\n\n if (message.systemKind === \"error\" && message.errorInfo) {\n return (\n <div className=\"mx-auto my-2 w-full max-w-4xl\">\n <ErrorMessage errorInfo={message.errorInfo} onRetry={onRetry} />\n </div>\n );\n }\n\n return null;\n}\n\n// ── Cancelled tool row (parallel-batch sibling-error cancellation) ──\n\nfunction cancelledToolLabel(toolName: string): string {\n const map: Record<string, string> = {\n terminal: \"Command\",\n execute_code: \"Execute Code\",\n read_file: \"Read\",\n write_file: \"Write\",\n patch: \"Patch\",\n search_files: \"Search Files\",\n list_files: \"List Files\",\n web_search: \"Web Search\",\n web_extract: \"Web Fetch\",\n web_crawl: \"Web Crawl\",\n session_search: \"Session Search\",\n memory: \"Memory\",\n todo: \"Todo\",\n skills_list: \"Skills\",\n skill_view: \"Skill\",\n consult_expert: \"Expert\",\n delegate_task: \"Delegate\",\n clarify: \"Clarify\",\n process: \"Process\",\n create_artifact: \"Artifact\",\n };\n return map[toolName] ?? toolName;\n}\n\nfunction CancelledToolRow({ tc }: { tc: ToolCallInfo }) {\n return (\n <div className=\"flex items-center gap-1.5 text-sm\">\n <span className=\"font-semibold text-muted-foreground\">\n {cancelledToolLabel(tc.toolName)}\n </span>\n <span className=\"text-muted-foreground/70\">\n Cancelled\n </span>\n </div>\n );\n}\n\n// ── Timeline entry renderer ──────────────────────────────────────────\n\nfunction TimelineEntryItem({\n entry,\n step,\n sessionId,\n onFileSelect,\n}: {\n entry: TimelineEntry;\n step: number;\n sessionId: string | null;\n onFileSelect?: (path: string) => void;\n}) {\n if (entry.kind === \"reasoning\") {\n return (\n <TimelineItem step={step}>\n <TimelineHeader>\n <TimelineSeparator style={{ backgroundColor: \"var(--color-border)\" }} />\n <TimelineIndicator className=\"size-2\" />\n </TimelineHeader>\n <TimelineContent>\n <Reasoning isStreaming={entry.isStreaming}>\n <ReasoningTrigger />\n <ReasoningContent>{entry.reasoning}</ReasoningContent>\n </Reasoning>\n </TimelineContent>\n </TimelineItem>\n );\n }\n\n if (entry.kind === \"tool\") {\n const rawStatus = effectiveStatus(entry.tc);\n // Failed ``create_artifact`` calls are almost always transient\n // (malformed shape, stringified spec) and immediately retried by\n // the model. We hide the failure from the UI so the user sees a\n // single coherent \"Creating artifact… → Created\" flow instead of a\n // red error followed by a successful retry. Treat the error as\n // \"still running\" for both the timeline dot and the failure text.\n const hideArtifactFailure =\n rawStatus === \"error\" && entry.tc.toolName === \"create_artifact\";\n const indicatorStatus = hideArtifactFailure ? \"running\" : rawStatus;\n const failureSummary =\n rawStatus === \"error\" && !hideArtifactFailure\n ? toolErrorSummary(entry.tc.result)\n : \"\";\n return (\n <TimelineItem step={step}>\n <TimelineHeader>\n <TimelineSeparator style={{ backgroundColor: \"var(--color-border)\" }} />\n <TimelineIndicator\n className={cn(\"size-2 border-none\", statusColorClass(indicatorStatus))}\n />\n </TimelineHeader>\n <TimelineContent>\n {entry.tc.cancelled ? (\n <CancelledToolRow tc={entry.tc} />\n ) : (\n <div className=\"space-y-1\">\n <ToolCallBlock\n tc={entry.tc}\n resolvedArtifactName={entry.resolvedArtifactName}\n onFileSelect={onFileSelect}\n />\n {failureSummary ? (\n <div className=\"max-w-full truncate text-xs text-destructive\" title={failureSummary}>\n {failureSummary}\n </div>\n ) : null}\n </div>\n )}\n </TimelineContent>\n </TimelineItem>\n );\n }\n\n if (entry.kind === \"browser_activity\") {\n return (\n <TimelineItem step={step}>\n <TimelineHeader>\n <TimelineSeparator style={{ backgroundColor: \"var(--color-border)\" }} />\n <TimelineIndicator className=\"size-2 border-none bg-amber-500\" />\n </TimelineHeader>\n <TimelineContent>\n <BrowserActivityGroup calls={entry.calls} />\n </TimelineContent>\n </TimelineItem>\n );\n }\n\n if (entry.kind === \"web_search_group\") {\n const allComplete = entry.calls.every((tc) => tc.status === \"complete\");\n const anyRunning = entry.calls.some((tc) => tc.status === \"running\");\n const indicatorClass = anyRunning\n ? \"bg-emerald-500 animate-pulse\"\n : allComplete\n ? \"bg-emerald-500\"\n : \"bg-red-500\";\n return (\n <TimelineItem step={step}>\n <TimelineHeader>\n <TimelineSeparator style={{ backgroundColor: \"var(--color-border)\" }} />\n <TimelineIndicator className={cn(\"size-2 border-none\", indicatorClass)} />\n </TimelineHeader>\n <TimelineContent>\n <WebSearchGroupBlock tcs={entry.calls} />\n </TimelineContent>\n </TimelineItem>\n );\n }\n\n if (entry.kind === \"text\") {\n return (\n <TimelineItem step={step}>\n <TimelineHeader>\n <TimelineSeparator style={{ backgroundColor: \"var(--color-border)\" }} />\n <TimelineIndicator className=\"size-2 border-none bg-foreground/40\" />\n </TimelineHeader>\n <TimelineContent>\n <MessageResponse>{entry.content}</MessageResponse>\n </TimelineContent>\n </TimelineItem>\n );\n }\n\n if (entry.kind === \"skill_invoked\") {\n return (\n <TimelineItem step={step}>\n <TimelineHeader>\n <TimelineSeparator style={{ backgroundColor: \"var(--color-border)\" }} />\n <TimelineIndicator className=\"size-2 border-none bg-emerald-500\" />\n </TimelineHeader>\n <TimelineContent>\n <div className=\"flex items-center gap-1.5 py-1 text-sm \">\n <span className=\"font-semibold text-foreground\">Skill</span>\n <span className=\"text-muted-foreground truncate\">\n {entry.skill}\n </span>\n {entry.stagedAt && (\n <span className=\"text-xs text-muted-foreground/70 \">\n staged at {entry.stagedAt}\n </span>\n )}\n </div>\n </TimelineContent>\n </TimelineItem>\n );\n }\n\n if (entry.kind === \"artifact\") {\n return (\n <TimelineItem step={step}>\n <TimelineHeader>\n <TimelineSeparator style={{ backgroundColor: \"var(--color-border)\" }} />\n <TimelineIndicator className=\"size-2 border-none bg-sky-500\" />\n </TimelineHeader>\n <TimelineContent>\n {sessionId ? (\n <ArtifactBlock\n sessionId={sessionId}\n artifactId={entry.artifactId}\n name={entry.name}\n kind={entry.artifactKind}\n version={entry.version}\n />\n ) : null}\n </TimelineContent>\n </TimelineItem>\n );\n }\n\n // kind === \"thinking\"\n return (\n <TimelineItem step={step}>\n <TimelineHeader>\n <TimelineSeparator style={{ backgroundColor: \"var(--color-border)\" }} />\n <TimelineIndicator className=\"size-2 border-none bg-primary animate-pulse\" />\n </TimelineHeader>\n <TimelineContent>\n <Shimmer duration={3} spread={3} className=\"text-sm\">Working on it...</Shimmer>\n </TimelineContent>\n </TimelineItem>\n );\n}\n\n// ── Assistant message group (single Timeline) ────────────────────────\n\nfunction AssistantGroup({\n messages,\n lastGlobalIndex,\n totalMessages,\n isRunning,\n sessionId,\n artifactFallbacks,\n onFileSelect,\n onRetry,\n}: {\n messages: ChatMessageType[];\n lastGlobalIndex: number;\n totalMessages: number;\n isRunning: boolean;\n sessionId: string | null;\n artifactFallbacks: Record<string, string>;\n onFileSelect?: (path: string) => void;\n onRetry?: () => Promise<void>;\n}) {\n let entries: TimelineEntry[] = [];\n for (let i = 0; i < messages.length; i++) {\n const isLast = i === messages.length - 1\n && lastGlobalIndex === totalMessages - 1;\n entries.push(...messageToEntries(messages[i], isLast, artifactFallbacks));\n }\n entries = groupBrowserActivityEntries(entries);\n entries = groupWebSearchEntries(entries);\n\n // Whenever this is the tail assistant group and the session is still\n // running, append a \"Working on it...\" row unless something visible is\n // already in progress (a running tool, or messageToEntries already added\n // a thinking entry for an empty streaming turn). This covers both the\n // mid-stream pause between text and the next tool call AND the gap\n // between LLM iterations after a turn has fully completed.\n const isTailGroup = lastGlobalIndex === totalMessages - 1;\n const lastEntry = entries[entries.length - 1];\n const hasRunningTool = entries.some(\n (e) => e.kind === \"tool\" && e.tc.status === \"running\",\n );\n const tailMsg = messages[messages.length - 1];\n if (\n isTailGroup\n && isRunning\n && !hasRunningTool\n && lastEntry?.kind !== \"thinking\"\n ) {\n entries.push({ kind: \"thinking\", key: `${tailMsg.id}-tail-thinking` });\n }\n\n // Surface the classifier's error info inline below the timeline when\n // the last assistant message in the group ended in error.\n const tail = messages[messages.length - 1];\n const showErrorInfo =\n tail && tail.role === \"assistant\"\n && tail.status === \"error\"\n && !!tail.errorInfo;\n\n return (\n <Message from=\"assistant\">\n <MessageContent>\n <Timeline defaultValue={999} className=\"gap-0\">\n {entries.map((entry, i) => (\n <TimelineEntryItem\n key={entry.key}\n entry={entry}\n step={i + 1}\n sessionId={sessionId}\n onFileSelect={onFileSelect}\n />\n ))}\n </Timeline>\n {showErrorInfo && (\n <div className=\"mt-3\">\n <ErrorMessage errorInfo={tail.errorInfo!} onRetry={onRetry} />\n </div>\n )}\n </MessageContent>\n </Message>\n );\n}\n\n// Transient banner shown above the composer while the orchestrator is\n// retrying after a provider error. Collapsible for the raw detail.\nfunction RetryBanner({ indicator }: { indicator: RetryIndicator }) {\n const [open, setOpen] = useState(false);\n return (\n <div\n role=\"status\"\n className=\"flex flex-col gap-1 border-l-2 border-amber-500 bg-amber-500/5 px-3 py-2 text-xs\"\n >\n <button\n type=\"button\"\n onClick={() => setOpen((prev) => !prev)}\n className=\"flex items-center gap-2 text-left text-amber-600 hover:text-amber-700\"\n aria-expanded={open}\n >\n <AlertTriangle className=\"size-3 shrink-0\" />\n <span className=\"flex-1 truncate font-medium\">{indicator.title}</span>\n <span className=\"text-[10px] text-muted-foreground\">\n attempt {indicator.attempt}\n </span>\n {indicator.detail && (\n open ? <ChevronDown className=\"size-3\" /> : <ChevronRight className=\"size-3\" />\n )}\n </button>\n {open && indicator.detail && (\n <pre className=\"mt-1 overflow-x-auto rounded-none bg-background p-2 font-mono text-[11px] whitespace-pre-wrap wrap-break-word text-muted-foreground\">\n {indicator.detail}\n </pre>\n )}\n </div>\n );\n}\n\n// ── Main thread ──────────────────────────────────────────────────────\n\nexport function ChatThread({\n sessionId,\n messages,\n isRunning,\n isLoadingHistory = false,\n onSend,\n onStop,\n onFileSelect,\n disabled = false,\n disabledReason,\n tokenUsage,\n retryIndicator,\n onRetry,\n onComposerError,\n}: ChatThreadProps) {\n const groups = useMemo(() => groupMessages(messages), [messages]);\n\n // Pair ``create_artifact`` tool calls to their matching\n // ``artifact.created`` system messages by emission order across the\n // whole thread (the events live in different group-buckets, but the\n // 1:1 ordering is stable). The map is keyed by tool-call id so a\n // ``create_artifact`` whose args have not yet streamed in can still\n // render with the artifact's name as a fallback label.\n //\n // Errored and cancelled calls never emit ``artifact.created``, so they\n // are excluded from the pairing — including them would slip the index\n // and attribute a successful call's artifact name to a failed sibling.\n const artifactFallbacks = useMemo<Record<string, string>>(() => {\n const fallbacks: Record<string, string> = {};\n const createArtifactToolCallIds: string[] = [];\n let artifactIdx = 0;\n for (const msg of messages) {\n if (msg.role === \"assistant\" && msg.toolCalls) {\n for (const tc of msg.toolCalls) {\n if (tc.toolName === \"create_artifact\"\n && !tc.cancelled\n && tc.status !== \"error\") {\n createArtifactToolCallIds.push(tc.id);\n }\n }\n } else if (msg.role === \"system\" && msg.systemKind === \"artifact\") {\n const tcId = createArtifactToolCallIds[artifactIdx];\n if (tcId) {\n const { name } = unpackArtifactMeta(msg.systemMeta, msg.content);\n if (name) fallbacks[tcId] = name;\n }\n artifactIdx += 1;\n }\n }\n return fallbacks;\n }, [messages]);\n\n // Retry is only actionable for the most recent unresolved failure.\n // An error bubble (standalone system or inline assistant) is \"active\"\n // only when it is the tail of the message list — anything after it\n // (a new user message, a later successful turn, another failure)\n // means the server-side state has moved on and clicking the older\n // button would 409. We resolve the active failure's id once here\n // and pass onRetry only to the matching render site.\n const activeFailureId = useMemo<string | null>(() => {\n if (messages.length === 0) return null;\n const tail = messages[messages.length - 1];\n if (tail.role === \"system\" && tail.systemKind === \"error\" && tail.errorInfo) {\n return tail.id;\n }\n if (tail.role === \"assistant\" && tail.status === \"error\" && tail.errorInfo) {\n return tail.id;\n }\n return null;\n }, [messages]);\n\n return (\n <div className=\"flex flex-1 flex-col overflow-hidden bg-background text-sm\">\n <Conversation className=\"relative flex-1 min-h-0\">\n <ConversationContent className=\"mx-auto w-full max-w-4xl\">\n {messages.length === 0 && isLoadingHistory ? (\n <ConversationEmptyState\n icon={<MessageSquareIcon className=\"size-8 opacity-40\" />}\n title=\"Loading conversation\"\n description=\"Fetching the session history.\"\n />\n ) : messages.length === 0 && !disabled ? (\n <ConversationEmptyState\n icon={<MessageSquareIcon className=\"size-8 opacity-40\" />}\n title=\"Start a conversation\"\n description=\"Ask me anything — I can search, analyze, write code, and more.\"\n />\n ) : (\n <>\n {groups.map((group) => {\n if (group.role === \"user\") {\n const msg = group.messages[0];\n return (\n <ChatMessage\n key={msg.id}\n message={msg}\n isLast={group.lastGlobalIndex === messages.length - 1}\n onFileSelect={onFileSelect}\n />\n );\n }\n\n if (group.role === \"system\") {\n const msg = group.messages[0];\n const groupRetry =\n msg.id === activeFailureId ? onRetry : undefined;\n return (\n <OrphanSystemMarker\n key={msg.id}\n message={msg}\n sessionId={sessionId}\n onRetry={groupRetry}\n />\n );\n }\n\n // Only the assistant group whose tail message is the\n // active failure gets the onRetry callback; earlier\n // failed turns render read-only.\n const groupTail = group.messages[group.messages.length - 1];\n const groupRetry =\n groupTail.id === activeFailureId ? onRetry : undefined;\n return (\n <AssistantGroup\n key={group.messages[0].id}\n messages={group.messages}\n lastGlobalIndex={group.lastGlobalIndex}\n totalMessages={messages.length}\n isRunning={isRunning}\n sessionId={sessionId}\n artifactFallbacks={artifactFallbacks}\n onFileSelect={onFileSelect}\n onRetry={groupRetry}\n />\n );\n })}\n {isRunning && messages.length > 0 && messages[messages.length - 1].role === \"user\" && (\n <Message from=\"assistant\">\n <MessageContent>\n <Shimmer duration={3} spread={3} className=\"text-sm\">Working on it...</Shimmer>\n </MessageContent>\n </Message>\n )}\n </>\n )}\n </ConversationContent>\n <ConversationScrollButton />\n </Conversation>\n\n <div className=\"mx-auto w-full max-w-4xl px-6 pb-5 pt-3\">\n {retryIndicator && (\n <div className=\"mb-2\">\n <RetryBanner indicator={retryIndicator} />\n </div>\n )}\n {disabled && disabledReason ? (\n <div\n className=\"rounded border border-line bg-muted/40 px-3 py-2 text-sm text-muted-foreground\"\n role=\"status\"\n >\n {disabledReason}\n </div>\n ) : (\n <ChatComposer\n onSend={onSend}\n onStop={onStop}\n isRunning={isRunning}\n disabled={disabled}\n disabledReason={disabledReason}\n tokenUsage={tokenUsage}\n onComposerError={onComposerError}\n />\n )}\n </div>\n </div>\n );\n}\n","import {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../ui/collapsible\";\nimport { cn } from \"../../lib/utils\";\nimport {\n ChevronRightIcon,\n FileIcon,\n FolderIcon,\n FolderOpenIcon,\n} from \"lucide-react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\n\ninterface FileTreeContextType {\n expandedPaths: Set<string>;\n togglePath: (path: string) => void;\n selectedPath?: string;\n onSelect?: (path: string) => void;\n}\n\nconst noop = () => {};\n\nconst FileTreeContext = createContext<FileTreeContextType>({\n expandedPaths: new Set(),\n togglePath: noop,\n});\n\nexport type FileTreeProps = Omit<HTMLAttributes<HTMLDivElement>, \"onSelect\"> & {\n expanded?: Set<string>;\n defaultExpanded?: Set<string>;\n selectedPath?: string | null;\n onSelect?: (path: string) => void;\n onExpandedChange?: (expanded: Set<string>) => void;\n};\n\nexport function FileTree({\n expanded: controlledExpanded,\n defaultExpanded = new Set(),\n selectedPath,\n onSelect,\n onExpandedChange,\n className,\n children,\n ...props\n}: FileTreeProps) {\n const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n const expandedPaths = controlledExpanded ?? internalExpanded;\n\n const togglePath = useCallback(\n (path: string) => {\n const next = new Set(expandedPaths);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n setInternalExpanded(next);\n onExpandedChange?.(next);\n },\n [expandedPaths, onExpandedChange],\n );\n\n const contextValue = useMemo(\n () => ({\n expandedPaths,\n onSelect,\n selectedPath: selectedPath ?? undefined,\n togglePath,\n }),\n [expandedPaths, onSelect, selectedPath, togglePath],\n );\n\n return (\n <FileTreeContext.Provider value={contextValue}>\n <div\n className={cn(\"rounded-lg border bg-background text-sm\", className)}\n role=\"tree\"\n {...props}\n >\n <div className=\"p-2\">{children}</div>\n </div>\n </FileTreeContext.Provider>\n );\n}\n\nexport type FileTreeIconProps = HTMLAttributes<HTMLSpanElement>;\n\nexport function FileTreeIcon({\n className,\n children,\n ...props\n}: FileTreeIconProps) {\n return (\n <span className={cn(\"shrink-0\", className)} {...props}>\n {children}\n </span>\n );\n}\n\nexport type FileTreeNameProps = HTMLAttributes<HTMLSpanElement>;\n\nexport function FileTreeName({\n className,\n children,\n ...props\n}: FileTreeNameProps) {\n return (\n <span className={cn(\"truncate\", className)} {...props}>\n {children}\n </span>\n );\n}\n\nexport type FileTreeFolderProps = HTMLAttributes<HTMLDivElement> & {\n path: string;\n name: string;\n};\n\nexport function FileTreeFolder({\n path,\n name,\n className,\n children,\n ...props\n}: FileTreeFolderProps) {\n const { expandedPaths, togglePath, selectedPath, onSelect } =\n useContext(FileTreeContext);\n const isExpanded = expandedPaths.has(path);\n const isSelected = selectedPath === path;\n\n const handleOpenChange = useCallback(() => {\n togglePath(path);\n }, [togglePath, path]);\n\n const handleSelect = useCallback(() => {\n onSelect?.(path);\n }, [onSelect, path]);\n\n return (\n <Collapsible onOpenChange={handleOpenChange} open={isExpanded}>\n <div className={cn(\"\", className)} role=\"treeitem\" tabIndex={0} {...props}>\n <div\n className={cn(\n \"flex w-full items-center gap-1 rounded px-2 py-1 text-left transition-colors hover:bg-muted/50\",\n isSelected && \"bg-muted\",\n )}\n >\n <CollapsibleTrigger asChild>\n <button\n className=\"flex shrink-0 cursor-pointer items-center border-none bg-transparent p-0\"\n type=\"button\"\n aria-label={isExpanded ? `Collapse ${name}` : `Expand ${name}`}\n >\n <ChevronRightIcon\n className={cn(\n \"size-4 shrink-0 text-muted-foreground transition-transform\",\n isExpanded && \"rotate-90\",\n )}\n />\n </button>\n </CollapsibleTrigger>\n <button\n className=\"flex min-w-0 flex-1 cursor-pointer items-center gap-1 border-none bg-transparent p-0 text-left\"\n onClick={handleSelect}\n type=\"button\"\n >\n <FileTreeIcon>\n {isExpanded ? (\n <FolderOpenIcon className=\"size-4 text-blue-500\" />\n ) : (\n <FolderIcon className=\"size-4 text-blue-500\" />\n )}\n </FileTreeIcon>\n <FileTreeName>{name}</FileTreeName>\n </button>\n </div>\n <CollapsibleContent>\n <div className=\"ml-4 border-l border-muted-foreground/50 pl-2\">\n {children}\n </div>\n </CollapsibleContent>\n </div>\n </Collapsible>\n );\n}\n\nexport type FileTreeFileProps = HTMLAttributes<HTMLDivElement> & {\n path: string;\n name: string;\n icon?: ReactNode;\n};\n\nexport function FileTreeFile({\n path,\n name,\n icon,\n className,\n children,\n ...props\n}: FileTreeFileProps) {\n const { selectedPath, onSelect } = useContext(FileTreeContext);\n const isSelected = selectedPath === path;\n\n const handleClick = useCallback(() => {\n onSelect?.(path);\n }, [onSelect, path]);\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n onSelect?.(path);\n }\n },\n [onSelect, path],\n );\n\n return (\n <div\n className={cn(\n \"group flex cursor-pointer items-center gap-1 rounded px-2 py-1 transition-colors hover:bg-muted/50\",\n isSelected && \"bg-muted\",\n className,\n )}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role=\"treeitem\"\n tabIndex={0}\n {...props}\n >\n {children ?? (\n <>\n <span className=\"size-4 shrink-0\" />\n <FileTreeIcon>\n {icon ?? <FileIcon className=\"size-4 text-muted-foreground\" />}\n </FileTreeIcon>\n <FileTreeName>{name}</FileTreeName>\n </>\n )}\n </div>\n );\n}\n\n","import type { ComponentProps } from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport function Skeleton({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n );\n}\n\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n\n/**\n * Format a byte count as a human-readable size string (B / KB / MB).\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Infer a language hint from a file path for syntax display.\n *\n * Extracts the extension from the filename component only, so directory\n * names containing dots (e.g. ``some.dir/Makefile``) are handled correctly.\n */\nexport function getLanguageHint(path: string): string {\n const name = path.split(\"/\").pop() ?? path;\n const dot = name.lastIndexOf(\".\");\n if (dot < 0) return \"plaintext\";\n const ext = name.slice(dot).toLowerCase();\n const map: Record<string, string> = {\n \".py\": \"python\",\n \".js\": \"javascript\",\n \".ts\": \"typescript\",\n \".tsx\": \"tsx\",\n \".jsx\": \"jsx\",\n \".json\": \"json\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\",\n \".toml\": \"toml\",\n \".sql\": \"sql\",\n \".sh\": \"bash\",\n \".css\": \"css\",\n \".html\": \"html\",\n \".md\": \"markdown\",\n \".rs\": \"rust\",\n \".go\": \"go\",\n \".java\": \"java\",\n \".rb\": \"ruby\",\n \".php\": \"php\",\n \".c\": \"c\",\n \".cpp\": \"cpp\",\n \".h\": \"c\",\n \".hpp\": \"cpp\",\n };\n return map[ext] ?? \"plaintext\";\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport {\n AlertCircleIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n DownloadIcon,\n FileTextIcon,\n ImageIcon,\n MinusIcon,\n PlusIcon,\n SearchIcon,\n TrashIcon,\n XIcon,\n} from \"lucide-react\";\nimport \"pdfjs-dist/web/pdf_viewer.css\";\nimport { formatFileSize, getLanguageHint } from \"../../lib/format\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { ScrollArea } from \"../ui/scroll-area\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport type { AgentChatWorkspaceFile } from \"../../types\";\nimport type {\n PDFDocumentLoadingTask,\n PDFDocumentProxy,\n} from \"pdfjs-dist\";\nimport type {\n EventBus,\n PDFFindController,\n PDFViewer,\n} from \"pdfjs-dist/web/pdf_viewer.mjs\";\n\nconst SKELETON_WIDTHS = [70, 85, 55, 90, 60, 78, 45, 82, 65, 72];\nconst PDF_WORKER_SRC = new URL(\n \"pdfjs-dist/legacy/build/pdf.worker.mjs\",\n import.meta.url,\n).toString();\n\ninterface FileViewerProps {\n file: AgentChatWorkspaceFile | null;\n loading: boolean;\n error: string | null;\n /** Same-origin URL the browser can navigate to for download. */\n downloadUrl: string | null;\n onDelete: (() => void) | null;\n onClose: () => void;\n}\n\nexport function FileViewer({\n file,\n loading,\n error,\n downloadUrl,\n onDelete,\n onClose,\n}: FileViewerProps) {\n const visible = loading || file !== null || error !== null;\n if (!visible) return null;\n\n const fileName = file?.path.split(\"/\").pop() ?? \"File\";\n const lang = file ? getLanguageHint(file.path) : \"\";\n const isPdf =\n file?.mime_type === \"application/pdf\" ||\n file?.path.toLowerCase().endsWith(\".pdf\") ||\n false;\n const isImage = file?.encoding === \"base64\" && !isPdf;\n const HeaderIcon = isImage ? ImageIcon : FileTextIcon;\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col border-t border-line\">\n <div className=\"flex shrink-0 items-center gap-2 border-b border-line px-3 py-2\">\n <HeaderIcon className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-xs font-medium\">{fileName}</div>\n <div className=\"truncate text-[10px] text-muted-foreground\">\n {file?.path ?? \"Loading...\"}\n {file && (\n <span className=\"ml-1.5\">\n {formatFileSize(file.size)}\n {file.truncated && \" (truncated)\"}\n </span>\n )}\n </div>\n </div>\n {downloadUrl && (\n <a\n href={downloadUrl}\n download={fileName}\n className=\"shrink-0 rounded p-0.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n aria-label={`Download ${fileName}`}\n title=\"Download\"\n >\n <DownloadIcon className=\"size-3.5\" />\n </a>\n )}\n {onDelete && (\n <button\n type=\"button\"\n onClick={onDelete}\n className=\"shrink-0 rounded p-0.5 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive\"\n aria-label={`Delete ${fileName}`}\n title=\"Delete\"\n >\n <TrashIcon className=\"size-3.5\" />\n </button>\n )}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"shrink-0 rounded p-0.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n aria-label=\"Close file\"\n >\n <XIcon className=\"size-3.5\" />\n </button>\n </div>\n\n <ScrollArea className=\"min-h-0 flex-1\">\n {loading && (\n <div className=\"space-y-1.5 p-3\">\n {Array.from({ length: 10 }).map((_, index) => (\n <Skeleton\n key={index}\n className=\"h-3.5 rounded\"\n style={{\n width: `${SKELETON_WIDTHS[index % SKELETON_WIDTHS.length]}%`,\n }}\n />\n ))}\n </div>\n )}\n\n {error && (\n <div className=\"flex items-start gap-2 p-3 text-xs text-destructive\">\n <AlertCircleIcon className=\"mt-0.5 size-3.5 shrink-0\" />\n <span>{error}</span>\n </div>\n )}\n\n {file && isPdf && file.encoding !== \"base64\" && (\n <FileViewerError message=\"PDF preview requires base64 file content.\" />\n )}\n\n {file && isPdf && file.encoding === \"base64\" && (\n <PdfPreview file={file} fileName={fileName} />\n )}\n\n {file && isImage && (\n <div className=\"flex items-center justify-center p-4\">\n <img\n src={`data:${file.mime_type ?? \"image/png\"};base64,${file.content}`}\n alt={fileName}\n className=\"max-h-[60vh] max-w-full rounded object-contain\"\n />\n </div>\n )}\n\n {file && !isImage && !isPdf && (\n <pre className=\"wrap-break-word whitespace-pre-wrap p-3 text-[11px] leading-relaxed text-foreground\">\n <code data-language={lang}>{file.content}</code>\n </pre>\n )}\n </ScrollArea>\n </div>\n );\n}\n\nfunction FileViewerError({ message }: { message: string }) {\n return (\n <div className=\"flex items-start gap-2 p-3 text-xs text-destructive\">\n <AlertCircleIcon className=\"mt-0.5 size-3.5 shrink-0\" />\n <span>{message}</span>\n </div>\n );\n}\n\nfunction PdfPreview({\n file,\n fileName,\n}: {\n file: AgentChatWorkspaceFile;\n fileName: string;\n}) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<HTMLDivElement>(null);\n const pdfViewerRef = useRef<PDFViewer | null>(null);\n const eventBusRef = useRef<EventBus | null>(null);\n const findControllerRef = useRef<PDFFindController | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [pageNumber, setPageNumber] = useState(1);\n const [pagesCount, setPagesCount] = useState(0);\n const [scale, setScale] = useState(1);\n const [query, setQuery] = useState(\"\");\n\n useEffect(() => {\n let cancelled = false;\n let loadingTask: PDFDocumentLoadingTask | null = null;\n let pdfDocument: PDFDocumentProxy | null = null;\n\n const renderPdf = async () => {\n setError(null);\n const container = containerRef.current;\n const viewerElement = viewerRef.current;\n if (!container || !viewerElement) return;\n\n const pdfBytes = decodeBase64(file.content);\n const pdfjs = await import(\"pdfjs-dist/legacy/build/pdf.mjs\");\n pdfjs.GlobalWorkerOptions.workerSrc = PDF_WORKER_SRC;\n (\n globalThis as typeof globalThis & {\n pdfjsLib?: typeof pdfjs;\n }\n ).pdfjsLib = pdfjs;\n const pdfViewerModule = await import(\"pdfjs-dist/web/pdf_viewer.mjs\");\n loadingTask = pdfjs.getDocument({ data: pdfBytes });\n const pdf = await loadingTask.promise;\n pdfDocument = pdf;\n if (cancelled) return;\n\n const eventBus = new pdfViewerModule.EventBus();\n const linkService = new pdfViewerModule.PDFLinkService({ eventBus });\n const findController = new pdfViewerModule.PDFFindController({\n eventBus,\n linkService,\n });\n const pdfViewer = new pdfViewerModule.PDFViewer({\n container,\n viewer: viewerElement,\n eventBus,\n linkService,\n findController,\n removePageBorders: true,\n });\n linkService.setViewer(pdfViewer);\n linkService.setDocument(pdf);\n findController.setDocument(pdf);\n\n const onPagesInit = () => {\n pdfViewer.currentScaleValue = \"page-width\";\n setScale(pdfViewer.currentScale || 1);\n setPagesCount(pdfViewer.pagesCount);\n setPageNumber(pdfViewer.currentPageNumber);\n };\n const onPageChanging = (event: { pageNumber?: number }) => {\n if (typeof event.pageNumber === \"number\") {\n setPageNumber(event.pageNumber);\n }\n };\n const onScaleChanging = (event: { scale?: number }) => {\n if (typeof event.scale === \"number\") {\n setScale(event.scale);\n }\n };\n\n eventBus.on(\"pagesinit\", onPagesInit);\n eventBus.on(\"pagechanging\", onPageChanging);\n eventBus.on(\"scalechanging\", onScaleChanging);\n\n pdfViewerRef.current = pdfViewer;\n eventBusRef.current = eventBus;\n findControllerRef.current = findController;\n setPagesCount(pdf.numPages);\n pdfViewer.setDocument(pdf);\n };\n\n void renderPdf().catch((nextError) => {\n if (cancelled) return;\n if (\n nextError instanceof Error &&\n nextError.name === \"RenderingCancelledException\"\n ) {\n return;\n }\n setError(formatPdfPreviewError(nextError));\n });\n\n return () => {\n cancelled = true;\n loadingTask?.destroy();\n pdfDocument?.destroy();\n pdfViewerRef.current?.cleanup();\n pdfViewerRef.current = null;\n eventBusRef.current = null;\n findControllerRef.current = null;\n };\n }, [file.content]);\n\n const setViewerPage = (nextPage: number) => {\n const viewer = pdfViewerRef.current;\n if (!viewer) return;\n const clampedPage = Math.min(\n Math.max(1, nextPage),\n Math.max(1, viewer.pagesCount),\n );\n viewer.currentPageNumber = clampedPage;\n setPageNumber(clampedPage);\n };\n\n const setViewerScale = (nextScale: number) => {\n const viewer = pdfViewerRef.current;\n if (!viewer) return;\n const clampedScale = Math.min(3, Math.max(0.5, nextScale));\n viewer.currentScale = clampedScale;\n setScale(clampedScale);\n };\n\n const runFind = (findPrevious = false) => {\n const eventBus = eventBusRef.current;\n if (!eventBus || !query.trim()) return;\n eventBus.dispatch(\"find\", {\n source: eventBus,\n type: \"again\",\n query,\n phraseSearch: true,\n caseSensitive: false,\n entireWord: false,\n highlightAll: true,\n findPrevious,\n matchDiacritics: true,\n });\n };\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <div className=\"flex shrink-0 flex-wrap items-center gap-1.5 border-b border-line px-2 py-1.5\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={() => setViewerPage(pageNumber - 1)}\n disabled={pageNumber <= 1}\n aria-label=\"Previous PDF page\"\n title=\"Previous page\"\n >\n <ChevronLeftIcon className=\"size-3.5\" />\n </Button>\n <Input\n type=\"number\"\n min={1}\n max={pagesCount || 1}\n value={pageNumber}\n onChange={(event) => setViewerPage(Number(event.target.value))}\n aria-label=\"PDF page number\"\n className=\"h-7 w-12 border-input px-1 text-center text-xs\"\n />\n <span className=\"text-xs text-muted-foreground\">\n / {pagesCount || \"-\"}\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={() => setViewerPage(pageNumber + 1)}\n disabled={pagesCount > 0 && pageNumber >= pagesCount}\n aria-label=\"Next PDF page\"\n title=\"Next page\"\n >\n <ChevronRightIcon className=\"size-3.5\" />\n </Button>\n\n <div className=\"mx-1 h-5 w-px bg-line\" />\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={() => setViewerScale(scale - 0.1)}\n disabled={scale <= 0.5}\n aria-label=\"Zoom out PDF\"\n title=\"Zoom out\"\n >\n <MinusIcon className=\"size-3.5\" />\n </Button>\n <button\n type=\"button\"\n className=\"h-7 min-w-12 px-1 text-xs text-muted-foreground hover:text-foreground\"\n onClick={() => {\n const viewer = pdfViewerRef.current;\n if (!viewer) return;\n viewer.currentScaleValue = \"page-width\";\n setScale(viewer.currentScale || 1);\n }}\n aria-label=\"Fit PDF to width\"\n title=\"Fit width\"\n >\n {Math.round(scale * 100)}%\n </button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={() => setViewerScale(scale + 0.1)}\n disabled={scale >= 3}\n aria-label=\"Zoom in PDF\"\n title=\"Zoom in\"\n >\n <PlusIcon className=\"size-3.5\" />\n </Button>\n\n <div className=\"mx-1 h-5 w-px bg-line\" />\n\n <SearchIcon className=\"size-3.5 text-muted-foreground\" />\n <Input\n type=\"search\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") runFind(event.shiftKey);\n }}\n placeholder=\"Find\"\n aria-label=\"Find in PDF\"\n className=\"h-7 w-28 border-input px-1 text-xs\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"xs\"\n onClick={() => runFind(false)}\n disabled={!query.trim()}\n >\n Find\n </Button>\n </div>\n {error && (\n <div className=\"flex w-full items-start gap-2 p-3 text-xs text-destructive\">\n <AlertCircleIcon className=\"mt-0.5 size-3.5 shrink-0\" />\n <span>{error}</span>\n </div>\n )}\n {!error && (\n <div className=\"relative h-[70vh] min-h-[420px] flex-1 bg-muted/20\">\n <div\n ref={containerRef}\n aria-label={`PDF viewer for ${fileName}`}\n className=\"absolute inset-0 overflow-auto\"\n >\n <div ref={viewerRef} className=\"pdfViewer\" />\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction decodeBase64(content: string): Uint8Array {\n const binary = globalThis.atob(content);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n\nfunction formatPdfPreviewError(error: unknown): string {\n if (\n error instanceof Error &&\n (error.name === \"InvalidCharacterError\" || error.message === \"Invalid character\")\n ) {\n return \"PDF preview data is not valid base64.\";\n }\n return error instanceof Error ? error.message : \"Failed to render PDF preview.\";\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { MouseEvent, ReactNode } from \"react\";\nimport {\n AlertCircleIcon,\n DownloadIcon,\n FolderOpenIcon,\n Loader2Icon,\n RefreshCwIcon,\n TrashIcon,\n UploadIcon,\n} from \"lucide-react\";\nimport {\n FileTree,\n FileTreeFile,\n FileTreeFolder,\n} from \"../ai-elements/file-tree\";\nimport { Button } from \"../ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\";\nimport { ScrollArea } from \"../ui/scroll-area\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../ui/tooltip\";\nimport { cn } from \"../../lib/utils\";\nimport { formatFileSize } from \"../../lib/format\";\nimport type {\n AgentChatAdapter,\n AgentChatWorkspaceEntry,\n AgentChatWorkspaceFile,\n} from \"../../types\";\nimport { FileViewer } from \"./file-viewer\";\n\nconst SKELETON_WIDTHS = [75, 60, 90, 65, 80, 70, 85, 55];\nconst DEFAULT_WIDTH = 400;\nconst MIN_WIDTH = 300;\nconst MAX_WIDTH = 900;\n\ninterface WorkspacePanelProps {\n adapter: AgentChatAdapter;\n sessionId: string | null;\n selectedPath: string | null;\n onSelectedPathChange: (path: string | null) => void;\n refreshSignal?: number;\n disabled?: boolean;\n fillParent?: boolean;\n}\n\nfunction collectExpandedPaths(\n entries: AgentChatWorkspaceEntry[],\n depth = 0,\n): string[] {\n const paths: string[] = [];\n for (const entry of entries) {\n if (entry.kind === \"dir\" && depth < 1) {\n paths.push(entry.path);\n if (entry.children) {\n paths.push(...collectExpandedPaths(entry.children, depth + 1));\n }\n }\n }\n return paths;\n}\n\nfunction findEntry(\n entries: AgentChatWorkspaceEntry[],\n path: string,\n): AgentChatWorkspaceEntry | null {\n for (const entry of entries) {\n if (entry.path === path) return entry;\n if (entry.kind === \"dir\" && entry.children) {\n const found = findEntry(entry.children, path);\n if (found) return found;\n }\n }\n return null;\n}\n\nfunction RenderEntries({\n entries,\n onDelete,\n downloadUrlFor,\n}: {\n entries: AgentChatWorkspaceEntry[];\n onDelete: (path: string) => void;\n downloadUrlFor: (path: string) => string;\n}) {\n return (\n <>\n {entries.map((entry) => {\n if (entry.kind === \"dir\") {\n return (\n <FileTreeFolder key={entry.path} name={entry.name} path={entry.path}>\n {entry.children && entry.children.length > 0 && (\n <RenderEntries\n entries={entry.children}\n onDelete={onDelete}\n downloadUrlFor={downloadUrlFor}\n />\n )}\n </FileTreeFolder>\n );\n }\n\n const fileName = entry.name;\n\n return (\n <FileTreeFile key={entry.path} name={entry.name} path={entry.path}>\n <span className=\"size-4 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">{entry.name}</span>\n {entry.size != null && (\n <span className=\"ml-1 shrink-0 text-xs text-muted-foreground/60\">\n {formatFileSize(entry.size)}\n </span>\n )}\n <div className=\"ml-1 flex shrink-0 items-center gap-0 opacity-0 transition-opacity group-hover:opacity-100\">\n <a\n href={downloadUrlFor(entry.path)}\n download={fileName}\n className=\"rounded p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground\"\n onClick={(event) => event.stopPropagation()}\n title=\"Download\"\n aria-label={`Download ${fileName}`}\n >\n <DownloadIcon className=\"size-3\" />\n </a>\n <button\n type=\"button\"\n className=\"rounded p-0.5 text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n onClick={(event) => {\n event.stopPropagation();\n onDelete(entry.path);\n }}\n title=\"Delete\"\n aria-label={`Delete ${fileName}`}\n >\n <TrashIcon className=\"size-3\" />\n </button>\n </div>\n </FileTreeFile>\n );\n })}\n </>\n );\n}\n\nexport function WorkspacePanel({\n adapter,\n sessionId,\n selectedPath,\n onSelectedPathChange,\n refreshSignal = 0,\n disabled = false,\n fillParent = false,\n}: WorkspacePanelProps) {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [entries, setEntries] = useState<AgentChatWorkspaceEntry[]>([]);\n const [rootName, setRootName] = useState(\"workspace\");\n const [treeLoading, setTreeLoading] = useState(false);\n const [treeError, setTreeError] = useState<string | null>(null);\n const [file, setFile] = useState<AgentChatWorkspaceFile | null>(null);\n const [fileLoading, setFileLoading] = useState(false);\n const [fileError, setFileError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [uploading, setUploading] = useState(false);\n const [deleteTarget, setDeleteTarget] = useState<string | null>(null);\n const [expandedPaths, setExpandedPaths] = useState<Set<string>>(new Set());\n const [width, setWidth] = useState(DEFAULT_WIDTH);\n const sessionIdRef = useRef(sessionId);\n const isResizing = useRef(false);\n const startX = useRef(0);\n const startWidth = useRef(DEFAULT_WIDTH);\n\n sessionIdRef.current = sessionId;\n\n const fetchTree = useCallback(async () => {\n if (!sessionId) {\n setEntries([]);\n setRootName(\"workspace\");\n setExpandedPaths(new Set());\n setTreeLoading(false);\n setTreeError(null);\n return;\n }\n const requestedSessionId = sessionId;\n setTreeLoading(true);\n setTreeError(null);\n try {\n const tree = await adapter.getWorkspaceTree({\n sessionId: requestedSessionId,\n });\n if (sessionIdRef.current !== requestedSessionId) return;\n setEntries(tree.entries);\n setRootName(tree.root || \"workspace\");\n setExpandedPaths(new Set(collectExpandedPaths(tree.entries)));\n } catch (error) {\n if (sessionIdRef.current !== requestedSessionId) return;\n setEntries([]);\n setRootName(\"workspace\");\n setTreeError((error as Error).message);\n } finally {\n if (sessionIdRef.current === requestedSessionId) {\n setTreeLoading(false);\n }\n }\n }, [adapter, sessionId]);\n\n const fetchFile = useCallback(\n async (path: string) => {\n if (!sessionId) return;\n const requestedSessionId = sessionId;\n setFileLoading(true);\n setFileError(null);\n try {\n const nextFile = await adapter.getWorkspaceFile({\n sessionId: requestedSessionId,\n path,\n });\n if (sessionIdRef.current !== requestedSessionId) return;\n setFile(nextFile);\n } catch (error) {\n if (sessionIdRef.current !== requestedSessionId) return;\n setFile(null);\n setFileError((error as Error).message);\n } finally {\n if (sessionIdRef.current === requestedSessionId) {\n setFileLoading(false);\n }\n }\n },\n [adapter, sessionId],\n );\n\n useEffect(() => {\n void fetchTree();\n }, [fetchTree]);\n\n useEffect(() => {\n if (!sessionId || refreshSignal === 0) return;\n const timer = setTimeout(() => {\n void fetchTree();\n }, 300);\n return () => clearTimeout(timer);\n }, [refreshSignal, sessionId, fetchTree]);\n\n useEffect(() => {\n if (!sessionId) {\n setFile(null);\n setFileError(null);\n onSelectedPathChange(null);\n }\n }, [onSelectedPathChange, sessionId]);\n\n useEffect(() => {\n if (!selectedPath) return;\n const parts = selectedPath.split(\"/\");\n if (parts.length <= 1) return;\n setExpandedPaths((prev) => {\n const next = new Set(prev);\n let path = \"\";\n for (let index = 0; index < parts.length - 1; index += 1) {\n path = path ? `${path}/${parts[index]}` : parts[index];\n next.add(path);\n }\n return next;\n });\n }, [selectedPath]);\n\n useEffect(() => {\n if (!selectedPath || !sessionId || entries.length === 0) return;\n const entry = findEntry(entries, selectedPath);\n if (entry?.kind === \"file\" && file?.path !== selectedPath) {\n void fetchFile(selectedPath);\n }\n }, [entries, fetchFile, file?.path, selectedPath, sessionId]);\n\n const handleSelect = useCallback(\n (path: string) => {\n onSelectedPathChange(path);\n const entry = findEntry(entries, path);\n if (entry?.kind === \"file\") {\n void fetchFile(path);\n }\n },\n [entries, fetchFile, onSelectedPathChange],\n );\n\n const handleUpload = useCallback(\n async (files: FileList) => {\n if (disabled || !sessionId || files.length === 0) return;\n setUploading(true);\n setNotice(null);\n try {\n for (const uploadedFile of Array.from(files)) {\n await adapter.uploadWorkspaceFile({\n sessionId,\n file: uploadedFile,\n });\n }\n setNotice(\n files.length === 1\n ? `Uploaded ${files[0]?.name ?? \"file\"}`\n : `Uploaded ${files.length} files`,\n );\n await fetchTree();\n } catch (error) {\n setNotice((error as Error).message);\n } finally {\n setUploading(false);\n if (fileInputRef.current) fileInputRef.current.value = \"\";\n }\n },\n [adapter, disabled, fetchTree, sessionId],\n );\n\n const handleDelete = useCallback(\n async (path: string) => {\n if (disabled || !sessionId) return;\n try {\n await adapter.deleteWorkspaceFile({ sessionId, path });\n if (selectedPath === path) {\n onSelectedPathChange(null);\n setFile(null);\n setFileError(null);\n }\n setNotice(`Deleted ${path.split(\"/\").pop() ?? path}`);\n await fetchTree();\n } catch (error) {\n setNotice((error as Error).message);\n } finally {\n setDeleteTarget(null);\n }\n },\n [adapter, disabled, fetchTree, onSelectedPathChange, selectedPath, sessionId],\n );\n\n const onResizeStart = useCallback(\n (event: MouseEvent) => {\n event.preventDefault();\n isResizing.current = true;\n startX.current = event.clientX;\n startWidth.current = width;\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n },\n [width],\n );\n\n useEffect(() => {\n const onMouseMove = (event: globalThis.MouseEvent) => {\n if (!isResizing.current) return;\n const delta = startX.current - event.clientX;\n setWidth(\n Math.min(MAX_WIDTH, Math.max(MIN_WIDTH, startWidth.current + delta)),\n );\n };\n const onMouseUp = () => {\n if (!isResizing.current) return;\n isResizing.current = false;\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n };\n window.addEventListener(\"mousemove\", onMouseMove);\n window.addEventListener(\"mouseup\", onMouseUp);\n return () => {\n window.removeEventListener(\"mousemove\", onMouseMove);\n window.removeEventListener(\"mouseup\", onMouseUp);\n };\n }, []);\n\n return (\n <aside\n data-testid=\"workspace-panel\"\n className={cn(\n \"relative z-10 flex h-full min-h-0 flex-col overflow-hidden border-l border-muted-foreground/20 bg-card\",\n fillParent && \"w-full\",\n )}\n style={\n fillParent\n ? undefined\n : { width, minWidth: MIN_WIDTH, maxWidth: MAX_WIDTH }\n }\n >\n {!fillParent && (\n <div\n className=\"absolute inset-y-0 left-0 z-20 w-1.5 cursor-col-resize transition-colors hover:bg-primary/20 active:bg-primary/30\"\n onMouseDown={onResizeStart}\n />\n )}\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n disabled={disabled}\n onChange={(event) => {\n if (event.target.files) void handleUpload(event.target.files);\n }}\n />\n\n <div className=\"flex min-h-14 items-center gap-2 border-b border-line px-3 py-3\">\n <FolderOpenIcon className=\"size-4 shrink-0 text-amber-500\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium text-foreground\">\n {rootName}\n </div>\n <div className=\"truncate text-xs text-faint\">\n {disabled ? \"Workspace - Read-only\" : \"Workspace\"}\n </div>\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => fileInputRef.current?.click()}\n disabled={disabled || !sessionId || uploading}\n aria-label=\"Upload files\"\n >\n {uploading ? (\n <Loader2Icon className=\"size-4 animate-spin\" />\n ) : (\n <UploadIcon className=\"size-4\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Upload files</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => void fetchTree()}\n disabled={!sessionId || treeLoading}\n aria-label=\"Refresh workspace\"\n >\n <RefreshCwIcon\n className={cn(\"size-4\", treeLoading && \"animate-spin\")}\n />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Refresh</TooltipContent>\n </Tooltip>\n </div>\n\n {notice && (\n <div className=\"border-b border-line px-3 py-2 text-xs text-muted-foreground\">\n {notice}\n </div>\n )}\n\n <ScrollArea className=\"min-h-0 flex-1\">\n <div className=\"px-1 py-1\">\n {treeLoading && entries.length === 0 && (\n <div className=\"space-y-1 p-2\">\n {Array.from({ length: 8 }).map((_, index) => (\n <Skeleton\n key={index}\n className=\"h-5 rounded\"\n style={{\n width: `${SKELETON_WIDTHS[index % SKELETON_WIDTHS.length]}%`,\n }}\n />\n ))}\n </div>\n )}\n\n {treeError && (\n <div className=\"flex items-start gap-2 p-3 text-sm text-destructive\">\n <AlertCircleIcon className=\"mt-0.5 size-4 shrink-0\" />\n <span>{treeError}</span>\n </div>\n )}\n\n {!treeLoading && !treeError && entries.length === 0 && (\n <div className=\"px-4 py-8 text-center text-sm text-faint\">\n <p>No workspace files</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-3 gap-1.5\"\n onClick={() => fileInputRef.current?.click()}\n disabled={disabled || !sessionId}\n >\n <UploadIcon className=\"size-3.5\" />\n Upload files\n </Button>\n </div>\n )}\n\n {entries.length > 0 && (\n <FileTree\n expanded={expandedPaths}\n onExpandedChange={setExpandedPaths}\n selectedPath={selectedPath}\n onSelect={handleSelect}\n className=\"rounded-none border-0\"\n >\n <RenderEntries\n entries={entries}\n onDelete={setDeleteTarget}\n downloadUrlFor={(path) =>\n sessionId\n ? adapter.getWorkspaceDownloadUrl({ sessionId, path })\n : \"#\"\n }\n />\n </FileTree>\n )}\n </div>\n </ScrollArea>\n\n <FileViewer\n file={file}\n loading={fileLoading}\n error={fileError}\n downloadUrl={\n file && sessionId\n ? adapter.getWorkspaceDownloadUrl({\n sessionId,\n path: file.path,\n })\n : null\n }\n onDelete={file && !disabled ? () => setDeleteTarget(file.path) : null}\n onClose={() => {\n onSelectedPathChange(null);\n setFile(null);\n setFileError(null);\n }}\n />\n\n <ConfirmDialog\n open={deleteTarget !== null}\n title=\"Delete file?\"\n description={`This will permanently delete ${\n deleteTarget?.split(\"/\").pop() ?? \"this file\"\n } from the workspace.`}\n confirmLabel=\"Delete\"\n onConfirm={() =>\n deleteTarget ? handleDelete(deleteTarget) : Promise.resolve()\n }\n onCancel={() => setDeleteTarget(null)}\n />\n </aside>\n );\n}\n\ninterface ConfirmDialogProps {\n open: boolean;\n title: string;\n description: ReactNode;\n confirmLabel: string;\n onConfirm: () => Promise<void> | void;\n onCancel: () => void;\n}\n\nfunction ConfirmDialog({\n open,\n title,\n description,\n confirmLabel,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n const [loading, setLoading] = useState(false);\n\n const handleConfirm = async () => {\n setLoading(true);\n try {\n await onConfirm();\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Dialog\n open={open}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !loading) onCancel();\n }}\n >\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" disabled={loading} onClick={onCancel}>\n Cancel\n </Button>\n <Button variant=\"destructive\" disabled={loading} onClick={handleConfirm}>\n {loading && <Loader2Icon className=\"mr-1.5 size-3.5 animate-spin\" />}\n {confirmLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import type { AgentChatSession } from \"../types\";\n\nexport function isScheduledRunSession(\n session: AgentChatSession | null | undefined,\n): boolean {\n return Boolean(\n session?.channel === \"scheduled\" || session?.config?.scheduled_session_id,\n );\n}\n","import type { AgentChatEventType } from \"../types\";\n\nexport const WORKSPACE_MUTATING_TOOLS: ReadonlySet<string> = new Set([\n \"terminal\",\n \"write_file\",\n \"patch\",\n \"execute_code\",\n \"browser_screenshot\",\n]);\n\nexport const AGENT_CHAT_LISTENED_EVENTS = [\n \"user.message\",\n \"llm.request\",\n \"llm.response\",\n \"llm.thinking\",\n \"llm.delta\",\n \"tool.call\",\n \"tool.result\",\n \"session.start\",\n \"session.pause\",\n \"session.resume\",\n \"session.complete\",\n \"session.fail\",\n \"session.done\",\n \"harness.wake\",\n \"harness.crash\",\n \"context.compact\",\n \"skill.invoked\",\n \"policy.denied\",\n \"stream.timeout\",\n \"expert.result\",\n \"expert.endorse\",\n \"expert.override\",\n \"artifact.created\",\n \"artifact.updated\",\n \"browser.provisioned\",\n \"browser.destroyed\",\n \"browser.control_granted\",\n \"browser.control_returned\",\n \"clarify.response\",\n] as const satisfies readonly AgentChatEventType[];\n","import type {\n AgentChatBrowserState,\n AgentChatDisplayAttachment,\n AgentChatErrorInfo,\n AgentChatImageAttachment,\n AgentChatMessage,\n AgentChatRuntimeEvent,\n AgentChatState,\n AgentChatTokenUsage,\n AgentChatToolCallInfo,\n} from \"../types\";\nimport { WORKSPACE_MUTATING_TOOLS } from \"./events\";\n\nexport const EMPTY_TOKEN_USAGE: AgentChatTokenUsage = {\n inputTokens: 0,\n outputTokens: 0,\n reasoningTokens: 0,\n cachedInputTokens: 0,\n totalTokens: 0,\n contextWindow: 0,\n model: \"\",\n};\n\nexport function createInitialAgentChatState(\n options: { isLoadingHistory?: boolean } = {},\n): AgentChatState {\n return {\n messages: [],\n isRunning: false,\n isLoadingHistory: options.isLoadingHistory ?? false,\n tokenUsage: EMPTY_TOKEN_USAGE,\n retryIndicator: null,\n lastEventId: 0,\n sessionDone: false,\n hadDeltas: false,\n terminal: false,\n workspaceRefreshKey: 0,\n browser: null,\n };\n}\n\nexport function applyAgentChatEvent(\n state: AgentChatState,\n event: AgentChatRuntimeEvent,\n): AgentChatState {\n let nextState: AgentChatState = {\n ...state,\n isLoadingHistory: false,\n lastEventId: Math.max(state.lastEventId, event.eventId),\n sessionDone: state.sessionDone || event.type === \"session.done\",\n };\n\n nextState = applyRetryIndicator(nextState, event);\n\n switch (event.type) {\n case \"user.message\":\n return withMessages(nextState, applyUserMessage(\n nextState.messages,\n event.eventId,\n event.data,\n ));\n\n case \"skill.invoked\":\n return withMessages(nextState, [\n ...nextState.messages,\n {\n id: `evt-${event.eventId}`,\n role: \"system\",\n content: stringValue(event.data.skill),\n createdAt: new Date(),\n status: \"complete\",\n systemKind: \"skill_invoked\",\n systemMeta: {\n skill: event.data.skill,\n staged_at: event.data.staged_at,\n },\n },\n ]);\n\n case \"artifact.created\":\n case \"artifact.updated\":\n return withMessages(nextState, [\n ...nextState.messages,\n {\n id: `evt-${event.eventId}`,\n role: \"system\",\n content: stringValue(event.data.name),\n createdAt: new Date(),\n status: \"complete\",\n systemKind: \"artifact\",\n systemMeta: {\n artifact_id: event.data.artifact_id,\n name: event.data.name,\n kind: event.data.kind,\n version: event.data.version,\n size: event.data.size,\n },\n },\n ]);\n\n case \"browser.provisioned\":\n return applyBrowserEvent(nextState, event, {\n status: \"live\",\n controlOwner: null,\n });\n\n case \"browser.control_granted\":\n return applyBrowserEvent(nextState, event, {\n status: \"user-control\",\n controlOwner: stringValue(event.data.owner_user_id) || null,\n });\n\n case \"browser.control_returned\":\n return applyBrowserEvent(nextState, event, {\n status: \"live\",\n controlOwner: null,\n });\n\n case \"browser.destroyed\":\n return applyBrowserEvent(nextState, event, null);\n\n case \"llm.delta\":\n return applyLlmDelta(nextState, event);\n\n case \"llm.response\":\n return applyLlmResponse(nextState, event);\n\n case \"llm.thinking\":\n return applyLlmThinking(nextState, event);\n\n case \"tool.call\":\n return applyToolCall(nextState, event);\n\n case \"tool.result\": {\n const toolCallId = stringValue(event.data.tool_call_id);\n const toolName = findToolNameById(nextState.messages, toolCallId);\n const messages = applyToolResult(nextState.messages, event.data);\n const mutatesWorkspace =\n toolName !== null && WORKSPACE_MUTATING_TOOLS.has(toolName);\n return {\n ...nextState,\n messages,\n workspaceRefreshKey: mutatesWorkspace\n ? nextState.workspaceRefreshKey + 1\n : nextState.workspaceRefreshKey,\n };\n }\n\n case \"harness.wake\":\n case \"llm.request\":\n return nextState.terminal ? nextState : { ...nextState, isRunning: true };\n\n case \"harness.crash\":\n case \"stream.timeout\":\n return nextState;\n\n case \"session.resume\":\n return {\n ...nextState,\n terminal: false,\n isRunning: true,\n };\n\n case \"session.pause\":\n case \"session.complete\":\n case \"session.fail\":\n case \"session.done\":\n return applyTerminalEvent(nextState, event);\n\n case \"context.compact\":\n if (event.data.strategy === \"clear\") {\n return {\n ...nextState,\n messages: [],\n tokenUsage: EMPTY_TOKEN_USAGE,\n };\n }\n return nextState;\n\n case \"expert.result\":\n return withMessages(\n nextState,\n applyExpertResult(nextState.messages, event.eventId),\n );\n\n case \"expert.endorse\":\n case \"expert.override\":\n return withMessages(\n nextState,\n applyExpertFeedback(nextState.messages, event.type, event.data),\n );\n\n case \"clarify.response\":\n return withMessages(\n nextState,\n applyClarifyResponse(nextState.messages, event.data),\n );\n\n case \"policy.denied\":\n return applyPolicyDenied(nextState, event.data);\n\n case \"session.start\":\n return nextState;\n }\n}\n\nfunction applyRetryIndicator(\n state: AgentChatState,\n event: AgentChatRuntimeEvent,\n): AgentChatState {\n switch (event.type) {\n case \"harness.wake\":\n case \"llm.request\":\n case \"llm.response\":\n case \"session.resume\":\n case \"session.pause\":\n case \"session.complete\":\n case \"session.fail\":\n case \"session.done\":\n return { ...state, retryIndicator: null };\n case \"harness.crash\": {\n const title = stringValue(event.data.error_title) ||\n \"A transient error occurred, retrying...\";\n const detail = stringValue(event.data.error_detail) ||\n stringValue(event.data.error);\n return {\n ...state,\n retryIndicator: {\n title,\n detail,\n attempt: (state.retryIndicator?.attempt ?? 0) + 1,\n },\n };\n }\n default:\n return state;\n }\n}\n\nfunction applyUserMessage(\n messages: AgentChatMessage[],\n eventId: number,\n data: Record<string, unknown>,\n): AgentChatMessage[] {\n const content = stringValue(data.content);\n const images = parseUserMessageImages(data.images);\n const attachments = parseUserMessageAttachments(data.attachments);\n const next = [...messages];\n const localIdx = next.findIndex(\n (m) =>\n m.role === \"user\" &&\n m.id.startsWith(\"local-\") &&\n m.content === content,\n );\n if (localIdx >= 0) {\n const local = next[localIdx]!;\n next[localIdx] = {\n ...local,\n id: `evt-${eventId}`,\n // Server-confirmed lists replace any optimistic display-only\n // entries: chips that were rendered while the upload was in\n // flight become clickable because the persisted refs include a\n // workspace path.\n images: images ?? local.images,\n attachments: attachments ?? local.attachments,\n };\n return next;\n }\n next.push({\n id: `evt-${eventId}`,\n role: \"user\",\n content,\n createdAt: new Date(),\n status: \"complete\",\n images,\n attachments,\n });\n return next;\n}\n\nfunction parseUserMessageImages(\n raw: unknown,\n): AgentChatImageAttachment[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: AgentChatImageAttachment[] = [];\n for (const item of raw) {\n if (!item || typeof item !== \"object\") continue;\n const r = item as Record<string, unknown>;\n const data = typeof r.data === \"string\" ? r.data : undefined;\n if (!data) continue;\n const mimeType =\n typeof r.mime_type === \"string\"\n ? r.mime_type\n : typeof r.mimeType === \"string\"\n ? r.mimeType\n : undefined;\n out.push({ data, mimeType });\n }\n return out.length > 0 ? out : undefined;\n}\n\nfunction parseUserMessageAttachments(\n raw: unknown,\n): AgentChatDisplayAttachment[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: AgentChatDisplayAttachment[] = [];\n for (const item of raw) {\n if (!item || typeof item !== \"object\") continue;\n const r = item as Record<string, unknown>;\n const filename = typeof r.filename === \"string\" ? r.filename : undefined;\n if (!filename) continue;\n const path = typeof r.path === \"string\" ? r.path : undefined;\n if (!path) continue;\n const mimeType =\n typeof r.mime_type === \"string\"\n ? r.mime_type\n : typeof r.mimeType === \"string\"\n ? r.mimeType\n : undefined;\n const size = typeof r.size === \"number\" ? r.size : undefined;\n out.push({ path, filename, mimeType, size });\n }\n return out.length > 0 ? out : undefined;\n}\n\nfunction applyBrowserEvent(\n state: AgentChatState,\n event: AgentChatRuntimeEvent,\n browser: AgentChatBrowserState | null,\n): AgentChatState {\n return withMessages(\n { ...state, browser },\n [...state.messages, browserMarker(event)],\n );\n}\n\nfunction browserMarker(event: AgentChatRuntimeEvent): AgentChatMessage {\n const labels: Record<string, { content: string; warning: boolean }> = {\n \"browser.provisioned\": {\n content: \"Browser ready.\",\n warning: false,\n },\n \"browser.control_granted\": {\n content: \"A user took control of the browser.\",\n warning: true,\n },\n \"browser.control_returned\": {\n content: \"Browser control returned to the agent.\",\n warning: false,\n },\n \"browser.destroyed\": {\n content: \"Browser closed.\",\n warning: false,\n },\n };\n const label = labels[event.type] ?? {\n content: \"Browser updated.\",\n warning: false,\n };\n return {\n id: `browser-marker-${event.eventId}`,\n role: \"system\",\n content: label.content,\n createdAt: new Date(),\n status: \"complete\",\n systemKind: label.warning ? \"browser_marker_warning\" : \"browser_marker\",\n };\n}\n\nfunction applyLlmDelta(\n state: AgentChatState,\n event: AgentChatRuntimeEvent,\n): AgentChatState {\n const deltaContent = stringValue(event.data.content);\n const deltaReasoning = stringValue(event.data.reasoning);\n const messages = [...state.messages];\n const lastIdx = findLastAssistantIndex(messages);\n const lastMsg = lastIdx >= 0 ? messages[lastIdx] : null;\n const hasUserAfter = lastIdx >= 0 && hasUserAfterIndex(messages, lastIdx);\n const allToolsDone = Boolean(\n lastMsg?.toolCalls?.length &&\n lastMsg.toolCalls.every((tc) => tc.status !== \"running\"),\n );\n const canAppend = Boolean(\n lastMsg &&\n lastMsg.status === \"streaming\" &&\n !allToolsDone &&\n !hasUserAfter,\n );\n\n if (canAppend && lastMsg) {\n messages[lastIdx] = {\n ...lastMsg,\n content: deltaContent ? lastMsg.content + deltaContent : lastMsg.content,\n reasoning: deltaReasoning\n ? (lastMsg.reasoning ?? \"\") + deltaReasoning\n : lastMsg.reasoning,\n };\n } else {\n messages.push({\n id: `evt-${event.eventId}`,\n role: \"assistant\",\n content: deltaContent,\n reasoning: deltaReasoning || undefined,\n createdAt: new Date(),\n status: \"streaming\",\n });\n }\n\n return {\n ...state,\n messages,\n hadDeltas: state.hadDeltas || Boolean(deltaContent),\n isRunning: state.terminal ? state.isRunning : true,\n };\n}\n\nfunction applyLlmResponse(\n state: AgentChatState,\n event: AgentChatRuntimeEvent,\n): AgentChatState {\n const messages = [...state.messages];\n const message = objectValue(event.data.message);\n const responseContent = stringValue(message?.content) ||\n stringValue(event.data.content);\n const toolCalls = Array.isArray(message?.tool_calls)\n ? message?.tool_calls\n : [];\n const hasToolCalls = toolCalls.length > 0;\n const responseToolCallIds = toolCallIdsFromResponse(toolCalls);\n const idx = findLastAssistantIndex(messages);\n const prevAssistant = idx >= 0 ? messages[idx] : undefined;\n const prevHasTools = Boolean(prevAssistant?.toolCalls?.length);\n const hasUserAfter = idx >= 0 && hasUserAfterIndex(messages, idx);\n const matchesExistingToolTurn = Boolean(\n hasToolCalls &&\n prevAssistant?.toolCalls?.length &&\n responseToolCallIds.length > 0 &&\n !hasUserAfter &&\n responseToolCallIds.every((id) =>\n prevAssistant.toolCalls?.some((tc) => tc.id === id)\n ),\n );\n\n if (state.hadDeltas && idx >= 0 && !hasUserAfter) {\n const current = messages[idx]!;\n if (hasToolCalls) {\n messages[idx] = {\n ...current,\n reasoning: (current.reasoning ?? \"\") + current.content,\n content: \"\",\n status: \"streaming\",\n };\n } else {\n messages[idx] = { ...current, status: \"complete\" };\n }\n } else if (matchesExistingToolTurn && idx >= 0) {\n const current = messages[idx]!;\n messages[idx] = {\n ...current,\n reasoning: responseContent\n ? appendText(current.reasoning, responseContent)\n : current.reasoning,\n status: \"streaming\",\n };\n } else if (prevHasTools || !prevAssistant || hasUserAfter) {\n messages.push({\n id: `evt-${event.eventId}`,\n role: \"assistant\",\n content: hasToolCalls ? \"\" : responseContent,\n reasoning: hasToolCalls && responseContent ? responseContent : undefined,\n createdAt: new Date(),\n status: hasToolCalls ? \"streaming\" : \"complete\",\n });\n } else {\n const current = messages[idx]!;\n if (hasToolCalls && responseContent) {\n messages[idx] = {\n ...current,\n reasoning: (current.reasoning ?? \"\") + responseContent,\n status: \"streaming\",\n };\n } else {\n messages[idx] = {\n ...current,\n content: responseContent || current.content,\n status: hasToolCalls ? \"streaming\" : \"complete\",\n };\n }\n }\n\n const inputTokens = numberValue(event.data.input_tokens);\n const outputTokens = numberValue(event.data.output_tokens);\n return {\n ...state,\n messages,\n hadDeltas: false,\n isRunning: hasToolCalls,\n tokenUsage: {\n inputTokens,\n outputTokens,\n reasoningTokens: numberValue(event.data.reasoning_tokens),\n cachedInputTokens: numberValue(event.data.cache_read_tokens),\n totalTokens: inputTokens + outputTokens,\n contextWindow: numberValue(event.data.context_window),\n model: stringValue(event.data.model),\n },\n };\n}\n\nfunction toolCallIdsFromResponse(toolCalls: unknown[]): string[] {\n return toolCalls\n .map((toolCall) => stringValue(objectValue(toolCall)?.id))\n .filter((id) => id.length > 0);\n}\n\nfunction appendText(existing: string | undefined, addition: string): string {\n if (!existing) return addition;\n if (existing.includes(addition)) return existing;\n return `${existing}\\n${addition}`;\n}\n\nfunction applyLlmThinking(\n state: AgentChatState,\n event: AgentChatRuntimeEvent,\n): AgentChatState {\n const reasoningText = stringValue(event.data.reasoning) ||\n stringValue(event.data.content);\n const messages = [...state.messages];\n const idx = findLastAssistantIndex(messages);\n const prev = idx >= 0 ? messages[idx] : null;\n const allToolsDone = Boolean(\n prev?.toolCalls?.length &&\n prev.toolCalls.every((tc) => tc.status !== \"running\"),\n );\n const hasUserAfter = idx >= 0 && hasUserAfterIndex(messages, idx);\n\n if (!prev || allToolsDone || hasUserAfter) {\n messages.push({\n id: `evt-${event.eventId}`,\n role: \"assistant\",\n content: \"\",\n reasoning: reasoningText,\n createdAt: new Date(),\n status: \"streaming\",\n });\n } else {\n messages[idx] = {\n ...prev,\n reasoning: (prev.reasoning ?? \"\") + reasoningText,\n };\n }\n\n return {\n ...state,\n messages,\n isRunning: state.terminal ? state.isRunning : true,\n };\n}\n\nfunction applyToolCall(\n state: AgentChatState,\n event: AgentChatRuntimeEvent,\n): AgentChatState {\n const messages = [...state.messages];\n const assistantIdx = findLastAssistantIndex(messages);\n let assistant = assistantIdx >= 0 ? messages[assistantIdx] : null;\n const userAfterAssistant = assistantIdx >= 0 &&\n hasUserAfterIndex(messages, assistantIdx);\n\n if (!assistant || assistant.status === \"complete\" || userAfterAssistant) {\n assistant = {\n id: `evt-${event.eventId}-tc`,\n role: \"assistant\",\n content: \"\",\n createdAt: new Date(),\n status: \"streaming\",\n };\n messages.push(assistant);\n } else {\n assistant = { ...assistant };\n messages[assistantIdx] = assistant;\n }\n\n const existingCalls = assistant.toolCalls ?? [];\n const toolCallId = stringValue(event.data.tool_call_id) || `tc-${event.eventId}`;\n if (!existingCalls.some((tc) => tc.id === toolCallId)) {\n const entry: AgentChatToolCallInfo = {\n id: toolCallId,\n toolName: stringValue(event.data.name) ||\n stringValue(event.data.tool_name) ||\n \"unknown\",\n args: typeof event.data.arguments === \"string\"\n ? event.data.arguments\n : JSON.stringify(event.data.arguments ?? {}),\n status: \"running\",\n };\n if (event.data.checkpoint_hash) {\n entry.checkpointHash = String(event.data.checkpoint_hash);\n }\n assistant.toolCalls = [...existingCalls, entry];\n }\n\n return {\n ...state,\n messages,\n isRunning: state.terminal ? state.isRunning : true,\n };\n}\n\nfunction applyToolResult(\n messages: AgentChatMessage[],\n data: Record<string, unknown>,\n): AgentChatMessage[] {\n const targetId = stringValue(data.tool_call_id);\n let matchIdx = -1;\n for (let i = messages.length - 1; i >= 0; i--) {\n if (\n messages[i]?.role === \"assistant\" &&\n messages[i]?.toolCalls?.some((tc) => tc.id === targetId)\n ) {\n matchIdx = i;\n break;\n }\n }\n if (matchIdx < 0) return messages;\n\n const next = [...messages];\n const matchMsg = next[matchIdx]!;\n const rawResult = data.content ?? data.result;\n const formattedResult = typeof rawResult === \"string\"\n ? rawResult\n : JSON.stringify(rawResult ?? null);\n const isCancelled = data.cancelled === true ||\n formattedResult === \"[cancelled (sibling error)]\";\n next[matchIdx] = {\n ...matchMsg,\n toolCalls: matchMsg.toolCalls!.map((tc) =>\n tc.id === targetId\n ? {\n ...tc,\n result: formattedResult,\n status: isCancelled ? \"error\" : \"complete\",\n cancelled: isCancelled || undefined,\n }\n : tc,\n ),\n };\n return next;\n}\n\nfunction applyTerminalEvent(\n state: AgentChatState,\n event: AgentChatRuntimeEvent,\n): AgentChatState {\n const messages = [...state.messages];\n const errorInfo = buildErrorInfo(event);\n const doneIdx = findLastAssistantIndex(messages);\n\n if (doneIdx >= 0 && messages[doneIdx]?.status === \"streaming\") {\n const doneMsg = messages[doneIdx]!;\n messages[doneIdx] = {\n ...doneMsg,\n toolCalls: doneMsg.toolCalls?.map((tc) =>\n tc.status === \"running\"\n ? {\n ...tc,\n status: event.type === \"session.pause\" ? \"complete\" : \"error\",\n result: tc.result ??\n (event.type === \"session.pause\" ? \"[interrupted]\" : \"[failed]\"),\n }\n : tc,\n ),\n status: event.type === \"session.fail\" ? \"error\" : \"complete\",\n errorInfo: errorInfo ?? doneMsg.errorInfo,\n };\n } else if (event.type === \"session.fail\" && errorInfo) {\n messages.push({\n id: `error-${event.eventId}`,\n role: \"system\",\n systemKind: \"error\",\n content: \"\",\n createdAt: new Date(),\n status: \"error\",\n errorInfo,\n });\n }\n\n return {\n ...state,\n messages,\n terminal: true,\n isRunning: false,\n };\n}\n\nfunction buildErrorInfo(\n event: AgentChatRuntimeEvent,\n): AgentChatErrorInfo | undefined {\n if (\n event.type !== \"session.fail\" ||\n typeof event.data.error_category !== \"string\"\n ) {\n return undefined;\n }\n return {\n category: event.data.error_category as AgentChatErrorInfo[\"category\"],\n title: stringValue(event.data.error_title) ||\n \"The session failed due to an internal error.\",\n detail: stringValue(event.data.error_detail) || stringValue(event.data.error),\n retryable: Boolean(event.data.retryable),\n };\n}\n\nfunction applyExpertResult(\n messages: AgentChatMessage[],\n eventId: number,\n): AgentChatMessage[] {\n const match = findLatestConsultExpertCall(messages);\n if (!match) return messages;\n const next = [...messages];\n const msg = next[match.msgIdx]!;\n next[match.msgIdx] = {\n ...msg,\n toolCalls: msg.toolCalls?.map((tc) =>\n tc.id === match.toolId\n ? { ...tc, expertResultEventId: eventId }\n : tc,\n ),\n };\n return next;\n}\n\nfunction applyExpertFeedback(\n messages: AgentChatMessage[],\n type: \"expert.endorse\" | \"expert.override\",\n data: Record<string, unknown>,\n): AgentChatMessage[] {\n const resultEventId = typeof data.target_event_id === \"number\"\n ? data.target_event_id\n : undefined;\n if (resultEventId == null) return messages;\n const rating = type === \"expert.endorse\" ? \"up\" : \"down\";\n const reason = typeof data.reason === \"string\" ? data.reason : undefined;\n const next = [...messages];\n for (let i = next.length - 1; i >= 0; i--) {\n const msg = next[i];\n if (!msg?.toolCalls) continue;\n const hit = msg.toolCalls.find(\n (tc) => tc.expertResultEventId === resultEventId,\n );\n if (!hit) continue;\n if (\n hit.expertFeedback?.rating === rating &&\n hit.expertFeedback?.reason === reason\n ) {\n return messages;\n }\n next[i] = {\n ...msg,\n toolCalls: msg.toolCalls.map((tc) =>\n tc.expertResultEventId === resultEventId\n ? { ...tc, expertFeedback: { rating, reason } }\n : tc,\n ),\n };\n return next;\n }\n return messages;\n}\n\nfunction applyClarifyResponse(\n messages: AgentChatMessage[],\n data: Record<string, unknown>,\n): AgentChatMessage[] {\n const targetToolId = stringValue(data.tool_call_id);\n const responses = Array.isArray(data.responses) ? data.responses : undefined;\n if (!targetToolId || !responses) return messages;\n const next = [...messages];\n for (let i = next.length - 1; i >= 0; i--) {\n const msg = next[i];\n if (!msg?.toolCalls?.some((tc) => tc.id === targetToolId)) continue;\n next[i] = {\n ...msg,\n toolCalls: msg.toolCalls.map((tc) =>\n tc.id === targetToolId\n ? {\n ...tc,\n clarifyAnswers: responses.map((response) => {\n const row = objectValue(response) ?? {};\n return {\n question: stringValue(row.question),\n answer: stringValue(row.answer),\n is_other: Boolean(row.is_other),\n };\n }),\n }\n : tc,\n ),\n };\n return next;\n }\n return messages;\n}\n\nfunction applyPolicyDenied(\n state: AgentChatState,\n data: Record<string, unknown>,\n): AgentChatState {\n const messages = [...state.messages];\n const policyIdx = findLastAssistantIndex(messages);\n if (policyIdx >= 0) {\n const policyMsg = messages[policyIdx]!;\n messages[policyIdx] = {\n ...policyMsg,\n content: `${policyMsg.content}\\n\\n**Policy denied**: ${\n stringValue(data.reason) || \"Action blocked by governance policy.\"\n }`,\n status: \"error\",\n };\n }\n return {\n ...state,\n messages,\n isRunning: false,\n };\n}\n\nfunction withMessages(\n state: AgentChatState,\n messages: AgentChatMessage[],\n): AgentChatState {\n return { ...state, messages };\n}\n\nfunction findLastAssistantIndex(messages: AgentChatMessage[]): number {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]?.role === \"assistant\") return i;\n }\n return -1;\n}\n\nfunction hasUserAfterIndex(messages: AgentChatMessage[], idx: number): boolean {\n for (let i = idx + 1; i < messages.length; i++) {\n if (messages[i]?.role === \"user\") return true;\n }\n return false;\n}\n\nfunction findToolNameById(\n messages: AgentChatMessage[],\n toolCallId: string,\n): string | null {\n if (!toolCallId) return null;\n for (let i = messages.length - 1; i >= 0; i--) {\n const tc = messages[i]?.toolCalls?.find((c) => c.id === toolCallId);\n if (tc) return tc.toolName;\n }\n return null;\n}\n\nfunction findLatestConsultExpertCall(\n messages: AgentChatMessage[],\n): { msgIdx: number; toolId: string } | null {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (!msg?.toolCalls) continue;\n for (let j = msg.toolCalls.length - 1; j >= 0; j--) {\n const tc = msg.toolCalls[j];\n if (\n tc?.toolName === \"consult_expert\" &&\n tc.expertResultEventId === undefined\n ) {\n return { msgIdx: i, toolId: tc.id };\n }\n }\n }\n return null;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | undefined {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return undefined;\n}\n\nfunction stringValue(value: unknown): string {\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction numberValue(value: unknown): number {\n return typeof value === \"number\" ? value : 0;\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type {\n AgentChatAdapter,\n AgentChatAttachment,\n AgentChatDisplayAttachment,\n AgentChatEventStream,\n AgentChatImageAttachment,\n AgentChatPendingAttachment,\n AgentChatRuntimeApi,\n AgentChatSession,\n AgentChatState,\n} from \"../types\";\nimport { AGENT_CHAT_LISTENED_EVENTS } from \"./events\";\nimport {\n applyAgentChatEvent,\n createInitialAgentChatState,\n} from \"./reducer\";\n\nexport interface UseAgentChatRuntimeInput {\n adapter: AgentChatAdapter;\n agentId?: string;\n sessionId: string | null;\n onSessionChange?: (sessionId: string) => void;\n}\n\nexport function useAgentChatRuntime({\n adapter,\n agentId,\n sessionId,\n onSessionChange,\n}: UseAgentChatRuntimeInput): AgentChatRuntimeApi {\n const [state, setState] = useState<AgentChatState>(() =>\n createInitialAgentChatState({ isLoadingHistory: Boolean(sessionId) }),\n );\n const [session, setSession] = useState<AgentChatSession | null>(null);\n const stateRef = useRef(state);\n const streamRef = useRef<AgentChatEventStream | null>(null);\n const reconnectTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const previousSessionIdRef = useRef<string | null>(sessionId);\n const sessionIdRef = useRef<string | null>(sessionId);\n\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n useEffect(() => {\n sessionIdRef.current = sessionId;\n }, [sessionId]);\n\n const clearReconnectTimer = useCallback(() => {\n if (reconnectTimerRef.current) {\n clearTimeout(reconnectTimerRef.current);\n reconnectTimerRef.current = null;\n }\n }, []);\n\n const closeStream = useCallback(() => {\n const stream = streamRef.current;\n streamRef.current = null;\n stream?.close();\n }, []);\n\n const openStream = useCallback(\n (targetSessionId: string, after?: number) => {\n const stream = adapter.openEventStream({\n sessionId: targetSessionId,\n after: after ?? stateRef.current.lastEventId,\n });\n streamRef.current = stream;\n\n for (const eventType of AGENT_CHAT_LISTENED_EVENTS) {\n stream.addEventListener(eventType, (messageEvent) => {\n if (streamRef.current !== stream) return;\n const data = parseEventData(messageEvent.data);\n const eventId = messageEvent.lastEventId\n ? Number(messageEvent.lastEventId)\n : 0;\n setState((prev) =>\n applyAgentChatEvent(prev, {\n type: eventType,\n eventId,\n data,\n }),\n );\n });\n }\n\n stream.onerror = () => {\n stream.close();\n if (streamRef.current === stream) {\n streamRef.current = null;\n }\n if (\n !stateRef.current.sessionDone &&\n sessionIdRef.current === targetSessionId\n ) {\n reconnectTimerRef.current = setTimeout(\n () => openStream(targetSessionId),\n 3000,\n );\n }\n };\n },\n [adapter],\n );\n\n const ensureStreamForNewTurn = useCallback(\n (targetSessionId: string) => {\n if (streamRef.current && !stateRef.current.sessionDone) return;\n\n const after = stateRef.current.lastEventId;\n clearReconnectTimer();\n closeStream();\n stateRef.current = {\n ...stateRef.current,\n sessionDone: false,\n terminal: false,\n };\n openStream(targetSessionId, after);\n },\n [clearReconnectTimer, closeStream, openStream],\n );\n\n useEffect(() => {\n const previousSessionId = previousSessionIdRef.current;\n previousSessionIdRef.current = sessionId;\n clearReconnectTimer();\n closeStream();\n\n if (!sessionId) {\n setSession(null);\n setState(createInitialAgentChatState());\n return;\n }\n\n const currentState = stateRef.current;\n const preservePendingFirstMessage =\n previousSessionId === null &&\n currentState.isRunning &&\n currentState.messages.some(\n (message) =>\n message.role === \"user\" && message.id.startsWith(\"local-\"),\n );\n const initialState = preservePendingFirstMessage\n ? {\n ...createInitialAgentChatState({ isLoadingHistory: false }),\n messages: currentState.messages,\n isRunning: true,\n }\n : createInitialAgentChatState({\n isLoadingHistory: true,\n });\n stateRef.current = initialState;\n setSession(null);\n setState(initialState);\n openStream(sessionId, 0);\n\n adapter\n .getSession({ sessionId })\n .then((loadedSession) => {\n if (sessionIdRef.current !== sessionId) return;\n setSession(loadedSession);\n if (loadedSession.messageCount === 0) {\n setState((prev) => ({\n ...prev,\n isLoadingHistory: false,\n }));\n }\n if (isTerminalStatus(loadedSession.status)) {\n setState((prev) => ({\n ...prev,\n terminal: true,\n isRunning: false,\n }));\n }\n })\n .catch(() => undefined);\n\n return () => {\n clearReconnectTimer();\n closeStream();\n };\n }, [adapter, clearReconnectTimer, closeStream, openStream, sessionId]);\n\n const markSending = useCallback(\n (\n content: string,\n images?: AgentChatImageAttachment[],\n attachments?: AgentChatDisplayAttachment[],\n ) => {\n setState((prev) => ({\n ...prev,\n terminal: false,\n sessionDone: false,\n isRunning: true,\n messages: [\n ...prev.messages,\n {\n id: `local-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n role: \"user\",\n content,\n createdAt: new Date(),\n status: \"complete\",\n images: images?.length ? images : undefined,\n attachments: attachments?.length ? attachments : undefined,\n },\n ],\n }));\n },\n [],\n );\n\n const markSendError = useCallback((errorText: string) => {\n setState((prev) => {\n for (let i = prev.messages.length - 1; i >= 0; i--) {\n const message = prev.messages[i];\n if (message?.role === \"user\" && message.id.startsWith(\"local-\")) {\n const messages = [...prev.messages];\n messages[i] = {\n ...message,\n status: \"error\",\n content: `${message.content}\\n\\n*Failed to send: ${errorText}*`,\n };\n return {\n ...prev,\n isRunning: false,\n messages,\n };\n }\n }\n return { ...prev, isRunning: false };\n });\n }, []);\n\n const forceStop = useCallback(() => {\n setState((prev) => {\n const messages = [...prev.messages];\n const idx = findLastAssistantIndex(messages);\n if (idx >= 0 && messages[idx]?.status === \"streaming\") {\n const message = messages[idx]!;\n messages[idx] = {\n ...message,\n status: \"complete\",\n toolCalls: message.toolCalls?.map((toolCall) =>\n toolCall.status === \"running\"\n ? {\n ...toolCall,\n status: \"complete\",\n result: toolCall.result ?? \"[interrupted]\",\n }\n : toolCall,\n ),\n };\n }\n return {\n ...prev,\n terminal: true,\n isRunning: false,\n messages,\n };\n });\n }, []);\n\n const send = useCallback(\n async (\n content: string,\n images?: AgentChatImageAttachment[],\n pendingAttachments?: AgentChatPendingAttachment[],\n ) => {\n // Display-only mirror of pendingAttachments for the optimistic\n // local user-message: same filename + size, no path (chip renders\n // disabled). The reducer reconciles these with the persisted\n // refs when the user.message event arrives.\n const displayAttachments: AgentChatDisplayAttachment[] | undefined =\n pendingAttachments?.length\n ? pendingAttachments.map((a) => ({\n filename: a.filename,\n mimeType: a.mimeType,\n size: a.size ?? a.file.size,\n // path absent until upload completes.\n }))\n : undefined;\n\n markSending(content, images, displayAttachments);\n // Slash-command parsing is suppressed when the user is sending\n // image vision OR file attachments — neither shape participates\n // in /goal control flow.\n const goal =\n images?.length || pendingAttachments?.length\n ? null\n : parseGoalDefinition(content);\n\n const runUploadsAndSend = async (sid: string): Promise<void> => {\n let refs: AgentChatAttachment[] | undefined;\n if (pendingAttachments?.length) {\n // Same epoch timestamp shared across this batch so all files\n // from this turn cluster together in the workspace listing.\n const stamp = Date.now();\n refs = await Promise.all(\n pendingAttachments.map(async (a, index) => {\n const safeName = sanitizeUploadFilename(a.file.name);\n const renamed = new File(\n [a.file],\n `${stamp}-${index}-${safeName}`,\n { type: a.file.type },\n );\n const up = await adapter.uploadWorkspaceFile({\n sessionId: sid,\n file: renamed,\n directory: \"uploads\",\n });\n return {\n path: up.path,\n filename: a.filename,\n mimeType: a.mimeType ?? a.file.type ?? undefined,\n size: up.size,\n } satisfies AgentChatAttachment;\n }),\n );\n }\n await sendTurn(adapter, sid, content, images, refs, goal);\n };\n\n if (!sessionId) {\n try {\n const session = await adapter.createSession({ agentId });\n onSessionChange?.(session.id);\n await runUploadsAndSend(session.id);\n } catch (error) {\n markSendError(error instanceof Error ? error.message : \"send failed\");\n throw error;\n }\n return;\n }\n\n try {\n ensureStreamForNewTurn(sessionId);\n await runUploadsAndSend(sessionId);\n } catch (error) {\n markSendError(error instanceof Error ? error.message : \"send failed\");\n throw error;\n }\n },\n [\n adapter,\n agentId,\n ensureStreamForNewTurn,\n markSendError,\n markSending,\n onSessionChange,\n sessionId,\n ],\n );\n\n const stop = useCallback(async () => {\n if (!sessionId) return;\n forceStop();\n await adapter.pauseSession({ sessionId });\n }, [adapter, forceStop, sessionId]);\n\n const retry = useCallback(async () => {\n if (!sessionId) return;\n setState((prev) => ({\n ...prev,\n terminal: false,\n retryIndicator: null,\n isRunning: true,\n }));\n try {\n await adapter.retrySession({ sessionId });\n } catch (error) {\n setState((prev) => ({\n ...prev,\n terminal: true,\n isRunning: false,\n }));\n throw error;\n }\n }, [adapter, sessionId]);\n\n return {\n state,\n session,\n messages: state.messages,\n isRunning: state.isRunning,\n isLoadingHistory: state.isLoadingHistory,\n tokenUsage: state.tokenUsage,\n retryIndicator: state.retryIndicator,\n workspaceRefreshKey: state.workspaceRefreshKey,\n send,\n stop,\n retry,\n markSending,\n markSendError,\n };\n}\n\nfunction parseEventData(data: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(data) as unknown;\n return typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {};\n } catch {\n return {};\n }\n}\n\nfunction isTerminalStatus(status: string): boolean {\n return status === \"paused\" || status === \"completed\" || status === \"failed\";\n}\n\nfunction findLastAssistantIndex(messages: AgentChatState[\"messages\"]): number {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]?.role === \"assistant\") return i;\n }\n return -1;\n}\n\ntype ParsedGoalDefinition = {\n description: string;\n rubric?: string;\n};\n\nconst GOAL_RUBRIC_RE = /\\n\\s*(?:rubric|criteria)\\s*:\\s*\\n/i;\nconst GOAL_CONTROL_COMMANDS = new Set([\"\", \"status\", \"pause\", \"resume\", \"clear\"]);\n\nasync function sendTurn(\n adapter: AgentChatAdapter,\n sessionId: string,\n content: string,\n images: AgentChatImageAttachment[] | undefined,\n attachments: AgentChatAttachment[] | undefined,\n goal: ParsedGoalDefinition | null,\n): Promise<void> {\n if (goal && adapter.defineOutcome) {\n await adapter.defineOutcome({\n sessionId,\n description: goal.description,\n rubric: goal.rubric,\n });\n return;\n }\n await adapter.sendMessage({ sessionId, content, images, attachments });\n}\n\n/**\n * Strip characters the harness or storage backend will reject from an\n * upload filename: path separators, NUL. When the resulting string is\n * empty (e.g. the original name was made up entirely of stripped\n * characters), fall back to a generic placeholder so the workspace key\n * stays well-formed. The harness re-validates the path on its end.\n */\nfunction sanitizeUploadFilename(name: string): string {\n const stripped = name.replace(/[\\/\\\\\\0]/g, \"\").trim();\n return stripped.length > 0 ? stripped : \"attachment\";\n}\n\nfunction parseGoalDefinition(content: string): ParsedGoalDefinition | null {\n const text = content.trim();\n if (text !== \"/goal\" && !text.startsWith(\"/goal \")) return null;\n\n const args = text.slice(\"/goal\".length).trim();\n if (GOAL_CONTROL_COMMANDS.has(args.toLowerCase())) return null;\n\n const match = GOAL_RUBRIC_RE.exec(args);\n const description = (match ? args.slice(0, match.index) : args).trim();\n if (!description) return null;\n\n const rubric = match ? args.slice(match.index + match[0].length).trim() : \"\";\n return rubric ? { description, rubric } : { description };\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { AgentChatAdapterProvider } from \"./adapter-context\";\nimport { BrowserPane } from \"./components/browser/browser-pane\";\nimport { ChatThread } from \"./components/chat/chat-thread\";\nimport { TooltipProvider } from \"./components/ui/tooltip\";\nimport { WorkspacePanel } from \"./components/workspace/workspace-panel\";\nimport { isScheduledRunSession } from \"./lib/sessions\";\nimport { useAgentChatRuntime } from \"./runtime/use-agent-chat-runtime\";\nimport type {\n AgentChatAdapter,\n AgentChatMessage,\n} from \"./types\";\nimport type { ChatComposerError } from \"./components/chat/chat-composer\";\n\nexport interface AgentChatProps {\n adapter: AgentChatAdapter;\n agentId?: string;\n sessionId: string | null;\n onSessionChange?: (sessionId: string) => void;\n onFileSelect?: (path: string) => void;\n onMessagesChange?: (messages: AgentChatMessage[]) => void;\n disabled?: boolean;\n /**\n * Called when the composer rejects a file selection before sending —\n * size/count caps, accept-pattern misses. Host apps wire this to\n * their toast system; the SDK does not surface these on its own.\n */\n onComposerError?: (err: ChatComposerError) => void;\n}\n\nexport function AgentChat({\n adapter,\n agentId,\n sessionId,\n onSessionChange,\n onFileSelect,\n onMessagesChange,\n disabled,\n onComposerError,\n}: AgentChatProps) {\n const [workspacePath, setWorkspacePath] = useState<string | null>(null);\n const runtime = useAgentChatRuntime({\n adapter,\n agentId,\n sessionId,\n onSessionChange,\n });\n const isReadOnlySession = isScheduledRunSession(runtime.session);\n const effectiveDisabled = disabled || isReadOnlySession;\n const disabledReason = isReadOnlySession\n ? \"Scheduled run is read-only\"\n : undefined;\n const browserState = runtime.state.browser;\n const hasBrowserPanel = browserState !== null && sessionId;\n\n useEffect(() => {\n onMessagesChange?.(runtime.messages);\n }, [onMessagesChange, runtime.messages]);\n\n const handleFileSelect = useCallback(\n (path: string) => {\n setWorkspacePath(path);\n onFileSelect?.(path);\n },\n [onFileSelect],\n );\n\n return (\n <AgentChatAdapterProvider\n value={{\n adapter,\n sessionId,\n onFileSelect: handleFileSelect,\n }}\n >\n <TooltipProvider>\n <section\n data-testid=\"agent-chat-layout\"\n className={\n hasBrowserPanel\n ? \"relative min-h-0 flex-1 overflow-hidden bg-background text-sm text-foreground\"\n : \"flex min-h-0 flex-1 overflow-hidden bg-background text-sm text-foreground\"\n }\n style={{ direction: \"ltr\" }}\n >\n <div\n data-testid=\"chat-panel\"\n className={\n hasBrowserPanel\n ? \"absolute inset-y-0 left-0 flex min-h-0 min-w-0 flex-col overflow-hidden\"\n : \"flex min-w-0 flex-1 flex-col overflow-hidden\"\n }\n style={hasBrowserPanel ? { right: 440 } : undefined}\n >\n <ChatThread\n sessionId={sessionId}\n messages={runtime.messages}\n isRunning={runtime.isRunning}\n isLoadingHistory={runtime.isLoadingHistory}\n onSend={(content, images, attachments) =>\n runtime.send(content, images, attachments)\n }\n onStop={() => runtime.stop()}\n onRetry={runtime.retry}\n onFileSelect={handleFileSelect}\n disabled={effectiveDisabled}\n disabledReason={disabledReason}\n tokenUsage={runtime.tokenUsage}\n retryIndicator={runtime.retryIndicator}\n onComposerError={onComposerError}\n />\n </div>\n <div\n data-testid=\"right-stack\"\n className={\n hasBrowserPanel\n ? \"absolute inset-y-0 flex min-h-0 flex-col overflow-hidden\"\n : \"flex min-h-0 shrink-0 flex-col\"\n }\n style={hasBrowserPanel ? { right: 0, width: 440 } : undefined}\n >\n {hasBrowserPanel && (\n <div\n data-testid=\"browser-panel\"\n className=\"h-1/2 min-h-0 w-full overflow-hidden border-b border-line\"\n >\n <BrowserPane\n sessionId={sessionId}\n state={browserState}\n adapter={adapter}\n />\n </div>\n )}\n <div\n data-testid=\"workspace-panel-frame\"\n className={\n hasBrowserPanel\n ? \"h-1/2 min-h-0 w-full overflow-hidden\"\n : \"min-h-0 h-full\"\n }\n >\n <WorkspacePanel\n adapter={adapter}\n sessionId={sessionId}\n selectedPath={workspacePath}\n onSelectedPathChange={setWorkspacePath}\n refreshSignal={runtime.workspaceRefreshKey}\n disabled={effectiveDisabled}\n fillParent={Boolean(hasBrowserPanel)}\n />\n </div>\n </div>\n </section>\n </TooltipProvider>\n </AgentChatAdapterProvider>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport {\n CheckIcon,\n CircleDotIcon,\n ClipboardCheckIcon,\n ExternalLinkIcon,\n InboxIcon,\n MessageSquareIcon,\n ShieldAlertIcon,\n TimerIcon,\n Trash2Icon,\n} from \"lucide-react\";\nimport { Badge } from \"../ui/badge\";\nimport { Button } from \"../ui/button\";\nimport { cn } from \"../../lib/utils\";\nimport type {\n AgentChatAdapter,\n AgentChatClarifyAnswer,\n AgentChatInboxEventStream,\n AgentChatInboxItem,\n AgentChatInboxKind,\n AgentChatInboxList,\n} from \"../../types\";\n\nexport interface InboxPanelProps {\n adapter: AgentChatAdapter;\n title?: string;\n selectedId?: number | null;\n onSelectedIdChange?: (itemId: number | null) => void;\n onSessionSelect?: (sessionId: string) => void;\n hideHeader?: boolean;\n limit?: number;\n}\n\nconst DEFAULT_LIMIT = 50;\n\ntype InboxAdapter = AgentChatAdapter & {\n listInbox(input?: Parameters<NonNullable<AgentChatAdapter[\"listInbox\"]>>[0]): Promise<AgentChatInboxList>;\n getInboxItem(input: { itemId: number }): Promise<AgentChatInboxItem>;\n markInboxItemRead(input: { itemId: number }): Promise<AgentChatInboxItem>;\n acknowledgeInboxItem(input: { itemId: number }): Promise<AgentChatInboxItem>;\n deleteInboxItem?(input: { itemId: number }): Promise<void>;\n respondGovernanceInboxItem(input: {\n itemId: number;\n decision: \"approve\" | \"reject\";\n }): Promise<AgentChatInboxItem>;\n respondActionRequiredInboxItem?(input: {\n itemId: number;\n }): Promise<AgentChatInboxItem>;\n openInboxStream(): AgentChatInboxEventStream;\n};\n\nfunction requireInboxAdapter(adapter: AgentChatAdapter): InboxAdapter {\n if (\n !adapter.listInbox ||\n !adapter.getInboxItem ||\n !adapter.markInboxItemRead ||\n !adapter.acknowledgeInboxItem ||\n !adapter.respondGovernanceInboxItem ||\n !adapter.openInboxStream\n ) {\n throw new Error(\"Inbox is not supported by this adapter.\");\n }\n return adapter as InboxAdapter;\n}\n\nconst KIND_LABEL: Record<string, string> = {\n input_required: \"Input needed\",\n action_required: \"Action needed\",\n task_complete: \"Task complete\",\n governance_gate: \"Approval\",\n progress_checkin: \"Progress\",\n};\n\nfunction kindLabel(kind: AgentChatInboxKind): string {\n return KIND_LABEL[kind] ?? kind.replace(/[_-]+/g, \" \");\n}\n\nfunction statusLabel(status: string): string {\n return status\n .split(/[_-]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nfunction formatRelative(value: string): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"\";\n return formatDistanceToNow(date, { addSuffix: true });\n}\n\nfunction kindIcon(kind: AgentChatInboxKind) {\n if (kind === \"input_required\") return MessageSquareIcon;\n if (kind === \"action_required\") return ExternalLinkIcon;\n if (kind === \"task_complete\") return ClipboardCheckIcon;\n if (kind === \"governance_gate\") return ShieldAlertIcon;\n if (kind === \"progress_checkin\") return TimerIcon;\n return CircleDotIcon;\n}\n\nfunction sortItems(items: AgentChatInboxItem[]): AgentChatInboxItem[] {\n return [...items].sort((a, b) => {\n if (a.createdAt !== b.createdAt) return a.createdAt > b.createdAt ? -1 : 1;\n return b.id - a.id;\n });\n}\n\nfunction QuestionInput({\n prompt,\n choices,\n disabled,\n value,\n onChange,\n}: {\n prompt: string;\n choices?: Array<{ label: string; description?: string }>;\n disabled: boolean;\n value: string;\n onChange: (value: string) => void;\n}) {\n if (choices && choices.length > 0) {\n return (\n <select\n aria-label={prompt}\n className=\"h-9 w-full border border-line bg-background px-2 text-sm text-foreground outline-none focus:border-primary disabled:opacity-50\"\n disabled={disabled}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n >\n <option value=\"\">Select</option>\n {choices.map((choice) => (\n <option key={choice.label} value={choice.label}>\n {choice.label}\n </option>\n ))}\n </select>\n );\n }\n\n return (\n <input\n aria-label={prompt}\n className=\"h-9 w-full border border-line bg-background px-2 text-sm text-foreground outline-none focus:border-primary disabled:opacity-50\"\n disabled={disabled}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n />\n );\n}\n\nfunction InboxDetailActions({\n item,\n adapter,\n onDeleted,\n onSessionSelect,\n children,\n}: {\n item: AgentChatInboxItem;\n adapter: InboxAdapter;\n onDeleted: (itemId: number) => Promise<void>;\n onSessionSelect?: (sessionId: string) => void;\n children?: ReactNode;\n}) {\n const [deleting, setDeleting] = useState(false);\n\n async function deleteItem() {\n if (!adapter.deleteInboxItem) return;\n setDeleting(true);\n try {\n await onDeleted(item.id);\n } finally {\n setDeleting(false);\n }\n }\n\n return (\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => onSessionSelect?.(item.sessionId)}\n aria-label=\"Open session\"\n >\n <ExternalLinkIcon className=\"size-3.5\" />\n Open session\n </Button>\n {children}\n {adapter.deleteInboxItem && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => void deleteItem()}\n disabled={deleting}\n aria-label=\"Delete inbox item\"\n title=\"Delete inbox item\"\n >\n <Trash2Icon className=\"size-3.5\" />\n {deleting ? \"Deleting\" : \"Delete\"}\n </Button>\n )}\n </div>\n );\n}\n\nfunction InputRequiredDetail({\n item,\n adapter,\n onUpdated,\n onDeleted,\n onSessionSelect,\n}: {\n item: AgentChatInboxItem;\n adapter: InboxAdapter;\n onUpdated: (item: AgentChatInboxItem) => void;\n onDeleted: (itemId: number) => Promise<void>;\n onSessionSelect?: (sessionId: string) => void;\n}) {\n const questions = Array.isArray(item.payload.questions)\n ? (item.payload.questions as Array<{\n prompt?: unknown;\n choices?: unknown;\n }>)\n .map((question) => ({\n prompt: typeof question.prompt === \"string\" ? question.prompt : \"\",\n choices: Array.isArray(question.choices)\n ? (question.choices as Array<{ label?: unknown; description?: unknown }>)\n .map((choice) => ({\n label: typeof choice.label === \"string\" ? choice.label : \"\",\n description:\n typeof choice.description === \"string\"\n ? choice.description\n : undefined,\n }))\n .filter((choice) => choice.label)\n : undefined,\n }))\n .filter((question) => question.prompt)\n : [];\n const [answers, setAnswers] = useState<Record<string, string>>({});\n const [submitting, setSubmitting] = useState(false);\n const disabled = item.status !== \"pending\" || submitting;\n const canSubmit = questions.every((question) => answers[question.prompt]?.trim());\n\n async function submit() {\n const toolCallId =\n typeof item.payload.tool_call_id === \"string\"\n ? item.payload.tool_call_id\n : \"\";\n if (!toolCallId || !canSubmit) return;\n setSubmitting(true);\n try {\n const responses: AgentChatClarifyAnswer[] = questions.map((question) => ({\n question: question.prompt,\n answer: answers[question.prompt]?.trim() ?? \"\",\n is_other: false,\n }));\n await adapter.submitClarifyResponse({\n sessionId: item.sessionId,\n toolCallId,\n responses,\n });\n onUpdated(await adapter.getInboxItem({ itemId: item.id }));\n } finally {\n setSubmitting(false);\n }\n }\n\n return (\n <div className=\"space-y-4\">\n {item.body && (\n <p className=\"whitespace-pre-wrap text-sm text-muted-foreground\">\n {item.body}\n </p>\n )}\n {questions.map((question) => (\n <label key={question.prompt} className=\"block space-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">\n {question.prompt}\n </span>\n <QuestionInput\n prompt={question.prompt}\n choices={question.choices}\n disabled={disabled}\n value={answers[question.prompt] ?? \"\"}\n onChange={(value) =>\n setAnswers((current) => ({\n ...current,\n [question.prompt]: value,\n }))\n }\n />\n </label>\n ))}\n <InboxDetailActions\n item={item}\n adapter={adapter}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n >\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void submit()}\n disabled={disabled || !canSubmit}\n aria-label=\"Submit inbox response\"\n >\n {submitting ? \"Submitting\" : \"Submit\"}\n </Button>\n </InboxDetailActions>\n </div>\n );\n}\n\nfunction AckDetail({\n item,\n adapter,\n onUpdated,\n onDeleted,\n onSessionSelect,\n}: {\n item: AgentChatInboxItem;\n adapter: InboxAdapter;\n onUpdated: (item: AgentChatInboxItem) => void;\n onDeleted: (itemId: number) => Promise<void>;\n onSessionSelect?: (sessionId: string) => void;\n}) {\n async function acknowledge() {\n onUpdated(await adapter.acknowledgeInboxItem({ itemId: item.id }));\n }\n const outcome = typeof item.payload.outcome === \"string\" ? item.payload.outcome : \"\";\n const duration =\n typeof item.payload.duration_seconds === \"number\"\n ? item.payload.duration_seconds\n : null;\n return (\n <div className=\"space-y-3\">\n {outcome && <Badge variant=\"secondary\">{outcome}</Badge>}\n {item.body && <p className=\"whitespace-pre-wrap text-sm\">{item.body}</p>}\n {typeof item.payload.error === \"string\" && (\n <pre className=\"overflow-x-auto bg-destructive/10 p-3 text-xs text-destructive\">\n {item.payload.error}\n </pre>\n )}\n {duration !== null && (\n <p className=\"text-xs text-muted-foreground\">\n Duration: {Math.round(duration / 60)} min ({duration} s)\n </p>\n )}\n <InboxDetailActions\n item={item}\n adapter={adapter}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n >\n {item.status === \"pending\" && (\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void acknowledge()}\n aria-label=\"Acknowledge inbox item\"\n >\n <CheckIcon className=\"size-3.5\" />\n Acknowledge\n </Button>\n )}\n </InboxDetailActions>\n </div>\n );\n}\n\nfunction GovernanceDetail({\n item,\n adapter,\n onUpdated,\n onDeleted,\n onSessionSelect,\n}: {\n item: AgentChatInboxItem;\n adapter: InboxAdapter;\n onUpdated: (item: AgentChatInboxItem) => void;\n onDeleted: (itemId: number) => Promise<void>;\n onSessionSelect?: (sessionId: string) => void;\n}) {\n async function decide(decision: \"approve\" | \"reject\") {\n onUpdated(\n await adapter.respondGovernanceInboxItem({ itemId: item.id, decision }),\n );\n }\n const toolName =\n typeof item.payload.tool_name === \"string\" ? item.payload.tool_name : \"tool\";\n const args =\n typeof item.payload.arguments_excerpt === \"string\"\n ? item.payload.arguments_excerpt\n : \"\";\n const reason =\n typeof item.payload.deny_reason === \"string\" ? item.payload.deny_reason : \"\";\n const disabled = item.status !== \"pending\";\n return (\n <div className=\"space-y-4\">\n <div>\n <div className=\"text-base font-semibold text-foreground\">\n Approve {toolName}?\n </div>\n {reason && <p className=\"mt-1 text-sm text-muted-foreground\">{reason}</p>}\n </div>\n {args && (\n <pre className=\"overflow-x-auto border border-line bg-muted p-3 text-xs\">\n {args}\n </pre>\n )}\n <InboxDetailActions\n item={item}\n adapter={adapter}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n >\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={disabled}\n onClick={() => void decide(\"approve\")}\n >\n Approve\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"destructive\"\n disabled={disabled}\n onClick={() => void decide(\"reject\")}\n >\n Reject\n </Button>\n </InboxDetailActions>\n </div>\n );\n}\n\nfunction ActionRequiredDetail({\n item,\n adapter,\n onUpdated,\n onDeleted,\n onSessionSelect,\n}: {\n item: AgentChatInboxItem;\n adapter: InboxAdapter;\n onUpdated: (item: AgentChatInboxItem) => void;\n onDeleted: (itemId: number) => Promise<void>;\n onSessionSelect?: (sessionId: string) => void;\n}) {\n const [submitting, setSubmitting] = useState(false);\n const actionType =\n typeof item.payload.action_type === \"string\"\n ? item.payload.action_type\n : \"\";\n const context =\n typeof item.payload.context === \"string\" ? item.payload.context : \"\";\n const disabled =\n item.status !== \"pending\" || submitting || !adapter.respondActionRequiredInboxItem;\n\n async function complete() {\n if (!adapter.respondActionRequiredInboxItem) return;\n setSubmitting(true);\n try {\n onUpdated(await adapter.respondActionRequiredInboxItem({ itemId: item.id }));\n } finally {\n setSubmitting(false);\n }\n }\n\n return (\n <div className=\"space-y-4\">\n {item.body && <p className=\"whitespace-pre-wrap text-sm\">{item.body}</p>}\n {context && context !== item.body && (\n <p className=\"whitespace-pre-wrap text-sm text-muted-foreground\">\n {context}\n </p>\n )}\n {actionType && <Badge variant=\"secondary\">{actionType}</Badge>}\n <InboxDetailActions\n item={item}\n adapter={adapter}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n >\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void complete()}\n disabled={disabled}\n aria-label=\"Mark action complete\"\n >\n <CheckIcon className=\"size-3.5\" />\n {submitting ? \"Marking\" : \"I completed this\"}\n </Button>\n </InboxDetailActions>\n </div>\n );\n}\n\nfunction ProgressDetail({\n item,\n adapter,\n onUpdated,\n onDeleted,\n onSessionSelect,\n}: {\n item: AgentChatInboxItem;\n adapter: InboxAdapter;\n onUpdated: (item: AgentChatInboxItem) => void;\n onDeleted: (itemId: number) => Promise<void>;\n onSessionSelect?: (sessionId: string) => void;\n}) {\n async function acknowledge() {\n onUpdated(await adapter.acknowledgeInboxItem({ itemId: item.id }));\n }\n const rows: Array<[string, unknown]> = [];\n for (const row of [\n [\"Iterations\", item.payload.iterations] as [string, unknown],\n [\"Last tool\", item.payload.last_tool] as [string, unknown],\n [\"Elapsed\", item.payload.elapsed_seconds] as [string, unknown],\n ]) {\n if (row[1] !== undefined && row[1] !== null && row[1] !== \"\") {\n rows.push(row);\n }\n }\n return (\n <div className=\"space-y-3\">\n {item.body && <p className=\"whitespace-pre-wrap text-sm\">{item.body}</p>}\n {rows.length > 0 && (\n <dl className=\"space-y-1 text-xs text-muted-foreground\">\n {rows.map(([label, value]) => (\n <div key={String(label)} className=\"flex gap-2\">\n <dt className=\"w-20 shrink-0\">{String(label)}</dt>\n <dd className=\"min-w-0\">{String(value)}</dd>\n </div>\n ))}\n </dl>\n )}\n <InboxDetailActions\n item={item}\n adapter={adapter}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n >\n {item.status === \"pending\" && (\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void acknowledge()}\n aria-label=\"Acknowledge inbox item\"\n >\n <CheckIcon className=\"size-3.5\" />\n Acknowledge\n </Button>\n )}\n </InboxDetailActions>\n </div>\n );\n}\n\nfunction InboxDetail({\n item,\n adapter,\n onUpdated,\n onDeleted,\n onSessionSelect,\n}: {\n item: AgentChatInboxItem;\n adapter: InboxAdapter;\n onUpdated: (item: AgentChatInboxItem) => void;\n onDeleted: (itemId: number) => Promise<void>;\n onSessionSelect?: (sessionId: string) => void;\n}) {\n const Icon = kindIcon(item.kind);\n\n return (\n <section className=\"min-w-0 flex-1 overflow-y-auto p-6\">\n <div className=\"mb-5 flex min-w-0 items-start gap-3\">\n <div className=\"mt-0.5 flex size-8 shrink-0 items-center justify-center border border-line text-muted-foreground\">\n <Icon className=\"size-4\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"secondary\">{kindLabel(item.kind)}</Badge>\n <Badge variant={item.status === \"pending\" ? \"default\" : \"secondary\"}>\n {statusLabel(item.status)}\n </Badge>\n </div>\n <h2 className=\"mt-2 text-lg font-semibold leading-snug text-foreground\">\n {item.title}\n </h2>\n </div>\n </div>\n\n {item.kind === \"input_required\" ? (\n <InputRequiredDetail\n item={item}\n adapter={adapter}\n onUpdated={onUpdated}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n />\n ) : item.kind === \"action_required\" ? (\n <ActionRequiredDetail\n item={item}\n adapter={adapter}\n onUpdated={onUpdated}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n />\n ) : item.kind === \"governance_gate\" ? (\n <GovernanceDetail\n item={item}\n adapter={adapter}\n onUpdated={onUpdated}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n />\n ) : item.kind === \"progress_checkin\" ? (\n <ProgressDetail\n item={item}\n adapter={adapter}\n onUpdated={onUpdated}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n />\n ) : (\n <AckDetail\n item={item}\n adapter={adapter}\n onUpdated={onUpdated}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n />\n )}\n </section>\n );\n}\n\nexport function InboxPanel({\n adapter,\n title = \"Inbox\",\n selectedId,\n onSelectedIdChange,\n onSessionSelect,\n hideHeader = false,\n limit = DEFAULT_LIMIT,\n}: InboxPanelProps) {\n const inboxAdapter = useMemo(() => requireInboxAdapter(adapter), [adapter]);\n const [items, setItems] = useState<AgentChatInboxItem[]>([]);\n const [nextCursor, setNextCursor] = useState<string | null>(null);\n const [internalSelectedId, setInternalSelectedId] = useState<number | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const requestId = useRef(0);\n const selectedItemId = selectedId ?? internalSelectedId;\n const selectedItem = useMemo(\n () => items.find((item) => item.id === selectedItemId) ?? null,\n [items, selectedItemId],\n );\n\n const applyItem = useCallback((nextItem: AgentChatInboxItem) => {\n setItems((current) =>\n sortItems(\n current.map((item) => (item.id === nextItem.id ? nextItem : item)),\n ),\n );\n }, []);\n\n const selectItem = useCallback(\n async (itemId: number) => {\n if (selectedId === undefined) setInternalSelectedId(itemId);\n onSelectedIdChange?.(itemId);\n const item = await inboxAdapter.getInboxItem({ itemId });\n applyItem(item);\n if (!item.readAt) {\n applyItem(await inboxAdapter.markInboxItemRead({ itemId }));\n }\n },\n [applyItem, inboxAdapter, onSelectedIdChange, selectedId],\n );\n\n const load = useCallback(\n async (cursor?: string | null) => {\n const id = ++requestId.current;\n setLoading(true);\n setError(null);\n try {\n const response = await inboxAdapter.listInbox({\n cursor: cursor ?? undefined,\n limit,\n });\n if (id !== requestId.current) return;\n setItems((current) =>\n sortItems(cursor ? [...current, ...response.items] : response.items),\n );\n setNextCursor(response.nextCursor);\n } catch (err) {\n if (id === requestId.current) {\n setError(err instanceof Error ? err.message : \"Failed to load inbox\");\n }\n } finally {\n if (id === requestId.current) setLoading(false);\n }\n },\n [inboxAdapter, limit],\n );\n\n useEffect(() => {\n void load(null);\n }, [load]);\n\n useEffect(() => {\n const stream = inboxAdapter.openInboxStream();\n stream.addEventListener(\"item\", (event) => {\n const payload = JSON.parse(event.data) as { item_id?: unknown };\n if (typeof payload.item_id !== \"number\") return;\n void inboxAdapter.getInboxItem({ itemId: payload.item_id }).then(applyItem);\n });\n return () => stream.close();\n }, [applyItem, inboxAdapter]);\n\n function updateSelectedItem(item: AgentChatInboxItem) {\n applyItem(item);\n }\n\n const deleteItem = useCallback(\n async (itemId: number) => {\n if (!inboxAdapter.deleteInboxItem) return;\n await inboxAdapter.deleteInboxItem({ itemId });\n setItems((current) => current.filter((item) => item.id !== itemId));\n if (selectedItemId === itemId) {\n if (selectedId === undefined) setInternalSelectedId(null);\n onSelectedIdChange?.(null);\n }\n },\n [inboxAdapter, onSelectedIdChange, selectedId, selectedItemId],\n );\n\n return (\n <div className=\"flex h-full min-h-0 min-w-0 bg-background text-foreground\">\n <aside className=\"flex w-80 min-w-72 max-w-sm shrink-0 flex-col border-r border-line\">\n {!hideHeader && (\n <div className=\"flex min-h-14 items-center gap-2 border-b border-line px-4\">\n <InboxIcon className=\"size-4 text-muted-foreground\" />\n <h1 className=\"font-semibold\">{title}</h1>\n </div>\n )}\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {error && (\n <div className=\"px-4 py-3 text-sm text-destructive\">{error}</div>\n )}\n {!error && items.length === 0 && !loading && (\n <div className=\"px-4 py-8 text-sm text-muted-foreground\">\n No inbox items\n </div>\n )}\n {items.map((item) => {\n const Icon = kindIcon(item.kind);\n const selected = item.id === selectedItemId;\n return (\n <button\n key={item.id}\n type=\"button\"\n aria-label={`Open inbox item ${item.title}`}\n className={cn(\n \"flex w-full min-w-0 gap-3 border-l-2 px-3 py-3 text-left transition-colors hover:bg-input\",\n selected\n ? \"border-l-primary bg-line text-foreground\"\n : \"border-l-transparent text-subtle\",\n !item.readAt && \"font-medium text-foreground\",\n )}\n onClick={() => void selectItem(item.id)}\n >\n <Icon className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex min-w-0 items-center justify-between gap-2\">\n <span className=\"truncate text-xs uppercase tracking-wide text-muted-foreground\">\n {kindLabel(item.kind)}\n </span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {formatRelative(item.createdAt)}\n </span>\n </span>\n <span className=\"mt-1 block truncate text-sm\">{item.title}</span>\n <span className=\"mt-1 block text-xs text-muted-foreground\">\n {statusLabel(item.status)}\n </span>\n </span>\n </button>\n );\n })}\n {nextCursor && (\n <button\n type=\"button\"\n className=\"w-full px-3 py-3 text-sm text-muted-foreground hover:bg-input\"\n onClick={() => void load(nextCursor)}\n disabled={loading}\n >\n {loading ? \"Loading\" : \"Load more\"}\n </button>\n )}\n </div>\n </aside>\n {selectedItem ? (\n <InboxDetail\n item={selectedItem}\n adapter={inboxAdapter}\n onUpdated={updateSelectedItem}\n onDeleted={deleteItem}\n onSessionSelect={onSessionSelect}\n />\n ) : (\n <main className=\"flex min-w-0 flex-1 items-center justify-center px-4 text-sm text-muted-foreground\">\n Select an item\n </main>\n )}\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n\nimport { useEffect, useState } from \"react\";\nimport type { AgentChatAdapter, AgentChatInboxEventStream } from \"../../types\";\n\nexport interface InboxUnreadCountState {\n unreadCount: number;\n hasLoaded: boolean;\n error: string | null;\n}\n\nexport function useInboxUnreadCount(\n adapter: AgentChatAdapter,\n): InboxUnreadCountState {\n const [unreadCount, setUnreadCount] = useState(0);\n const [hasLoaded, setHasLoaded] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n let stream: AgentChatInboxEventStream | null = null;\n\n if (!adapter.listInbox || !adapter.openInboxStream) {\n setError(\"Inbox is not supported by this adapter.\");\n setHasLoaded(true);\n return () => {\n cancelled = true;\n };\n }\n\n adapter\n .listInbox({ status: \"pending\", limit: 200 })\n .then((response) => {\n if (cancelled) return;\n setUnreadCount(response.items.filter((item) => !item.readAt).length);\n setHasLoaded(true);\n })\n .catch((err) => {\n if (cancelled) return;\n setError(err instanceof Error ? err.message : \"Failed to load inbox\");\n setHasLoaded(true);\n });\n\n try {\n stream = adapter.openInboxStream();\n stream.addEventListener(\"snapshot\", (event) => {\n if (cancelled) return;\n const payload = JSON.parse(event.data) as { unread_ids?: unknown };\n const ids = Array.isArray(payload.unread_ids) ? payload.unread_ids : [];\n setUnreadCount(ids.length);\n setHasLoaded(true);\n });\n stream.addEventListener(\"item\", () => {\n if (cancelled) return;\n setUnreadCount((count) => count + 1);\n setHasLoaded(true);\n });\n stream.onerror = () => {\n if (!cancelled) setError(\"Inbox stream disconnected.\");\n };\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to open inbox stream\");\n }\n\n return () => {\n cancelled = true;\n stream?.close();\n };\n }, [adapter]);\n\n return { unreadCount, hasLoaded, error };\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n\nimport {\n type KeyboardEvent,\n type MouseEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport {\n CalendarClockIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n Trash2Icon,\n} from \"lucide-react\";\nimport { Badge } from \"../ui/badge\";\nimport { cn } from \"../../lib/utils\";\nimport type {\n AgentChatAdapter,\n AgentChatScheduledWorkItem,\n} from \"../../types\";\n\nexport interface ScheduledWorkPanelProps {\n adapter: AgentChatAdapter;\n agentId?: string;\n title?: string;\n limit?: number;\n status?: string;\n hideHeader?: boolean;\n pollIntervalMs?: number;\n onSessionSelect?: (sessionId: string) => void;\n onScheduleCancel?: (scheduleId: string) => void;\n onScheduleRunNow?: (scheduleId: string, sessionId?: string) => void;\n}\n\nconst DEFAULT_LIMIT = 50;\nconst DEFAULT_POLL_INTERVAL_MS = 30000;\n\nfunction fingerprint(items: AgentChatScheduledWorkItem[]): string {\n return items\n .map(\n (item) =>\n `${item.id}:${item.status}:${item.kind ?? \"\"}:${item.name ?? \"\"}:${\n item.prompt\n }:${item.scheduleDisplay}:${item.runCount}:${item.nextRunAt ?? \"\"}:${\n item.lastRunAt ?? \"\"\n }:${item.lastSessionId ?? \"\"}:${item.lastError ?? \"\"}:${\n item.updatedAt\n }`,\n )\n .join(\"|\");\n}\n\nfunction formatKind(value: string | null | undefined): string {\n if (value === \"dynamic_loop\") return \"Dynamic loop\";\n if (value === \"cron\") return \"Cron\";\n if (value === \"one_shot\") return \"One-shot\";\n if (value === \"scheduled\") return \"Scheduled\";\n if (!value) return \"Scheduled\";\n return value\n .split(/[_-]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nfunction formatRelative(\n value: string | null | undefined,\n label: string,\n future = false,\n): string | null {\n if (!value) return null;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n if (future && date.getTime() <= Date.now()) return `${label} due now`;\n return `${label} ${formatDistanceToNow(date, { addSuffix: true })}`;\n}\n\nfunction formatRuns(count: number): string {\n return `${count} ${count === 1 ? \"run\" : \"runs\"}`;\n}\n\nfunction scheduleTitle(item: AgentChatScheduledWorkItem): string {\n const title = item.name?.trim();\n if (title) return title;\n return item.prompt;\n}\n\nfunction canRunScheduleNow(item: AgentChatScheduledWorkItem): boolean {\n return item.repeatLimit === 1;\n}\n\nfunction scheduleDisplay(item: AgentChatScheduledWorkItem): string | null {\n if (item.kind === \"dynamic_loop\") return null;\n return item.scheduleDisplay;\n}\n\nfunction sortScheduledWork(\n items: AgentChatScheduledWorkItem[],\n): AgentChatScheduledWorkItem[] {\n return [...items].sort((a, b) => {\n if (a.status === \"active\" && b.status !== \"active\") return -1;\n if (a.status !== \"active\" && b.status === \"active\") return 1;\n const aNext = a.nextRunAt ?? \"\";\n const bNext = b.nextRunAt ?? \"\";\n if (aNext && bNext && aNext !== bNext) return aNext < bNext ? -1 : 1;\n if (aNext && !bNext) return -1;\n if (!aNext && bNext) return 1;\n return (a.updatedAt ?? \"\") > (b.updatedAt ?? \"\") ? -1 : 1;\n });\n}\n\nfunction ScheduledWorkRow({\n item,\n canRunNow,\n canCancel,\n actionScheduleId,\n onOpenLastRun,\n onRunNow,\n onCancel,\n}: {\n item: AgentChatScheduledWorkItem;\n canRunNow: boolean;\n canCancel: boolean;\n actionScheduleId: string | null;\n onOpenLastRun: (sessionId: string) => void;\n onRunNow: (scheduleId: string) => void;\n onCancel: (scheduleId: string) => void;\n}) {\n const isActive = item.status === \"active\";\n const disabled = actionScheduleId === item.id;\n const title = scheduleTitle(item);\n const statusText = item.status === \"active\" ? null : item.status;\n const showRunNow = canRunNow && isActive && canRunScheduleNow(item);\n const lastSessionId = item.lastSessionId ?? null;\n const meta = [\n scheduleDisplay(item),\n formatRelative(item.nextRunAt, \"Next\", true),\n formatRelative(item.lastRunAt, \"Last\"),\n formatRuns(item.runCount),\n item.expiresAt ? formatRelative(item.expiresAt, \"Expires\", true) : null,\n ].filter(Boolean);\n const openLastRun = () => {\n if (lastSessionId) onOpenLastRun(lastSessionId);\n };\n const handleRowKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (!lastSessionId) return;\n if (e.key !== \"Enter\" && e.key !== \" \") return;\n e.preventDefault();\n openLastRun();\n };\n const stopActionClick = (e: MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n };\n\n return (\n <div\n className={cn(\n \"group flex min-w-0 items-start gap-2 border-l-2 border-l-transparent px-3 py-2 text-sm transition-colors hover:border-l-primary hover:bg-input\",\n lastSessionId && \"cursor-pointer\",\n )}\n onClick={openLastRun}\n onKeyDown={handleRowKeyDown}\n role={lastSessionId ? \"button\" : undefined}\n tabIndex={lastSessionId ? 0 : undefined}\n aria-label={lastSessionId ? `Open last run for ${title}` : undefined}\n title={lastSessionId ? \"Open last run\" : undefined}\n >\n <div className=\"mt-0.5 flex size-5 shrink-0 items-center justify-center text-faint\">\n <CalendarClockIcon className=\"size-3.5\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-foreground\">{title}</div>\n <div className=\"mt-0.5 flex min-w-0 items-center gap-2\">\n <Badge variant=\"secondary\" className=\"shrink-0\">\n {formatKind(item.kind)}\n </Badge>\n </div>\n {meta.length > 0 && (\n <div className=\"mt-0.5 space-y-0.5 text-xs text-faint\">\n {meta.map((line) => (\n <div key={line} className=\"truncate\">\n {line}\n </div>\n ))}\n </div>\n )}\n </div>\n {statusText && (\n <Badge variant=\"destructive\" className=\"shrink-0\">\n {statusText}\n </Badge>\n )}\n </div>\n {item.lastError && (\n <div className=\"mt-1 line-clamp-2 text-xs text-destructive\">\n {item.lastError}\n </div>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {showRunNow && (\n <button\n type=\"button\"\n className=\"rounded p-1 text-faint opacity-70 transition-all hover:bg-line hover:text-foreground disabled:pointer-events-none disabled:opacity-40 group-hover:opacity-100\"\n onClick={(e) => {\n stopActionClick(e);\n onRunNow(item.id);\n }}\n aria-label=\"Run schedule now\"\n title=\"Run schedule now\"\n disabled={disabled}\n >\n <CalendarClockIcon className=\"size-3.5\" />\n </button>\n )}\n {canCancel && isActive && (\n <button\n type=\"button\"\n className=\"rounded p-1 text-faint opacity-70 transition-all hover:bg-destructive/10 hover:text-destructive disabled:pointer-events-none disabled:opacity-40 group-hover:opacity-100\"\n onClick={(e) => {\n stopActionClick(e);\n onCancel(item.id);\n }}\n aria-label=\"Cancel schedule\"\n title=\"Cancel schedule\"\n disabled={disabled}\n >\n <Trash2Icon className=\"size-3.5\" />\n </button>\n )}\n </div>\n </div>\n );\n}\n\nexport function ScheduledWorkPanel({\n adapter,\n agentId,\n title = \"Scheduled Work\",\n limit = DEFAULT_LIMIT,\n status = \"active\",\n hideHeader = false,\n pollIntervalMs = DEFAULT_POLL_INTERVAL_MS,\n onSessionSelect,\n onScheduleCancel,\n onScheduleRunNow,\n}: ScheduledWorkPanelProps) {\n const [items, setItems] = useState<AgentChatScheduledWorkItem[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [hasEverLoaded, setHasEverLoaded] = useState(false);\n const [actionScheduleId, setActionScheduleId] = useState<string | null>(null);\n const [collapsed, setCollapsed] = useState(false);\n const mounted = useRef(true);\n const requestId = useRef(0);\n const lastFingerprint = useRef(\"\");\n\n const refetch = useCallback(\n async (opts?: { silent?: boolean }) => {\n if (!adapter.listScheduledWork) {\n setItems([]);\n setHasEverLoaded(true);\n return;\n }\n const currentRequestId = ++requestId.current;\n try {\n const list = await adapter.listScheduledWork({\n agentId,\n status,\n limit,\n });\n if (!mounted.current || currentRequestId !== requestId.current) return;\n const nextItems = sortScheduledWork(list.items);\n const fp = fingerprint(nextItems);\n if (fp !== lastFingerprint.current) {\n lastFingerprint.current = fp;\n setItems(nextItems);\n }\n setError(null);\n setHasEverLoaded(true);\n } catch (e) {\n if (!mounted.current || currentRequestId !== requestId.current) return;\n if (!opts?.silent) {\n setError(\n e instanceof Error ? e.message : \"Failed to load scheduled work\",\n );\n setHasEverLoaded(true);\n }\n }\n },\n [adapter, agentId, limit, status],\n );\n\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n useEffect(() => {\n setError(null);\n lastFingerprint.current = \"\";\n void refetch();\n }, [refetch]);\n\n useEffect(() => {\n if (!adapter.listScheduledWork || pollIntervalMs <= 0) return;\n const id = setInterval(() => {\n void refetch({ silent: true });\n }, pollIntervalMs);\n return () => clearInterval(id);\n }, [adapter.listScheduledWork, pollIntervalMs, refetch]);\n\n const activeCount = useMemo(\n () => items.filter((item) => item.status === \"active\").length,\n [items],\n );\n\n const handleOpenLastRun = useCallback(\n (sessionId: string) => {\n onSessionSelect?.(sessionId);\n },\n [onSessionSelect],\n );\n\n const handleRunNow = useCallback(\n async (scheduleId: string) => {\n if (!adapter.runScheduledWorkNow || actionScheduleId) return;\n setActionScheduleId(scheduleId);\n try {\n const result = await adapter.runScheduledWorkNow({ scheduleId });\n onScheduleRunNow?.(scheduleId, result?.sessionId);\n await refetch({ silent: true });\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to run schedule\");\n } finally {\n if (mounted.current) setActionScheduleId(null);\n }\n },\n [actionScheduleId, adapter, onScheduleRunNow, refetch],\n );\n\n const handleCancel = useCallback(\n async (scheduleId: string) => {\n if (!adapter.cancelScheduledWork || actionScheduleId) return;\n setActionScheduleId(scheduleId);\n try {\n await adapter.cancelScheduledWork({ scheduleId });\n setItems((current) => {\n const next = current.filter((item) => item.id !== scheduleId);\n lastFingerprint.current = fingerprint(next);\n return next;\n });\n onScheduleCancel?.(scheduleId);\n await refetch({ silent: true });\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to cancel schedule\");\n } finally {\n if (mounted.current) setActionScheduleId(null);\n }\n },\n [actionScheduleId, adapter, onScheduleCancel, refetch],\n );\n\n if (!hasEverLoaded) return null;\n if (!adapter.listScheduledWork) return null;\n\n const showBody = hideHeader || !collapsed;\n\n return (\n <section className=\"min-w-0 border-t border-line\">\n {!hideHeader && (\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-1.5 px-3 py-2 text-left text-xs font-semibold uppercase tracking-wide text-foreground transition-colors hover:bg-input\"\n onClick={() => setCollapsed((current) => !current)}\n aria-expanded={!collapsed}\n >\n <CalendarClockIcon className=\"size-3.5\" />\n <span className=\"truncate\">{title}</span>\n {activeCount > 0 && (\n <Badge variant=\"default\" className=\"ml-auto\">\n {activeCount}\n </Badge>\n )}\n {collapsed ? (\n <ChevronRightIcon className=\"size-3.5 shrink-0 text-faint\" />\n ) : (\n <ChevronDownIcon className=\"size-3.5 shrink-0 text-faint\" />\n )}\n </button>\n )}\n {showBody && error && (\n <div className=\"px-3 py-2 text-xs text-destructive\">{error}</div>\n )}\n {showBody && !error && items.length === 0 && (\n <div className=\"px-3 py-2 text-xs text-faint\">No scheduled work</div>\n )}\n {showBody && !error && items.length > 0 && (\n <div className={cn(\"pb-2\", hideHeader && \"pt-1\")}>\n {items.map((item) => (\n <ScheduledWorkRow\n key={item.id}\n item={item}\n canRunNow={Boolean(adapter.runScheduledWorkNow)}\n canCancel={Boolean(adapter.cancelScheduledWork)}\n actionScheduleId={actionScheduleId}\n onOpenLastRun={handleOpenLastRun}\n onRunNow={handleRunNow}\n onCancel={handleCancel}\n />\n ))}\n </div>\n )}\n </section>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// \"Running\" panel -- live view of the current session's sub-agents and\n// delegation children. Loads `/v1/sessions/{id}/tree`, polls on a\n// cadence that adapts to whether any child is still running, and lets\n// the user open or stop each child.\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport {\n ChevronDownIcon,\n ChevronRightIcon,\n Loader2Icon,\n SquareIcon,\n Trash2Icon,\n UsersIcon,\n} from \"lucide-react\";\nimport { Badge } from \"../ui/badge\";\nimport { cn } from \"../../lib/utils\";\nimport type {\n AgentChatAdapter,\n AgentChatSession,\n AgentChatSessionTreeNode,\n} from \"../../types\";\n\nexport interface SessionTreePanelProps {\n adapter: AgentChatAdapter;\n sessionId?: string | null;\n activeSessionId?: string;\n agentId?: string;\n title?: string;\n sessionListLimit?: number;\n /** Treat the root as hidden, so its children appear as top-level rows. */\n hideRoot?: boolean;\n /** Suppress the header row (icon + title + running count badge). */\n hideHeader?: boolean;\n /**\n * Fetch the tenant's full session list via ``adapter.listSessions`` and\n * merge it with the per-session tree. Off by default; the panel renders\n * only the tree of ``sessionId`` unless this is set.\n */\n loadList?: boolean;\n onSessionSelect?: (sessionId: string) => void;\n onSessionDelete?: (sessionId: string) => void;\n}\n\ninterface TreeEntry extends AgentChatSessionTreeNode {\n children: TreeEntry[];\n}\n\n// Poll cadence: tight while any sub-agent is still running, relaxed\n// when every child has settled. The idle cadence still exists so\n// newly-spawned children surface without a page reload, but without\n// charging the user 15 req/min for a frozen tree.\nconst POLL_INTERVAL_ACTIVE_MS = 4000;\nconst POLL_INTERVAL_IDLE_MS = 30000;\nconst DEFAULT_SESSION_LIST_LIMIT = 50;\n\nfunction buildTree(nodes: AgentChatSessionTreeNode[]): TreeEntry[] {\n const byId = new Map<string, TreeEntry>();\n for (const n of nodes) byId.set(n.id, { ...n, children: [] });\n const roots: TreeEntry[] = [];\n for (const n of byId.values()) {\n const parent = n.parentId ? byId.get(n.parentId) : undefined;\n if (parent) {\n parent.children.push(n);\n } else {\n roots.push(n);\n }\n }\n const sortRec = (e: TreeEntry) => {\n // ISO-8601 timestamps sort lexicographically; plain string compare\n // is ~10x faster than localeCompare and poll frequency keeps this\n // on the hot path for large trees.\n e.children.sort((a, b) => (a.createdAt < b.createdAt ? -1 : 1));\n for (const c of e.children) sortRec(c);\n };\n for (const r of roots) sortRec(r);\n return roots;\n}\n\nfunction treeFingerprint(nodes: AgentChatSessionTreeNode[]): string {\n // Cheap signature: only the fields that affect rendering. If the\n // server returns structurally-identical data, skip the setState and\n // the entire rebuild / re-render cascade.\n return nodes\n .map(\n (n) =>\n `${n.id}:${n.parentId ?? \"\"}:${n.status}:${n.agentType ?? \"\"}:${\n n.runKind ?? \"\"\n }:${n.title ?? \"\"}:${n.messageCount ?? 0}:${n.toolCallCount ?? 0}:${\n n.updatedAt\n }`,\n )\n .join(\"|\");\n}\n\nfunction sessionToTreeNode(session: AgentChatSession): AgentChatSessionTreeNode {\n const timestamp = session.updatedAt ?? session.createdAt ?? \"\";\n return {\n id: session.id,\n parentId: session.parentId ?? null,\n agentId: session.agentId,\n channel: session.channel,\n runKind: session.runKind ?? deriveRunKind(session.channel, session.config),\n status: session.status,\n title: session.title,\n model: session.model,\n messageCount: session.messageCount,\n toolCallCount: session.toolCallCount,\n createdAt: session.createdAt ?? timestamp,\n updatedAt: session.updatedAt ?? timestamp,\n };\n}\n\nfunction mergeNodeFields(\n current: AgentChatSessionTreeNode,\n next: AgentChatSessionTreeNode,\n): AgentChatSessionTreeNode {\n return {\n ...current,\n ...Object.fromEntries(\n Object.entries(next).filter(([, value]) => value !== undefined),\n ),\n messageCount: next.messageCount ?? current.messageCount,\n toolCallCount: next.toolCallCount ?? current.toolCallCount,\n } as AgentChatSessionTreeNode;\n}\n\nfunction mergeTreeNodes(\n groups: AgentChatSessionTreeNode[][],\n): AgentChatSessionTreeNode[] {\n const byId = new Map<string, AgentChatSessionTreeNode>();\n for (const group of groups) {\n for (const node of group) {\n const current = byId.get(node.id);\n byId.set(node.id, current ? mergeNodeFields(current, node) : node);\n }\n }\n return Array.from(byId.values());\n}\n\nfunction pruneDeletedSessionNodes(\n nodes: AgentChatSessionTreeNode[],\n deletedSessionId: string,\n): AgentChatSessionTreeNode[] {\n const deletedIds = new Set([deletedSessionId]);\n let changed = true;\n while (changed) {\n changed = false;\n for (const node of nodes) {\n if (node.parentId && deletedIds.has(node.parentId) && !deletedIds.has(node.id)) {\n deletedIds.add(node.id);\n changed = true;\n }\n }\n }\n return nodes.filter((node) => !deletedIds.has(node.id));\n}\n\nfunction formatSessionTime(value: string): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"\";\n return formatDistanceToNow(date, { addSuffix: true });\n}\n\nfunction deriveRunKind(\n channel: string | null | undefined,\n config: Record<string, unknown> | undefined,\n): string | null {\n if (channel === \"scheduled\" && config?.scheduled_dynamic_loop === true) {\n return \"dynamic_loop\";\n }\n if (channel === \"scheduled\") return \"scheduled\";\n return null;\n}\n\nfunction formatRunKind(value: string | null | undefined): string | null {\n if (value === \"dynamic_loop\") return \"Loop\";\n if (value === \"scheduled\") return \"Scheduled\";\n return null;\n}\n\nfunction fallbackSessionTitle(entry: AgentChatSessionTreeNode): string {\n if (entry.runKind === \"dynamic_loop\") return \"Loop run\";\n if (entry.runKind === \"scheduled\") return \"Scheduled run\";\n return \"New session\";\n}\n\nfunction TreeNodeRow({\n entry,\n depth,\n activeSessionId,\n canStop,\n canDelete,\n deletingSessionId,\n onSelect,\n onStop,\n onDelete,\n}: {\n entry: TreeEntry;\n depth: number;\n activeSessionId: string;\n canStop: boolean;\n canDelete: boolean;\n deletingSessionId: string | null;\n onSelect: (sessionId: string) => void;\n onStop: (sessionId: string) => void;\n onDelete: (sessionId: string) => void;\n}) {\n const [expanded, setExpanded] = useState(true);\n const hasChildren = entry.children.length > 0;\n const isActive = entry.id === activeSessionId;\n const isRunning = entry.status === \"active\";\n // Only child sessions can be stopped from the tree; top-level sessions use\n // the main composer stop control.\n const isChildSession = entry.parentId != null;\n const title = entry.title ?? fallbackSessionTitle(entry);\n const subtitle = [\n formatRunKind(entry.runKind),\n entry.model ?? entry.agentType,\n formatSessionTime(entry.updatedAt),\n ].filter(Boolean).join(\" · \");\n\n return (\n <>\n {/* eslint-disable-next-line jsx-a11y/prefer-tag-over-role --\n The row has nested interactive elements (chevron + stop); a\n button-in-button would be invalid HTML. Match the existing\n pattern from navbar.tsx / skills-page.tsx sidebar rows. */}\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => onSelect(entry.id)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") onSelect(entry.id);\n }}\n className={cn(\n \"group flex items-center gap-2 w-full py-2 pr-2 text-left cursor-pointer transition-colors border-l-2\",\n isActive\n ? \"bg-line text-foreground border-l-primary\"\n : \"bg-transparent text-subtle hover:bg-input hover:text-foreground border-l-transparent\",\n )}\n style={{ paddingLeft: `${depth * 12 + 12}px` }}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n className=\"p-0.5 rounded hover:bg-line shrink-0\"\n onClick={(e) => {\n e.stopPropagation();\n setExpanded(!expanded);\n }}\n aria-label={expanded ? \"Collapse\" : \"Expand\"}\n aria-expanded={expanded}\n >\n {expanded ? (\n <ChevronDownIcon className=\"w-3.5 h-3.5\" />\n ) : (\n <ChevronRightIcon className=\"w-3.5 h-3.5\" />\n )}\n </button>\n ) : (\n <span className=\"w-4 h-4 shrink-0\" />\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm truncate\">{title}</div>\n <div className=\"text-xs text-faint truncate\">{subtitle}</div>\n </div>\n {isRunning && canStop && isChildSession && (\n <button\n type=\"button\"\n className=\"p-1 rounded opacity-0 group-hover:opacity-100 hover:bg-destructive/10 hover:text-destructive transition-all\"\n onClick={(e) => {\n e.stopPropagation();\n onStop(entry.id);\n }}\n aria-label=\"Stop child session\"\n title=\"Stop child session\"\n >\n <SquareIcon className=\"w-3 h-3\" fill=\"currentColor\" />\n </button>\n )}\n {canDelete && (\n <button\n type=\"button\"\n className={cn(\n \"p-1 rounded hover:bg-destructive/10 hover:text-destructive disabled:pointer-events-none transition-all\",\n deletingSessionId === entry.id\n ? \"opacity-100\"\n : \"opacity-0 group-hover:opacity-100 focus-visible:opacity-100\",\n )}\n onClick={(e) => {\n e.stopPropagation();\n onDelete(entry.id);\n }}\n aria-label=\"Delete session\"\n title=\"Delete session\"\n disabled={deletingSessionId === entry.id}\n >\n {deletingSessionId === entry.id ? (\n <Loader2Icon className=\"w-3 h-3 animate-spin\" />\n ) : (\n <Trash2Icon className=\"w-3 h-3\" />\n )}\n </button>\n )}\n </div>\n {hasChildren && expanded &&\n entry.children.map((child) => (\n <TreeNodeRow\n key={child.id}\n entry={child}\n depth={depth + 1}\n activeSessionId={activeSessionId}\n canStop={canStop}\n canDelete={canDelete}\n deletingSessionId={deletingSessionId}\n onSelect={onSelect}\n onStop={onStop}\n onDelete={onDelete}\n />\n ))}\n </>\n );\n}\n\nexport function SessionTreePanel({\n adapter,\n sessionId = null,\n activeSessionId = sessionId ?? undefined,\n agentId,\n title = \"Running\",\n sessionListLimit = DEFAULT_SESSION_LIST_LIMIT,\n hideRoot = false,\n hideHeader = false,\n loadList = false,\n onSessionSelect,\n onSessionDelete,\n}: SessionTreePanelProps) {\n const [nodes, setNodes] = useState<AgentChatSessionTreeNode[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [hasEverLoaded, setHasEverLoaded] = useState(false);\n const [deletingSessionId, setDeletingSessionId] = useState<string | null>(\n null,\n );\n\n // Guard async setters from firing after unmount.\n const mounted = useRef(true);\n // Monotonic fetch id. If a route change or newer poll starts while an\n // older request is in flight, only the newest response may update state.\n const requestId = useRef(0);\n // Previous payload fingerprint -- skip setState when unchanged so we\n // don't rebuild the tree and re-render every row on every poll of a\n // frozen session.\n const lastFingerprint = useRef<string>(\"\");\n const resetContext = useRef<{\n loadList: boolean;\n agentId?: string;\n sessionListLimit: number;\n } | null>(null);\n\n const refetch = useCallback(\n async (opts?: { silent?: boolean }) => {\n const canLoadSessionList = Boolean(loadList && adapter.listSessions);\n const canLoadSessionTree = Boolean(sessionId && adapter.getSessionTree);\n if (!canLoadSessionList && !canLoadSessionTree) {\n setNodes([]);\n setHasEverLoaded(true);\n return;\n }\n const currentRequestId = ++requestId.current;\n try {\n const sessionListPromise =\n loadList && adapter.listSessions\n ? adapter.listSessions({\n agentId,\n limit: sessionListLimit,\n })\n : Promise.resolve(null);\n const sessionTreePromise =\n sessionId && adapter.getSessionTree\n ? adapter.getSessionTree({ sessionId })\n : Promise.resolve(null);\n const [sessionList, sessionTree] = await Promise.all([\n sessionListPromise,\n sessionTreePromise,\n ]);\n if (!mounted.current || currentRequestId !== requestId.current) return;\n const nextNodes = mergeTreeNodes([\n sessionList?.sessions.map(sessionToTreeNode) ?? [],\n sessionTree?.nodes ?? [],\n ]);\n const fp = treeFingerprint(nextNodes);\n if (fp !== lastFingerprint.current) {\n lastFingerprint.current = fp;\n setNodes(nextNodes);\n }\n setError(null);\n setHasEverLoaded(true);\n } catch (e) {\n if (!mounted.current || currentRequestId !== requestId.current) return;\n // Silent polls must not clobber the last-known-good view --\n // one transient failure would otherwise flip the panel to a\n // red error block until the next successful poll.\n if (!opts?.silent) {\n setError(e instanceof Error ? e.message : \"Failed to load tree\");\n }\n }\n },\n [adapter, agentId, loadList, sessionId, sessionListLimit],\n );\n\n // Mount / unmount flag for the component lifetime.\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n useEffect(() => {\n const previous = resetContext.current;\n const shouldReset =\n !previous ||\n previous.loadList !== loadList ||\n previous.agentId !== agentId ||\n previous.sessionListLimit !== sessionListLimit;\n resetContext.current = { loadList, agentId, sessionListLimit };\n\n if (shouldReset) {\n setNodes([]);\n setHasEverLoaded(false);\n lastFingerprint.current = \"\";\n }\n setError(null);\n void refetch();\n }, [adapter, agentId, loadList, refetch, sessionListLimit]);\n\n // Adaptive polling: 4s while any child is running, 30s when every\n // child has settled. Pulling the interval from ``nodes`` lets the\n // effect re-run whenever the tree changes state.\n const runningCount = useMemo(\n () => nodes.filter((n) => n.status === \"active\").length,\n [nodes],\n );\n useEffect(() => {\n const interval =\n runningCount > 0 ? POLL_INTERVAL_ACTIVE_MS : POLL_INTERVAL_IDLE_MS;\n const id = setInterval(() => {\n void refetch({ silent: true });\n }, interval);\n return () => clearInterval(id);\n }, [refetch, runningCount]);\n\n const roots = useMemo(() => buildTree(nodes), [nodes]);\n\n const handleSelect = useCallback(\n (id: string) => {\n onSessionSelect?.(id);\n },\n [onSessionSelect],\n );\n\n const handleStop = useCallback(\n async (id: string) => {\n if (!adapter.stopSession) return;\n try {\n await adapter.stopSession({ sessionId: id });\n await refetch({ silent: true });\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to stop sub-agent\");\n }\n },\n [adapter, refetch],\n );\n\n const handleDelete = useCallback(\n async (id: string) => {\n if (!adapter.deleteSession || deletingSessionId) return;\n setDeletingSessionId(id);\n try {\n await adapter.deleteSession({ sessionId: id });\n setNodes((current) => {\n const next = pruneDeletedSessionNodes(current, id);\n lastFingerprint.current = treeFingerprint(next);\n return next;\n });\n onSessionDelete?.(id);\n await refetch({ silent: true });\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to delete session\");\n } finally {\n if (mounted.current) setDeletingSessionId(null);\n }\n },\n [adapter, deletingSessionId, onSessionDelete, refetch],\n );\n\n // Hide the panel until the first fetch has completed so we don't\n // flash an empty \"Loading...\" header for sessions with no sub-agents.\n if (!hasEverLoaded) return null;\n if (nodes.length === 0) return null;\n\n const topLevel: TreeEntry[] = hideRoot\n ? roots.flatMap((r) => r.children)\n : roots;\n if (topLevel.length === 0) return null;\n\n return (\n <>\n {!hideHeader && (\n <div className=\"border-t border-line flex items-center gap-1.5 px-3 py-2 text-xs font-semibold uppercase tracking-wide\">\n <UsersIcon className=\"w-3.5 h-3.5\" />\n <span>{title}</span>\n {runningCount > 0 && (\n <Badge variant=\"default\" className=\"h-4 px-1.5 text-[10px] ml-auto\">\n {runningCount}\n </Badge>\n )}\n </div>\n )}\n {error && (\n <div className=\"px-3 py-2 text-xs text-destructive\">{error}</div>\n )}\n {!error && (\n <div className=\"px-1 pb-2\">\n {topLevel.map((entry) => (\n <TreeNodeRow\n key={entry.id}\n entry={entry}\n depth={0}\n activeSessionId={activeSessionId ?? \"\"}\n canStop={Boolean(adapter.stopSession)}\n canDelete={Boolean(adapter.deleteSession)}\n deletingSessionId={deletingSessionId}\n onSelect={handleSelect}\n onStop={handleStop}\n onDelete={handleDelete}\n />\n ))}\n </div>\n )}\n </>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapter-context.tsx","../src/components/ui/button.tsx","../src/components/browser/browser-control-bar.tsx","../src/components/browser/browser-live-view.tsx","../src/components/browser/browser-status-dot.tsx","../src/components/ui/dialog.tsx","../src/components/ui/tooltip.tsx","../src/components/browser/browser-pane.tsx","../src/components/ai-elements/conversation.tsx","../src/components/ui/separator.tsx","../src/components/ai-elements/message.tsx","../src/components/ui/collapsible.tsx","../src/components/ai-elements/shimmer.tsx","../src/components/ai-elements/reasoning.tsx","../src/components/reui/timeline.tsx","../src/components/browser/browser-activity-group.tsx","../src/components/chat/tools/shared.ts","../src/components/chat/tools/terminal-tool.tsx","../src/components/ui/scroll-area.tsx","../src/components/ai-elements/queue.tsx","../src/components/chat/tools/todo-tool.tsx","../src/components/ai-elements/code-block.tsx","../src/components/ui/tabs.tsx","../src/components/ui/badge.tsx","../src/components/ai-elements/tool.tsx","../src/components/ai-elements/sandbox.tsx","../src/components/chat/tools/execute-code-tool.tsx","../src/components/chat/tools/oneliner-tools.tsx","../src/components/chat/tools/web-extract-tool.tsx","../src/components/chat/diff-viewer.tsx","../src/components/chat/tools/file-tools.tsx","../src/components/ai-elements/terminal.tsx","../src/components/chat/tools/process-tool.tsx","../src/components/ui/textarea.tsx","../src/components/chat/tools/expert-tool.tsx","../src/components/chat/tools/skill-tools.tsx","../src/components/ui/input.tsx","../src/components/chat/tools/clarify-tool.tsx","../src/components/chat/tools/artifact-tool.tsx","../src/components/chat/tools/delegate-tool.tsx","../src/components/chat/tools/memory-tool.tsx","../src/components/chat/tools/skill-manage-tool.tsx","../src/components/chat/tools/coordinator-tools.tsx","../src/components/chat/tools/default-tool.tsx","../src/components/chat/tool-call-block.tsx","../src/components/chat/tools/web-search-tool.tsx","../src/components/chat/chat-message.tsx","../src/components/ui/input-group.tsx","../src/components/ui/command.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/hover-card.tsx","../src/components/ui/spinner.tsx","../src/components/ai-elements/prompt-input.tsx","../src/components/ui/progress.tsx","../src/components/ai-elements/context.tsx","../src/components/ui/item.tsx","../src/components/ui/popover.tsx","../src/components/chat/chat-composer.tsx","../src/components/chat/use-smooth-stream.ts","../src/components/ai-elements/artifact.tsx","../src/components/chat/artifacts/artifact-markdown.tsx","../src/components/chat/artifacts/artifact-table.tsx","../src/components/chat/artifacts/artifact-html.tsx","../src/components/chat/artifacts/artifact-svg.tsx","../src/components/chat/artifacts/artifact-export.ts","../src/components/chat/artifacts/artifact-block.tsx","../src/components/chat/error-message.tsx","../src/components/chat/chat-thread.tsx","../src/components/ai-elements/file-tree.tsx","../src/components/ui/skeleton.tsx","../src/lib/format.ts","../src/components/workspace/file-viewer.tsx","../src/components/workspace/workspace-panel.tsx","../src/lib/sessions.ts","../src/runtime/events.ts","../src/runtime/reducer.ts","../src/runtime/use-agent-chat-runtime.ts","../src/agent-chat.tsx","../src/components/inbox/inbox-panel.tsx","../src/components/inbox/use-inbox-unread-count.ts","../src/components/ui/card.tsx","../src/components/missions/mission-derive.ts","../src/components/missions/mission-dashboard.tsx","../src/components/missions/missions-panel.tsx","../src/components/scheduled/scheduled-work-panel.tsx","../src/components/sessions/session-tree-panel.tsx"],"names":["jsx","DialogPrimitive","jsxs","TooltipPrimitive","useState","Fragment","useCallback","SeparatorPrimitive","createContext","CollapsiblePrimitive","useMemo","memo","useContext","useEffect","streamdownPlugins","cjk","code","math","mermaid","Streamdown","Slot","ZapIcon","ChevronDownIcon","ScrollAreaPrimitive","useRef","CopyIcon","TabsPrimitive","cva","toolLabel","CheckIcon","XIcon","i","DiffViewer","fileName","parseArgs","parseResult","ClockIcon","Loader2Icon","ChevronRightIcon","firstLine","XCircleIcon","CheckCircle2Icon","parseResultCount","SearchIcon","ChatMessage","FileIcon","CommandPrimitive","DropdownMenuPrimitive","HoverCardPrimitive","ProgressPrimitive","PopoverPrimitive","iconForMime","FileAudio","FileVideo","FileText","FileCode","FileArchive","FileSpreadsheet","formatBytes","DownloadIcon","Maximize2Icon","ErrorMessage","AlertTriangle","ChevronDown","ChevronRight","groupRetry","ImageIcon","ChevronLeftIcon","PlusIcon","SKELETON_WIDTHS","TrashIcon","FolderOpenIcon","AlertCircleIcon","stringValue","findLastAssistantIndex","session","KIND_LABEL","MessageSquareIcon","CircleDotIcon","Trash2Icon","truncate","mission","RefreshCw","DEFAULT_POLL_INTERVAL_MS","formatDistanceToNow","Pause","Play","Ban","DEFAULT_LIMIT","fingerprint","formatRelative","SquareIcon"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { AgentChatAdapter } from \"./types\";\n\nexport interface AgentChatAdapterContextValue {\n adapter: AgentChatAdapter;\n sessionId: string | null;\n onFileSelect?: (path: string) => void;\n}\n\nconst AgentChatAdapterContext =\n createContext<AgentChatAdapterContextValue | null>(null);\n\nexport const NO_BROWSER_ADAPTER: Pick<\n AgentChatAdapter,\n | \"getBrowserState\"\n | \"getBrowserPreviewSnapshot\"\n | \"acquireBrowserControl\"\n | \"releaseBrowserControl\"\n | \"browserLiveViewUrl\"\n> = {\n async getBrowserState() {\n return null;\n },\n async getBrowserPreviewSnapshot() {\n return null;\n },\n async acquireBrowserControl() {\n throw new Error(\"Browser control is not supported by this adapter.\");\n },\n async releaseBrowserControl() {\n // Releasing unsupported browser control is intentionally a no-op.\n },\n browserLiveViewUrl() {\n return \"\";\n },\n};\n\nexport const AgentChatAdapterProvider = AgentChatAdapterContext.Provider;\n\nexport function useAgentChatAdapterContext(): AgentChatAdapterContextValue {\n const value = useContext(AgentChatAdapterContext);\n if (!value) {\n throw new Error(\n \"useAgentChatAdapterContext must be used inside AgentChatAdapterProvider\",\n );\n }\n return value;\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-none border border-transparent bg-clip-padding text-xs font-semibold tracking-widest whitespace-nowrap uppercase transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-2 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-2 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-3.5\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-transparent hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-input/30\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 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 underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-10 gap-1.5 px-6 has-data-[icon=inline-end]:pr-4 has-data-[icon=inline-start]:pl-4\",\n xs: \"h-7 gap-1 px-3 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-9 gap-1 px-4 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3\",\n lg: \"h-11 gap-1.5 px-8 has-data-[icon=inline-end]:pr-5 has-data-[icon=inline-start]:pl-5\",\n icon: \"size-10\",\n \"icon-xs\": \"size-7 [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-9\",\n \"icon-lg\": \"size-11\",\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 { MousePointer2Icon, RotateCcwIcon } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Button } from \"../ui/button\";\nimport type { AgentChatAdapter } from \"../../types\";\n\ntype BrowserControlAdapter = Pick<\n AgentChatAdapter,\n \"acquireBrowserControl\" | \"releaseBrowserControl\"\n>;\n\ninterface BrowserControlBarProps {\n sessionId: string;\n hasControl: boolean;\n adapter: BrowserControlAdapter;\n onControlAcquired?: () => void;\n onControlReleased?: () => void;\n}\n\nexport function BrowserControlBar({\n sessionId,\n hasControl,\n adapter,\n onControlAcquired,\n onControlReleased,\n}: BrowserControlBarProps) {\n const [pending, setPending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n async function toggleControl() {\n if (!sessionId || pending) return;\n setPending(true);\n setError(null);\n try {\n if (hasControl) {\n await adapter.releaseBrowserControl(sessionId);\n onControlReleased?.();\n } else {\n await adapter.acquireBrowserControl(sessionId);\n onControlAcquired?.();\n }\n } catch (nextError) {\n setError((nextError as Error).message);\n } finally {\n setPending(false);\n }\n }\n\n return (\n <div className=\"flex min-h-11 items-center gap-2 border-t border-line bg-card px-3 py-2\">\n <Button\n type=\"button\"\n size=\"xs\"\n variant={hasControl ? \"secondary\" : \"default\"}\n disabled={!sessionId || pending}\n onClick={() => void toggleControl()}\n >\n {hasControl ? (\n <RotateCcwIcon className=\"size-3\" aria-hidden=\"true\" />\n ) : (\n <MousePointer2Icon className=\"size-3\" aria-hidden=\"true\" />\n )}\n {hasControl ? \"Return control\" : \"Take control\"}\n </Button>\n <span className=\"ml-auto flex items-center gap-1.5 text-[11px] text-muted-foreground\">\n <span className=\"size-1.5 rounded-full bg-red-500\" aria-hidden=\"true\" />\n Live\n </span>\n {error && (\n <span className=\"max-w-40 truncate text-[11px] text-destructive\">\n {error}\n </span>\n )}\n </div>\n );\n}\n","interface BrowserLiveViewProps {\n src: string;\n testId?: string;\n}\n\nexport function BrowserLiveView({\n src,\n testId = \"browser-iframe\",\n}: BrowserLiveViewProps) {\n return (\n <iframe\n data-testid={testId}\n title=\"Browser live view\"\n src={src}\n className=\"h-full w-full border-0 bg-black\"\n allow=\"clipboard-read; clipboard-write\"\n />\n );\n}\n","import { cn } from \"../../lib/utils\";\nimport type { AgentChatBrowserState } from \"../../types\";\n\nexport function BrowserStatusDot({\n status,\n}: {\n status: AgentChatBrowserState[\"status\"];\n}) {\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"inline-block size-2 shrink-0 rounded-full\",\n status === \"live\" && \"bg-emerald-500\",\n status === \"user-control\" && \"bg-amber-500\",\n status === \"provisioning\" && \"animate-pulse bg-sky-500\",\n status === \"closed\" && \"bg-muted-foreground\",\n )}\n />\n );\n}\n","import * 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\"\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 ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal 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/20 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-none bg-popover p-6 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-md 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-5 right-5 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-2\", 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-lg leading-none font-semibold tracking-wider uppercase\",\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 \"mt-0.5 text-sm leading-relaxed 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 { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-none bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 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-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-none data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 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 <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-none bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Maximize2Icon, ZapIcon } from \"lucide-react\";\nimport { BrowserControlBar } from \"./browser-control-bar\";\nimport { BrowserLiveView } from \"./browser-live-view\";\nimport { BrowserStatusDot } from \"./browser-status-dot\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../ui/tooltip\";\nimport type {\n AgentChatAdapter,\n AgentChatBrowserPreviewSnapshot,\n AgentChatBrowserState,\n} from \"../../types\";\n\ntype BrowserPaneAdapter = Pick<\n AgentChatAdapter,\n | \"browserLiveViewUrl\"\n | \"getBrowserPreviewSnapshot\"\n | \"acquireBrowserControl\"\n | \"releaseBrowserControl\"\n>;\n\ninterface BrowserPaneProps {\n sessionId: string;\n state: AgentChatBrowserState;\n adapter: BrowserPaneAdapter;\n}\n\nexport function BrowserPane({ sessionId, state, adapter }: BrowserPaneProps) {\n const [fullscreenOpen, setFullscreenOpen] = useState(false);\n const [openFullscreenOnControl, setOpenFullscreenOnControl] = useState(false);\n const [localControlActive, setLocalControlActive] = useState(false);\n const [previewSnapshot, setPreviewSnapshot] =\n useState<AgentChatBrowserPreviewSnapshot | null>(null);\n const [previewLoading, setPreviewLoading] = useState(false);\n const [previewError, setPreviewError] = useState<string | null>(null);\n const hasLiveViewAdapter =\n typeof adapter.browserLiveViewUrl === \"function\";\n const hasPreviewAdapter =\n typeof adapter.getBrowserPreviewSnapshot === \"function\";\n const hasControlAdapter =\n typeof adapter.acquireBrowserControl === \"function\" &&\n typeof adapter.releaseBrowserControl === \"function\";\n const liveViewUrl = useMemo(() => {\n if (!hasLiveViewAdapter) return \"\";\n return adapter.browserLiveViewUrl(sessionId);\n }, [adapter, hasLiveViewAdapter, sessionId]);\n const hasLiveView = state.status !== \"provisioning\" && state.status !== \"closed\";\n const hasUserControl = localControlActive;\n const canUseLiveView = hasLiveView && hasUserControl && Boolean(liveViewUrl);\n const canOpenPreview = hasLiveView && (hasPreviewAdapter || canUseLiveView);\n const canOpenFullscreen = canOpenPreview;\n\n const refreshPreview = useCallback(\n async (signal?: AbortSignal) => {\n if (!hasPreviewAdapter || canUseLiveView) return;\n setPreviewLoading(true);\n setPreviewError(null);\n try {\n const snapshot = await adapter.getBrowserPreviewSnapshot?.(sessionId);\n if (signal?.aborted) return;\n setPreviewSnapshot(snapshot ?? null);\n if (!snapshot) {\n setPreviewError(\"Browser preview is unavailable.\");\n }\n } catch (error) {\n if (signal?.aborted) return;\n setPreviewSnapshot(null);\n setPreviewError(\n error instanceof Error ? error.message : \"Browser preview failed.\",\n );\n } finally {\n if (!signal?.aborted) setPreviewLoading(false);\n }\n },\n [adapter, canUseLiveView, hasPreviewAdapter, sessionId],\n );\n\n useEffect(() => {\n setFullscreenOpen(false);\n setOpenFullscreenOnControl(false);\n setLocalControlActive(false);\n setPreviewSnapshot(null);\n setPreviewLoading(false);\n setPreviewError(null);\n }, [sessionId]);\n\n useEffect(() => {\n if (!openFullscreenOnControl) return;\n if (!canUseLiveView) return;\n setFullscreenOpen(true);\n setOpenFullscreenOnControl(false);\n }, [canUseLiveView, openFullscreenOnControl]);\n\n const handleFullscreenOpenChange = useCallback(\n (open: boolean) => {\n setFullscreenOpen(open);\n if (open || !hasUserControl || !hasControlAdapter) return;\n\n setLocalControlActive(false);\n void adapter.releaseBrowserControl(sessionId).catch((error) => {\n console.error(\"Failed to release browser control\", error);\n });\n },\n [adapter, hasControlAdapter, hasUserControl, sessionId],\n );\n\n useEffect(() => {\n if (!hasLiveView || canUseLiveView) {\n setPreviewLoading(false);\n setPreviewError(null);\n return;\n }\n if (!hasPreviewAdapter) return;\n\n const abort = new AbortController();\n void refreshPreview(abort.signal);\n const timer = window.setInterval(() => {\n void refreshPreview(abort.signal);\n }, 5000);\n return () => {\n abort.abort();\n window.clearInterval(timer);\n };\n }, [\n canUseLiveView,\n fullscreenOpen,\n hasLiveView,\n hasPreviewAdapter,\n refreshPreview,\n ]);\n\n return (\n <>\n <div\n data-testid=\"browser-pane\"\n className=\"flex h-full min-h-0 flex-col bg-background\"\n >\n <header className=\"flex min-h-10 items-center gap-2 border-b border-line bg-card px-3 text-xs text-foreground\">\n <ZapIcon className=\"size-3.5 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"font-medium\">Browser</span>\n <BrowserStatusDot status={state.status} />\n {state.controlOwner && (\n <span className=\"min-w-0 truncate text-amber-500\">\n {state.controlOwner} has control\n </span>\n )}\n {canOpenFullscreen && (\n <div className=\"ml-auto flex items-center\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Maximize browser\"\n className=\"inline-flex size-7 items-center justify-center text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={() => setFullscreenOpen(true)}\n >\n <Maximize2Icon className=\"size-3.5\" aria-hidden=\"true\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Full screen</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n )}\n </header>\n <div className=\"min-h-0 flex-1 bg-black\">\n {state.status === \"provisioning\" ? (\n <div className=\"flex h-full items-center justify-center bg-background text-sm text-muted-foreground\">\n Starting browser...\n </div>\n ) : state.status === \"closed\" ? (\n <div className=\"flex h-full items-center justify-center bg-background text-sm text-muted-foreground\">\n Browser closed.\n </div>\n ) : canUseLiveView ? (\n <BrowserLiveView src={liveViewUrl} />\n ) : previewSnapshot ? (\n <BrowserPreviewImage\n src={previewSnapshot.src}\n fit=\"contain\"\n testId=\"browser-preview-image\"\n />\n ) : previewLoading ? (\n <div className=\"flex h-full items-center justify-center bg-background text-sm text-muted-foreground\">\n Loading browser preview...\n </div>\n ) : previewError ? (\n <div className=\"flex h-full items-center justify-center bg-background text-sm text-muted-foreground\">\n {previewError}\n </div>\n ) : (\n <div className=\"flex h-full items-center justify-center bg-background text-sm text-muted-foreground\">\n Browser preview is unavailable.\n </div>\n )}\n </div>\n {hasLiveView && hasControlAdapter && (\n <BrowserControlBar\n sessionId={sessionId}\n hasControl={localControlActive}\n adapter={adapter}\n onControlAcquired={() => {\n setLocalControlActive(true);\n setOpenFullscreenOnControl(true);\n }}\n onControlReleased={() => setLocalControlActive(false)}\n />\n )}\n </div>\n <Dialog open={fullscreenOpen} onOpenChange={handleFullscreenOpenChange}>\n <DialogContent\n aria-describedby={undefined}\n className=\"flex h-screen w-screen max-w-none flex-col gap-0 overflow-hidden rounded-none border-0 bg-background p-0 shadow-none ring-0 sm:max-w-none\"\n >\n <DialogHeader className=\"h-10 shrink-0 flex-row items-center gap-2 border-b border-line bg-card px-4 py-0\">\n <ZapIcon className=\"size-3.5 text-muted-foreground\" aria-hidden=\"true\" />\n <DialogTitle className=\"text-xs normal-case tracking-normal\">\n Browser\n </DialogTitle>\n <BrowserStatusDot status={state.status} />\n {state.controlOwner && (\n <span className=\"min-w-0 truncate text-xs text-amber-500\">\n {state.controlOwner} has control\n </span>\n )}\n </DialogHeader>\n <div className=\"min-h-0 flex-1 bg-black\">\n {canUseLiveView ? (\n <BrowserLiveView\n src={liveViewUrl}\n testId=\"browser-fullscreen-iframe\"\n />\n ) : previewSnapshot ? (\n <BrowserPreviewImage\n src={previewSnapshot.src}\n fit=\"contain\"\n testId=\"browser-fullscreen-preview-image\"\n />\n ) : previewLoading ? (\n <div className=\"flex h-full items-center justify-center bg-background text-sm text-muted-foreground\">\n Loading browser preview...\n </div>\n ) : previewError ? (\n <div className=\"flex h-full items-center justify-center bg-background text-sm text-muted-foreground\">\n {previewError}\n </div>\n ) : (\n <div className=\"flex h-full items-center justify-center bg-background text-sm text-muted-foreground\">\n Browser preview is unavailable.\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n\nfunction BrowserPreviewImage({\n src,\n fit,\n testId,\n}: {\n src: string;\n fit: \"contain\" | \"cover\";\n testId: string;\n}) {\n return (\n <img\n data-testid={testId}\n src={src}\n alt=\"Browser preview\"\n className={`h-full w-full bg-black ${\n fit === \"cover\" ? \"object-cover object-top\" : \"object-contain\"\n }`}\n draggable={false}\n />\n );\n}\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport { cn } from \"../../lib/utils\";\nimport type { UIMessage } from \"ai\";\nimport { ArrowDownIcon, DownloadIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { useCallback } from \"react\";\nimport { StickToBottom, useStickToBottomContext } from \"use-stick-to-bottom\";\n\nexport type ConversationProps = ComponentProps<typeof StickToBottom>;\n\nexport const Conversation = ({ className, ...props }: ConversationProps) => (\n <StickToBottom\n className={cn(\"relative flex-1\", className)}\n initial=\"smooth\"\n resize=\"smooth\"\n role=\"log\"\n {...props}\n />\n);\n\nexport type ConversationContentProps = ComponentProps<\n typeof StickToBottom.Content\n>;\n\nexport const ConversationContent = ({\n className,\n ...props\n}: ConversationContentProps) => (\n <StickToBottom.Content\n className={cn(\"flex flex-col gap-6 py-6 px-6\", className)}\n {...props}\n />\n);\n\nexport type ConversationEmptyStateProps = ComponentProps<\"div\"> & {\n title?: string;\n description?: string;\n icon?: React.ReactNode;\n};\n\nexport const ConversationEmptyState = ({\n className,\n title = \"No messages yet\",\n description = \"Start a conversation to see messages here\",\n icon,\n children,\n ...props\n}: ConversationEmptyStateProps) => (\n <div\n className={cn(\n \"flex size-full flex-col items-center justify-center gap-4 p-8 text-center\",\n className\n )}\n {...props}\n >\n {children ?? (\n <>\n {icon && (\n <div className=\"flex items-center justify-center size-14 rounded-2xl bg-muted/60 text-muted-foreground/60\">\n {icon}\n </div>\n )}\n <div className=\"space-y-1.5\">\n <h3 className=\"font-semibold text-base text-foreground/80\">{title}</h3>\n {description && (\n <p className=\"text-muted-foreground/60 text-sm max-w-sm\">{description}</p>\n )}\n </div>\n </>\n )}\n </div>\n);\n\nexport type ConversationScrollButtonProps = ComponentProps<typeof Button>;\n\nexport const ConversationScrollButton = ({\n className,\n ...props\n}: ConversationScrollButtonProps) => {\n const { isAtBottom, scrollToBottom } = useStickToBottomContext();\n\n const handleScrollToBottom = useCallback(() => {\n scrollToBottom();\n }, [scrollToBottom]);\n\n return (\n !isAtBottom && (\n <Button\n className={cn(\n \"absolute bottom-4 left-[50%] translate-x-[-50%] rounded-full shadow-lg border-border/50 dark:bg-background dark:hover:bg-muted\",\n className\n )}\n onClick={handleScrollToBottom}\n size=\"icon\"\n type=\"button\"\n variant=\"outline\"\n {...props}\n >\n <ArrowDownIcon className=\"size-4\" />\n </Button>\n )\n );\n};\n\nconst getMessageText = (message: UIMessage): string =>\n message.parts\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\");\n\nexport type ConversationDownloadProps = Omit<\n ComponentProps<typeof Button>,\n \"onClick\"\n> & {\n messages: UIMessage[];\n filename?: string;\n formatMessage?: (message: UIMessage, index: number) => string;\n};\n\nconst defaultFormatMessage = (message: UIMessage): string => {\n const roleLabel =\n message.role.charAt(0).toUpperCase() + message.role.slice(1);\n return `**${roleLabel}:** ${getMessageText(message)}`;\n};\n\nexport const messagesToMarkdown = (\n messages: UIMessage[],\n formatMessage: (\n message: UIMessage,\n index: number\n ) => string = defaultFormatMessage\n): string => messages.map((msg, i) => formatMessage(msg, i)).join(\"\\n\\n\");\n\nexport const ConversationDownload = ({\n messages,\n filename = \"conversation.md\",\n formatMessage = defaultFormatMessage,\n className,\n children,\n ...props\n}: ConversationDownloadProps) => {\n const handleDownload = useCallback(() => {\n const markdown = messagesToMarkdown(messages, formatMessage);\n const blob = new Blob([markdown], { type: \"text/markdown\" });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = filename;\n document.body.append(link);\n link.click();\n link.remove();\n URL.revokeObjectURL(url);\n }, [messages, filename, formatMessage]);\n\n return (\n <Button\n className={cn(\n \"absolute top-4 right-4 rounded-full dark:bg-background dark:hover:bg-muted\",\n className\n )}\n onClick={handleDownload}\n size=\"icon\"\n type=\"button\"\n variant=\"outline\"\n {...props}\n >\n {children ?? <DownloadIcon className=\"size-4\" />}\n </Button>\n );\n};\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 { Button } from \"../ui/button\";\nimport {\n ButtonGroup,\n ButtonGroupText,\n} from \"../ui/button-group\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../ui/tooltip\";\nimport { cn } from \"../../lib/utils\";\nimport { cjk } from \"@streamdown/cjk\";\nimport { code } from \"@streamdown/code\";\nimport { math } from \"@streamdown/math\";\nimport { mermaid } from \"@streamdown/mermaid\";\nimport type { UIMessage } from \"ai\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes, ReactElement } from \"react\";\nimport {\n createContext,\n memo,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { Streamdown } from \"streamdown\";\n\nexport type MessageProps = HTMLAttributes<HTMLDivElement> & {\n from: UIMessage[\"role\"];\n};\n\nexport const Message = ({ className, from, ...props }: MessageProps) => (\n <div\n className={cn(\n \"group flex w-full flex-col gap-2\",\n from === \"user\" ? \"is-user max-w-[85%]\" : \"is-assistant max-w-full\",\n className\n )}\n {...props}\n />\n);\n\nexport type MessageContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const MessageContent = ({\n children,\n className,\n ...props\n}: MessageContentProps) => (\n <div\n className={cn(\n \"flex w-full min-w-0 max-w-full flex-col gap-2 overflow-hidden break-words\",\n \"group-[.is-user]:ml-auto group-[.is-user]:rounded-2xl group-[.is-user]:bg-primary/10 group-[.is-user]:px-4 group-[.is-user]:py-3 group-[.is-user]:text-foreground group-[.is-user]:border group-[.is-user]:border-primary/15\",\n \"group-[.is-assistant]:text-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n);\n\nexport type MessageActionsProps = ComponentProps<\"div\">;\n\nexport const MessageActions = ({\n className,\n children,\n ...props\n}: MessageActionsProps) => (\n <div className={cn(\"flex items-center gap-1\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type MessageActionProps = ComponentProps<typeof Button> & {\n tooltip?: string;\n label?: string;\n};\n\nexport const MessageAction = ({\n tooltip,\n children,\n label,\n variant = \"ghost\",\n size = \"icon-sm\",\n ...props\n}: MessageActionProps) => {\n const button = (\n <Button size={size} type=\"button\" variant={variant} {...props}>\n {children}\n <span className=\"sr-only\">{label || tooltip}</span>\n </Button>\n );\n\n if (tooltip) {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent>\n <p>{tooltip}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return button;\n};\n\ninterface MessageBranchContextType {\n currentBranch: number;\n totalBranches: number;\n goToPrevious: () => void;\n goToNext: () => void;\n branches: ReactElement[];\n setBranches: (branches: ReactElement[]) => void;\n}\n\nconst MessageBranchContext = createContext<MessageBranchContextType | null>(\n null\n);\n\nconst useMessageBranch = () => {\n const context = useContext(MessageBranchContext);\n\n if (!context) {\n throw new Error(\n \"MessageBranch components must be used within MessageBranch\"\n );\n }\n\n return context;\n};\n\nexport type MessageBranchProps = HTMLAttributes<HTMLDivElement> & {\n defaultBranch?: number;\n onBranchChange?: (branchIndex: number) => void;\n};\n\nexport const MessageBranch = ({\n defaultBranch = 0,\n onBranchChange,\n className,\n ...props\n}: MessageBranchProps) => {\n const [currentBranch, setCurrentBranch] = useState(defaultBranch);\n const [branches, setBranches] = useState<ReactElement[]>([]);\n\n const handleBranchChange = useCallback(\n (newBranch: number) => {\n setCurrentBranch(newBranch);\n onBranchChange?.(newBranch);\n },\n [onBranchChange]\n );\n\n const goToPrevious = useCallback(() => {\n const newBranch =\n currentBranch > 0 ? currentBranch - 1 : branches.length - 1;\n handleBranchChange(newBranch);\n }, [currentBranch, branches.length, handleBranchChange]);\n\n const goToNext = useCallback(() => {\n const newBranch =\n currentBranch < branches.length - 1 ? currentBranch + 1 : 0;\n handleBranchChange(newBranch);\n }, [currentBranch, branches.length, handleBranchChange]);\n\n const contextValue = useMemo<MessageBranchContextType>(\n () => ({\n branches,\n currentBranch,\n goToNext,\n goToPrevious,\n setBranches,\n totalBranches: branches.length,\n }),\n [branches, currentBranch, goToNext, goToPrevious]\n );\n\n return (\n <MessageBranchContext.Provider value={contextValue}>\n <div\n className={cn(\"grid w-full gap-2 [&>div]:pb-0\", className)}\n {...props}\n />\n </MessageBranchContext.Provider>\n );\n};\n\nexport type MessageBranchContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const MessageBranchContent = ({\n children,\n ...props\n}: MessageBranchContentProps) => {\n const { currentBranch, setBranches, branches } = useMessageBranch();\n const childrenArray = useMemo(\n () => (Array.isArray(children) ? children : [children]),\n [children]\n );\n\n // Use useEffect to update branches when they change\n useEffect(() => {\n if (branches.length !== childrenArray.length) {\n setBranches(childrenArray);\n }\n }, [childrenArray, branches, setBranches]);\n\n return childrenArray.map((branch, index) => (\n <div\n className={cn(\n \"grid gap-2 overflow-hidden [&>div]:pb-0\",\n index === currentBranch ? \"block\" : \"hidden\"\n )}\n key={branch.key}\n {...props}\n >\n {branch}\n </div>\n ));\n};\n\nexport type MessageBranchSelectorProps = ComponentProps<typeof ButtonGroup>;\n\nexport const MessageBranchSelector = ({\n className,\n ...props\n}: MessageBranchSelectorProps) => {\n const { totalBranches } = useMessageBranch();\n\n // Don't render if there's only one branch\n if (totalBranches <= 1) {\n return null;\n }\n\n return (\n <ButtonGroup\n className={cn(\n \"[&>*:not(:first-child)]:rounded-l-md [&>*:not(:last-child)]:rounded-r-md\",\n className\n )}\n orientation=\"horizontal\"\n {...props}\n />\n );\n};\n\nexport type MessageBranchPreviousProps = ComponentProps<typeof Button>;\n\nexport const MessageBranchPrevious = ({\n children,\n ...props\n}: MessageBranchPreviousProps) => {\n const { goToPrevious, totalBranches } = useMessageBranch();\n\n return (\n <Button\n aria-label=\"Previous branch\"\n disabled={totalBranches <= 1}\n onClick={goToPrevious}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <ChevronLeftIcon size={14} />}\n </Button>\n );\n};\n\nexport type MessageBranchNextProps = ComponentProps<typeof Button>;\n\nexport const MessageBranchNext = ({\n children,\n ...props\n}: MessageBranchNextProps) => {\n const { goToNext, totalBranches } = useMessageBranch();\n\n return (\n <Button\n aria-label=\"Next branch\"\n disabled={totalBranches <= 1}\n onClick={goToNext}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <ChevronRightIcon size={14} />}\n </Button>\n );\n};\n\nexport type MessageBranchPageProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const MessageBranchPage = ({\n className,\n ...props\n}: MessageBranchPageProps) => {\n const { currentBranch, totalBranches } = useMessageBranch();\n\n return (\n <ButtonGroupText\n className={cn(\n \"border-none bg-transparent text-muted-foreground shadow-none\",\n className\n )}\n {...props}\n >\n {currentBranch + 1} of {totalBranches}\n </ButtonGroupText>\n );\n};\n\nexport type MessageResponseProps = ComponentProps<typeof Streamdown>;\n\nconst streamdownPlugins = { cjk, code, math, mermaid };\n\nexport const MessageResponse = memo(\n ({ className, ...props }: MessageResponseProps) => (\n <Streamdown\n className={cn(\n \"size-full [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\",\n className\n )}\n plugins={streamdownPlugins}\n {...props}\n />\n ),\n (prevProps, nextProps) =>\n prevProps.children === nextProps.children &&\n nextProps.isAnimating === prevProps.isAnimating\n);\n\nMessageResponse.displayName = \"MessageResponse\";\n\nexport type MessageToolbarProps = ComponentProps<\"div\">;\n\nexport const MessageToolbar = ({\n className,\n children,\n ...props\n}: MessageToolbarProps) => (\n <div\n className={cn(\n \"mt-4 flex w-full items-center justify-between gap-4\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n);\n","import { Collapsible as CollapsiblePrimitive } from \"radix-ui\"\n\nfunction Collapsible({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />\n}\n\nfunction CollapsibleTrigger({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n return (\n <CollapsiblePrimitive.CollapsibleTrigger\n data-slot=\"collapsible-trigger\"\n {...props}\n />\n )\n}\n\nfunction CollapsibleContent({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {\n return (\n <CollapsiblePrimitive.CollapsibleContent\n data-slot=\"collapsible-content\"\n {...props}\n />\n )\n}\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n","\"use client\";\n\nimport { cn } from \"../../lib/utils\";\nimport type { CSSProperties, ElementType } from \"react\";\nimport { memo, useMemo } from \"react\";\n\nexport interface TextShimmerProps {\n children: string;\n as?: ElementType;\n className?: string;\n duration?: number;\n spread?: number;\n}\n\nconst ShimmerComponent = ({\n children,\n as: Component = \"p\",\n className,\n duration = 2,\n spread = 2,\n}: TextShimmerProps) => {\n const dynamicSpread = useMemo(\n () => (children?.length ?? 0) * spread,\n [children, spread]\n );\n\n return (\n <Component\n className={cn(\"shimmer text-muted-foreground\", className)}\n style={\n {\n \"--shimmer-duration\": duration * 1000,\n \"--shimmer-spread\": `${dynamicSpread}px`,\n } as CSSProperties\n }\n >\n {children}\n </Component>\n );\n};\n\nexport const Shimmer = memo(ShimmerComponent);\n","\"use client\";\n\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../ui/collapsible\";\nimport { cn } from \"../../lib/utils\";\nimport { cjk } from \"@streamdown/cjk\";\nimport { code } from \"@streamdown/code\";\nimport { math } from \"@streamdown/math\";\nimport { mermaid } from \"@streamdown/mermaid\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport {\n createContext,\n memo,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { Streamdown } from \"streamdown\";\n\nimport { Shimmer } from \"./shimmer\";\n\ninterface ReasoningContextValue {\n isStreaming: boolean;\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n duration: number | undefined;\n}\n\nconst ReasoningContext = createContext<ReasoningContextValue | null>(null);\n\nexport const useReasoning = () => {\n const context = useContext(ReasoningContext);\n if (!context) {\n throw new Error(\"Reasoning components must be used within Reasoning\");\n }\n return context;\n};\n\nexport type ReasoningProps = ComponentProps<typeof Collapsible> & {\n isStreaming?: boolean;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n duration?: number;\n};\n\nconst MIN_DURATION_MS = 100;\nconst MS_IN_S = 1000;\n\nexport const Reasoning = memo(\n ({\n className,\n isStreaming = false,\n open,\n defaultOpen,\n onOpenChange,\n duration: durationProp,\n children,\n ...props\n }: ReasoningProps) => {\n // Reasoning blocks always start closed and never auto-open -- the user\n // explicitly clicks the trigger to expand. This keeps the chat quiet\n // during streaming and avoids forcing every historical Reasoning's\n // Streamdown to render on session replay.\n const resolvedDefaultOpen = defaultOpen ?? false;\n\n const [isOpen, setIsOpen] = useControllableState<boolean>({\n defaultProp: resolvedDefaultOpen,\n onChange: onOpenChange,\n prop: open,\n });\n const [duration, setDuration] = useControllableState<number | undefined>({\n defaultProp: undefined,\n prop: durationProp,\n });\n\n const startTimeRef = useRef<number | null>(null);\n\n // Track when streaming starts and compute duration. Sub-100ms flickers\n // (from replay) are ignored so stale \"Thought for 1 seconds\" labels\n // don't land on historical messages.\n useEffect(() => {\n if (isStreaming) {\n if (startTimeRef.current === null) {\n startTimeRef.current = Date.now();\n }\n } else if (startTimeRef.current !== null) {\n const elapsed = Date.now() - startTimeRef.current;\n startTimeRef.current = null;\n if (elapsed >= MIN_DURATION_MS) {\n setDuration(Math.ceil(elapsed / MS_IN_S));\n }\n }\n }, [isStreaming, setDuration]);\n\n const handleOpenChange = useCallback(\n (newOpen: boolean) => {\n setIsOpen(newOpen);\n },\n [setIsOpen]\n );\n\n const contextValue = useMemo(\n () => ({ duration, isOpen, isStreaming, setIsOpen }),\n [duration, isOpen, isStreaming, setIsOpen]\n );\n\n return (\n <ReasoningContext.Provider value={contextValue}>\n <Collapsible\n className={cn(\"not-prose\", className)}\n onOpenChange={handleOpenChange}\n open={isOpen}\n {...props}\n >\n {children}\n </Collapsible>\n </ReasoningContext.Provider>\n );\n }\n);\n\nexport type ReasoningTriggerProps = ComponentProps<\n typeof CollapsibleTrigger\n> & {\n getThinkingMessage?: (isStreaming: boolean, duration?: number) => ReactNode;\n};\n\nconst defaultGetThinkingMessage = (isStreaming: boolean, duration?: number) => {\n if (isStreaming || duration === 0) {\n return <Shimmer duration={1}>Thinking...</Shimmer>;\n }\n if (duration === undefined) {\n return <p className=\"text-foreground\">Thought for a few seconds</p>;\n }\n return <p className=\"text-foreground\">Thought for {duration} seconds</p>;\n};\n\nexport const ReasoningTrigger = memo(\n ({\n className,\n children,\n getThinkingMessage = defaultGetThinkingMessage,\n ...props\n }: ReasoningTriggerProps) => {\n const { isStreaming, isOpen, duration } = useReasoning();\n\n return (\n <CollapsibleTrigger\n className={cn(\n \"flex w-full items-center gap-2 text-muted-foreground text-sm transition-colors hover:text-foreground\",\n className\n )}\n {...props}\n >\n {children ?? (\n <>\n <span className=\"text-muted-foregound text-sm\">{getThinkingMessage(isStreaming, duration)}</span>\n <ChevronDownIcon\n className={cn(\n \"size-4 transition-transform\",\n isOpen ? \"rotate-180\" : \"rotate-0\"\n )}\n />\n </>\n )}\n </CollapsibleTrigger>\n );\n }\n);\n\nexport type ReasoningContentProps = ComponentProps<\n typeof CollapsibleContent\n> & {\n children: string;\n};\n\nconst streamdownPlugins = { cjk, code, math, mermaid };\n\nexport const ReasoningContent = memo(\n ({ className, children, ...props }: ReasoningContentProps) => (\n <CollapsibleContent\n className={cn(\n \"mt-4 text-sm\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-foreground/60 italic outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n className\n )}\n {...props}\n >\n <Streamdown plugins={streamdownPlugins}>{children}</Streamdown>\n </CollapsibleContent>\n )\n);\n\nReasoning.displayName = \"Reasoning\";\nReasoningTrigger.displayName = \"ReasoningTrigger\";\nReasoningContent.displayName = \"ReasoningContent\";\n","import {\n createContext,\n type HTMLAttributes,\n useCallback,\n useContext,\n useState,\n} from \"react\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\n// Types\ntype TimelineContextValue = {\n activeStep: number\n setActiveStep: (step: number) => void\n}\n\n// Context\nconst TimelineContext = createContext<TimelineContextValue | undefined>(\n undefined\n)\n\nconst useTimeline = () => {\n const context = useContext(TimelineContext)\n if (!context) {\n throw new Error(\"useTimeline must be used within a Timeline\")\n }\n return context\n}\n\n// Components\ninterface TimelineProps extends HTMLAttributes<HTMLDivElement> {\n defaultValue?: number\n value?: number\n onValueChange?: (value: number) => void\n orientation?: \"horizontal\" | \"vertical\"\n}\n\nfunction Timeline({\n defaultValue = 1,\n value,\n onValueChange,\n orientation = \"vertical\",\n className,\n children,\n ...props\n}: TimelineProps) {\n const [activeStep, setInternalStep] = useState(defaultValue)\n\n const setActiveStep = useCallback(\n (step: number) => {\n if (value === undefined) {\n setInternalStep(step)\n }\n onValueChange?.(step)\n },\n [value, onValueChange]\n )\n\n const currentStep = value ?? activeStep\n\n return (\n <TimelineContext.Provider\n value={{ activeStep: currentStep, setActiveStep }}\n >\n <div\n className={cn(\n \"group/timeline flex flex-col\",\n className\n )}\n data-orientation={orientation}\n data-slot=\"timeline\"\n {...props}\n >\n {children}\n </div>\n </TimelineContext.Provider>\n )\n}\n\n// TimelineContent\nfunction TimelineContent({\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"text-foreground text-sm min-w-0 overflow-hidden\", className)}\n data-slot=\"timeline-content\"\n {...props}\n />\n )\n}\n\n// TimelineDate\ninterface TimelineDateProps extends HTMLAttributes<HTMLTimeElement> {\n asChild?: boolean\n}\n\nfunction TimelineDate({\n asChild = false,\n className,\n ...props\n}: TimelineDateProps) {\n const Comp = asChild ? Slot.Root : \"time\"\n\n return (\n <Comp\n className={cn(\n \"text-muted-foreground mb-1 block text-xs font-medium max-sm:h-4\",\n className\n )}\n data-slot=\"timeline-date\"\n {...props}\n />\n )\n}\n\n// TimelineHeader\nfunction TimelineHeader({\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn(className)} data-slot=\"timeline-header\" {...props} />\n )\n}\n\n// TimelineIndicator\ninterface TimelineIndicatorProps extends HTMLAttributes<HTMLDivElement> {\n asChild?: boolean\n}\n\nfunction TimelineIndicator({\n asChild = false,\n className,\n children,\n ...props\n}: TimelineIndicatorProps) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n aria-hidden=\"true\"\n className={cn(\n \"border-primary/20 group-data-completed/timeline-item:border-primary absolute size-4 rounded-full border-2 top-1.25 -left-6 -translate-x-1/2\",\n className\n )}\n data-slot=\"timeline-indicator\"\n {...props}\n >\n {children}\n </Comp>\n )\n}\n\n// TimelineItem\ninterface TimelineItemProps extends HTMLAttributes<HTMLDivElement> {\n step: number\n}\n\nfunction TimelineItem({ step, className, ...props }: TimelineItemProps) {\n const { activeStep } = useTimeline()\n\n return (\n <div\n className={cn(\n \"group/timeline-item has-[+[data-completed]]:**:data-[slot=timeline-separator]:bg-primary relative flex flex-col gap-0.5 ms-8 not-last:pb-6\",\n className\n )}\n data-completed={step <= activeStep || undefined}\n data-slot=\"timeline-item\"\n {...props}\n />\n )\n}\n\n// TimelineSeparator\nfunction TimelineSeparator({\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n aria-hidden=\"true\"\n className={cn(\n \"bg-primary/10 absolute self-start group-last/timeline-item:hidden -left-6 h-[calc(100%-1rem-0.25rem)] w-0.5 -translate-x-1/2 translate-y-4.5\",\n className\n )}\n data-slot=\"timeline-separator\"\n {...props}\n />\n )\n}\n\n// TimelineTitle\nfunction TimelineTitle({\n className,\n ...props\n}: HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h3\n className={cn(\"text-sm font-medium\", className)}\n data-slot=\"timeline-title\"\n {...props}\n />\n )\n}\n\nexport {\n Timeline,\n TimelineContent,\n TimelineDate,\n TimelineHeader,\n TimelineIndicator,\n TimelineItem,\n TimelineSeparator,\n TimelineTitle,\n}","import { ZapIcon } from \"lucide-react\";\nimport type { ToolCallInfo } from \"../../types\";\n\ninterface BrowserActivityGroupProps {\n calls: ToolCallInfo[];\n}\n\nexport function BrowserActivityGroup({ calls }: BrowserActivityGroupProps) {\n return (\n <div className=\"flex items-center gap-2 border border-line bg-card px-3 py-2 text-xs\">\n <ZapIcon className=\"size-3 shrink-0 text-amber-500\" aria-hidden=\"true\" />\n <span className=\"shrink-0 font-semibold text-foreground\">Browser:</span>\n <span className=\"min-w-0 truncate text-muted-foreground\">\n {calls.map((call, index) => {\n const error = stringValue(parseJson(call.result).error);\n return (\n <span key={call.id}>\n {index > 0 && \", \"}\n <span\n className={error ? \"text-destructive\" : undefined}\n data-testid={error ? `activity-error-${call.id}` : undefined}\n title={error || undefined}\n >\n {summarize(call)}\n </span>\n </span>\n );\n })}\n </span>\n </div>\n );\n}\n\nfunction summarize(call: ToolCallInfo): string {\n const args = parseJson(call.args);\n const handler = ACTION_SUMMARIES[call.toolName];\n return handler ? handler(args) : call.toolName.replace(/^browser_/, \"\");\n}\n\nconst ACTION_SUMMARIES: Record<string, (args: Record<string, unknown>) => string> = {\n browser_navigate: (args) => `navigate to ${stringValue(args.url) || \"?\"}`,\n browser_get_state: () => \"get state\",\n browser_close: () => \"close\",\n browser_click: (args) => {\n const ref = stringValue(args.ref);\n if (ref) return `click ${ref}`;\n const x = asNumber(args.x);\n const y = asNumber(args.y);\n if (x !== null && y !== null) return `click (${x}, ${y})`;\n return \"click\";\n },\n browser_type: (args) => {\n const text = stringValue(args.text);\n const ref = stringValue(args.ref);\n const quoted = text ? `\"${truncateText(text)}\"` : \"\";\n if (!quoted) return ref ? `type into ${ref}` : \"type\";\n return ref ? `type ${quoted} into ${ref}` : `type ${quoted}`;\n },\n browser_press_key: (args) => {\n const keys = Array.isArray(args.keys) ? args.keys.map(String) : [];\n return keys.length ? `press ${keys.join(\"+\")}` : \"press key\";\n },\n browser_scroll: (args) => {\n const x = asNumber(args.x);\n const y = asNumber(args.y);\n const dx = asNumber(args.delta_x) ?? 0;\n const dy = asNumber(args.delta_y) ?? 0;\n const delta = dx || dy ? `Δ(${dx}, ${dy})` : \"\";\n const origin = x !== null && y !== null ? `at (${x}, ${y})` : \"\";\n return [\"scroll\", delta, origin].filter(Boolean).join(\" \");\n },\n browser_drag: (args) => {\n const path = Array.isArray(args.path) ? args.path : [];\n if (path.length < 2) return \"drag\";\n const first = path[0] as unknown[];\n const last = path[path.length - 1] as unknown[];\n const point = (p: unknown[]) =>\n `(${asNumber(p[0]) ?? \"?\"}, ${asNumber(p[1]) ?? \"?\"})`;\n return `drag ${point(first)} → ${point(last)}`;\n },\n browser_wait: (args) => {\n const ms = asNumber(args.ms);\n return ms === null ? \"wait\" : `wait ${ms}ms`;\n },\n browser_screenshot: (args) =>\n args.annotate === true ? \"screenshot (annotated)\" : \"screenshot\",\n};\n\nfunction truncateText(text: string, max = 32): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n\nfunction asNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction parseJson(raw?: string): Record<string, unknown> {\n if (!raw) return {};\n try {\n const parsed = JSON.parse(raw) as unknown;\n return typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : {};\n } catch {\n return {};\n }\n}\n\nfunction stringValue(value: unknown): string {\n return typeof value === \"string\" ? value : \"\";\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Shared utilities for tool call renderers.\n\n/**\n * Map a tool-call status to a Tailwind background-color class for use\n * as a TimelineIndicator color.\n */\nexport function statusColorClass(status: ToolStatus): string {\n if (status === \"running\") return \"bg-primary animate-pulse\";\n if (status === \"error\") return \"bg-red-500\";\n if (status === \"cancelled\") return \"bg-muted-foreground/40\";\n return \"bg-emerald-500\";\n}\n\nexport type ToolStatus = \"running\" | \"complete\" | \"error\" | \"cancelled\";\n\n/**\n * Derive the effective status from a tool call. Cancelled siblings\n * (parallel-batch cancellations) are distinguished from genuine errors\n * so the timeline dot reads as muted rather than red.\n */\nexport function effectiveStatus(tc: {\n status: \"running\" | \"complete\" | \"error\";\n result?: string;\n cancelled?: boolean;\n}): ToolStatus {\n if (tc.cancelled) return \"cancelled\";\n if (tc.status !== \"complete\" || !tc.result) return tc.status;\n try {\n const parsed = JSON.parse(tc.result);\n if (parsed?.exit_code !== undefined && parsed.exit_code !== 0) return \"error\";\n if (parsed?.error) return \"error\";\n if (parsed?.status === \"blocked\" || parsed?.status === \"error\") return \"error\";\n if (parsed?.success === false) return \"error\";\n } catch { /* ignore */ }\n return \"complete\";\n}\n\nexport function formatArgs(args: string): string {\n try {\n return JSON.stringify(JSON.parse(args), null, 2);\n } catch {\n return args;\n }\n}\n\nexport function parseArgs<T = Record<string, unknown>>(args: string): T | null {\n try {\n return JSON.parse(args) as T;\n } catch {\n return null;\n }\n}\n\nexport function truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max) + \"\\n... (truncated)\" : s;\n}\n\nexport function toolErrorSummary(result: string | undefined, max = 180): string {\n if (!result) return \"\";\n try {\n const parsed = JSON.parse(result);\n const error = typeof parsed?.error === \"string\" ? parsed.error : \"\";\n if (error === \"sandbox_unavailable\") {\n return \"Sandbox is unavailable. Workspace commands cannot run right now.\";\n }\n const reason = typeof parsed?.reason === \"string\" ? parsed.reason : \"\";\n const message = typeof parsed?.message === \"string\" ? parsed.message : \"\";\n const detail = reason || message;\n const summary = error && detail && detail !== error\n ? `${error}: ${detail}`\n : error || detail;\n return summary ? summary.replace(/\\s+/g, \" \").slice(0, max) : \"\";\n } catch {\n return \"\";\n }\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\nimport { useState } from \"react\";\nimport {\n CheckCircle2Icon,\n ChevronDownIcon,\n CopyIcon,\n} from \"lucide-react\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../../ui/collapsible\";\nimport { Shimmer } from \"../../ai-elements/shimmer\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ToolCallInfo } from \"../../../types\";\nimport { toolErrorSummary } from \"./shared\";\n\n\nfunction CopyButton({ text }: { text: string }) {\n const [copied, setCopied] = useState(false);\n return (\n <button\n type=\"button\"\n className=\"shrink-0 p-0.5 rounded opacity-0 group-hover/in:opacity-100 transition-opacity text-muted-foreground hover:text-foreground\"\n onClick={(e) => {\n e.stopPropagation();\n void navigator.clipboard.writeText(text).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }}\n aria-label=\"Copy command\"\n >\n {copied ? <CheckCircle2Icon className=\"size-3\" /> : <CopyIcon className=\"size-3\" />}\n </button>\n );\n}\n\ninterface TerminalResult {\n output: string;\n exit_code: number;\n error: string | null;\n command: string;\n}\n\nexport function parseTerminalResult(\n result: string | undefined,\n args: string,\n): TerminalResult | null {\n if (!result) return null;\n try {\n let parsed = JSON.parse(result);\n\n // Unwrap double-wrapped results: the sandbox may return\n // {\"stdout\": \"{\\\"output\\\": \\\"...\\\", \\\"exit_code\\\": 0}\"} where\n // stdout contains the actual tool handler result as a JSON string.\n if (typeof parsed?.stdout === \"string\" && parsed.stdout.startsWith(\"{\")) {\n try {\n const inner = JSON.parse(parsed.stdout);\n if (inner?.output !== undefined || inner?.exit_code !== undefined) {\n parsed = inner;\n }\n } catch { /* not nested JSON, use as-is */ }\n }\n\n const hasOutput = typeof parsed?.output === \"string\";\n const hasStdout = typeof parsed?.stdout === \"string\";\n const hasExitCode = typeof parsed?.exit_code === \"number\";\n const errorSummary = toolErrorSummary(result, 400);\n if (!hasOutput && !hasStdout && !hasExitCode && !errorSummary) {\n return null;\n }\n let command = \"\";\n try {\n const parsedArgs = JSON.parse(args);\n command = parsedArgs?.command ?? \"\";\n } catch { /* ignore */ }\n const output = parsed.output ?? parsed.stdout ?? \"\";\n const stderr = parsed.stderr ?? errorSummary;\n const combined = stderr ? `${output}\\n${stderr}`.trim() : output;\n return {\n output: combined,\n exit_code: parsed.exit_code ?? (errorSummary ? 1 : 0),\n error: errorSummary || null,\n command,\n };\n } catch {\n return null;\n }\n}\n\ninterface TerminalBodyProps {\n command: string;\n output: string;\n isRunning: boolean;\n hasError?: boolean;\n}\n\nfunction TerminalCollapsible({ command, output, isRunning, hasError }: TerminalBodyProps) {\n // Terminal stays collapsed until the user clicks the trigger -- unlike\n // Reasoning, the terminal's output is rarely scannable at a glance and\n // auto-expanding every call floods the chat with noise. The trigger\n // still shows a shimmer while running so progress is visible.\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <Collapsible\n open={isOpen}\n onOpenChange={setIsOpen}\n className=\"not-prose w-full\"\n >\n <CollapsibleTrigger className=\"group/trigger flex w-fit items-center gap-2 text-sm transition-colors\">\n <span className=\"text-left\">\n {isRunning ? (\n <Shimmer as=\"span\" duration={1}>Running command...</Shimmer>\n ) : hasError ? (\n <span className=\"font-semibold text-destructive\">Command failed</span>\n ) : (\n <span className=\"font-semibold text-foreground\">Command</span>\n )}\n </span>\n <ChevronDownIcon\n className={cn(\n \"size-4 shrink-0 transition-transform\",\n isOpen ? \"rotate-180\" : \"rotate-0\",\n )}\n />\n </CollapsibleTrigger>\n <CollapsibleContent\n className={cn(\n \"mt-2 overflow-hidden\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n )}\n >\n <div className=\"rounded-lg border border-border overflow-hidden\">\n {command && (\n <div className=\"group/in flex items-start gap-2 bg-background text-muted-foreground px-3 py-2 font-mono text-sm leading-relaxed\">\n <span className=\"shrink-0 select-none text-emerald-600\">IN</span>\n <pre className=\"whitespace-pre-wrap wrap-break-word text-foreground/90 flex-1\">{command}</pre>\n <CopyButton text={command} />\n </div>\n )}\n <div\n className={cn(\n \"px-3 py-2 bg-background font-mono text-sm leading-relaxed max-h-96 overflow-auto\",\n command && \"border-t border-border\",\n )}\n >\n {(output || !isRunning) && (\n <div className=\"flex gap-2 text-foreground/90\">\n <span className=\"shrink-0 select-none text-sky-600\">OUT</span>\n <pre className=\"whitespace-pre-wrap wrap-break-word flex-1\">\n {output || <span className=\"text-muted-foreground/60\">(no output)</span>}\n </pre>\n </div>\n )}\n {isRunning && !output && (\n <span className=\"ml-0.5 inline-block h-3.5 w-1.5 animate-pulse bg-foreground\" />\n )}\n </div>\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nexport function TerminalToolBlock({ tc }: { tc: ToolCallInfo }) {\n const isRunning = tc.status === \"running\";\n const result = parseTerminalResult(tc.result, tc.args);\n\n if (result) {\n const hasError = result.exit_code !== 0 || Boolean(result.error);\n if (hasError) return null;\n const output = result.output || \"\";\n return (\n <TerminalCollapsible\n command={result.command}\n output={output}\n isRunning={isRunning}\n hasError={false}\n />\n );\n }\n\n if (isRunning) {\n let command = \"\";\n try {\n const parsedArgs = JSON.parse(tc.args);\n command = parsedArgs?.command ?? \"\";\n } catch { /* ignore */ }\n\n return <TerminalCollapsible command={command} output=\"\" isRunning />;\n }\n\n return null;\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { ScrollArea as ScrollAreaPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n )\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n data-orientation={orientation}\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-none bg-border\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n )\n}\n\nexport { ScrollArea, ScrollBar }\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../ui/collapsible\";\nimport { ScrollArea } from \"../ui/scroll-area\";\nimport { cn } from \"../../lib/utils\";\nimport { ChevronDownIcon, PaperclipIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\n\nexport interface QueueMessagePart {\n type: string;\n text?: string;\n url?: string;\n filename?: string;\n mediaType?: string;\n}\n\nexport interface QueueMessage {\n id: string;\n parts: QueueMessagePart[];\n}\n\nexport interface QueueTodo {\n id: string;\n title: string;\n description?: string;\n status?: \"pending\" | \"completed\";\n}\n\nexport type QueueItemProps = ComponentProps<\"li\">;\n\nexport const QueueItem = ({ className, ...props }: QueueItemProps) => (\n <li\n className={cn(\n \"group flex flex-col gap-1 rounded-md px-3 py-1 text-sm transition-colors hover:bg-muted\",\n className\n )}\n {...props}\n />\n);\n\nexport type QueueItemIndicatorProps = ComponentProps<\"span\"> & {\n completed?: boolean;\n};\n\nexport const QueueItemIndicator = ({\n completed = false,\n className,\n ...props\n}: QueueItemIndicatorProps) => (\n <span\n className={cn(\n \"mt-0.5 inline-block size-2.5 rounded-full border\",\n completed\n ? \"border-muted-foreground/20 bg-muted-foreground/10\"\n : \"border-muted-foreground/50\",\n className\n )}\n {...props}\n />\n);\n\nexport type QueueItemContentProps = ComponentProps<\"span\"> & {\n completed?: boolean;\n};\n\nexport const QueueItemContent = ({\n completed = false,\n className,\n ...props\n}: QueueItemContentProps) => (\n <span\n className={cn(\n \"line-clamp-1 grow break-words\",\n completed\n ? \"text-muted-foreground/50 line-through\"\n : \"text-muted-foreground\",\n className\n )}\n {...props}\n />\n);\n\nexport type QueueItemDescriptionProps = ComponentProps<\"div\"> & {\n completed?: boolean;\n};\n\nexport const QueueItemDescription = ({\n completed = false,\n className,\n ...props\n}: QueueItemDescriptionProps) => (\n <div\n className={cn(\n \"ml-6 text-xs\",\n completed\n ? \"text-muted-foreground/40 line-through\"\n : \"text-muted-foreground\",\n className\n )}\n {...props}\n />\n);\n\nexport type QueueItemActionsProps = ComponentProps<\"div\">;\n\nexport const QueueItemActions = ({\n className,\n ...props\n}: QueueItemActionsProps) => (\n <div className={cn(\"flex gap-1\", className)} {...props} />\n);\n\nexport type QueueItemActionProps = Omit<\n ComponentProps<typeof Button>,\n \"variant\" | \"size\"\n>;\n\nexport const QueueItemAction = ({\n className,\n ...props\n}: QueueItemActionProps) => (\n <Button\n className={cn(\n \"size-auto rounded p-1 text-muted-foreground opacity-0 transition-opacity hover:bg-muted-foreground/10 hover:text-foreground group-hover:opacity-100\",\n className\n )}\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n {...props}\n />\n);\n\nexport type QueueItemAttachmentProps = ComponentProps<\"div\">;\n\nexport const QueueItemAttachment = ({\n className,\n ...props\n}: QueueItemAttachmentProps) => (\n <div className={cn(\"mt-1 flex flex-wrap gap-2\", className)} {...props} />\n);\n\nexport type QueueItemImageProps = ComponentProps<\"img\">;\n\nexport const QueueItemImage = ({\n className,\n ...props\n}: QueueItemImageProps) => (\n <img\n alt=\"\"\n className={cn(\"h-8 w-8 rounded border object-cover\", className)}\n height={32}\n width={32}\n {...props}\n />\n);\n\nexport type QueueItemFileProps = ComponentProps<\"span\">;\n\nexport const QueueItemFile = ({\n children,\n className,\n ...props\n}: QueueItemFileProps) => (\n <span\n className={cn(\n \"flex items-center gap-1 rounded border bg-muted px-2 py-1 text-xs\",\n className\n )}\n {...props}\n >\n <PaperclipIcon size={12} />\n <span className=\"max-w-[100px] truncate\">{children}</span>\n </span>\n);\n\nexport type QueueListProps = ComponentProps<typeof ScrollArea>;\n\nexport const QueueList = ({\n children,\n className,\n ...props\n}: QueueListProps) => (\n <ScrollArea className={cn(\"mt-2 -mb-1\", className)} {...props}>\n <div className=\"max-h-40 pr-4\">\n <ul>{children}</ul>\n </div>\n </ScrollArea>\n);\n\n// QueueSection - collapsible section container\nexport type QueueSectionProps = ComponentProps<typeof Collapsible>;\n\nexport const QueueSection = ({\n className,\n defaultOpen = true,\n ...props\n}: QueueSectionProps) => (\n <Collapsible className={cn(className)} defaultOpen={defaultOpen} {...props} />\n);\n\n// QueueSectionTrigger - section header/trigger\nexport type QueueSectionTriggerProps = ComponentProps<\"button\">;\n\nexport const QueueSectionTrigger = ({\n children,\n className,\n ...props\n}: QueueSectionTriggerProps) => (\n <CollapsibleTrigger asChild>\n <button\n className={cn(\n \"group flex w-full items-center justify-between rounded-md bg-muted/40 px-3 py-2 text-left font-medium text-muted-foreground text-sm transition-colors hover:bg-muted\",\n className\n )}\n type=\"button\"\n {...props}\n >\n {children}\n </button>\n </CollapsibleTrigger>\n);\n\n// QueueSectionLabel - label content with icon and count\nexport type QueueSectionLabelProps = ComponentProps<\"span\"> & {\n count?: number;\n label: string;\n icon?: React.ReactNode;\n};\n\nexport const QueueSectionLabel = ({\n count,\n label,\n icon,\n className,\n ...props\n}: QueueSectionLabelProps) => (\n <span className={cn(\"flex items-center gap-2\", className)} {...props}>\n <ChevronDownIcon className=\"size-4 transition-transform group-data-[state=closed]:-rotate-90\" />\n {icon}\n <span>\n {count} {label}\n </span>\n </span>\n);\n\n// QueueSectionContent - collapsible content area\nexport type QueueSectionContentProps = ComponentProps<\n typeof CollapsibleContent\n>;\n\nexport const QueueSectionContent = ({\n className,\n ...props\n}: QueueSectionContentProps) => (\n <CollapsibleContent className={cn(className)} {...props} />\n);\n\nexport type QueueProps = ComponentProps<\"div\">;\n\nexport const Queue = ({ className, ...props }: QueueProps) => (\n <div\n className={cn(\n \"flex flex-col gap-2 rounded-xl border border-border bg-background px-3 pt-2 pb-2 shadow-xs\",\n className\n )}\n {...props}\n />\n);\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\nimport { Loader2Icon, ListTodoIcon } from \"lucide-react\";\nimport {\n Queue,\n QueueItem,\n QueueItemContent,\n QueueItemDescription,\n QueueItemIndicator,\n QueueList,\n QueueSection,\n QueueSectionContent,\n QueueSectionLabel,\n QueueSectionTrigger,\n} from \"../../ai-elements/queue\";\nimport type { ToolCallInfo } from \"../../../types\";\n\ninterface TodoItem {\n id: string;\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n description?: string;\n}\n\nexport function parseTodoResult(result: string | undefined): TodoItem[] | null {\n if (!result) return null;\n try {\n const parsed = JSON.parse(result);\n const todos = parsed?.todos ?? parsed;\n if (!Array.isArray(todos)) return null;\n if (todos.length === 0) return null;\n if (!todos.every((t: unknown) =>\n typeof t === \"object\" && t !== null &&\n \"id\" in t && \"content\" in t && \"status\" in t\n )) return null;\n return todos as TodoItem[];\n } catch {\n return null;\n }\n}\n\nexport function TodoToolBlock({ tc }: { tc: ToolCallInfo }) {\n const todos = parseTodoResult(tc.result);\n if (!todos) return null;\n\n const completed = todos.filter((t) => t.status === \"completed\").length;\n const total = todos.length;\n\n return (\n <Queue>\n <QueueSection>\n <QueueSectionTrigger>\n <QueueSectionLabel\n count={total}\n label={`tasks (${completed}/${total} done)`}\n icon={<ListTodoIcon className=\"size-3.5\" />}\n />\n </QueueSectionTrigger>\n <QueueSectionContent>\n <QueueList>\n {todos.map((todo) => {\n const isCompleted = todo.status === \"completed\";\n const isInProgress = todo.status === \"in_progress\";\n return (\n <QueueItem key={todo.id}>\n <div className=\"flex items-center gap-2\">\n {isInProgress ? (\n <Loader2Icon className=\"size-2.5 animate-spin text-primary shrink-0\" />\n ) : (\n <QueueItemIndicator completed={isCompleted} />\n )}\n <QueueItemContent completed={isCompleted}>\n {todo.content}\n </QueueItemContent>\n </div>\n {todo.description && (\n <QueueItemDescription completed={isCompleted}>\n {todo.description}\n </QueueItemDescription>\n )}\n </QueueItem>\n );\n })}\n </QueueList>\n </QueueSectionContent>\n </QueueSection>\n </Queue>\n );\n}\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport { cn } from \"../../lib/utils\";\nimport { CheckIcon, CopyIcon } from \"lucide-react\";\nimport type { ComponentProps, CSSProperties, HTMLAttributes } from \"react\";\nimport {\n createContext,\n memo,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n BundledLanguage,\n BundledTheme,\n HighlighterGeneric,\n ThemedToken,\n} from \"shiki\";\nimport { createHighlighter } from \"shiki\";\n\n// Shiki uses bitflags for font styles: 1=italic, 2=bold, 4=underline\n// oxlint-disable-next-line eslint(no-bitwise)\nconst isItalic = (fontStyle: number | undefined) => fontStyle && fontStyle & 1;\n// oxlint-disable-next-line eslint(no-bitwise)\nconst isBold = (fontStyle: number | undefined) => fontStyle && fontStyle & 2;\nconst isUnderline = (fontStyle: number | undefined) =>\n // oxlint-disable-next-line eslint(no-bitwise)\n fontStyle && fontStyle & 4;\n\n// Transform tokens to include pre-computed keys to avoid noArrayIndexKey lint\ninterface KeyedToken {\n token: ThemedToken;\n key: string;\n}\ninterface KeyedLine {\n tokens: KeyedToken[];\n key: string;\n}\n\nconst addKeysToTokens = (lines: ThemedToken[][]): KeyedLine[] =>\n lines.map((line, lineIdx) => ({\n key: `line-${lineIdx}`,\n tokens: line.map((token, tokenIdx) => ({\n key: `line-${lineIdx}-${tokenIdx}`,\n token,\n })),\n }));\n\n// Token rendering component\nconst TokenSpan = ({ token }: { token: ThemedToken }) => (\n <span\n className=\"dark:!bg-[var(--shiki-dark-bg)] dark:!text-[var(--shiki-dark)]\"\n style={\n {\n backgroundColor: token.bgColor,\n color: token.color,\n fontStyle: isItalic(token.fontStyle) ? \"italic\" : undefined,\n fontWeight: isBold(token.fontStyle) ? \"bold\" : undefined,\n textDecoration: isUnderline(token.fontStyle) ? \"underline\" : undefined,\n ...token.htmlStyle,\n } as CSSProperties\n }\n >\n {token.content}\n </span>\n);\n\n// Line number styles using CSS counters\nconst LINE_NUMBER_CLASSES = cn(\n \"block\",\n \"before:content-[counter(line)]\",\n \"before:inline-block\",\n \"before:[counter-increment:line]\",\n \"before:w-8\",\n \"before:mr-4\",\n \"before:text-right\",\n \"before:text-muted-foreground/50\",\n \"before:font-mono\",\n \"before:select-none\"\n);\n\n// Line rendering component\nconst LineSpan = ({\n keyedLine,\n showLineNumbers,\n}: {\n keyedLine: KeyedLine;\n showLineNumbers: boolean;\n}) => (\n <span className={showLineNumbers ? LINE_NUMBER_CLASSES : \"block\"}>\n {keyedLine.tokens.length === 0\n ? \"\\n\"\n : keyedLine.tokens.map(({ token, key }) => (\n <TokenSpan key={key} token={token} />\n ))}\n </span>\n);\n\n// Types\ntype CodeBlockProps = HTMLAttributes<HTMLDivElement> & {\n code: string;\n language: BundledLanguage;\n showLineNumbers?: boolean;\n};\n\ninterface TokenizedCode {\n tokens: ThemedToken[][];\n fg: string;\n bg: string;\n}\n\ninterface CodeBlockContextType {\n code: string;\n}\n\n// Context\nconst CodeBlockContext = createContext<CodeBlockContextType>({\n code: \"\",\n});\n\n// Highlighter cache (singleton per language)\nconst highlighterCache = new Map<\n string,\n Promise<HighlighterGeneric<BundledLanguage, BundledTheme>>\n>();\n\n// Token cache\nconst tokensCache = new Map<string, TokenizedCode>();\n\n// Subscribers for async token updates\nconst subscribers = new Map<string, Set<(result: TokenizedCode) => void>>();\n\nconst getTokensCacheKey = (code: string, language: BundledLanguage) => {\n const start = code.slice(0, 100);\n const end = code.length > 100 ? code.slice(-100) : \"\";\n return `${language}:${code.length}:${start}:${end}`;\n};\n\nconst getHighlighter = (\n language: BundledLanguage\n): Promise<HighlighterGeneric<BundledLanguage, BundledTheme>> => {\n const cached = highlighterCache.get(language);\n if (cached) {\n return cached;\n }\n\n const highlighterPromise = createHighlighter({\n langs: [language],\n themes: [\"github-light\", \"github-dark\"],\n });\n\n highlighterCache.set(language, highlighterPromise);\n return highlighterPromise;\n};\n\n// Create raw tokens for immediate display while highlighting loads\nconst createRawTokens = (code: string): TokenizedCode => ({\n bg: \"transparent\",\n fg: \"inherit\",\n tokens: code.split(\"\\n\").map((line) =>\n line === \"\"\n ? []\n : [\n {\n color: \"inherit\",\n content: line,\n } as ThemedToken,\n ]\n ),\n});\n\n// Synchronous highlight with callback for async results\nexport const highlightCode = (\n code: string,\n language: BundledLanguage,\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-callbacks)\n callback?: (result: TokenizedCode) => void\n): TokenizedCode | null => {\n const tokensCacheKey = getTokensCacheKey(code, language);\n\n // Return cached result if available\n const cached = tokensCache.get(tokensCacheKey);\n if (cached) {\n return cached;\n }\n\n // Subscribe callback if provided\n if (callback) {\n if (!subscribers.has(tokensCacheKey)) {\n subscribers.set(tokensCacheKey, new Set());\n }\n subscribers.get(tokensCacheKey)?.add(callback);\n }\n\n // Start highlighting in background - fire-and-forget async pattern\n getHighlighter(language)\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-then)\n .then((highlighter) => {\n const availableLangs = highlighter.getLoadedLanguages();\n const langToUse = availableLangs.includes(language) ? language : \"text\";\n\n const result = highlighter.codeToTokens(code, {\n lang: langToUse,\n themes: {\n dark: \"github-dark\",\n light: \"github-light\",\n },\n });\n\n const tokenized: TokenizedCode = {\n bg: result.bg ?? \"transparent\",\n fg: result.fg ?? \"inherit\",\n tokens: result.tokens,\n };\n\n // Cache the result\n tokensCache.set(tokensCacheKey, tokenized);\n\n // Notify all subscribers\n const subs = subscribers.get(tokensCacheKey);\n if (subs) {\n for (const sub of subs) {\n sub(tokenized);\n }\n subscribers.delete(tokensCacheKey);\n }\n })\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-then), eslint-plugin-promise(prefer-await-to-callbacks)\n .catch((error) => {\n console.error(\"Failed to highlight code:\", error);\n subscribers.delete(tokensCacheKey);\n });\n\n return null;\n};\n\nconst CodeBlockBody = memo(\n ({\n tokenized,\n showLineNumbers,\n className,\n }: {\n tokenized: TokenizedCode;\n showLineNumbers: boolean;\n className?: string;\n }) => {\n const preStyle = useMemo(\n () => ({\n backgroundColor: tokenized.bg,\n color: tokenized.fg,\n }),\n [tokenized.bg, tokenized.fg]\n );\n\n const keyedLines = useMemo(\n () => addKeysToTokens(tokenized.tokens),\n [tokenized.tokens]\n );\n\n return (\n <pre\n className={cn(\n \"dark:!bg-[var(--shiki-dark-bg)] dark:!text-[var(--shiki-dark)] m-0 p-4 text-sm\",\n className\n )}\n style={preStyle}\n >\n <code\n className={cn(\n \"font-mono text-sm\",\n showLineNumbers && \"[counter-increment:line_0] [counter-reset:line]\"\n )}\n >\n {keyedLines.map((keyedLine) => (\n <LineSpan\n key={keyedLine.key}\n keyedLine={keyedLine}\n showLineNumbers={showLineNumbers}\n />\n ))}\n </code>\n </pre>\n );\n },\n (prevProps, nextProps) =>\n prevProps.tokenized === nextProps.tokenized &&\n prevProps.showLineNumbers === nextProps.showLineNumbers &&\n prevProps.className === nextProps.className\n);\n\nCodeBlockBody.displayName = \"CodeBlockBody\";\n\nexport const CodeBlockContainer = ({\n className,\n language,\n style,\n ...props\n}: HTMLAttributes<HTMLDivElement> & { language: string }) => (\n <div\n className={cn(\n \"group relative w-full overflow-hidden rounded-md border bg-background text-foreground\",\n className\n )}\n data-language={language}\n style={{\n containIntrinsicSize: \"auto 200px\",\n contentVisibility: \"auto\",\n ...style,\n }}\n {...props}\n />\n);\n\nexport const CodeBlockHeader = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex items-center justify-between border-b bg-muted/80 px-3 py-2 text-muted-foreground text-xs\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n);\n\nexport const CodeBlockTitle = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex items-center gap-2\", className)} {...props}>\n {children}\n </div>\n);\n\nexport const CodeBlockFilename = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLSpanElement>) => (\n <span className={cn(\"font-mono\", className)} {...props}>\n {children}\n </span>\n);\n\nexport const CodeBlockActions = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"-my-1 -mr-1 flex items-center gap-2\", className)}\n {...props}\n >\n {children}\n </div>\n);\n\nexport const CodeBlockContent = ({\n code,\n language,\n showLineNumbers = false,\n}: {\n code: string;\n language: BundledLanguage;\n showLineNumbers?: boolean;\n}) => {\n // Memoized raw tokens for immediate display\n const rawTokens = useMemo(() => createRawTokens(code), [code]);\n\n // Synchronous cache lookup — avoids setState in effect for cached results\n const syncTokens = useMemo(\n () => highlightCode(code, language) ?? rawTokens,\n [code, language, rawTokens]\n );\n\n // Async highlighting result (populated after shiki loads)\n const [asyncTokens, setAsyncTokens] = useState<TokenizedCode | null>(null);\n const asyncKeyRef = useRef({ code, language });\n\n // Invalidate stale async tokens synchronously during render\n if (\n asyncKeyRef.current.code !== code ||\n asyncKeyRef.current.language !== language\n ) {\n asyncKeyRef.current = { code, language };\n setAsyncTokens(null);\n }\n\n useEffect(() => {\n let cancelled = false;\n\n highlightCode(code, language, (result) => {\n if (!cancelled) {\n setAsyncTokens(result);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [code, language]);\n\n const tokenized = asyncTokens ?? syncTokens;\n\n return (\n <div className=\"relative overflow-auto\">\n <CodeBlockBody showLineNumbers={showLineNumbers} tokenized={tokenized} />\n </div>\n );\n};\n\nexport const CodeBlock = ({\n code,\n language,\n showLineNumbers = false,\n className,\n children,\n ...props\n}: CodeBlockProps) => {\n const contextValue = useMemo(() => ({ code }), [code]);\n\n return (\n <CodeBlockContext.Provider value={contextValue}>\n <CodeBlockContainer className={className} language={language} {...props}>\n {children}\n <CodeBlockContent\n code={code}\n language={language}\n showLineNumbers={showLineNumbers}\n />\n </CodeBlockContainer>\n </CodeBlockContext.Provider>\n );\n};\n\nexport type CodeBlockCopyButtonProps = ComponentProps<typeof Button> & {\n onCopy?: () => void;\n onError?: (error: Error) => void;\n timeout?: number;\n};\n\nexport const CodeBlockCopyButton = ({\n onCopy,\n onError,\n timeout = 2000,\n children,\n className,\n ...props\n}: CodeBlockCopyButtonProps) => {\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<number>(0);\n const { code } = useContext(CodeBlockContext);\n\n const copyToClipboard = useCallback(async () => {\n if (typeof window === \"undefined\" || !navigator?.clipboard?.writeText) {\n onError?.(new Error(\"Clipboard API not available\"));\n return;\n }\n\n try {\n if (!isCopied) {\n await navigator.clipboard.writeText(code);\n setIsCopied(true);\n onCopy?.();\n timeoutRef.current = window.setTimeout(\n () => setIsCopied(false),\n timeout\n );\n }\n } catch (error) {\n onError?.(error as Error);\n }\n }, [code, onCopy, onError, timeout, isCopied]);\n\n useEffect(\n () => () => {\n window.clearTimeout(timeoutRef.current);\n },\n []\n );\n\n const Icon = isCopied ? CheckIcon : CopyIcon;\n\n return (\n <Button\n className={cn(\"shrink-0\", className)}\n onClick={copyToClipboard}\n size=\"icon\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <Icon size={14} />}\n </Button>\n );\n};\n\nexport type CodeBlockLanguageSelectorProps = ComponentProps<typeof Select>;\n\nexport const CodeBlockLanguageSelector = (\n props: CodeBlockLanguageSelectorProps\n) => <Select {...props} />;\n\nexport type CodeBlockLanguageSelectorTriggerProps = ComponentProps<\n typeof SelectTrigger\n>;\n\nexport const CodeBlockLanguageSelectorTrigger = ({\n className,\n ...props\n}: CodeBlockLanguageSelectorTriggerProps) => (\n <SelectTrigger\n className={cn(\n \"h-7 border-none bg-transparent px-2 text-xs shadow-none\",\n className\n )}\n size=\"sm\"\n {...props}\n />\n);\n\nexport type CodeBlockLanguageSelectorValueProps = ComponentProps<\n typeof SelectValue\n>;\n\nexport const CodeBlockLanguageSelectorValue = (\n props: CodeBlockLanguageSelectorValueProps\n) => <SelectValue {...props} />;\n\nexport type CodeBlockLanguageSelectorContentProps = ComponentProps<\n typeof SelectContent\n>;\n\nexport const CodeBlockLanguageSelectorContent = ({\n align = \"end\",\n ...props\n}: CodeBlockLanguageSelectorContentProps) => (\n <SelectContent align={align} {...props} />\n);\n\nexport type CodeBlockLanguageSelectorItemProps = ComponentProps<\n typeof SelectItem\n>;\n\nexport const CodeBlockLanguageSelectorItem = (\n props: CodeBlockLanguageSelectorItemProps\n) => <SelectItem {...props} />;\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Tabs as TabsPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(\n \"group/tabs flex gap-2 data-horizontal:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst tabsListVariants = cva(\n \"group/tabs-list inline-flex w-fit items-center justify-center p-1 text-muted-foreground group-data-horizontal/tabs:h-10 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n line: \"gap-1 bg-transparent\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction TabsList({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List> &\n VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction TabsTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n \"relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-2 border border-transparent px-4 py-1.5 text-xs font-semibold tracking-wider whitespace-nowrap text-foreground/60 uppercase transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start group-data-vertical/tabs:px-4 group-data-vertical/tabs:py-2 hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-2.5 has-data-[icon=inline-start]:pl-2.5 dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5\",\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent\",\n \"data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground\",\n \"after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsContent({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn(\"flex-1 text-sm outline-none\", className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }\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 badgeVariants = cva(\n \"group/badge inline-flex w-fit shrink-0 items-center justify-center gap-1.5 overflow-hidden rounded-none border-0 bg-transparent px-0 py-0 text-[0.625rem] font-semibold tracking-widest whitespace-nowrap uppercase transition-colors focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-0 has-data-[icon=inline-start]:pl-0 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!\",\n {\n variants: {\n variant: {\n default: \"text-foreground [a]:hover:text-foreground/70\",\n secondary: \"text-muted-foreground [a]:hover:text-foreground\",\n destructive:\n \"text-destructive focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:text-destructive/70\",\n outline: \"text-foreground [a]:hover:text-foreground/70\",\n ghost: \"text-muted-foreground hover:text-foreground\",\n link: \"text-foreground underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","\"use client\";\n\nimport { Badge } from \"../ui/badge\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../ui/collapsible\";\nimport { cn } from \"../../lib/utils\";\nimport type { DynamicToolUIPart, ToolUIPart } from \"ai\";\nimport {\n CheckCircleIcon,\n ChevronDownIcon,\n CircleIcon,\n ClockIcon,\n WrenchIcon,\n XCircleIcon,\n} from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { isValidElement } from \"react\";\n\nimport { CodeBlock } from \"./code-block\";\n\nexport type ToolProps = ComponentProps<typeof Collapsible>;\n\nexport const Tool = ({ className, ...props }: ToolProps) => (\n <Collapsible\n className={cn(\"group not-prose mb-4 w-full rounded-md border\", className)}\n {...props}\n />\n);\n\nexport type ToolPart = ToolUIPart | DynamicToolUIPart;\n\nexport type ToolHeaderProps = {\n title?: string;\n className?: string;\n} & (\n | { type: ToolUIPart[\"type\"]; state: ToolUIPart[\"state\"]; toolName?: never }\n | {\n type: DynamicToolUIPart[\"type\"];\n state: DynamicToolUIPart[\"state\"];\n toolName: string;\n }\n);\n\nconst statusLabels: Record<ToolPart[\"state\"], string> = {\n \"approval-requested\": \"Awaiting Approval\",\n \"approval-responded\": \"Responded\",\n \"input-available\": \"Running\",\n \"input-streaming\": \"Pending\",\n \"output-available\": \"Completed\",\n \"output-denied\": \"Denied\",\n \"output-error\": \"Error\",\n};\n\nconst statusIcons: Record<ToolPart[\"state\"], ReactNode> = {\n \"approval-requested\": <ClockIcon className=\"size-4 text-yellow-600\" />,\n \"approval-responded\": <CheckCircleIcon className=\"size-4 text-blue-600\" />,\n \"input-available\": <ClockIcon className=\"size-4 animate-pulse\" />,\n \"input-streaming\": <CircleIcon className=\"size-4\" />,\n \"output-available\": <CheckCircleIcon className=\"size-4 text-green-600\" />,\n \"output-denied\": <XCircleIcon className=\"size-4 text-orange-600\" />,\n \"output-error\": <XCircleIcon className=\"size-4 text-red-600\" />,\n};\n\nexport const getStatusBadge = (status: ToolPart[\"state\"]) => (\n <Badge className=\"gap-1.5 rounded-full text-xs\" variant=\"secondary\">\n {statusIcons[status]}\n {statusLabels[status]}\n </Badge>\n);\n\nexport const ToolHeader = ({\n className,\n title,\n type,\n state,\n toolName,\n ...props\n}: ToolHeaderProps) => {\n const derivedName =\n type === \"dynamic-tool\" ? toolName : type.split(\"-\").slice(1).join(\"-\");\n\n return (\n <CollapsibleTrigger\n className={cn(\n \"flex w-full items-center justify-between gap-4 p-3\",\n className\n )}\n {...props}\n >\n <div className=\"flex items-center gap-2\">\n <WrenchIcon className=\"size-4 text-muted-foreground\" />\n <span className=\"font-medium text-sm\">{title ?? derivedName}</span>\n {getStatusBadge(state)}\n </div>\n <ChevronDownIcon className=\"size-4 text-muted-foreground transition-transform group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n );\n};\n\nexport type ToolContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const ToolContent = ({ className, ...props }: ToolContentProps) => (\n <CollapsibleContent\n className={cn(\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 space-y-4 p-4 text-popover-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n className\n )}\n {...props}\n />\n);\n\nexport type ToolInputProps = ComponentProps<\"div\"> & {\n input: ToolPart[\"input\"];\n};\n\nexport const ToolInput = ({ className, input, ...props }: ToolInputProps) => (\n <div className={cn(\"space-y-2 overflow-hidden\", className)} {...props}>\n <h4 className=\"font-medium text-muted-foreground text-xs uppercase tracking-wide\">\n Parameters\n </h4>\n <div className=\"rounded-md bg-muted/50\">\n <CodeBlock code={JSON.stringify(input, null, 2)} language=\"json\" />\n </div>\n </div>\n);\n\nexport type ToolOutputProps = ComponentProps<\"div\"> & {\n output: ToolPart[\"output\"];\n errorText: ToolPart[\"errorText\"];\n};\n\nexport const ToolOutput = ({\n className,\n output,\n errorText,\n ...props\n}: ToolOutputProps) => {\n if (!(output || errorText)) {\n return null;\n }\n\n let Output = <div>{output as ReactNode}</div>;\n\n if (typeof output === \"object\" && !isValidElement(output)) {\n Output = (\n <CodeBlock code={JSON.stringify(output, null, 2)} language=\"json\" />\n );\n } else if (typeof output === \"string\") {\n Output = <CodeBlock code={output} language=\"json\" />;\n }\n\n return (\n <div className={cn(\"space-y-2\", className)} {...props}>\n <h4 className=\"font-medium text-muted-foreground text-xs uppercase tracking-wide\">\n {errorText ? \"Error\" : \"Result\"}\n </h4>\n <div\n className={cn(\n \"overflow-x-auto rounded-md text-xs [&_table]:w-full\",\n errorText\n ? \"bg-destructive/10 text-destructive\"\n : \"bg-muted/50 text-foreground\"\n )}\n >\n {errorText && <div>{errorText}</div>}\n {Output}\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../ui/collapsible\";\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"../ui/tabs\";\nimport { cn } from \"../../lib/utils\";\nimport type { ToolUIPart } from \"ai\";\nimport { ChevronDownIcon, Code } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\n\nimport { getStatusBadge } from \"./tool\";\n\nexport type SandboxRootProps = ComponentProps<typeof Collapsible>;\n\nexport const Sandbox = ({ className, ...props }: SandboxRootProps) => (\n <Collapsible\n className={cn(\n \"not-prose group mb-4 w-full overflow-hidden rounded-md border border-foreground/20\",\n className\n )}\n defaultOpen\n {...props}\n />\n);\n\nexport interface SandboxHeaderProps {\n title?: string;\n state: ToolUIPart[\"state\"];\n className?: string;\n}\n\nexport const SandboxHeader = ({\n className,\n title,\n state,\n ...props\n}: SandboxHeaderProps) => (\n <CollapsibleTrigger\n className={cn(\n \"flex w-full items-center justify-between gap-4 p-3\",\n className\n )}\n {...props}\n >\n <div className=\"flex items-center gap-2\">\n <Code className=\"size-4 text-muted-foreground\" />\n <span className=\"font-medium text-sm\">{title}</span>\n {getStatusBadge(state)}\n </div>\n <ChevronDownIcon className=\"size-4 text-muted-foreground transition-transform group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n);\n\nexport type SandboxContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const SandboxContent = ({\n className,\n ...props\n}: SandboxContentProps) => (\n <CollapsibleContent\n className={cn(\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n className\n )}\n {...props}\n />\n);\n\nexport type SandboxTabsProps = ComponentProps<typeof Tabs>;\n\nexport const SandboxTabs = ({ className, ...props }: SandboxTabsProps) => (\n <Tabs className={cn(\"w-full gap-0\", className)} {...props} />\n);\n\nexport type SandboxTabsBarProps = ComponentProps<\"div\">;\n\nexport const SandboxTabsBar = ({\n className,\n ...props\n}: SandboxTabsBarProps) => (\n <div\n className={cn(\n \"flex w-full items-center border-border border-t border-b\",\n className\n )}\n {...props}\n />\n);\n\nexport type SandboxTabsListProps = ComponentProps<typeof TabsList>;\n\nexport const SandboxTabsList = ({\n className,\n ...props\n}: SandboxTabsListProps) => (\n <TabsList\n className={cn(\"h-auto rounded-none border-0 bg-transparent p-0\", className)}\n {...props}\n />\n);\n\nexport type SandboxTabsTriggerProps = ComponentProps<typeof TabsTrigger>;\n\nexport const SandboxTabsTrigger = ({\n className,\n ...props\n}: SandboxTabsTriggerProps) => (\n <TabsTrigger\n className={cn(\n \"rounded-none border-0 border-transparent border-b-2 px-4 py-2 font-medium text-muted-foreground text-sm transition-colors data-[state=active]:border-primary data-[state=active]:bg-transparent data-[state=active]:text-foreground data-[state=active]:shadow-none\",\n className\n )}\n {...props}\n />\n);\n\nexport type SandboxTabContentProps = ComponentProps<typeof TabsContent>;\n\nexport const SandboxTabContent = ({\n className,\n ...props\n}: SandboxTabContentProps) => (\n <TabsContent className={cn(\"mt-0 text-sm\", className)} {...props} />\n);\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\nimport { CodeBlock, CodeBlockCopyButton } from \"../../ai-elements/code-block\";\nimport {\n Sandbox,\n SandboxContent,\n SandboxHeader,\n SandboxTabContent,\n SandboxTabs,\n SandboxTabsBar,\n SandboxTabsList,\n SandboxTabsTrigger,\n} from \"../../ai-elements/sandbox\";\nimport type { ToolCallInfo } from \"../../../types\";\n\ninterface ExecuteCodeResult {\n code: string;\n output: string;\n hasError: boolean;\n}\n\nfunction parseExecuteCodeResult(\n result: string | undefined,\n args: string,\n): ExecuteCodeResult | null {\n let code = \"\";\n try {\n const parsedArgs = JSON.parse(args);\n code = parsedArgs?.code ?? \"\";\n } catch { /* ignore */ }\n\n if (!code) return null;\n\n let output = \"\";\n let hasError = false;\n if (result) {\n try {\n const parsed = JSON.parse(result);\n const stdout = parsed?.stdout ?? parsed?.output ?? \"\";\n const stderr = parsed?.stderr ?? parsed?.error ?? \"\";\n const exitCode = parsed?.exit_code ?? 0;\n hasError = exitCode !== 0 || !!stderr;\n output = stderr ? `${stdout}\\n${stderr}`.trim() : stdout;\n } catch {\n output = result;\n }\n }\n\n return { code, output, hasError };\n}\n\nexport function ExecuteCodeToolBlock({ tc }: { tc: ToolCallInfo }) {\n const isRunning = tc.status === \"running\";\n const result = parseExecuteCodeResult(tc.result, tc.args);\n if (!result) return null;\n\n const state = isRunning\n ? \"input-available\"\n : result.hasError\n ? \"output-error\"\n : \"output-available\";\n\n return (\n <Sandbox>\n <SandboxHeader state={state} title=\"Run code\" />\n <SandboxContent>\n <SandboxTabs defaultValue=\"code\">\n <SandboxTabsBar>\n <SandboxTabsList>\n <SandboxTabsTrigger value=\"code\">Code</SandboxTabsTrigger>\n <SandboxTabsTrigger value=\"output\">Output</SandboxTabsTrigger>\n </SandboxTabsList>\n </SandboxTabsBar>\n <SandboxTabContent value=\"code\">\n <div className=\"max-h-60 overflow-auto\">\n <CodeBlock\n className=\"border-0\"\n code={result.code}\n language=\"python\"\n >\n <CodeBlockCopyButton\n className=\"absolute top-2 right-2 opacity-0 transition-opacity duration-200 group-hover:opacity-100\"\n size=\"sm\"\n />\n </CodeBlock>\n </div>\n </SandboxTabContent>\n <SandboxTabContent value=\"output\">\n <div className=\"max-h-60 overflow-auto\">\n <CodeBlock\n className=\"border-0\"\n code={result.output || (isRunning ? \"Running...\" : \"(no output)\")}\n language=\"log\"\n >\n <CodeBlockCopyButton\n className=\"absolute top-2 right-2 opacity-0 transition-opacity duration-200 group-hover:opacity-100\"\n size=\"sm\"\n />\n </CodeBlock>\n </div>\n </SandboxTabContent>\n </SandboxTabs>\n </SandboxContent>\n </Sandbox>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Compact one-liner renderers for lightweight tools:\n// - Session search\n// - Web search / crawl\n// - Vision analyze\n\nimport { SearchIcon, EyeIcon } from \"lucide-react\";\nimport type { ToolCallInfo } from \"../../../types\";\n\n// ── Session search ──────────────────────────────────────────────────\n\nexport function SessionSearchBlock({ tc }: { tc: ToolCallInfo }) {\n let query = \"\";\n try {\n const args = JSON.parse(tc.args);\n query = args.query ?? \"\";\n } catch { /* ignore */ }\n\n return (\n <div className=\"flex items-center gap-2 text-sm py-0.5\">\n <SearchIcon className=\"size-3.5 text-muted-foreground/60 shrink-0\" />\n <span className=\"font-medium text-foreground\">Session Search</span>\n {query && (\n <span className=\"text-muted-foreground/70 truncate text-xs italic\">\n “{query}”\n </span>\n )}\n </div>\n );\n}\n\n// ── Web tools ───────────────────────────────────────────────────────\n\nexport function WebToolBlock({ tc }: { tc: ToolCallInfo }) {\n let displayText = \"\";\n try {\n const args = JSON.parse(tc.args);\n if (tc.toolName === \"web_search\") {\n displayText = args.query ?? \"\";\n } else if (tc.toolName === \"web_crawl\") {\n displayText = args.url ?? \"\";\n }\n } catch { /* ignore */ }\n\n const toolLabel = {\n web_search: \"Web Search\",\n web_crawl: \"Web Crawl\",\n }[tc.toolName] ?? tc.toolName;\n\n return (\n <div className=\"flex items-center gap-2 text-sm py-0.5\">\n <span className=\"font-medium text-foreground\">{toolLabel}</span>\n {displayText && (\n <span className=\"text-muted-foreground/70 truncate text-xs\">\n {displayText}\n </span>\n )}\n </div>\n );\n}\n\n// ── MCP tools ───────────────────────────────────────────────────────\n\nexport function MCPToolBlock({ tc }: { tc: ToolCallInfo }) {\n // Tool names are emitted as `mcp__{server}__{tool}`. Split on the\n // double-underscore separator; the last segment is the tool name.\n const segments = tc.toolName.replace(/^mcp__/, \"\").split(\"__\");\n const toolName = segments[segments.length - 1] ?? tc.toolName;\n const label = toolName\n .split(\"_\")\n .map((p) => p.charAt(0).toUpperCase() + p.slice(1))\n .join(\" \");\n\n let summary = \"\";\n try {\n const args = JSON.parse(tc.args);\n if (args && typeof args === \"object\") {\n const entries = Object.entries(args).filter(([, v]) => v !== undefined && v !== null && v !== \"\");\n if (entries.length > 0) {\n summary = entries\n .map(([k, v]) => {\n const val = typeof v === \"string\" ? v : JSON.stringify(v);\n return `${k}=${val}`;\n })\n .join(\", \");\n }\n }\n } catch { /* ignore */ }\n\n return (\n <div className=\"flex items-center gap-2 text-sm py-0.5\">\n <span className=\"font-medium text-foreground\">{label}</span>\n {summary && (\n <span className=\"text-muted-foreground/60 truncate text-xs\">\n {summary}\n </span>\n )}\n </div>\n );\n}\n\n// ── Vision analyze ──────────────────────────────────────────────────\n\nexport function VisionAnalyzeBlock({ tc }: { tc: ToolCallInfo }) {\n let image = \"\";\n try {\n const args = JSON.parse(tc.args);\n const ref = String(args.image ?? args.image_url ?? args.image_path ?? \"\");\n image = ref.split(\"/\").pop() ?? ref;\n } catch { /* ignore */ }\n\n return (\n <div className=\"flex items-center gap-2 text-sm py-0.5\">\n <EyeIcon className=\"size-3.5 text-muted-foreground/60 shrink-0\" />\n <span className=\"font-medium text-foreground\">Vision Analyze</span>\n {image && (\n <span className=\"text-muted-foreground/70 truncate text-xs\">\n {image}\n </span>\n )}\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Renders a batched web_extract call: the full list of URLs being\n// fetched, with per-URL status sourced from the tool result.\n\nimport { GlobeIcon, CheckIcon, XIcon } from \"lucide-react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../../ui/tooltip\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ToolCallInfo } from \"../../../types\";\n\ninterface ResultEntry {\n url?: string;\n title?: string;\n content?: string;\n error?: string;\n}\n\nfunction parseUrls(rawArgs: string): string[] {\n try {\n const args = JSON.parse(rawArgs);\n if (Array.isArray(args.urls)) {\n return args.urls.filter((u: unknown): u is string => typeof u === \"string\");\n }\n } catch {\n /* ignore */\n }\n return [];\n}\n\nfunction parseResult(rawResult: string | undefined): {\n byUrl: Map<string, ResultEntry>;\n toolError: string | null;\n} {\n const byUrl = new Map<string, ResultEntry>();\n if (!rawResult) return { byUrl, toolError: null };\n try {\n const parsed = JSON.parse(rawResult);\n const entries: ResultEntry[] = Array.isArray(parsed?.results)\n ? parsed.results\n : [];\n for (const entry of entries) {\n if (entry && typeof entry.url === \"string\") {\n byUrl.set(entry.url, entry);\n }\n }\n if (byUrl.size === 0 && typeof parsed?.error === \"string\") {\n return { byUrl, toolError: parsed.error };\n }\n } catch {\n /* ignore */\n }\n return { byUrl, toolError: null };\n}\n\nfunction domain(url: string): string {\n try {\n return new URL(url).hostname.replace(/^www\\./, \"\");\n } catch {\n return url;\n }\n}\n\nexport function WebExtractToolBlock({ tc }: { tc: ToolCallInfo }) {\n const urls = parseUrls(tc.args);\n const { byUrl, toolError } = parseResult(tc.result);\n const isComplete = tc.status === \"complete\" || tc.status === \"error\";\n\n if (urls.length === 0) {\n return (\n <div className=\"flex items-center gap-2 text-sm py-0.5\">\n <GlobeIcon className=\"size-3.5 text-muted-foreground/60 shrink-0\" />\n <span className=\"font-medium text-foreground\">Web Fetch</span>\n </div>\n );\n }\n\n return (\n <div>\n <div className=\"flex items-center gap-2 text-sm\">\n <GlobeIcon className=\"size-3.5 text-muted-foreground/60 shrink-0\" />\n <span className=\"font-medium text-foreground\">Web Fetch</span>\n <span className=\"text-muted-foreground/70 text-xs\">\n {urls.length} URL{urls.length !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n <ul className=\"mt-1 ml-5 space-y-0.5\">\n {urls.map((url, i) => {\n const entry = byUrl.get(url);\n const perUrlError = entry?.error;\n const failure = perUrlError ?? (isComplete && !entry ? toolError : null);\n const fetched = entry && !perUrlError;\n const pending = !isComplete && !entry;\n\n const row = (\n <div className=\"flex items-center gap-2 text-xs\">\n <span\n className={cn(\n \"truncate\",\n pending ? \"text-muted-foreground/50\" : \"text-muted-foreground\",\n )}\n >\n {domain(url)}\n </span>\n {fetched && (\n <CheckIcon className=\"size-3 text-green-500/70 shrink-0\" />\n )}\n {failure && (\n <XIcon className=\"size-3 text-red-500/80 shrink-0\" />\n )}\n </div>\n );\n\n return (\n <li key={`${url}-${i}`}>\n {failure ? (\n <Tooltip>\n <TooltipTrigger asChild>{row}</TooltipTrigger>\n <TooltipContent side=\"top\">{failure}</TooltipContent>\n </Tooltip>\n ) : (\n row\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Unified inline diff viewer component using the `diff` package.\n// Renders removed lines with a red background and added lines with\n// a green background. Within modified line pairs, individual changed\n// words get a stronger highlight layered on top. Unchanged regions\n// beyond the context window are collapsible.\n\nimport { memo, useMemo, useState, useCallback } from \"react\";\nimport { diffLines, diffWordsWithSpace } from \"diff\";\nimport type { Change } from \"diff\";\nimport { cn } from \"../../lib/utils\";\n\n// ── Types ──────────────────────────────────────────────────────────\n\ninterface DiffLine {\n type: \"added\" | \"removed\" | \"unchanged\";\n content: string;\n lineNum: number;\n}\n\ninterface DiffViewerProps {\n /** Original text (left side). */\n oldValue: string;\n /** Modified text (right side). */\n newValue: string;\n /** Number of unchanged context lines to show around changes. */\n contextLines?: number;\n /** Optional filename to display in the header. */\n fileName?: string;\n /** Whether to show word-level highlighting within changed lines. */\n wordDiff?: boolean;\n /** Additional CSS classes for the outer container. */\n className?: string;\n}\n\n// ── Diff computation ───────────────────────────────────────────────\n\n/**\n * Split a Change value into individual line strings, stripping the\n * trailing newline that `diffLines` appends to each chunk.\n */\nfunction splitChangeLines(change: Change): string[] {\n const v = change.value;\n if (v === \"\") return [];\n const stripped = v.endsWith(\"\\n\") ? v.slice(0, -1) : v;\n return stripped.split(\"\\n\");\n}\n\n/**\n * Build a flat array of DiffLines from the raw Change[] produced by\n * `diffLines`. Each line gets a sequential line number (tracking\n * position in the combined output).\n */\nfunction buildDiffLines(changes: Change[]): DiffLine[] {\n const lines: DiffLine[] = [];\n let lineNum = 1;\n\n for (const change of changes) {\n const type: DiffLine[\"type\"] = change.added\n ? \"added\"\n : change.removed\n ? \"removed\"\n : \"unchanged\";\n\n for (const text of splitChangeLines(change)) {\n lines.push({ type, content: text, lineNum: lineNum++ });\n }\n }\n\n return lines;\n}\n\n// ── Sections (context collapsing) ──────────────────────────────────\n\ninterface DiffSection {\n kind: \"lines\" | \"collapsed\";\n lines: DiffLine[];\n hiddenCount?: number;\n}\n\nfunction buildSections(allLines: DiffLine[], contextLines: number): DiffSection[] {\n if (allLines.length === 0) return [];\n\n const visible = new Uint8Array(allLines.length);\n for (let i = 0; i < allLines.length; i++) {\n if (allLines[i].type !== \"unchanged\") {\n const lo = Math.max(0, i - contextLines);\n const hi = Math.min(allLines.length - 1, i + contextLines);\n for (let j = lo; j <= hi; j++) visible[j] = 1;\n }\n }\n\n const sections: DiffSection[] = [];\n let i = 0;\n while (i < allLines.length) {\n if (visible[i]) {\n const start = i;\n while (i < allLines.length && visible[i]) i++;\n sections.push({ kind: \"lines\", lines: allLines.slice(start, i) });\n } else {\n const start = i;\n while (i < allLines.length && !visible[i]) i++;\n sections.push({ kind: \"collapsed\", lines: allLines.slice(start, i), hiddenCount: i - start });\n }\n }\n\n return sections;\n}\n\n// ── Word-diff pairing ──────────────────────────────────────────────\n\n/**\n * Compute the ratio of common characters between two strings (0..1).\n * When the ratio is low the lines are essentially unrelated and\n * word-level highlighting just paints everything, which is noisy.\n */\nfunction similarity(a: string, b: string): number {\n if (a.length === 0 && b.length === 0) return 1;\n if (a.length === 0 || b.length === 0) return 0;\n const changes = diffWordsWithSpace(a, b);\n let common = 0;\n let total = 0;\n for (const c of changes) {\n total += c.value.length;\n if (!c.added && !c.removed) common += c.value.length;\n }\n return total > 0 ? common / total : 0;\n}\n\n/** Minimum similarity (0..1) for word-level highlighting to activate. */\nconst WORD_DIFF_THRESHOLD = 0.35;\n\n/**\n * Pair consecutive removed+added runs for word-level diffing.\n * Only pairs lines that are sufficiently similar — entirely\n * different lines are left unpaired so they render without\n * per-word highlights.\n * Returns a map: line array index → paired line content from opposite side.\n */\nfunction buildWordDiffPairs(lines: DiffLine[]): Map<number, string> {\n const pairs = new Map<number, string>();\n let i = 0;\n while (i < lines.length) {\n const removedStart = i;\n while (i < lines.length && lines[i].type === \"removed\") i++;\n const removedEnd = i;\n\n const addedStart = i;\n while (i < lines.length && lines[i].type === \"added\") i++;\n const addedEnd = i;\n\n const removedCount = removedEnd - removedStart;\n const addedCount = addedEnd - addedStart;\n const pairCount = Math.min(removedCount, addedCount);\n for (let j = 0; j < pairCount; j++) {\n const oldContent = lines[removedStart + j].content;\n const newContent = lines[addedStart + j].content;\n if (similarity(oldContent, newContent) >= WORD_DIFF_THRESHOLD) {\n pairs.set(removedStart + j, newContent);\n pairs.set(addedStart + j, oldContent);\n }\n }\n\n if (i < lines.length && lines[i].type === \"unchanged\") i++;\n }\n return pairs;\n}\n\n// ── Word-diff rendering ────────────────────────────────────────────\n\n/**\n * Render word-level diff spans. Changed tokens get a stronger\n * highlight that layers on top of the line-level background.\n */\nfunction renderWordDiff(\n oldText: string,\n newText: string,\n side: \"old\" | \"new\",\n): React.ReactNode[] {\n const changes = diffWordsWithSpace(oldText, newText);\n const spans: React.ReactNode[] = [];\n\n for (let i = 0; i < changes.length; i++) {\n const c = changes[i];\n if (side === \"old\") {\n if (c.added) continue;\n spans.push(\n c.removed ? (\n <span key={i} className=\"bg-red-500/30 rounded-sm\">{c.value}</span>\n ) : (\n <span key={i}>{c.value}</span>\n ),\n );\n } else {\n if (c.removed) continue;\n spans.push(\n c.added ? (\n <span key={i} className=\"bg-green-500/30 rounded-sm\">{c.value}</span>\n ) : (\n <span key={i}>{c.value}</span>\n ),\n );\n }\n }\n\n return spans;\n}\n\n// ── Sub-components ─────────────────────────────────────────────────\n\nfunction DiffLineRow({\n line,\n wordDiffContent,\n}: {\n line: DiffLine;\n wordDiffContent?: React.ReactNode[];\n}) {\n const bgClass =\n line.type === \"added\"\n ? \"bg-green-500/15\"\n : line.type === \"removed\"\n ? \"bg-red-500/15\"\n : \"\";\n\n const textClass =\n line.type === \"added\"\n ? \"text-green-800 dark:text-green-300\"\n : line.type === \"removed\"\n ? \"text-red-800 dark:text-red-300\"\n : \"text-foreground/80\";\n\n const gutterClass =\n line.type === \"added\"\n ? \"text-green-500/40 bg-green-500/10\"\n : line.type === \"removed\"\n ? \"text-red-500/40 bg-red-500/10\"\n : \"text-muted-foreground/30\";\n\n return (\n <div className={cn(\"flex text-sm leading-5\", bgClass)}>\n <span\n className={cn(\n \"w-10 shrink-0 select-none text-right pr-2 tabular-nums\",\n gutterClass,\n )}\n >\n {line.lineNum}\n </span>\n <span className={cn(\"flex-1 whitespace-pre-wrap break-all px-3\", textClass)}>\n {wordDiffContent ?? line.content}\n </span>\n </div>\n );\n}\n\nfunction CollapsedBlock({\n count,\n onExpand,\n}: {\n count: number;\n onExpand: () => void;\n}) {\n return (\n <div className=\"flex text-sm leading-5 bg-muted/30 border-y border-border/30\">\n <span className=\"w-10 shrink-0\" />\n <button\n type=\"button\"\n onClick={onExpand}\n className=\"flex-1 text-left px-3 py-0.5 text-muted-foreground hover:text-foreground hover:bg-muted/50 transition-colors cursor-pointer\"\n >\n ↕ {count} unchanged line{count !== 1 ? \"s\" : \"\"}\n </button>\n </div>\n );\n}\n\n// ── Stats ──────────────────────────────────────────────────────────\n\nfunction DiffStats({ lines }: { lines: DiffLine[] }) {\n let additions = 0;\n let deletions = 0;\n for (const l of lines) {\n if (l.type === \"added\") additions++;\n if (l.type === \"removed\") deletions++;\n }\n\n if (additions === 0 && deletions === 0) return null;\n\n return (\n <span className=\"text-sm text-muted-foreground font-mono\">\n {additions > 0 && (\n <span className=\"text-green-600 dark:text-green-400\">+{additions}</span>\n )}\n {additions > 0 && deletions > 0 && \" \"}\n {deletions > 0 && (\n <span className=\"text-red-600 dark:text-red-400\">−{deletions}</span>\n )}\n </span>\n );\n}\n\n// ── Header label ───────────────────────────────────────────────────\n\nfunction HeaderLabel({ lines }: { lines: DiffLine[] }) {\n const additions = lines.filter((l) => l.type === \"added\").length;\n const deletions = lines.filter((l) => l.type === \"removed\").length;\n\n const parts: string[] = [];\n if (additions > 0 && deletions > 0) {\n parts.push(`Modified ${Math.max(additions, deletions)} line${Math.max(additions, deletions) !== 1 ? \"s\" : \"\"}`);\n } else if (additions > 0) {\n parts.push(`Added ${additions} line${additions !== 1 ? \"s\" : \"\"}`);\n } else if (deletions > 0) {\n parts.push(`Removed ${deletions} line${deletions !== 1 ? \"s\" : \"\"}`);\n }\n\n if (parts.length === 0) return null;\n\n return (\n <span className=\"text-xs text-muted-foreground text-muted-foregound\">{parts[0]}</span>\n );\n}\n\n// ── Main component ─────────────────────────────────────────────────\n\nexport const DiffViewer = memo(function DiffViewer({\n oldValue,\n newValue,\n contextLines = 3,\n fileName,\n wordDiff: enableWordDiff = true,\n className,\n}: DiffViewerProps) {\n const diffResult = useMemo(() => {\n const changes = diffLines(oldValue, newValue);\n const lines = buildDiffLines(changes);\n const sections = buildSections(lines, contextLines);\n return { lines, sections };\n }, [oldValue, newValue, contextLines]);\n\n const [expandedSections, setExpandedSections] = useState<Set<number>>(\n () => new Set(),\n );\n\n const toggleSection = useCallback((idx: number) => {\n setExpandedSections((prev) => {\n const next = new Set(prev);\n if (next.has(idx)) next.delete(idx);\n else next.add(idx);\n return next;\n });\n }, []);\n\n if (oldValue === newValue) {\n return (\n <div className={cn(\"rounded border bg-muted/30 p-3 text-sm text-muted-foreground font-mono\", className)}>\n No changes\n </div>\n );\n }\n\n return (\n <div className={cn(\"space-y-1\", className)}>\n {/* Summary label above the diff block */}\n <HeaderLabel lines={diffResult.lines} />\n\n <div className=\"rounded border border-border bg-muted/20 overflow-hidden font-mono\">\n {/* File header with stats */}\n {fileName && (\n <div className=\"flex items-center justify-between px-3 py-1.5 border-b border-border/50 bg-muted/40\">\n <span className=\"text-sm text-foreground/80 truncate\">{fileName}</span>\n <DiffStats lines={diffResult.lines} />\n </div>\n )}\n\n {/* Diff body */}\n <div className=\"overflow-x-auto\">\n {diffResult.sections.map((section, sIdx) => {\n if (section.kind === \"collapsed\" && !expandedSections.has(sIdx)) {\n return (\n <CollapsedBlock\n key={sIdx}\n count={section.hiddenCount!}\n onExpand={() => toggleSection(sIdx)}\n />\n );\n }\n\n const wordPairs = enableWordDiff\n ? buildWordDiffPairs(section.lines)\n : null;\n\n return (\n <div key={sIdx}>\n {section.lines.map((line, lIdx) => {\n let wordContent: React.ReactNode[] | undefined;\n if (wordPairs?.has(lIdx)) {\n const pairedContent = wordPairs.get(lIdx)!;\n if (line.type === \"removed\") {\n wordContent = renderWordDiff(line.content, pairedContent, \"old\");\n } else if (line.type === \"added\") {\n wordContent = renderWordDiff(pairedContent, line.content, \"new\");\n }\n }\n return (\n <DiffLineRow\n key={`${sIdx}-${lIdx}`}\n line={line}\n wordDiffContent={wordContent}\n />\n );\n })}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n});\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Renderers for file operation tools:\n// - read_file: one-liner with file name\n// - write_file: one-liner with file name\n// - patch: diff view showing old_string → new_string\n// - search_files: one-liner with pattern + result count\n// - list_files: one-liner with path + result count\n\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../../ui/tooltip\";\nimport { Button } from \"../../ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"../../ui/dialog\";\nimport { ScrollArea } from \"../../ui/scroll-area\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ToolCallInfo } from \"../../../types\";\nimport { DiffViewer } from \"../diff-viewer\";\n\n// ── Shared path helpers ─────────────────────────────────────────────\n\nfunction displayPath(filePath: string): string {\n if (filePath.startsWith(\"__WORKSPACE__\")) {\n return filePath.replace(/^__WORKSPACE__\\/?/, \"\");\n }\n if (filePath.startsWith(\"/\")) {\n const parts = filePath.split(\"/\").filter(Boolean);\n const uuidRe = /^[0-9a-f]{8}-/;\n const skip = new Set([\"home\", \"tmp\", \"work\", \"var\", \"opt\", \"data\", \"surogates\", \"workspaces\"]);\n for (let i = 0; i < parts.length - 1; i++) {\n if (!skip.has(parts[i]) && !uuidRe.test(parts[i])) {\n return parts.slice(i).join(\"/\");\n }\n }\n return parts.slice(-2).join(\"/\");\n }\n return filePath;\n}\n\nfunction fileName(path: string): string {\n return displayPath(path).split(\"/\").pop() || path;\n}\n\nfunction FileNameWithTooltip({\n filePath,\n onFileSelect,\n}: {\n filePath: string;\n onFileSelect?: (path: string) => void;\n}) {\n const display = displayPath(filePath);\n const name = fileName(filePath);\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n {onFileSelect ? (\n <button\n type=\"button\"\n onClick={() => onFileSelect(filePath)}\n className=\"text-primary hover:underline truncate text-left cursor-pointer underline\"\n >\n {name}\n </button>\n ) : (\n <span className=\"text-muted-foreground truncate\">{name}</span>\n )}\n </TooltipTrigger>\n <TooltipContent side=\"top\">{display}</TooltipContent>\n </Tooltip>\n );\n}\n\n// ── Result count helper ─────────────────────────────────────────────\n\nfunction parseResultCount(result: string | undefined): number | null {\n if (!result) return null;\n try {\n const parsed = JSON.parse(result);\n // search_files returns {matches: [...]} or {results: [...]}\n if (Array.isArray(parsed?.matches)) return parsed.matches.length;\n if (Array.isArray(parsed?.results)) return parsed.results.length;\n // list_files returns {entries: [...]} or an array directly\n if (Array.isArray(parsed?.entries)) return parsed.entries.length;\n if (Array.isArray(parsed)) return parsed.length;\n // Count lines in output string\n if (typeof parsed?.output === \"string\" && parsed.output.trim()) {\n return parsed.output.trim().split(\"\\n\").length;\n }\n } catch { /* ignore */ }\n return null;\n}\n\n// ── Read file ───────────────────────────────────────────────────────\n\nexport function ReadFileBlock({ tc, onFileSelect }: { tc: ToolCallInfo; onFileSelect?: (path: string) => void }) {\n let filePath = \"\";\n let detail = \"\";\n try {\n const args = JSON.parse(tc.args);\n filePath = args.path ?? args.file_path ?? \"\";\n const parts: string[] = [];\n if (args.offset != null || args.limit != null) {\n const start = (args.offset ?? 0) + 1;\n const end = args.limit ? start + args.limit - 1 : undefined;\n parts.push(end ? `lines ${start}-${end}` : `from line ${start}`);\n }\n if (parts.length) detail = `(${parts.join(\", \")})`;\n } catch { /* ignore */ }\n\n return (\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">Read</span>\n <FileNameWithTooltip filePath={filePath} onFileSelect={onFileSelect} />\n {detail && <span className=\"text-muted-foreground ml-1\">{detail}</span>}\n </div>\n );\n}\n\n// ── Write file ──────────────────────────────────────────────────────\n\nexport function WriteFileBlock({ tc, onFileSelect }: { tc: ToolCallInfo; onFileSelect?: (path: string) => void }) {\n let filePath = \"\";\n try {\n const args = JSON.parse(tc.args);\n filePath = args.path ?? args.file_path ?? \"\";\n } catch { /* ignore */ }\n\n return (\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">Write</span>\n <FileNameWithTooltip filePath={filePath} onFileSelect={onFileSelect} />\n </div>\n );\n}\n\n// ── Patch ───────────────────────────────────────────────────────────\n\nconst PATCH_COLLAPSED_HEIGHT = 192;\n\nexport function PatchBlock({ tc, onFileSelect }: { tc: ToolCallInfo; onFileSelect?: (path: string) => void }) {\n let filePath = \"\";\n let oldString = \"\";\n let newString = \"\";\n try {\n const args = JSON.parse(tc.args);\n filePath = args.path ?? args.file_path ?? \"\";\n oldString = args.old_string ?? \"\";\n newString = args.new_string ?? \"\";\n } catch { /* ignore */ }\n\n const contentRef = useRef<HTMLDivElement>(null);\n const [overflows, setOverflows] = useState(false);\n const [dialogOpen, setDialogOpen] = useState(false);\n\n useEffect(() => {\n if (contentRef.current) {\n setOverflows(contentRef.current.scrollHeight > PATCH_COLLAPSED_HEIGHT);\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps -- measure DOM after mount\n\n const hasDiff = oldString || newString;\n const fName = fileName(filePath);\n\n return (\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">Patch</span>\n <FileNameWithTooltip filePath={filePath} onFileSelect={onFileSelect} />\n </div>\n {hasDiff && (\n <div className=\"group/patch relative\">\n <div\n ref={contentRef}\n role={overflows ? \"button\" : undefined}\n tabIndex={overflows ? 0 : undefined}\n onClick={() => overflows && setDialogOpen(true)}\n onKeyDown={(e) => { if (e.key === \"Enter\" && overflows) setDialogOpen(true); }}\n className={cn(\n \"overflow-hidden\",\n overflows && \"cursor-pointer\",\n )}\n style={{ maxHeight: PATCH_COLLAPSED_HEIGHT }}\n >\n <DiffViewer\n oldValue={oldString}\n newValue={newString}\n fileName={fName}\n contextLines={3}\n />\n </div>\n {overflows && (\n <Button\n variant=\"outline\"\n size=\"xs\"\n onClick={() => setDialogOpen(true)}\n className=\"absolute bottom-1.5 right-2 opacity-0 group-hover/patch:opacity-100 transition-opacity backdrop-blur-sm\"\n >\n Expand\n </Button>\n )}\n </div>\n )}\n\n <Dialog open={dialogOpen} onOpenChange={setDialogOpen}>\n <DialogContent className=\"sm:max-w-[50vw] w-full h-[70vh] flex flex-col p-0 gap-0 overflow-hidden\">\n <DialogHeader className=\"px-4 py-3 border-b border-border shrink-0\">\n <DialogTitle className=\"text-sm \">Patch {fName}</DialogTitle>\n </DialogHeader>\n <ScrollArea className=\"flex-1 min-h-0\">\n <div className=\"p-4\">\n <DiffViewer\n oldValue={oldString}\n newValue={newString}\n fileName={fName}\n contextLines={3}\n />\n </div>\n </ScrollArea>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n\n// ── Search files ────────────────────────────────────────────────────\n\nexport function SearchFilesBlock({ tc }: { tc: ToolCallInfo }) {\n let pattern = \"\";\n let path = \"\";\n try {\n const args = JSON.parse(tc.args);\n pattern = args.pattern ?? \"\";\n path = args.path ?? \"\";\n } catch { /* ignore */ }\n\n const count = parseResultCount(tc.result);\n\n return (\n <div>\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">Search</span>\n {pattern && <span className=\"text-muted-foreground truncate\">"{pattern}"</span>}\n {path && path !== \".\" && (\n <span className=\"text-muted-foreground/60 truncate\">in {displayPath(path)}</span>\n )}\n </div>\n {count !== null && tc.status === \"complete\" && (\n <span className={cn(\n \"text-xs shrink-0\",\n count === 0 ? \"text-muted-foreground/50\" : \"text-muted-foreground\",\n )}>\n {count} result{count !== 1 ? \"s\" : \"\"}\n </span>\n )}\n </div>\n );\n}\n\n// ── List files ──────────────────────────────────────────────────────\n\nexport function ListFilesBlock({ tc }: { tc: ToolCallInfo }) {\n let path = \"\";\n let pattern = \"\";\n try {\n const args = JSON.parse(tc.args);\n path = args.path ?? \"\";\n pattern = args.pattern ?? \"\";\n } catch { /* ignore */ }\n\n const count = parseResultCount(tc.result);\n\n return (\n <div>\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">List</span>\n {path && <span className=\"text-muted-foreground truncate\">{displayPath(path)}</span>}\n {pattern && pattern !== \"*\" && (\n <span className=\"text-muted-foreground/60 truncate\">"{pattern}"</span>\n )}\n </div>\n {count !== null && tc.status === \"complete\" && (\n <span className={cn(\n \"text-xs shrink-0\",\n count === 0 ? \"text-muted-foreground/50\" : \"text-muted-foreground\",\n )}>\n {count} file{count !== 1 ? \"s\" : \"\"}\n </span>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport { cn } from \"../../lib/utils\";\nimport Ansi from \"ansi-to-react\";\nimport { CheckIcon, CopyIcon, TerminalIcon, Trash2Icon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes } from \"react\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\ninterface TerminalContextType {\n output: string;\n isStreaming: boolean;\n autoScroll: boolean;\n onClear?: () => void;\n}\n\nconst TerminalContext = createContext<TerminalContextType>({\n autoScroll: true,\n isStreaming: false,\n output: \"\",\n});\n\nexport type TerminalHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const TerminalHeader = ({\n className,\n children,\n ...props\n}: TerminalHeaderProps) => (\n <div\n className={cn(\n \"flex items-center justify-between border-border border-b p-0\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n);\n\nexport type TerminalTitleProps = HTMLAttributes<HTMLDivElement>;\n\nexport const TerminalTitle = ({\n className,\n children,\n ...props\n}: TerminalTitleProps) => (\n <div\n className={cn(\"flex items-center gap-2 text-sm text-muted-foreground\", className)}\n {...props}\n >\n <TerminalIcon className=\"size-4\" />\n {children ?? \"Terminal\"}\n </div>\n);\n\nexport type TerminalStatusProps = HTMLAttributes<HTMLDivElement>;\n\nexport const TerminalStatus = ({\n className,\n children,\n ...props\n}: TerminalStatusProps) => {\n const { isStreaming } = useContext(TerminalContext);\n\n if (!isStreaming) {\n return null;\n }\n\n return (\n <div\n className={cn(\"flex items-center gap-2 text-xs text-muted-foreground\", className)}\n {...props}\n >\n {children}\n </div>\n );\n};\n\nexport type TerminalActionsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const TerminalActions = ({\n className,\n children,\n ...props\n}: TerminalActionsProps) => (\n <div className={cn(\"flex items-center gap-1\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type TerminalCopyButtonProps = ComponentProps<typeof Button> & {\n onCopy?: () => void;\n onError?: (error: Error) => void;\n timeout?: number;\n};\n\nexport const TerminalCopyButton = ({\n onCopy,\n onError,\n timeout = 2000,\n children,\n className,\n ...props\n}: TerminalCopyButtonProps) => {\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<number>(0);\n const { output } = useContext(TerminalContext);\n\n const copyToClipboard = useCallback(async () => {\n if (typeof window === \"undefined\" || !navigator?.clipboard?.writeText) {\n onError?.(new Error(\"Clipboard API not available\"));\n return;\n }\n\n try {\n await navigator.clipboard.writeText(output);\n setIsCopied(true);\n onCopy?.();\n timeoutRef.current = window.setTimeout(() => setIsCopied(false), timeout);\n } catch (error) {\n onError?.(error as Error);\n }\n }, [output, onCopy, onError, timeout]);\n\n useEffect(\n () => () => {\n window.clearTimeout(timeoutRef.current);\n },\n []\n );\n\n const Icon = isCopied ? CheckIcon : CopyIcon;\n\n return (\n <Button\n className={cn(\n \"size-7 shrink-0 text-muted-foreground hover:bg-accent hover:text-foreground\",\n className\n )}\n onClick={copyToClipboard}\n size=\"icon\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <Icon size={14} />}\n </Button>\n );\n};\n\nexport type TerminalClearButtonProps = ComponentProps<typeof Button>;\n\nexport const TerminalClearButton = ({\n children,\n className,\n ...props\n}: TerminalClearButtonProps) => {\n const { onClear } = useContext(TerminalContext);\n\n if (!onClear) {\n return null;\n }\n\n return (\n <Button\n className={cn(\n \"size-7 shrink-0 text-muted-foreground hover:bg-accent hover:text-foreground\",\n className\n )}\n onClick={onClear}\n size=\"icon\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <Trash2Icon size={14} />}\n </Button>\n );\n};\n\nexport type TerminalContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const TerminalContent = ({\n className,\n children,\n ...props\n}: TerminalContentProps) => {\n const { output, isStreaming, autoScroll } = useContext(TerminalContext);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (autoScroll && containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight;\n }\n }, [output, autoScroll]);\n\n return (\n <div\n className={cn(\n \"max-h-96 overflow-auto p-4 font-mono text-sm leading-relaxed\",\n className\n )}\n ref={containerRef}\n {...props}\n >\n {children ?? (\n <pre className=\"whitespace-pre-wrap break-words\">\n <Ansi>{output}</Ansi>\n {isStreaming && (\n <span className=\"ml-0.5 inline-block h-4 w-2 animate-pulse bg-foreground\" />\n )}\n </pre>\n )}\n </div>\n );\n};\n\nexport type TerminalProps = HTMLAttributes<HTMLDivElement> & {\n output: string;\n isStreaming?: boolean;\n autoScroll?: boolean;\n onClear?: () => void;\n};\n\nexport const Terminal = ({\n output,\n isStreaming = false,\n autoScroll = true,\n onClear,\n className,\n children,\n ...props\n}: TerminalProps) => {\n const contextValue = useMemo(\n () => ({ autoScroll, isStreaming, onClear, output }),\n [autoScroll, isStreaming, onClear, output]\n );\n\n return (\n <TerminalContext.Provider value={contextValue}>\n <div\n className={cn(\n \"flex flex-col overflow-hidden rounded-lg text-foreground\",\n className\n )}\n {...props}\n >\n {children ?? (\n <>\n <TerminalHeader>\n <TerminalTitle />\n <div className=\"flex items-center gap-1\">\n <TerminalStatus />\n <TerminalActions>\n <TerminalCopyButton />\n {onClear && <TerminalClearButton />}\n </TerminalActions>\n </div>\n </TerminalHeader>\n <TerminalContent />\n </>\n )}\n </div>\n </TerminalContext.Provider>\n );\n};\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Renderer for the \"process\" tool — manages background processes started\n// via terminal(background=true). Handles all 7 actions: list, poll, log,\n// wait, kill, write, submit.\n\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n ActivityIcon,\n CircleCheckIcon,\n CircleDotIcon,\n CircleXIcon,\n ClockIcon,\n Loader2Icon,\n SkullIcon,\n} from \"lucide-react\";\nimport {\n Terminal,\n TerminalHeader,\n} from \"../../ai-elements/terminal\";\nimport { Button } from \"../../ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"../../ui/dialog\";\nimport { ScrollArea } from \"../../ui/scroll-area\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ToolCallInfo } from \"../../../types\";\n\n// ── Types ───────────────────────────────────────────────────────────\n\ninterface ProcessEntry {\n session_id: string;\n command: string;\n cwd?: string;\n pid?: number;\n started_at?: string;\n uptime_seconds?: number;\n status: \"running\" | \"exited\";\n output_preview?: string;\n exit_code?: number | null;\n detached?: boolean;\n}\n\ninterface ProcessArgs {\n action: string;\n session_id?: string;\n data?: string;\n timeout?: number;\n offset?: number;\n limit?: number;\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────\n\nfunction parseArgs(args: string): ProcessArgs {\n try {\n return JSON.parse(args) as ProcessArgs;\n } catch {\n return { action: \"unknown\" };\n }\n}\n\nfunction parseResult(result: string | undefined): Record<string, unknown> | null {\n if (!result) return null;\n try {\n return JSON.parse(result) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction formatUptime(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n return `${h}h ${m}m`;\n}\n\nfunction truncateCommand(cmd: string, max = 80): string {\n return cmd.length > max ? cmd.slice(0, max) + \"...\" : cmd;\n}\n\n// ── Status badge ────────────────────────────────────────────────────\n\nfunction StatusBadge({ status, exitCode }: { status: string; exitCode?: number | null }) {\n if (status === \"running\") {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-emerald-600 dark:text-emerald-400\">\n <CircleDotIcon className=\"size-3 animate-pulse\" />\n running\n </span>\n );\n }\n if (status === \"exited\") {\n const ok = exitCode === 0;\n return (\n <span className={cn(\n \"inline-flex items-center gap-1 text-xs font-medium\",\n ok ? \"text-muted-foreground\" : \"text-red-500 dark:text-red-400\",\n )}>\n {ok\n ? <CircleCheckIcon className=\"size-3\" />\n : <CircleXIcon className=\"size-3\" />}\n exited({exitCode ?? \"?\"})\n </span>\n );\n }\n if (status === \"killed\") {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-orange-500 dark:text-orange-400\">\n <SkullIcon className=\"size-3\" />\n killed\n </span>\n );\n }\n if (status === \"timeout\") {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-amber-500 dark:text-amber-400\">\n <ClockIcon className=\"size-3\" />\n timeout\n </span>\n );\n }\n if (status === \"interrupted\") {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-amber-500 dark:text-amber-400\">\n <CircleXIcon className=\"size-3\" />\n interrupted\n </span>\n );\n }\n // not_found, error, ok, already_exited, etc.\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground\">\n {status}\n </span>\n );\n}\n\n// ── Action: list ────────────────────────────────────────────────────\n\nfunction ProcessListView({ processes }: { processes: ProcessEntry[] }) {\n if (processes.length === 0) {\n return (\n <div className=\"flex items-center gap-2 px-3 py-2 text-sm text-muted-foreground \">\n <ActivityIcon className=\"size-3.5 shrink-0\" />\n No background processes\n </div>\n );\n }\n\n return (\n <div className=\"space-y-px\">\n {processes.map((p) => (\n <div\n key={p.session_id}\n className=\"flex items-start gap-3 px-3 py-1.5 text-sm\"\n >\n <div className=\"flex flex-col gap-0.5 min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <StatusBadge status={p.status} exitCode={p.exit_code} />\n <span className=\"text-muted-foreground text-xs shrink-0\">\n {p.session_id}\n </span>\n {p.pid != null && (\n <span className=\"text-muted-foreground/60 text-xs shrink-0\">\n pid:{p.pid}\n </span>\n )}\n {p.uptime_seconds != null && (\n <span className=\"text-muted-foreground/60 text-xs shrink-0\">\n {formatUptime(p.uptime_seconds)}\n </span>\n )}\n {p.detached && (\n <span className=\"text-xs text-amber-500/80\">detached</span>\n )}\n </div>\n <pre className=\"text-foreground/80 whitespace-pre-wrap wrap-break-word text-xs\">\n {truncateCommand(p.command, 120)}\n </pre>\n </div>\n </div>\n ))}\n </div>\n );\n}\n\n// ── Action: poll ────────────────────────────────────────────────────\n\nfunction ProcessPollView({ data }: { data: Record<string, unknown> }) {\n const status = (data.status as string) ?? \"unknown\";\n const command = (data.command as string) ?? \"\";\n const sessionId = (data.session_id as string) ?? \"\";\n const pid = data.pid as number | undefined;\n const uptime = data.uptime_seconds as number | undefined;\n const exitCode = data.exit_code as number | null | undefined;\n const preview = (data.output_preview as string) ?? \"\";\n\n return (\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-2 px-3 pt-1.5 text-sm\">\n <StatusBadge status={status} exitCode={exitCode} />\n <span className=\"text-muted-foreground text-xs\">{sessionId}</span>\n {pid != null && (\n <span className=\"text-muted-foreground/60 text-xs\">pid:{pid}</span>\n )}\n {uptime != null && (\n <span className=\"text-muted-foreground/60 text-xs\">{formatUptime(uptime)}</span>\n )}\n </div>\n {command && (\n <pre className=\"px-3 text-xs text-foreground/80 whitespace-pre-wrap wrap-break-word\">\n {truncateCommand(command, 120)}\n </pre>\n )}\n {preview && (\n <OutputPreview output={preview} />\n )}\n </div>\n );\n}\n\n// ── Action: log ─────────────────────────────────────────────────────\n\nconst LOG_COLLAPSED_HEIGHT = 96;\n\nfunction ProcessLogView({ data }: { data: Record<string, unknown> }) {\n const output = (data.output as string) ?? \"\";\n const status = (data.status as string) ?? \"\";\n const totalLines = data.total_lines as number | undefined;\n const showing = (data.showing as string) ?? \"\";\n const sessionId = (data.session_id as string) ?? \"\";\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n const [overflows, setOverflows] = useState(false);\n\n useEffect(() => {\n if (contentRef.current) {\n setOverflows(contentRef.current.scrollHeight > LOG_COLLAPSED_HEIGHT);\n }\n }, [output]);\n\n return (\n <>\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-2 px-3 pt-1.5 text-sm\">\n <StatusBadge status={status} />\n <span className=\"text-muted-foreground text-xs\">{sessionId}</span>\n {totalLines != null && (\n <span className=\"text-muted-foreground/60 text-xs\">\n {showing} of {totalLines}\n </span>\n )}\n </div>\n <div\n ref={contentRef}\n role=\"button\"\n tabIndex={0}\n onClick={() => overflows && setDialogOpen(true)}\n onKeyDown={(e) => { if (e.key === \"Enter\" && overflows) setDialogOpen(true); }}\n className={cn(\n \"overflow-hidden px-3 py-1.5 text-xs leading-relaxed\",\n overflows && \"cursor-pointer max-h-24\",\n )}\n >\n <pre className=\"whitespace-pre-wrap wrap-break-word text-foreground/80\">\n {output || <span className=\"text-muted-foreground/60\">(empty)</span>}\n </pre>\n </div>\n {overflows && (\n <div className=\"px-3 pb-1\">\n <Button\n variant=\"outline\"\n size=\"xs\"\n onClick={() => setDialogOpen(true)}\n >\n Expand log\n </Button>\n </div>\n )}\n </div>\n\n <Dialog open={dialogOpen} onOpenChange={setDialogOpen}>\n <DialogContent className=\"sm:max-w-[50vw] w-full h-[70vh] flex flex-col p-0 gap-0 overflow-hidden\">\n <DialogHeader className=\"px-4 py-3 border-b border-border shrink-0\">\n <DialogTitle className=\" text-sm\">\n Process log — {sessionId}\n </DialogTitle>\n </DialogHeader>\n <ScrollArea className=\"flex-1 min-h-0\">\n <pre className=\"px-4 py-3 text-sm leading-relaxed whitespace-pre-wrap wrap-break-word\">\n {output || \"(empty)\"}\n </pre>\n </ScrollArea>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n\n// ── Action: wait ────────────────────────────────────────────────────\n\nfunction ProcessWaitView({ data }: { data: Record<string, unknown> }) {\n const status = (data.status as string) ?? \"unknown\";\n const exitCode = data.exit_code as number | null | undefined;\n const output = (data.output as string) ?? \"\";\n const note = (data.timeout_note as string) ?? (data.note as string) ?? \"\";\n\n return (\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-2 px-3 pt-1.5 text-sm\">\n <StatusBadge status={status} exitCode={exitCode} />\n {note && (\n <span className=\"text-muted-foreground/60 text-xs\">{note}</span>\n )}\n </div>\n {output && <OutputPreview output={output} />}\n </div>\n );\n}\n\n// ── Action: kill ────────────────────────────────────────────────────\n\nfunction ProcessKillView({ data }: { data: Record<string, unknown> }) {\n const status = (data.status as string) ?? \"unknown\";\n const sessionId = (data.session_id as string) ?? \"\";\n const exitCode = data.exit_code as number | null | undefined;\n const error = (data.error as string) ?? \"\";\n\n return (\n <div className=\"flex items-center gap-2 px-3 py-1.5 text-sm\">\n <StatusBadge status={status} exitCode={exitCode} />\n {sessionId && (\n <span className=\"text-muted-foreground text-xs\">{sessionId}</span>\n )}\n {error && (\n <span className=\"text-red-500 text-xs\">{error}</span>\n )}\n </div>\n );\n}\n\n// ── Action: write / submit ──────────────────────────────────────────\n\nfunction ProcessStdinView({ action, data }: { action: string; data: Record<string, unknown> }) {\n const status = (data.status as string) ?? \"unknown\";\n const bytesWritten = data.bytes_written as number | undefined;\n const error = (data.error as string) ?? \"\";\n\n const ok = status === \"ok\";\n return (\n <div className=\"flex items-center gap-2 px-3 py-1.5 text-sm\">\n <span className={cn(\n \"text-xs font-medium\",\n ok ? \"text-emerald-600 dark:text-emerald-400\" : \"text-red-500 dark:text-red-400\",\n )}>\n {action === \"submit\" ? \"stdin submit\" : \"stdin write\"}\n </span>\n {ok\n ? <span className=\"text-muted-foreground/60 text-xs\">{bytesWritten} bytes</span>\n : <span className=\"text-red-500 text-xs\">{error || status}</span>}\n </div>\n );\n}\n\n// ── Shared output preview ───────────────────────────────────────────\n\nfunction OutputPreview({ output }: { output: string }) {\n return (\n <div className=\"px-3 py-1.5 text-xs leading-relaxed max-h-20 overflow-hidden\">\n <div className=\"flex gap-2 text-muted-foreground\">\n <span className=\"shrink-0 select-none text-sky-600\">OUT</span>\n <pre className=\"whitespace-pre-wrap wrap-break-word text-foreground/70\">\n {output}\n </pre>\n </div>\n </div>\n );\n}\n\n// ── Main renderer ───────────────────────────────────────────────────\n\nexport function ProcessToolBlock({ tc }: { tc: ToolCallInfo }) {\n const isRunning = tc.status === \"running\";\n const args = parseArgs(tc.args);\n const result = parseResult(tc.result);\n const action = args.action || \"unknown\";\n\n const actionLabel: Record<string, string> = {\n list: \"Process List\",\n poll: \"Process Poll\",\n log: \"Process Log\",\n wait: \"Process Wait\",\n kill: \"Process Kill\",\n write: \"Process Stdin\",\n submit: \"Process Stdin\",\n };\n\n // Running state — show action header with spinner\n if (isRunning && !result) {\n return (\n <Terminal output=\"\" isStreaming className=\"w-full text-sm\">\n <TerminalHeader>\n <div className=\"flex items-center gap-1.5 min-w-0 text-sm \">\n <ActivityIcon className=\"size-3.5 shrink-0\" />\n <span className=\"font-semibold text-foreground shrink-0\">\n {actionLabel[action] ?? \"Process\"}\n </span>\n {args.session_id && (\n <span className=\"text-muted-foreground text-xs truncate\">\n {args.session_id}\n </span>\n )}\n </div>\n </TerminalHeader>\n <div className=\"px-3 py-2 bg-background text-sm flex items-center gap-2 text-muted-foreground\">\n <Loader2Icon className=\"size-3 animate-spin\" />\n <span className=\"text-xs\">\n {action === \"wait\" ? `Waiting${args.timeout ? ` (${args.timeout}s timeout)` : \"\"}...` : \"(no output)\"}\n </span>\n </div>\n </Terminal>\n );\n }\n\n if (!result) return null;\n\n // Error result (not_found, generic error)\n const resultStatus = result.status as string | undefined;\n const resultError = result.error as string | undefined;\n if (resultStatus === \"not_found\" || (resultStatus === \"error\" && ![\"list\", \"poll\", \"log\"].includes(action))) {\n return (\n <Terminal output=\"\" className=\"w-full text-sm\">\n <TerminalHeader>\n <div className=\"flex items-center gap-1.5 min-w-0 text-sm \">\n <ActivityIcon className=\"size-3.5 shrink-0\" />\n <span className=\"font-semibold text-foreground shrink-0\">\n {actionLabel[action] ?? \"Process\"}\n </span>\n </div>\n </TerminalHeader>\n <div className=\"px-3 py-2 bg-background text-xs text-red-500 dark:text-red-400\">\n {resultError || resultStatus}\n </div>\n </Terminal>\n );\n }\n\n // Dispatch to action-specific view\n let content: React.ReactNode;\n switch (action) {\n case \"list\":\n content = <ProcessListView processes={(result.processes as ProcessEntry[]) ?? []} />;\n break;\n case \"poll\":\n content = <ProcessPollView data={result} />;\n break;\n case \"log\":\n content = <ProcessLogView data={result} />;\n break;\n case \"wait\":\n content = <ProcessWaitView data={result} />;\n break;\n case \"kill\":\n content = <ProcessKillView data={result} />;\n break;\n case \"write\":\n case \"submit\":\n content = <ProcessStdinView action={action} data={result} />;\n break;\n default:\n content = (\n <pre className=\"px-3 py-2 text-xs text-muted-foreground whitespace-pre-wrap\">\n {JSON.stringify(result, null, 2)}\n </pre>\n );\n }\n\n return (\n <Terminal output=\"\" className=\"w-full text-sm\">\n <TerminalHeader>\n <div className=\"flex items-center gap-1.5 min-w-0 text-sm \">\n <ActivityIcon className=\"size-3.5 shrink-0\" />\n <span className=\"font-semibold text-foreground shrink-0\">\n {actionLabel[action] ?? \"Process\"}\n </span>\n {args.session_id && ![\"list\"].includes(action) && (\n <span className=\"text-muted-foreground text-xs truncate\">\n {args.session_id}\n </span>\n )}\n </div>\n </TerminalHeader>\n <div className=\"bg-background pb-1\">\n {content}\n </div>\n </Terminal>\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-none border border-transparent border-b-input bg-transparent px-0 py-3 text-base transition-[color,border-color] outline-none placeholder:text-muted-foreground focus-visible:border-b-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-b-destructive md:text-sm dark:aria-invalid:border-b-destructive/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Renders consult_expert tool calls with thumbs-up / thumbs-down\n// feedback buttons. Thumbs-up posts immediately; thumbs-down opens a\n// comment form so the user can record why the response was\n// unsatisfactory. Submission hits\n// POST /v1/sessions/{id}/events/{event_id}/feedback (where event_id\n// is the id of the expert.result turn being rated) which emits\n// EXPERT_ENDORSE or EXPERT_OVERRIDE into the event log.\n\nimport { useState } from \"react\";\nimport { ChevronRightIcon, ThumbsDownIcon, ThumbsUpIcon } from \"lucide-react\";\nimport { cn } from \"../../../lib/utils\";\nimport { Textarea } from \"../../ui/textarea\";\nimport { Button } from \"../../ui/button\";\nimport { parseArgs } from \"./shared\";\nimport type { ToolCallInfo } from \"../../../types\";\nimport type { AgentChatExpertFeedbackRating } from \"../../../types\";\nimport { useAgentChatAdapterContext } from \"../../../adapter-context\";\n\n// Keep in sync with _MAX_REASON_LENGTH in api/routes/feedback.py.\nconst MAX_REASON_LENGTH = 500;\n\ninterface ExpertArgs {\n expert?: string;\n question?: string;\n prompt?: string;\n}\n\ninterface ExpertResult {\n summary?: string;\n response?: string;\n content?: string;\n error?: string | null;\n}\n\nexport function ExpertToolBlock({ tc }: { tc: ToolCallInfo }) {\n const [expanded, setExpanded] = useState(false);\n const { adapter, sessionId } = useAgentChatAdapterContext();\n // Optimistic marker: set the moment the user clicks, cleared when the\n // server responds. Authoritative rating arrives via the SSE stream as\n // tc.expertFeedback; we prefer it once present.\n const [pending, setPending] = useState<AgentChatExpertFeedbackRating | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [reasonDraft, setReasonDraft] = useState<string | null>(null);\n\n const rating = tc.expertFeedback?.rating ?? pending;\n const alreadyRated = tc.expertFeedback !== undefined;\n const canRate =\n tc.expertResultEventId !== undefined &&\n sessionId !== null &&\n adapter.submitExpertFeedback !== undefined &&\n tc.status !== \"running\";\n\n const submit = async (next: AgentChatExpertFeedbackRating, reason?: string) => {\n if (\n sessionId === null ||\n tc.expertResultEventId === undefined ||\n adapter.submitExpertFeedback === undefined\n ) return;\n setPending(next);\n setError(null);\n try {\n await adapter.submitExpertFeedback({\n sessionId,\n expertResultEventId: tc.expertResultEventId,\n rating: next,\n reason,\n });\n setReasonDraft(null);\n } catch (e) {\n setPending(null);\n setError(e instanceof Error ? e.message : \"Failed to submit feedback\");\n }\n };\n\n const handleRate = (next: AgentChatExpertFeedbackRating) => {\n if (!canRate || alreadyRated || pending !== null) return;\n if (next === \"down\") {\n setReasonDraft(\"\");\n return;\n }\n void submit(\"up\");\n };\n\n const args = parseArgs<ExpertArgs>(tc.args) ?? {};\n const expertName = args.expert ?? null;\n const question = args.question ?? args.prompt ?? \"\";\n const result = parseExpertResult(tc.result);\n const failed = Boolean(result?.error);\n\n return (\n <div className=\"space-y-1\">\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className={cn(\n \"flex w-fit max-w-full items-center gap-1.5 rounded-md px-0 py-0.5\",\n \"text-sm text-muted-foreground hover:text-foreground transition-colors\"\n )}\n >\n <ChevronRightIcon\n className={cn(\n \"size-3 shrink-0 transition-transform duration-150\",\n expanded && \"rotate-90\",\n )}\n />\n <span className=\"font-semibold text-foreground\">Consulted expert</span>\n {expertName && (\n <span className=\"text-muted-foreground\">· {expertName}</span>\n )}\n {failed && <span className=\"text-red-500\">· failed</span>}\n </button>\n\n {result?.summary && !expanded && (\n <div className=\"ml-6 rounded-md border-l-2 border-primary/50 bg-muted/30 px-3 py-2 text-sm text-foreground/90\">\n {result.summary}\n </div>\n )}\n\n {expanded && (\n <div className=\"ml-6 mt-0.5 space-y-1.5 text-sm\">\n {question && (\n <ExpertDetail label=\"Question\" content={question} />\n )}\n {result?.summary && (\n <ExpertDetail\n label={failed ? \"Error\" : \"Response\"}\n content={result.summary}\n tone={failed ? \"error\" : \"default\"}\n />\n )}\n </div>\n )}\n\n {canRate && (\n <div className=\"ml-6 mt-1 space-y-1.5\">\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <span>Rate this expert's response:</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Good response\"\n title={alreadyRated && rating === \"up\" ? \"Good response (recorded)\" : \"Good response\"}\n disabled={pending !== null || (alreadyRated && rating !== \"up\")}\n onClick={() => handleRate(\"up\")}\n className={cn(\n rating === \"up\" ? \"text-foreground\" : \"text-muted-foreground/60\",\n )}\n >\n <ThumbsUpIcon className=\"size-3.5\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Poor response\"\n title={alreadyRated && rating === \"down\" ? \"Poor response (recorded)\" : \"Poor response\"}\n disabled={\n pending !== null ||\n reasonDraft !== null ||\n (alreadyRated && rating !== \"down\")\n }\n onClick={() => handleRate(\"down\")}\n className={cn(\n rating === \"down\" ? \"text-foreground\" : \"text-muted-foreground/60\",\n )}\n >\n <ThumbsDownIcon className=\"size-3.5\" />\n </Button>\n {alreadyRated && tc.expertFeedback?.reason && (\n <span\n className=\"text-muted-foreground/70 truncate max-w-xs\"\n title={tc.expertFeedback.reason}\n >\n · \"{tc.expertFeedback.reason}\"\n </span>\n )}\n {error && <span className=\"text-red-500 ml-1\">{error}</span>}\n </div>\n\n {reasonDraft !== null && !alreadyRated && (\n <ReasonForm\n initialValue={reasonDraft}\n busy={pending !== null}\n onSubmit={(reason) => void submit(\"down\", reason)}\n onCancel={() => {\n setReasonDraft(null);\n setError(null);\n }}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction parseExpertResult(result: string | undefined): ExpertResult | null {\n if (!result) return null;\n const parsed = parseArgs<ExpertResult>(result);\n if (parsed) {\n return {\n ...parsed,\n summary: parsed.summary ?? parsed.response ?? parsed.content,\n };\n }\n return { summary: result };\n}\n\nfunction ExpertDetail({\n label,\n content,\n tone = \"default\",\n}: {\n label: string;\n content: string;\n tone?: \"default\" | \"error\";\n}) {\n return (\n <div\n className={cn(\n \"rounded-md border-l-2 px-3 py-2\",\n tone === \"error\"\n ? \"border-red-500/50 bg-red-500/5\"\n : \"border-primary/50 bg-muted/30\",\n )}\n >\n <div className=\"mb-1 text-[10px] uppercase tracking-wide text-muted-foreground/70\">\n {label}\n </div>\n <div className=\"whitespace-pre-wrap wrap-break-word text-foreground/90\">\n {content}\n </div>\n </div>\n );\n}\n\nfunction ReasonForm({\n initialValue,\n busy,\n onSubmit,\n onCancel,\n}: {\n initialValue: string;\n busy: boolean;\n onSubmit: (reason: string) => void;\n onCancel: () => void;\n}) {\n // State is local so keystrokes don't re-render the parent tool block.\n const [value, setValue] = useState(initialValue);\n const trimmed = value.trim();\n const charsLeft = MAX_REASON_LENGTH - value.length;\n\n const submit = () => {\n if (trimmed && !busy) onSubmit(trimmed);\n };\n\n return (\n <div className=\"rounded-md border border-border bg-muted/30 p-2 space-y-1.5\">\n <label className=\"text-xs text-muted-foreground\" htmlFor=\"expert-reason\">\n What was wrong with the response?\n </label>\n <Textarea\n id=\"expert-reason\"\n autoFocus\n rows={3}\n value={value}\n maxLength={MAX_REASON_LENGTH}\n placeholder=\"e.g. wrong WHERE clause, missed an edge case, hallucinated a column name…\"\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n submit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n onCancel();\n }\n }}\n className=\"text-xs min-h-12\"\n disabled={busy}\n />\n <div className=\"flex items-center justify-between gap-2\">\n <span\n className={cn(\n \"text-[10px] tabular-nums\",\n charsLeft < 50 ? \"text-amber-500\" : \"text-muted-foreground/60\",\n )}\n >\n {charsLeft} characters left\n </span>\n <div className=\"flex items-center gap-1.5\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"xs\"\n onClick={onCancel}\n disabled={busy}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"xs\"\n onClick={submit}\n disabled={busy || !trimmed}\n >\n {busy ? \"Sending…\" : \"Send feedback\"}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Compact one-liner renderers for the read-only skill discovery tools:\n// - skills_list: enumerate available skills (optionally filtered by category)\n// - skill_view: load a skill's SKILL.md (or one of its linked files)\n\nimport type { ToolCallInfo } from \"../../../types\";\nimport { parseArgs } from \"./shared\";\n\n// ── skills_list ─────────────────────────────────────────────────────\n\ninterface SkillsListArgs {\n category?: string;\n}\n\ninterface SkillsListResult {\n success?: boolean;\n count?: number;\n categories?: string[];\n}\n\nexport function SkillsListBlock({ tc }: { tc: ToolCallInfo }) {\n const args = parseArgs<SkillsListArgs>(tc.args) ?? {};\n const filter = args.category ? `category: ${args.category}` : \"all\";\n\n let summary = \"\";\n if (tc.result) {\n const parsed = parseArgs<SkillsListResult>(tc.result);\n if (parsed?.count !== undefined) {\n summary = `${parsed.count} skill${parsed.count === 1 ? \"\" : \"s\"}`;\n }\n }\n\n return (\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">Skills List</span>\n <span className=\"text-muted-foreground truncate\">{filter}</span>\n {summary && (\n <span className=\"text-muted-foreground/70 ml-1\">→ {summary}</span>\n )}\n </div>\n );\n}\n\n// ── skill_view ──────────────────────────────────────────────────────\n\ninterface SkillViewArgs {\n name?: string;\n file_path?: string;\n}\n\ninterface SkillViewResult {\n success?: boolean;\n name?: string;\n staged_at?: string;\n token_estimate?: number;\n}\n\nexport function SkillViewBlock({ tc }: { tc: ToolCallInfo }) {\n const args = parseArgs<SkillViewArgs>(tc.args) ?? {};\n const target = args.file_path\n ? `${args.name ?? \"?\"}/${args.file_path}`\n : (args.name ?? \"?\");\n\n let summary = \"\";\n if (tc.result) {\n const parsed = parseArgs<SkillViewResult>(tc.result);\n if (parsed?.staged_at) {\n summary = `staged at ${parsed.staged_at}`;\n } else if (parsed?.token_estimate) {\n summary = `${parsed.token_estimate} tokens`;\n }\n }\n\n return (\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">Skill View</span>\n <span className=\"text-muted-foreground truncate\">{target}</span>\n {summary && (\n <span className=\"text-muted-foreground/70 ml-1\">→ {summary}</span>\n )}\n </div>\n );\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-10 w-full min-w-0 border border-transparent border-b-input bg-transparent px-0 py-1 text-base transition-[color,border-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-b-ring disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-b-destructive md:text-sm dark:aria-invalid:border-b-destructive/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Clarify tool widget -- tabs for each question, radio choices with\n// labels + descriptions, an optional \"Other\" free-form row, and a single\n// Submit that batches every answer back to the worker. Esc pauses the\n// session (= user chose to stop the chat instead of answering).\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { XIcon } from \"lucide-react\";\nimport { cn } from \"../../../lib/utils\";\nimport { Input } from \"../../ui/input\";\nimport { useAgentChatAdapterContext } from \"../../../adapter-context\";\nimport { parseArgs } from \"./shared\";\nimport type { ToolCallInfo } from \"../../../types\";\nimport type {\n ClarifyAnswer,\n ClarifyArgs,\n ClarifyChoice,\n ClarifyQuestion,\n} from \"../../../types\";\n\n// Sentinel choice index for the \"Other\" option. Indexes into `choices`\n// are 0..(N-1); OTHER_INDEX is N so pickers can round-trip cleanly.\nconst OTHER_INDEX_OFFSET = 1_000_000;\n\ntype Selection = {\n // Index into question.choices, or a value >= OTHER_INDEX_OFFSET when\n // the user picked the \"Other\" row. -1 = no selection yet.\n index: number;\n other: string;\n};\n\nfunction emptySelection(): Selection {\n return { index: -1, other: \"\" };\n}\n\nfunction buildAnswer(q: ClarifyQuestion, sel: Selection): ClarifyAnswer | null {\n if (sel.index < 0) return null;\n if (sel.index >= OTHER_INDEX_OFFSET) {\n const text = sel.other.trim();\n if (!text) return null;\n return { question: q.prompt, answer: text, is_other: true };\n }\n const choice = q.choices?.[sel.index];\n if (!choice) return null;\n return { question: q.prompt, answer: choice.label, is_other: false };\n}\n\nexport function ClarifyToolBlock({ tc }: { tc: ToolCallInfo }) {\n const { adapter, sessionId } = useAgentChatAdapterContext();\n const args = useMemo(() => parseArgs<ClarifyArgs>(tc.args), [tc.args]);\n const questions = args?.questions ?? [];\n\n const [active, setActive] = useState(0);\n const [selections, setSelections] = useState<Selection[]>(() =>\n questions.map(emptySelection),\n );\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const locked = tc.clarifyAnswers !== undefined || tc.status !== \"running\";\n\n // Clamp active tab when questions change (shouldn't, but defensive).\n useEffect(() => {\n if (active >= questions.length && questions.length > 0) setActive(0);\n }, [active, questions.length]);\n\n const updateSelection = useCallback(\n (next: Partial<Selection>) => {\n setSelections((prev) => {\n const copy = prev.slice();\n copy[active] = { ...copy[active], ...next };\n return copy;\n });\n },\n [active],\n );\n\n const answers: (ClarifyAnswer | null)[] = useMemo(\n () => questions.map((q, i) => buildAnswer(q, selections[i] ?? emptySelection())),\n [questions, selections],\n );\n const allAnswered = answers.every((a) => a !== null);\n\n const handleSubmit = useCallback(async () => {\n if (!sessionId || locked || submitting) return;\n if (!allAnswered) {\n setError(\"Answer every question before submitting.\");\n return;\n }\n setError(null);\n setSubmitting(true);\n try {\n await adapter.submitClarifyResponse({\n sessionId,\n toolCallId: tc.id,\n responses: answers as ClarifyAnswer[],\n });\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Submit failed.\");\n } finally {\n setSubmitting(false);\n }\n }, [adapter, sessionId, tc.id, answers, allAnswered, locked, submitting]);\n\n const handleCancel = useCallback(() => {\n if (!sessionId || locked) return;\n // Cancel = stop chat: pause the session. The worker's clarify handler\n // sees the session.pause event and returns with ``cancelled: true``.\n void adapter.pauseSession({ sessionId }).catch(() => {\n // Best-effort; the user may press Esc again.\n });\n }, [adapter, sessionId, locked]);\n\n // Keyboard shortcuts: Esc cancels, Enter submits when all questions answered.\n useEffect(() => {\n if (locked) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n handleCancel();\n } else if (e.key === \"Enter\" && !e.shiftKey) {\n const tgt = e.target as HTMLElement | null;\n // Let textareas and the \"Other\" input consume Enter normally --\n // the global Enter only fires when focus is on the widget shell.\n if (tgt?.tagName === \"TEXTAREA\" || tgt?.tagName === \"INPUT\") return;\n e.preventDefault();\n void handleSubmit();\n }\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [handleCancel, handleSubmit, locked]);\n\n if (questions.length === 0) {\n return (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/5 px-3 py-2 text-xs text-destructive\">\n clarify: no questions provided\n </div>\n );\n }\n\n if (locked) {\n return <ClarifyLocked tc={tc} questions={questions} />;\n }\n\n const current = questions[active];\n const currentSel = selections[active] ?? emptySelection();\n\n return (\n <div\n className={cn(\n \"rounded-md border border-border bg-background/80 shadow-sm\",\n \"max-w-2xl\",\n )}\n role=\"group\"\n aria-label=\"Clarifying questions\"\n >\n {/* Tab bar + close */}\n <div className=\"flex items-center justify-between border-b border-border px-3 pt-2\">\n <div className=\"flex items-center gap-3 overflow-x-auto text-sm\">\n {questions.map((_, i) => {\n const isActive = i === active;\n const answered = answers[i] !== null;\n return (\n <button\n key={i}\n type=\"button\"\n onClick={() => setActive(i)}\n className={cn(\n \"relative pb-2 transition-colors whitespace-nowrap\",\n isActive\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n <span>Question {i + 1}</span>\n {answered && !isActive && (\n <span className=\"ml-1 text-[10px] text-emerald-500\">●</span>\n )}\n {isActive && (\n <span className=\"absolute inset-x-0 bottom-0 h-px bg-foreground\" />\n )}\n </button>\n );\n })}\n </div>\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"ml-2 rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n aria-label=\"Cancel clarification and stop chat\"\n title=\"Esc — cancel and stop the chat\"\n >\n <XIcon className=\"size-4\" />\n </button>\n </div>\n\n {/* Prompt */}\n <div className=\"px-3 pt-3\">\n <p className=\"text-sm text-foreground\">{current.prompt}</p>\n </div>\n\n {/* Choices */}\n <div className=\"mt-3 px-1 pb-2\">\n {(current.choices ?? []).map((choice, i) => (\n <ChoiceRow\n key={i}\n choice={choice}\n selected={currentSel.index === i}\n onSelect={() => updateSelection({ index: i })}\n />\n ))}\n\n {(current.allow_other ?? true) && (\n <OtherRow\n selected={currentSel.index >= OTHER_INDEX_OFFSET}\n value={currentSel.other}\n onSelect={() =>\n updateSelection({ index: OTHER_INDEX_OFFSET })\n }\n onChange={(v) =>\n updateSelection({ index: OTHER_INDEX_OFFSET, other: v })\n }\n />\n )}\n </div>\n\n {/* Submit */}\n <div className=\"border-t border-border px-3 py-2\">\n <button\n type=\"button\"\n disabled={!allAnswered || submitting}\n onClick={() => void handleSubmit()}\n className={cn(\n \"w-full rounded border border-border px-2 py-1.5 text-left text-sm \",\n \"text-muted-foreground hover:bg-muted/40\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n )}\n >\n <span className=\"mr-2 text-muted-foreground/70\">\n {answers.filter((a) => a !== null).length}\n </span>\n {submitting\n ? \"Submitting…\"\n : allAnswered\n ? \"Submit answers\"\n : `Answer ${questions.length - answers.filter((a) => a !== null).length} more to submit`}\n </button>\n <div className=\"mt-1 flex items-center justify-between text-[10px] text-muted-foreground/70\">\n <span>Esc to cancel</span>\n {error && <span className=\"text-destructive\">{error}</span>}\n </div>\n </div>\n </div>\n );\n}\n\n// ── Choice row ───────────────────────────────────────────────────────\n\nfunction ChoiceRow({\n choice,\n selected,\n onSelect,\n}: {\n choice: ClarifyChoice;\n selected: boolean;\n onSelect: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={cn(\n \"flex w-full items-start gap-3 rounded px-2 py-1.5 text-left transition-colors\",\n selected ? \"bg-muted\" : \"hover:bg-muted/40\",\n )}\n >\n <Radio selected={selected} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm text-foreground\">{choice.label}</div>\n {choice.description && (\n <div className=\"text-xs text-muted-foreground\">\n {choice.description}\n </div>\n )}\n </div>\n </button>\n );\n}\n\nfunction OtherRow({\n selected,\n value,\n onSelect,\n onChange,\n}: {\n selected: boolean;\n value: string;\n onSelect: () => void;\n onChange: (v: string) => void;\n}) {\n return (\n <div\n className={cn(\n \"flex items-start gap-3 rounded px-2 py-1.5 transition-colors\",\n selected ? \"bg-muted\" : \"hover:bg-muted/40\",\n )}\n >\n <button\n type=\"button\"\n onClick={onSelect}\n className=\"flex shrink-0 items-center pt-0.5\"\n aria-label=\"Choose Other\"\n >\n <Radio selected={selected} />\n </button>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm text-foreground\">Other</div>\n <Input\n placeholder=\"Type your answer…\"\n value={value}\n onFocus={onSelect}\n onChange={(e) => onChange(e.target.value)}\n className=\"mt-0.5 h-7 px-0 text-xs\"\n />\n </div>\n </div>\n );\n}\n\nfunction Radio({ selected }: { selected: boolean }) {\n return (\n <span\n aria-hidden\n className={cn(\n \"mt-[3px] size-3.5 shrink-0 rounded-full border\",\n selected\n ? \"border-foreground bg-foreground\"\n : \"border-muted-foreground/60 bg-transparent\",\n )}\n />\n );\n}\n\n// ── Locked (after submit / during replay) ────────────────────────────\n\nfunction ClarifyLocked({\n tc,\n questions,\n}: {\n tc: ToolCallInfo;\n questions: ClarifyQuestion[];\n}) {\n const answers = tc.clarifyAnswers;\n // Map answer question text back to the widget's question index so the\n // order matches the tabs (LLM-submitted order, not user navigation).\n const byPrompt = new Map(\n answers?.map((a) => [a.question, a]) ?? [],\n );\n\n const cancelled = !answers && tc.status !== \"running\";\n\n return (\n <div className=\"rounded-md border border-border bg-muted/20 px-3 py-2 text-sm max-w-2xl\">\n <div className=\"mb-1 text-xs text-muted-foreground\">\n {cancelled ? \"Clarification cancelled\" : \"Clarification answered\"}\n </div>\n <ul className=\"space-y-1.5\">\n {questions.map((q, i) => {\n const a = byPrompt.get(q.prompt);\n return (\n <li key={i} className=\"text-sm\">\n <div className=\"text-muted-foreground\">\n <span className=\"text-muted-foreground/70\">\n Q{i + 1}.\n </span>{\" \"}\n {q.prompt}\n </div>\n {a ? (\n <div className=\"ml-5 text-foreground\">\n <span className=\"text-emerald-500\">→</span>{\" \"}\n {a.answer}\n {a.is_other && (\n <span className=\"ml-1 text-[10px] text-muted-foreground/70\">\n (other)\n </span>\n )}\n </div>\n ) : (\n <div className=\"ml-5 text-muted-foreground/60 italic\">\n — no answer —\n </div>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Minimal renderer for the ``create_artifact`` tool call. The actual\n// artifact content is rendered below by ``ArtifactBlock`` from the\n// ``artifact.created`` event — so the tool call itself is just a\n// compact status line, matching Claude's \"creating …\" artifact UX.\n//\n// Failures here are almost always transient: the LLM occasionally\n// emits a malformed call (flat shape, stringified spec, missing\n// fields) and immediately retries with the right shape. Surfacing\n// the failed attempt as a red \"Tried to create\" + raw error text\n// confuses users who only care about the final rendered chart, and\n// nudges the model into post-hoc \"fix\" loops. We collapse the\n// failed attempt into the same \"still working\" status as the running\n// state instead.\n\nimport type { ToolCallInfo } from \"../../../types\";\nimport { parseArgs, effectiveStatus } from \"./shared\";\n\nexport function ArtifactToolBlock({\n tc,\n resolvedName,\n}: {\n tc: ToolCallInfo;\n // Name resolved by the caller (``args.name`` or the matching\n // ``artifact.created`` fallback). When omitted, the component parses\n // ``tc.args`` inline so it remains self-contained for callers that\n // don't pre-resolve.\n resolvedName?: string;\n}) {\n const status = effectiveStatus(tc);\n\n const label =\n status === \"running\"\n ? \"Creating artifact…\"\n : status === \"error\"\n ? \"Creating artifact…\"\n : \"Created\";\n\n const name = resolvedName\n ?? parseArgs<{ name?: string }>(tc.args)?.name;\n\n return (\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">{label}</span>\n {name && (\n <span className=\"text-muted-foreground truncate\">{name}</span>\n )}\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Renderer for the `delegate_task` tool — sub-agent delegation.\n// Header shows the goal as the primary signal; expanding reveals the\n// full goal, context, agent_type/model overrides, and the child\n// session's final response.\n\nimport { useState } from \"react\";\nimport { ChevronRightIcon, GitBranchIcon } from \"lucide-react\";\nimport { cn } from \"../../../lib/utils\";\nimport { parseArgs, truncate } from \"./shared\";\nimport type { ToolCallInfo } from \"../../../types\";\n\ninterface DelegateArgs {\n goal?: string;\n context?: string;\n model?: string;\n agent_type?: string;\n}\n\nfunction firstLine(s: string): string {\n const idx = s.indexOf(\"\\n\");\n return idx === -1 ? s : s.slice(0, idx);\n}\n\nexport function DelegateToolBlock({ tc }: { tc: ToolCallInfo }) {\n const [expanded, setExpanded] = useState(false);\n const args = parseArgs<DelegateArgs>(tc.args);\n\n const goal = args?.goal ?? \"\";\n const context = args?.context ?? \"\";\n const agentType = args?.agent_type;\n const model = args?.model;\n\n const summary = firstLine(goal).trim();\n\n // The result is usually plain text from the child's final response,\n // but errors come back as `{\"error\": \"...\"}`.\n let resultError: string | null = null;\n if (tc.result) {\n try {\n const parsed = JSON.parse(tc.result);\n if (parsed?.error) resultError = String(parsed.error);\n } catch {\n /* not JSON — treat as plain response text */\n }\n }\n\n return (\n <div>\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className={cn(\n \"flex w-full items-center gap-1.5 rounded-md px-2 py-1\",\n \"text-sm text-muted-foreground hover:bg-muted/50 transition-colors\"\n )}\n >\n <ChevronRightIcon\n className={cn(\n \"size-3 shrink-0 transition-transform duration-150\",\n expanded && \"rotate-90\",\n )}\n />\n <GitBranchIcon className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"font-medium text-foreground/80\">delegate_task</span>\n {agentType && (\n <span className=\"text-muted-foreground\">· {agentType}</span>\n )}\n {summary && (\n <span className=\"text-muted-foreground truncate min-w-0\">\n · {summary}\n </span>\n )}\n </button>\n\n {expanded && (\n <div className=\"ml-6 mt-0.5 space-y-1.5 text-sm font-mono\">\n {(agentType || model) && (\n <div className=\"flex flex-wrap gap-x-3 gap-y-0.5 text-xs text-muted-foreground\">\n {agentType && (\n <span>\n <span className=\"text-muted-foreground/70\">agent:</span>{\" \"}\n {agentType}\n </span>\n )}\n {model && (\n <span>\n <span className=\"text-muted-foreground/70\">model:</span>{\" \"}\n {model}\n </span>\n )}\n </div>\n )}\n\n {goal && (\n <div className=\"rounded bg-muted/40 px-2 py-1\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground/70\">\n Goal\n </div>\n <pre className=\"mt-0.5 whitespace-pre-wrap break-words text-foreground/90\">\n {goal}\n </pre>\n </div>\n )}\n\n {context && (\n <div className=\"rounded bg-muted/40 px-2 py-1\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground/70\">\n Context\n </div>\n <pre className=\"mt-0.5 whitespace-pre-wrap break-words text-muted-foreground\">\n {truncate(context, 2000)}\n </pre>\n </div>\n )}\n\n {tc.status === \"running\" && !tc.result && (\n <div className=\"text-xs text-muted-foreground italic\">\n Sub-agent running…\n </div>\n )}\n\n {tc.result && (\n <div\n className={cn(\n \"rounded px-2 py-1 max-h-64 overflow-y-auto\",\n resultError\n ? \"bg-destructive/10\"\n : \"bg-muted/40\",\n )}\n >\n <div\n className={cn(\n \"text-[10px] uppercase tracking-wide\",\n resultError\n ? \"text-destructive/80\"\n : \"text-emerald-600 dark:text-emerald-400\",\n )}\n >\n {resultError ? \"Error\" : \"Sub-agent response\"}\n </div>\n <pre className=\"mt-0.5 whitespace-pre-wrap break-words text-foreground/90\">\n {truncate(resultError ?? tc.result, 4000)}\n </pre>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Memory tool widget -- compact one-liner that summarises the action\n// (add / replace / remove) against the chosen store (memory / user\n// profile). Expands to show the actual entry content (and the old\n// text for replace / remove).\n\nimport { useState } from \"react\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../../ui/collapsible\";\nimport { cn } from \"../../../lib/utils\";\nimport { parseArgs } from \"./shared\";\nimport type { ToolCallInfo } from \"../../../types\";\n\ninterface MemoryArgs {\n action?: \"add\" | \"replace\" | \"remove\";\n target?: \"memory\" | \"user\";\n content?: string;\n old_text?: string;\n}\n\ninterface MemoryResult {\n success?: boolean;\n message?: string;\n error?: string | null;\n entries?: string[];\n usage?: string;\n entry_count?: number;\n}\n\nconst ACTION_VERB: Record<string, string> = {\n add: \"Saved\",\n replace: \"Updated\",\n remove: \"Removed\",\n};\n\nconst ACTION_PREP: Record<string, string> = {\n add: \"to\",\n replace: \"in\",\n remove: \"from\",\n};\n\nconst TARGET_LABEL: Record<string, string> = {\n memory: \"memory\",\n user: \"user profile\",\n};\n\nexport function MemoryToolBlock({ tc }: { tc: ToolCallInfo }) {\n const [isOpen, setIsOpen] = useState(false);\n const args = parseArgs<MemoryArgs>(tc.args) ?? {};\n const result = tc.result ? parseArgs<MemoryResult>(tc.result) : null;\n\n const action = args.action ?? \"add\";\n const target = args.target ?? \"memory\";\n const verb = ACTION_VERB[action] ?? action;\n const prep = ACTION_PREP[action] ?? \"to\";\n const targetLabel = TARGET_LABEL[target] ?? target;\n const failed = result?.success === false || !!result?.error;\n\n return (\n <Collapsible open={isOpen} onOpenChange={setIsOpen} className=\"not-prose w-full\">\n <CollapsibleTrigger className=\"group/trigger flex w-fit items-center gap-2 text-sm transition-colors\">\n <span className=\"text-left\">\n <span className=\"font-semibold text-foreground\">{verb}</span>{\" \"}\n <span className=\"text-muted-foreground\">\n {prep} {targetLabel}\n </span>\n {result?.usage && !failed && (\n <span className=\"text-muted-foreground/60 ml-1.5 text-xs\">\n {result.usage}\n </span>\n )}\n {failed && (\n <span className=\"text-red-500 ml-1.5\">· failed</span>\n )}\n </span>\n <ChevronDownIcon\n className={cn(\n \"size-4 shrink-0 transition-transform\",\n isOpen ? \"rotate-180\" : \"rotate-0\",\n )}\n />\n </CollapsibleTrigger>\n <CollapsibleContent\n className={cn(\n \"mt-2 overflow-hidden\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n )}\n >\n <div className=\"space-y-1.5\">\n {action === \"add\" && args.content && (\n <MemoryEntry content={args.content} variant=\"added\" />\n )}\n {action === \"replace\" && (\n <>\n {args.old_text && (\n <MemoryEntry content={args.old_text} label=\"Old\" variant=\"removed\" />\n )}\n {args.content && (\n <MemoryEntry content={args.content} label=\"New\" variant=\"added\" />\n )}\n </>\n )}\n {action === \"remove\" && args.old_text && (\n <MemoryEntry content={args.old_text} variant=\"removed\" />\n )}\n {result?.error && (\n <div className=\"rounded bg-red-500/10 px-2 py-1 text-xs text-red-500\">\n {result.error}\n </div>\n )}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nfunction MemoryEntry({\n content,\n label,\n variant = \"added\",\n}: {\n content: string;\n label?: string;\n variant?: \"added\" | \"removed\";\n}) {\n return (\n <div\n className={cn(\n \"rounded-md border-l-2 px-3 py-2 text-sm\",\n variant === \"added\"\n ? \"border-emerald-500/50 bg-emerald-500/5\"\n : \"border-red-500/50 bg-red-500/5\",\n )}\n >\n {label && (\n <div className=\"mb-1 text-[10px] uppercase tracking-wide text-muted-foreground/70\">\n {label}\n </div>\n )}\n <div className=\"whitespace-pre-wrap wrap-break-word text-foreground/90\">\n {content}\n </div>\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Compact renderer for skill_manage CRUD calls.\n\nimport { parseArgs } from \"./shared\";\nimport type { ToolCallInfo } from \"../../../types\";\n\ninterface SkillManageArgs {\n action?: string;\n name?: string;\n file_path?: string;\n}\n\ninterface SkillManageResult {\n success?: boolean;\n error?: string;\n message?: string;\n path?: string;\n}\n\nconst ACTION_LABEL: Record<string, string> = {\n create: \"Create skill\",\n patch: \"Patch skill\",\n edit: \"Edit skill\",\n delete: \"Delete skill\",\n write_file: \"Write skill file\",\n remove_file: \"Remove skill file\",\n};\n\nexport function SkillManageToolBlock({ tc }: { tc: ToolCallInfo }) {\n const args = parseArgs<SkillManageArgs>(tc.args) ?? {};\n const result = tc.result ? parseArgs<SkillManageResult>(tc.result) : null;\n const action = args.action ?? \"manage\";\n const label = ACTION_LABEL[action] ?? \"Manage skill\";\n const target = args.file_path ? `${args.name ?? \"?\"}/${args.file_path}` : (args.name ?? \"?\");\n const failed = result?.success === false || Boolean(result?.error);\n const summary = result?.error ?? result?.message ?? result?.path;\n\n return (\n <div className=\"flex items-center gap-1.5 text-sm\">\n <span className=\"font-semibold text-foreground\">{label}</span>\n <span className=\"text-muted-foreground truncate\">{target}</span>\n {summary && (\n <span className={failed ? \"text-red-500 truncate\" : \"text-muted-foreground/70 truncate\"}>\n → {summary}\n </span>\n )}\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Compact renderers for coordinator worker-management tools.\n\nimport { parseArgs } from \"./shared\";\nimport type { ToolCallInfo } from \"../../../types\";\n\ninterface CoordinatorArgs {\n goal?: string;\n context?: string;\n worker_id?: string;\n message?: string;\n reason?: string;\n agent_type?: string;\n model?: string;\n}\n\ninterface CoordinatorResult {\n worker_id?: string;\n session_id?: string;\n status?: string;\n error?: string;\n}\n\nfunction firstLine(value: string | undefined) {\n if (!value) return \"\";\n const index = value.indexOf(\"\\n\");\n return (index === -1 ? value : value.slice(0, index)).trim();\n}\n\nexport function CoordinatorToolBlock({ tc }: { tc: ToolCallInfo }) {\n const args = parseArgs<CoordinatorArgs>(tc.args) ?? {};\n const result = tc.result ? parseArgs<CoordinatorResult>(tc.result) : null;\n const failed = Boolean(result?.error);\n\n let label = \"Worker\";\n let target = \"\";\n let detail = \"\";\n\n if (tc.toolName === \"spawn_worker\") {\n label = tc.status === \"running\" ? \"Spawning worker\" : \"Spawned worker\";\n target = args.agent_type ?? args.model ?? \"\";\n detail = firstLine(args.goal);\n } else if (tc.toolName === \"send_worker_message\") {\n label = \"Message worker\";\n target = args.worker_id ?? \"\";\n detail = firstLine(args.message);\n } else if (tc.toolName === \"stop_worker\") {\n label = \"Stop worker\";\n target = args.worker_id ?? \"\";\n detail = firstLine(args.reason);\n }\n\n const resultId = result?.worker_id ?? result?.session_id;\n const summary = result?.error ?? resultId ?? result?.status;\n\n return (\n <div className=\"flex items-center gap-1.5 text-sm\">\n <span className=\"font-semibold text-foreground\">{label}</span>\n {target && <span className=\"text-muted-foreground truncate\">{target}</span>}\n {detail && <span className=\"text-muted-foreground/70 truncate\">· {detail}</span>}\n {summary && (\n <span className={failed ? \"text-red-500 truncate\" : \"text-muted-foreground/70 truncate\"}>\n → {summary}\n </span>\n )}\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Generic collapsible tool call renderer — used for tools without\n// a dedicated renderer.\n\nimport { useState } from \"react\";\nimport { ChevronRightIcon, CheckCircle2Icon, Loader2Icon, XCircleIcon } from \"lucide-react\";\nimport { cn } from \"../../../lib/utils\";\nimport { formatArgs, truncate, effectiveStatus } from \"./shared\";\nimport type { ToolCallInfo } from \"../../../types\";\n\nconst TOOL_LABELS: Record<string, string> = {\n kb_list_pages: \"Knowledge Base\",\n kb_read_page: \"Read KB Page\",\n consult_expert: \"Expert\",\n delegate_task: \"Delegate\",\n memory: \"Memory\",\n skills_list: \"Skills\",\n skill_view: \"Skill\",\n create_artifact: \"Artifact\",\n process: \"Process\",\n};\n\nfunction toolLabel(name: string): string {\n return TOOL_LABELS[name] ?? name.replace(/_/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction toolSummary(tc: ToolCallInfo): string {\n try {\n const args = JSON.parse(tc.args);\n if (tc.toolName === \"kb_list_pages\") return args.kb_id ? `Listing pages` : \"\";\n if (tc.toolName === \"kb_read_page\") return args.path ?? \"\";\n if (tc.toolName === \"consult_expert\") return args.question?.slice(0, 60) ?? \"\";\n if (tc.toolName === \"memory\") return args.action ?? \"\";\n return \"\";\n } catch {\n return \"\";\n }\n}\n\nfunction StatusIcon({ tc }: { tc: ToolCallInfo }) {\n const status = effectiveStatus(tc);\n if (status === \"running\") return <Loader2Icon className=\"size-3.5 animate-spin text-primary\" />;\n if (status === \"error\") return <XCircleIcon className=\"size-3.5 text-red-500\" />;\n if (status === \"cancelled\") return <XCircleIcon className=\"size-3.5 text-muted-foreground/40\" />;\n return <CheckCircle2Icon className=\"size-3.5 text-emerald-500\" />;\n}\n\nexport function DefaultToolBlock({ tc }: { tc: ToolCallInfo }) {\n const [expanded, setExpanded] = useState(false);\n const summary = toolSummary(tc);\n\n return (\n <div className=\"rounded-lg border border-border/60 bg-muted/20 overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className={cn(\n \"flex w-full items-center gap-2 px-3 py-2\",\n \"text-sm hover:bg-muted/40 transition-colors cursor-pointer\",\n )}\n >\n <StatusIcon tc={tc} />\n <span className=\"font-medium text-foreground\">{toolLabel(tc.toolName)}</span>\n {summary && (\n <span className=\"text-muted-foreground/70 truncate text-xs flex-1 text-left\">\n {summary}\n </span>\n )}\n <ChevronRightIcon\n className={cn(\n \"size-3.5 shrink-0 text-muted-foreground/50 transition-transform duration-150 ml-auto\",\n expanded && \"rotate-90\",\n )}\n />\n </button>\n\n {expanded && (\n <div className=\"border-t border-border/40 px-3 py-2 space-y-2\">\n <pre className=\"overflow-x-auto rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground font-mono whitespace-pre-wrap break-all\">\n {formatArgs(tc.args)}\n </pre>\n {tc.result && (\n <pre className=\"overflow-x-auto rounded-md bg-muted/50 px-3 py-2 text-xs font-mono whitespace-pre-wrap break-all max-h-48 overflow-y-auto\">\n <span className=\"text-emerald-600 dark:text-emerald-400 font-semibold\">\n Result\n </span>\n {\"\\n\"}\n <span className=\"text-muted-foreground\">{truncate(tc.result, 2000)}</span>\n </pre>\n )}\n </div>\n )}\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Main tool call block — dispatches to the appropriate renderer\n// based on tool name.\n\nimport type { ToolCallInfo } from \"../../types\";\n\nimport { TerminalToolBlock } from \"./tools/terminal-tool\";\nimport { TodoToolBlock } from \"./tools/todo-tool\";\nimport { ExecuteCodeToolBlock } from \"./tools/execute-code-tool\";\nimport { SessionSearchBlock, WebToolBlock, VisionAnalyzeBlock, MCPToolBlock } from \"./tools/oneliner-tools\";\nimport { WebExtractToolBlock } from \"./tools/web-extract-tool\";\nimport { ReadFileBlock, WriteFileBlock, PatchBlock, SearchFilesBlock, ListFilesBlock } from \"./tools/file-tools\";\nimport { ProcessToolBlock } from \"./tools/process-tool\";\nimport { ExpertToolBlock } from \"./tools/expert-tool\";\nimport { SkillsListBlock, SkillViewBlock } from \"./tools/skill-tools\";\nimport { ClarifyToolBlock } from \"./tools/clarify-tool\";\nimport { ArtifactToolBlock } from \"./tools/artifact-tool\";\nimport { DelegateToolBlock } from \"./tools/delegate-tool\";\nimport { MemoryToolBlock } from \"./tools/memory-tool\";\nimport { SkillManageToolBlock } from \"./tools/skill-manage-tool\";\nimport { CoordinatorToolBlock } from \"./tools/coordinator-tools\";\nimport { DefaultToolBlock } from \"./tools/default-tool\";\n\nexport function ToolCallBlock({\n tc,\n resolvedArtifactName,\n onFileSelect,\n}: {\n tc: ToolCallInfo;\n resolvedArtifactName?: string;\n onFileSelect?: (path: string) => void;\n}) {\n if (tc.toolName.startsWith(\"mcp__\")) {\n return <MCPToolBlock tc={tc} />;\n }\n\n switch (tc.toolName) {\n case \"terminal\":\n return <TerminalToolBlock tc={tc} />;\n\n case \"todo\":\n return <TodoToolBlock tc={tc} />;\n\n case \"execute_code\":\n return <ExecuteCodeToolBlock tc={tc} />;\n\n case \"session_search\":\n return <SessionSearchBlock tc={tc} />;\n\n case \"web_extract\":\n return <WebExtractToolBlock tc={tc} />;\n\n case \"web_search\":\n case \"web_crawl\":\n return <WebToolBlock tc={tc} />;\n\n case \"vision_analyze\":\n return <VisionAnalyzeBlock tc={tc} />;\n\n case \"read_file\":\n return <ReadFileBlock tc={tc} onFileSelect={onFileSelect} />;\n\n case \"write_file\":\n return <WriteFileBlock tc={tc} onFileSelect={onFileSelect} />;\n\n case \"patch\":\n return <PatchBlock tc={tc} onFileSelect={onFileSelect} />;\n\n case \"search_files\":\n return <SearchFilesBlock tc={tc} />;\n\n case \"list_files\":\n return <ListFilesBlock tc={tc} />;\n\n case \"process\":\n return <ProcessToolBlock tc={tc} />;\n\n case \"consult_expert\":\n return <ExpertToolBlock tc={tc} />;\n\n case \"skills_list\":\n return <SkillsListBlock tc={tc} />;\n\n case \"skill_view\":\n return <SkillViewBlock tc={tc} />;\n\n case \"skill_manage\":\n return <SkillManageToolBlock tc={tc} />;\n\n case \"clarify\":\n return <ClarifyToolBlock tc={tc} />;\n\n case \"create_artifact\":\n return <ArtifactToolBlock tc={tc} resolvedName={resolvedArtifactName} />;\n\n case \"delegate_task\":\n return <DelegateToolBlock tc={tc} />;\n\n case \"memory\":\n return <MemoryToolBlock tc={tc} />;\n\n case \"spawn_worker\":\n case \"send_worker_message\":\n case \"stop_worker\":\n return <CoordinatorToolBlock tc={tc} />;\n\n default:\n return <DefaultToolBlock tc={tc} />;\n }\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Renders a run of consecutive web_search calls as one grouped card,\n// with each query on its own row plus an optional result count.\n\nimport { SearchIcon } from \"lucide-react\";\nimport type { ToolCallInfo } from \"../../../types\";\n\nfunction parseQuery(rawArgs: string): string {\n try {\n const args = JSON.parse(rawArgs);\n return typeof args.query === \"string\" ? args.query : \"\";\n } catch {\n return \"\";\n }\n}\n\nfunction parseResultCount(rawResult: string | undefined): number | null {\n if (!rawResult) return null;\n try {\n const parsed = JSON.parse(rawResult);\n if (Array.isArray(parsed?.data?.web)) return parsed.data.web.length;\n if (Array.isArray(parsed?.results)) return parsed.results.length;\n } catch {\n /* ignore */\n }\n return null;\n}\n\nfunction WebSearchRow({ tc }: { tc: ToolCallInfo }) {\n const query = parseQuery(tc.args);\n const count = parseResultCount(tc.result);\n const showCount = count !== null && tc.status === \"complete\";\n\n return (\n <div className=\"flex items-center gap-2 text-xs min-w-0\">\n <span className=\"text-muted-foreground truncate\">{query || \"—\"}</span>\n {showCount && (\n <span className=\"text-muted-foreground/50 shrink-0\">\n {count} result{count !== 1 ? \"s\" : \"\"}\n </span>\n )}\n </div>\n );\n}\n\nexport function WebSearchGroupBlock({ tcs }: { tcs: ToolCallInfo[] }) {\n return (\n <div>\n <div className=\"flex items-center gap-2 text-sm\">\n <SearchIcon className=\"size-3.5 text-muted-foreground/60 shrink-0\" />\n <span className=\"font-medium text-foreground\">Web Search</span>\n <span className=\"text-muted-foreground/70 text-xs\">\n {tcs.length} {tcs.length === 1 ? \"query\" : \"queries\"}\n </span>\n </div>\n <ul className=\"mt-1 ml-5 space-y-0.5\">\n {tcs.map((tc) => (\n <li key={tc.id}>\n <WebSearchRow tc={tc} />\n </li>\n ))}\n </ul>\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\nimport { memo } from \"react\";\nimport {\n File as FileIcon,\n FileArchive,\n FileAudio,\n FileCode,\n FileImage,\n FileSpreadsheet,\n FileText,\n FileVideo,\n} from \"lucide-react\";\nimport { Message, MessageContent } from \"../ai-elements/message\";\nimport type {\n AgentChatDisplayAttachment,\n ChatMessage as ChatMessageType,\n} from \"../../types\";\n\ninterface ChatMessageProps {\n message: ChatMessageType;\n onFileSelect?: (path: string) => void;\n}\n\n// Renders user messages only. Assistant and system messages go through\n// chat-thread's AssistantGroup / OrphanSystemMarker instead.\nexport const ChatMessage = memo(function ChatMessage({\n message,\n onFileSelect,\n}: ChatMessageProps) {\n return (\n <Message from=\"user\">\n <MessageContent>\n {message.content}\n {message.images && message.images.length > 0 && (\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {message.images.map((img, i) => (\n <img\n key={i}\n src={img.data}\n alt=\"Attached\"\n className=\"max-w-64 max-h-48 rounded-lg border border-border object-contain\"\n />\n ))}\n </div>\n )}\n {message.attachments && message.attachments.length > 0 && (\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {message.attachments.map((a, i) => (\n <AttachmentChip\n // Stable key across the optimistic → confirmed\n // transition: the local chip starts without a path\n // and gains one when the user.message SSE event\n // arrives; falling back to the array index keeps the\n // chip in place across that swap.\n key={a.path ?? `pending-${i}`}\n attachment={a}\n onSelect={onFileSelect}\n />\n ))}\n </div>\n )}\n </MessageContent>\n </Message>\n );\n});\n\n// ── Attachment chip ──────────────────────────────────────────────────\n\nfunction iconForMime(mime?: string) {\n if (!mime) return FileIcon;\n if (mime.startsWith(\"image/\")) return FileImage;\n if (mime.startsWith(\"audio/\")) return FileAudio;\n if (mime.startsWith(\"video/\")) return FileVideo;\n if (mime === \"application/pdf\") return FileText;\n if (mime.startsWith(\"text/\")) return FileText;\n if (\n mime === \"application/json\" ||\n mime === \"application/xml\" ||\n mime.endsWith(\"+xml\") ||\n mime.endsWith(\"+json\") ||\n mime.includes(\"javascript\") ||\n mime.includes(\"typescript\")\n ) {\n return FileCode;\n }\n if (\n mime === \"application/zip\" ||\n mime === \"application/x-7z-compressed\" ||\n mime === \"application/x-tar\" ||\n mime === \"application/gzip\" ||\n mime === \"application/x-rar-compressed\"\n ) {\n return FileArchive;\n }\n if (\n mime === \"text/csv\" ||\n mime === \"application/vnd.ms-excel\" ||\n mime.includes(\"spreadsheet\")\n ) {\n return FileSpreadsheet;\n }\n return FileIcon;\n}\n\nfunction formatBytes(n?: number): string {\n if (n == null || !Number.isFinite(n) || n < 0) return \"\";\n for (const [unit, divisor] of [\n [\"GB\", 1_000_000_000],\n [\"MB\", 1_000_000],\n [\"KB\", 1_000],\n ] as const) {\n if (n >= divisor) return `${(n / divisor).toFixed(1)} ${unit}`;\n }\n return `${n} B`;\n}\n\nfunction AttachmentChip({\n attachment,\n onSelect,\n}: {\n attachment: AgentChatDisplayAttachment;\n onSelect?: (path: string) => void;\n}) {\n const Icon = iconForMime(attachment.mimeType);\n const clickable = !!attachment.path && !!onSelect;\n const sizeLabel = formatBytes(attachment.size);\n return (\n <button\n type=\"button\"\n onClick={\n clickable ? () => onSelect!(attachment.path!) : undefined\n }\n disabled={!clickable}\n title={attachment.filename}\n aria-label={\n clickable\n ? `Open ${attachment.filename}`\n : `${attachment.filename} (uploading)`\n }\n className={\n \"inline-flex items-center gap-2 rounded-md border border-border \" +\n \"bg-muted/40 px-2 py-1 text-xs max-w-[16rem] \" +\n (clickable\n ? \"hover:bg-muted cursor-pointer\"\n : \"opacity-60 cursor-default\")\n }\n >\n <Icon className=\"size-3.5 shrink-0\" />\n <span className=\"truncate\">{attachment.filename}</span>\n {sizeLabel && (\n <span className=\"text-muted-foreground shrink-0\">{sizeLabel}</span>\n )}\n </button>\n );\n}\n\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Textarea } from \"./textarea\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-10 w-full min-w-0 items-center rounded-none border border-transparent border-b-input bg-transparent transition-[color,border-color] outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-data-[align=block-end]:rounded-none has-data-[align=block-start]:rounded-none has-[[data-slot=input-group-control]:focus-visible]:border-b-ring has-[[data-slot][aria-invalid=true]]:border-b-destructive has-[textarea]:rounded-none has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:has-[[data-slot][aria-invalid=true]]:border-b-destructive/50 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-2 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 **:data-[slot=kbd]:rounded-none **:data-[slot=kbd]:bg-muted-foreground/10 **:data-[slot=kbd]:px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n {\n variants: {\n align: {\n \"inline-start\": \"order-first\",\n \"inline-end\": \"order-last\",\n \"block-start\":\n \"order-first w-full justify-start pt-3 group-has-[>input]/input-group:pt-3.5 [.border-b]:pb-3.5\",\n \"block-end\":\n \"order-last w-full justify-start pb-3 group-has-[>input]/input-group:pb-3.5 [.border-t]:pt-3.5\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 rounded-none text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-none px-1.5 text-xs [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"\",\n \"icon-xs\": \"size-6 p-0 text-xs has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-3.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 border-0 bg-transparent ring-0 group-has-[>[data-align=inline-end]]/input-group:pr-2 group-has-[>[data-align=inline-start]]/input-group:pl-2 focus-visible:ring-0 aria-invalid:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none border-0 bg-transparent py-2.5 ring-0 focus-visible:ring-0 aria-invalid:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Command as CommandPrimitive } from \"cmdk\"\n\nimport { cn } from \"../../lib/utils\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"./dialog\"\nimport {\n InputGroup,\n InputGroupAddon,\n} from \"./input-group\"\nimport { SearchIcon, CheckIcon } from \"lucide-react\"\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"flex size-full flex-col overflow-hidden bg-popover text-popover-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandDialog({\n title = \"Command Palette\",\n description = \"Search for a command to run...\",\n children,\n className,\n showCloseButton = false,\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string\n description?: string\n className?: string\n showCloseButton?: boolean\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent\n className={cn(\"top-1/3 translate-y-0 overflow-hidden p-0\", className)}\n showCloseButton={showCloseButton}\n >\n {children}\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div data-slot=\"command-input-wrapper\" className=\"p-1\">\n <InputGroup className=\"border-transparent border-b-input bg-transparent px-3\">\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"w-full px-2 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n <InputGroupAddon>\n <SearchIcon className=\"size-3.5 shrink-0 opacity-50\" />\n </InputGroupAddon>\n </InputGroup>\n </div>\n )\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n \"no-scrollbar max-h-72 scroll-py-1 overflow-x-hidden overflow-y-auto outline-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandEmpty({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className={cn(\"py-6 text-center text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"overflow-hidden p-1.5 text-foreground **:[[cmdk-group-heading]]:px-3 **:[[cmdk-group-heading]]:py-2 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-semibold **:[[cmdk-group-heading]]:tracking-wider **:[[cmdk-group-heading]]:text-muted-foreground **:[[cmdk-group-heading]]:uppercase\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"-mx-1.5 my-1.5 h-px bg-border/50\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"group/command-item relative flex cursor-default items-center gap-2 rounded-none px-3 py-2 text-sm outline-hidden select-none in-data-[slot=dialog-content]:rounded-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-muted data-selected:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5 data-selected:*:[svg]:text-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <CheckIcon className=\"ml-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-data-[checked=true]/command-item:opacity-100\" />\n </CommandPrimitive.Item>\n )\n}\n\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-data-selected/command-item:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { CheckIcon, ChevronRightIcon } from \"lucide-react\"\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 ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal 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 return (\n <DropdownMenuPrimitive.Portal>\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-none bg-popover p-1.5 text-popover-foreground shadow-md ring-1 ring-foreground/10 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 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-none px-3 py-2 text-xs font-medium tracking-wider uppercase 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-3.5 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-none py-2 pr-8 pl-3 text-xs font-medium tracking-wider uppercase 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-3.5\",\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-none py-2 pr-8 pl-3 text-xs font-medium tracking-wider uppercase 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-3.5\",\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 text-xs font-semibold tracking-wider text-muted-foreground uppercase 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-none px-3 py-2 text-xs font-medium tracking-wider uppercase 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-3.5\",\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-none bg-popover p-1.5 text-popover-foreground shadow-md ring-1 ring-foreground/10 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-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 { HoverCard as HoverCardPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction HoverCard({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Root>) {\n return <HoverCardPrimitive.Root data-slot=\"hover-card\" {...props} />\n}\n\nfunction HoverCardTrigger({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {\n return (\n <HoverCardPrimitive.Trigger data-slot=\"hover-card-trigger\" {...props} />\n )\n}\n\nfunction HoverCardContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Content>) {\n return (\n <HoverCardPrimitive.Portal data-slot=\"hover-card-portal\">\n <HoverCardPrimitive.Content\n data-slot=\"hover-card-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 origin-(--radix-hover-card-content-transform-origin) bg-popover p-4 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden 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-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 </HoverCardPrimitive.Portal>\n )\n}\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n","import { cn } from \"../../lib/utils\"\nimport { Loader2Icon } from \"lucide-react\"\n\nfunction Spinner({ className, ...props }: React.ComponentProps<\"svg\">) {\n return (\n <Loader2Icon role=\"status\" aria-label=\"Loading\" className={cn(\"size-4 animate-spin\", className)} {...props} />\n )\n}\n\nexport { Spinner }\n","\"use client\";\n\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from \"../ui/command\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\";\nimport {\n HoverCard,\n HoverCardContent,\n HoverCardTrigger,\n} from \"../ui/hover-card\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupTextarea,\n} from \"../ui/input-group\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport { Spinner } from \"../ui/spinner\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../ui/tooltip\";\nimport { cn } from \"../../lib/utils\";\nimport type { ChatStatus, FileUIPart, SourceDocumentUIPart } from \"ai\";\n\n/**\n * Local extension of FileUIPart that retains the original ``File`` object.\n *\n * Downstream consumers (e.g. the chat runtime) need the raw ``File`` to\n * upload a non-image attachment to the session workspace via\n * ``adapter.uploadWorkspaceFile``. Keeping it on the FileUIPart avoids\n * having to refetch the blob URL or otherwise reconstruct the file.\n *\n * The field is optional because attachments synthesised from other paths\n * (e.g. an HTTP source) may legitimately not have a backing ``File``.\n * We extend locally rather than mutating the upstream ``FileUIPart``\n * type so future AI SDK upgrades don't fight with this.\n */\nexport type PromptInputFileUIPart = FileUIPart & {\n id: string;\n file?: File;\n};\nimport {\n CornerDownLeftIcon,\n ImageIcon,\n Monitor,\n PlusIcon,\n SquareIcon,\n XIcon,\n} from \"lucide-react\";\nimport { nanoid } from \"nanoid\";\nimport type {\n ChangeEvent,\n ChangeEventHandler,\n ClipboardEventHandler,\n ComponentProps,\n FormEvent,\n FormEventHandler,\n HTMLAttributes,\n KeyboardEventHandler,\n PropsWithChildren,\n ReactNode,\n RefObject,\n} from \"react\";\nimport {\n Children,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst convertBlobUrlToDataUrl = async (url: string): Promise<string | null> => {\n try {\n const response = await fetch(url);\n const blob = await response.blob();\n // FileReader uses callback-based API, wrapping in Promise is necessary\n // oxlint-disable-next-line eslint-plugin-promise(avoid-new)\n return new Promise((resolve) => {\n const reader = new FileReader();\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n reader.onloadend = () => resolve(reader.result as string);\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n reader.onerror = () => resolve(null);\n reader.readAsDataURL(blob);\n });\n } catch {\n return null;\n }\n};\n\nconst captureScreenshot = async (): Promise<File | null> => {\n if (\n typeof navigator === \"undefined\" ||\n !navigator.mediaDevices?.getDisplayMedia\n ) {\n return null;\n }\n\n let stream: MediaStream | null = null;\n const video = document.createElement(\"video\");\n video.muted = true;\n video.playsInline = true;\n\n try {\n stream = await navigator.mediaDevices.getDisplayMedia({\n audio: false,\n video: true,\n });\n\n video.srcObject = stream;\n\n // Video element uses callback-based API, wrapping in Promise is necessary\n // oxlint-disable-next-line eslint-plugin-promise(avoid-new)\n await new Promise<void>((resolve, reject) => {\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n video.onloadedmetadata = () => resolve();\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n video.onerror = () => reject(new Error(\"Failed to load screen stream\"));\n });\n\n await video.play();\n\n const width = video.videoWidth;\n const height = video.videoHeight;\n if (!width || !height) {\n return null;\n }\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n\n context.drawImage(video, 0, 0, width, height);\n // canvas.toBlob uses callback-based API, wrapping in Promise is necessary\n // oxlint-disable-next-line eslint-plugin-promise(avoid-new)\n const blob = await new Promise<Blob | null>((resolve) => {\n canvas.toBlob(resolve, \"image/png\");\n });\n if (!blob) {\n return null;\n }\n\n const timestamp = new Date()\n .toISOString()\n .replaceAll(/[:.]/g, \"-\")\n .replace(\"T\", \"_\")\n .replace(\"Z\", \"\");\n\n return new File([blob], `screenshot-${timestamp}.png`, {\n lastModified: Date.now(),\n type: \"image/png\",\n });\n } finally {\n if (stream) {\n for (const track of stream.getTracks()) {\n track.stop();\n }\n }\n video.pause();\n video.srcObject = null;\n }\n};\n\n// ============================================================================\n// Provider Context & Types\n// ============================================================================\n\nexport interface AttachmentsContext {\n files: PromptInputFileUIPart[];\n add: (files: File[] | FileList) => void;\n remove: (id: string) => void;\n clear: () => void;\n openFileDialog: () => void;\n fileInputRef: RefObject<HTMLInputElement | null>;\n}\n\nexport interface TextInputContext {\n value: string;\n setInput: (v: string) => void;\n clear: () => void;\n}\n\nexport interface PromptInputControllerProps {\n textInput: TextInputContext;\n attachments: AttachmentsContext;\n /** INTERNAL: Allows PromptInput to register its file textInput + \"open\" callback */\n __registerFileInput: (\n ref: RefObject<HTMLInputElement | null>,\n open: () => void\n ) => void;\n}\n\nconst PromptInputController = createContext<PromptInputControllerProps | null>(\n null\n);\nconst ProviderAttachmentsContext = createContext<AttachmentsContext | null>(\n null\n);\n\nexport const usePromptInputController = () => {\n const ctx = useContext(PromptInputController);\n if (!ctx) {\n throw new Error(\n \"Wrap your component inside <PromptInputProvider> to use usePromptInputController().\"\n );\n }\n return ctx;\n};\n\n// Optional variants (do NOT throw). Useful for dual-mode components.\nconst useOptionalPromptInputController = () =>\n useContext(PromptInputController);\n\nexport const useProviderAttachments = () => {\n const ctx = useContext(ProviderAttachmentsContext);\n if (!ctx) {\n throw new Error(\n \"Wrap your component inside <PromptInputProvider> to use useProviderAttachments().\"\n );\n }\n return ctx;\n};\n\nconst useOptionalProviderAttachments = () =>\n useContext(ProviderAttachmentsContext);\n\nexport type PromptInputProviderProps = PropsWithChildren<{\n initialInput?: string;\n}>;\n\n/**\n * Optional global provider that lifts PromptInput state outside of PromptInput.\n * If you don't use it, PromptInput stays fully self-managed.\n */\nexport const PromptInputProvider = ({\n initialInput: initialTextInput = \"\",\n children,\n}: PromptInputProviderProps) => {\n // ----- textInput state\n const [textInput, setTextInput] = useState(initialTextInput);\n const clearInput = useCallback(() => setTextInput(\"\"), []);\n\n // ----- attachments state (global when wrapped)\n const [attachmentFiles, setAttachmentFiles] = useState<\n PromptInputFileUIPart[]\n >([]);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n // oxlint-disable-next-line eslint(no-empty-function)\n const openRef = useRef<() => void>(() => {});\n\n const add = useCallback((files: File[] | FileList) => {\n const incoming = [...files];\n if (incoming.length === 0) {\n return;\n }\n\n setAttachmentFiles((prev) => [\n ...prev,\n ...incoming.map<PromptInputFileUIPart>((file) => ({\n filename: file.name,\n id: nanoid(),\n mediaType: file.type,\n type: \"file\" as const,\n url: URL.createObjectURL(file),\n file,\n })),\n ]);\n }, []);\n\n const remove = useCallback((id: string) => {\n setAttachmentFiles((prev) => {\n const found = prev.find((f) => f.id === id);\n if (found?.url) {\n URL.revokeObjectURL(found.url);\n }\n return prev.filter((f) => f.id !== id);\n });\n }, []);\n\n const clear = useCallback(() => {\n setAttachmentFiles((prev) => {\n for (const f of prev) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n return [];\n });\n }, []);\n\n // Keep a ref to attachments for cleanup on unmount (avoids stale closure)\n const attachmentsRef = useRef(attachmentFiles);\n\n useEffect(() => {\n attachmentsRef.current = attachmentFiles;\n }, [attachmentFiles]);\n\n // Cleanup blob URLs on unmount to prevent memory leaks\n useEffect(\n () => () => {\n for (const f of attachmentsRef.current) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n },\n []\n );\n\n const openFileDialog = useCallback(() => {\n openRef.current?.();\n }, []);\n\n const attachments = useMemo<AttachmentsContext>(\n () => ({\n add,\n clear,\n fileInputRef,\n files: attachmentFiles,\n openFileDialog,\n remove,\n }),\n [attachmentFiles, add, remove, clear, openFileDialog]\n );\n\n const __registerFileInput = useCallback(\n (ref: RefObject<HTMLInputElement | null>, open: () => void) => {\n fileInputRef.current = ref.current;\n openRef.current = open;\n },\n []\n );\n\n const controller = useMemo<PromptInputControllerProps>(\n () => ({\n __registerFileInput,\n attachments,\n textInput: {\n clear: clearInput,\n setInput: setTextInput,\n value: textInput,\n },\n }),\n [textInput, clearInput, attachments, __registerFileInput]\n );\n\n return (\n <PromptInputController.Provider value={controller}>\n <ProviderAttachmentsContext.Provider value={attachments}>\n {children}\n </ProviderAttachmentsContext.Provider>\n </PromptInputController.Provider>\n );\n};\n\n// ============================================================================\n// Component Context & Hooks\n// ============================================================================\n\nconst LocalAttachmentsContext = createContext<AttachmentsContext | null>(null);\n\nexport const usePromptInputAttachments = () => {\n // Prefer local context (inside PromptInput) as it has validation, fall back to provider\n const provider = useOptionalProviderAttachments();\n const local = useContext(LocalAttachmentsContext);\n const context = local ?? provider;\n if (!context) {\n throw new Error(\n \"usePromptInputAttachments must be used within a PromptInput or PromptInputProvider\"\n );\n }\n return context;\n};\n\n// ============================================================================\n// Referenced Sources (Local to PromptInput)\n// ============================================================================\n\nexport interface ReferencedSourcesContext {\n sources: (SourceDocumentUIPart & { id: string })[];\n add: (sources: SourceDocumentUIPart[] | SourceDocumentUIPart) => void;\n remove: (id: string) => void;\n clear: () => void;\n}\n\nexport const LocalReferencedSourcesContext =\n createContext<ReferencedSourcesContext | null>(null);\n\nexport const usePromptInputReferencedSources = () => {\n const ctx = useContext(LocalReferencedSourcesContext);\n if (!ctx) {\n throw new Error(\n \"usePromptInputReferencedSources must be used within a LocalReferencedSourcesContext.Provider\"\n );\n }\n return ctx;\n};\n\nexport type PromptInputActionAddAttachmentsProps = ComponentProps<\n typeof DropdownMenuItem\n> & {\n label?: string;\n};\n\nexport const PromptInputActionAddAttachments = ({\n label = \"Add photos or files\",\n ...props\n}: PromptInputActionAddAttachmentsProps) => {\n const attachments = usePromptInputAttachments();\n\n const handleSelect = useCallback(\n (e: Event) => {\n e.preventDefault();\n attachments.openFileDialog();\n },\n [attachments]\n );\n\n return (\n <DropdownMenuItem {...props} onSelect={handleSelect}>\n <ImageIcon className=\"mr-2 size-4\" /> {label}\n </DropdownMenuItem>\n );\n};\n\nexport type PromptInputActionAddScreenshotProps = ComponentProps<\n typeof DropdownMenuItem\n> & {\n label?: string;\n};\n\nexport const PromptInputActionAddScreenshot = ({\n label = \"Take screenshot\",\n onSelect,\n ...props\n}: PromptInputActionAddScreenshotProps) => {\n const attachments = usePromptInputAttachments();\n\n const handleSelect = useCallback(\n async (event: Event) => {\n onSelect?.(event);\n if (event.defaultPrevented) {\n return;\n }\n\n try {\n const screenshot = await captureScreenshot();\n if (screenshot) {\n attachments.add([screenshot]);\n }\n } catch (error) {\n if (\n error instanceof DOMException &&\n (error.name === \"NotAllowedError\" || error.name === \"AbortError\")\n ) {\n return;\n }\n throw error;\n }\n },\n [onSelect, attachments]\n );\n\n return (\n <DropdownMenuItem {...props} onSelect={handleSelect}>\n <Monitor className=\"mr-2 size-4\" />\n {label}\n </DropdownMenuItem>\n );\n};\n\nexport interface PromptInputMessage {\n text: string;\n files: PromptInputFileUIPart[];\n}\n\nexport type PromptInputProps = Omit<\n HTMLAttributes<HTMLFormElement>,\n \"onSubmit\" | \"onError\"\n> & {\n // e.g., \"image/*\" or leave undefined for any\n accept?: string;\n multiple?: boolean;\n // When true, accepts drops anywhere on document. Default false (opt-in).\n globalDrop?: boolean;\n // Render a hidden input with given name and keep it in sync for native form posts. Default false.\n syncHiddenInput?: boolean;\n // Minimal constraints\n maxFiles?: number;\n // bytes\n maxFileSize?: number;\n onError?: (err: {\n code: \"max_files\" | \"max_file_size\" | \"accept\";\n message: string;\n }) => void;\n onSubmit: (\n message: PromptInputMessage,\n event: FormEvent<HTMLFormElement>\n ) => void | Promise<void>;\n};\n\nexport const PromptInput = ({\n className,\n accept,\n multiple,\n globalDrop,\n syncHiddenInput,\n maxFiles,\n maxFileSize,\n onError,\n onSubmit,\n children,\n ...props\n}: PromptInputProps) => {\n // Try to use a provider controller if present\n const controller = useOptionalPromptInputController();\n const usingProvider = !!controller;\n\n // Refs\n const inputRef = useRef<HTMLInputElement | null>(null);\n const formRef = useRef<HTMLFormElement | null>(null);\n\n // ----- Local attachments (only used when no provider)\n const [items, setItems] = useState<PromptInputFileUIPart[]>([]);\n const files = usingProvider ? controller.attachments.files : items;\n\n // ----- Local referenced sources (always local to PromptInput)\n const [referencedSources, setReferencedSources] = useState<\n (SourceDocumentUIPart & { id: string })[]\n >([]);\n\n // Keep a ref to files for cleanup on unmount (avoids stale closure)\n const filesRef = useRef(files);\n\n useEffect(() => {\n filesRef.current = files;\n }, [files]);\n\n const openFileDialogLocal = useCallback(() => {\n inputRef.current?.click();\n }, []);\n\n const matchesAccept = useCallback(\n (f: File) => {\n if (!accept || accept.trim() === \"\") {\n return true;\n }\n\n const patterns = accept\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n return patterns.some((pattern) => {\n if (pattern.endsWith(\"/*\")) {\n // e.g: image/* -> image/\n const prefix = pattern.slice(0, -1);\n return f.type.startsWith(prefix);\n }\n return f.type === pattern;\n });\n },\n [accept]\n );\n\n const addLocal = useCallback(\n (fileList: File[] | FileList) => {\n const incoming = [...fileList];\n const accepted = incoming.filter((f) => matchesAccept(f));\n if (incoming.length && accepted.length === 0) {\n onError?.({\n code: \"accept\",\n message: \"No files match the accepted types.\",\n });\n return;\n }\n const withinSize = (f: File) =>\n maxFileSize ? f.size <= maxFileSize : true;\n const sized = accepted.filter(withinSize);\n if (accepted.length > 0 && sized.length === 0) {\n onError?.({\n code: \"max_file_size\",\n message: \"All files exceed the maximum size.\",\n });\n return;\n }\n\n setItems((prev) => {\n const capacity =\n typeof maxFiles === \"number\"\n ? Math.max(0, maxFiles - prev.length)\n : undefined;\n const capped =\n typeof capacity === \"number\" ? sized.slice(0, capacity) : sized;\n if (typeof capacity === \"number\" && sized.length > capacity) {\n onError?.({\n code: \"max_files\",\n message: \"Too many files. Some were not added.\",\n });\n }\n const next: PromptInputFileUIPart[] = [];\n for (const file of capped) {\n next.push({\n filename: file.name,\n id: nanoid(),\n mediaType: file.type,\n type: \"file\",\n url: URL.createObjectURL(file),\n file,\n });\n }\n return [...prev, ...next];\n });\n },\n [matchesAccept, maxFiles, maxFileSize, onError]\n );\n\n const removeLocal = useCallback(\n (id: string) =>\n setItems((prev) => {\n const found = prev.find((file) => file.id === id);\n if (found?.url) {\n URL.revokeObjectURL(found.url);\n }\n return prev.filter((file) => file.id !== id);\n }),\n []\n );\n\n // Wrapper that validates files before calling provider's add\n const addWithProviderValidation = useCallback(\n (fileList: File[] | FileList) => {\n const incoming = [...fileList];\n const accepted = incoming.filter((f) => matchesAccept(f));\n if (incoming.length && accepted.length === 0) {\n onError?.({\n code: \"accept\",\n message: \"No files match the accepted types.\",\n });\n return;\n }\n const withinSize = (f: File) =>\n maxFileSize ? f.size <= maxFileSize : true;\n const sized = accepted.filter(withinSize);\n if (accepted.length > 0 && sized.length === 0) {\n onError?.({\n code: \"max_file_size\",\n message: \"All files exceed the maximum size.\",\n });\n return;\n }\n\n const currentCount = files.length;\n const capacity =\n typeof maxFiles === \"number\"\n ? Math.max(0, maxFiles - currentCount)\n : undefined;\n const capped =\n typeof capacity === \"number\" ? sized.slice(0, capacity) : sized;\n if (typeof capacity === \"number\" && sized.length > capacity) {\n onError?.({\n code: \"max_files\",\n message: \"Too many files. Some were not added.\",\n });\n }\n\n if (capped.length > 0) {\n controller?.attachments.add(capped);\n }\n },\n [matchesAccept, maxFileSize, maxFiles, onError, files.length, controller]\n );\n\n const clearAttachments = useCallback(\n () =>\n usingProvider\n ? controller?.attachments.clear()\n : setItems((prev) => {\n for (const file of prev) {\n if (file.url) {\n URL.revokeObjectURL(file.url);\n }\n }\n return [];\n }),\n [usingProvider, controller]\n );\n\n const clearReferencedSources = useCallback(\n () => setReferencedSources([]),\n []\n );\n\n const add = usingProvider ? addWithProviderValidation : addLocal;\n const remove = usingProvider ? controller.attachments.remove : removeLocal;\n const openFileDialog = usingProvider\n ? controller.attachments.openFileDialog\n : openFileDialogLocal;\n\n const clear = useCallback(() => {\n clearAttachments();\n clearReferencedSources();\n }, [clearAttachments, clearReferencedSources]);\n\n // Let provider know about our hidden file input so external menus can call openFileDialog()\n useEffect(() => {\n if (!usingProvider) {\n return;\n }\n controller.__registerFileInput(inputRef, () => inputRef.current?.click());\n }, [usingProvider, controller]);\n\n // Note: File input cannot be programmatically set for security reasons\n // The syncHiddenInput prop is no longer functional\n useEffect(() => {\n if (syncHiddenInput && inputRef.current && files.length === 0) {\n inputRef.current.value = \"\";\n }\n }, [files, syncHiddenInput]);\n\n // Attach drop handlers on nearest form and document (opt-in)\n useEffect(() => {\n const form = formRef.current;\n if (!form) {\n return;\n }\n if (globalDrop) {\n // when global drop is on, let the document-level handler own drops\n return;\n }\n\n const onDragOver = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes(\"Files\")) {\n e.preventDefault();\n }\n };\n const onDrop = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes(\"Files\")) {\n e.preventDefault();\n }\n if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n add(e.dataTransfer.files);\n }\n };\n form.addEventListener(\"dragover\", onDragOver);\n form.addEventListener(\"drop\", onDrop);\n return () => {\n form.removeEventListener(\"dragover\", onDragOver);\n form.removeEventListener(\"drop\", onDrop);\n };\n }, [add, globalDrop]);\n\n useEffect(() => {\n if (!globalDrop) {\n return;\n }\n\n const onDragOver = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes(\"Files\")) {\n e.preventDefault();\n }\n };\n const onDrop = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes(\"Files\")) {\n e.preventDefault();\n }\n if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n add(e.dataTransfer.files);\n }\n };\n document.addEventListener(\"dragover\", onDragOver);\n document.addEventListener(\"drop\", onDrop);\n return () => {\n document.removeEventListener(\"dragover\", onDragOver);\n document.removeEventListener(\"drop\", onDrop);\n };\n }, [add, globalDrop]);\n\n useEffect(\n () => () => {\n if (!usingProvider) {\n for (const f of filesRef.current) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n }\n },\n [usingProvider]\n );\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = useCallback(\n (event) => {\n if (event.currentTarget.files) {\n add(event.currentTarget.files);\n }\n // Reset input value to allow selecting files that were previously removed\n event.currentTarget.value = \"\";\n },\n [add]\n );\n\n const attachmentsCtx = useMemo<AttachmentsContext>(\n () => ({\n add,\n clear: clearAttachments,\n fileInputRef: inputRef,\n files: files.map((item) => ({ ...item, id: item.id })),\n openFileDialog,\n remove,\n }),\n [files, add, remove, clearAttachments, openFileDialog]\n );\n\n const refsCtx = useMemo<ReferencedSourcesContext>(\n () => ({\n add: (incoming: SourceDocumentUIPart[] | SourceDocumentUIPart) => {\n const array = Array.isArray(incoming) ? incoming : [incoming];\n setReferencedSources((prev) => [\n ...prev,\n ...array.map((s) => ({ ...s, id: nanoid() })),\n ]);\n },\n clear: clearReferencedSources,\n remove: (id: string) => {\n setReferencedSources((prev) => prev.filter((s) => s.id !== id));\n },\n sources: referencedSources,\n }),\n [referencedSources, clearReferencedSources]\n );\n\n const handleSubmit: FormEventHandler<HTMLFormElement> = useCallback(\n async (event) => {\n event.preventDefault();\n\n const form = event.currentTarget;\n const text = usingProvider\n ? controller.textInput.value\n : (() => {\n const formData = new FormData(form);\n return (formData.get(\"message\") as string) || \"\";\n })();\n\n // Reset form immediately after capturing text to avoid race condition\n // where user input during async blob conversion would be lost\n if (!usingProvider) {\n form.reset();\n }\n\n try {\n // Convert blob URLs to data URLs asynchronously for image-like\n // attachments only. Non-image files (PDFs, archives, etc.)\n // skip the base64 round-trip because the consumer reads them\n // via ``file: File`` and uploads to a workspace, not inline as\n // a data URL. For 50 MB attachments this avoids ~67 MB of\n // pointless base64 expansion per submit.\n const convertedFiles: PromptInputFileUIPart[] = await Promise.all(\n files.map(async (entry) => {\n const isBlob = entry.url?.startsWith(\"blob:\");\n const isImage = entry.mediaType?.startsWith(\"image/\");\n if (isBlob && isImage && entry.url) {\n const dataUrl = await convertBlobUrlToDataUrl(entry.url);\n return {\n ...entry,\n url: dataUrl ?? entry.url,\n };\n }\n return entry;\n })\n );\n\n const result = onSubmit({ files: convertedFiles, text }, event);\n\n // Handle both sync and async onSubmit\n if (result instanceof Promise) {\n try {\n await result;\n clear();\n if (usingProvider) {\n controller.textInput.clear();\n }\n } catch {\n // Don't clear on error - user may want to retry\n }\n } else {\n // Sync function completed without throwing, clear inputs\n clear();\n if (usingProvider) {\n controller.textInput.clear();\n }\n }\n } catch {\n // Don't clear on error - user may want to retry\n }\n },\n [usingProvider, controller, files, onSubmit, clear]\n );\n\n // Render with or without local provider\n const inner = (\n <>\n <input\n accept={accept}\n aria-label=\"Upload files\"\n className=\"hidden\"\n multiple={multiple}\n onChange={handleChange}\n ref={inputRef}\n title=\"Upload files\"\n type=\"file\"\n />\n <form\n className={cn(\"w-full\", className)}\n onSubmit={handleSubmit}\n ref={formRef}\n {...props}\n >\n <InputGroup className=\"overflow-hidden\">{children}</InputGroup>\n </form>\n </>\n );\n\n const withReferencedSources = (\n <LocalReferencedSourcesContext.Provider value={refsCtx}>\n {inner}\n </LocalReferencedSourcesContext.Provider>\n );\n\n // Always provide LocalAttachmentsContext so children get validated add function\n return (\n <LocalAttachmentsContext.Provider value={attachmentsCtx}>\n {withReferencedSources}\n </LocalAttachmentsContext.Provider>\n );\n};\n\nexport type PromptInputBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputBody = ({\n className,\n ...props\n}: PromptInputBodyProps) => (\n <div className={cn(\"contents\", className)} {...props} />\n);\n\nexport type PromptInputTextareaProps = ComponentProps<\n typeof InputGroupTextarea\n>;\n\nexport const PromptInputTextarea = ({\n onChange,\n onKeyDown,\n className,\n placeholder = \"What would you like to know?\",\n ...props\n}: PromptInputTextareaProps) => {\n const controller = useOptionalPromptInputController();\n const attachments = usePromptInputAttachments();\n const [isComposing, setIsComposing] = useState(false);\n\n const handleKeyDown: KeyboardEventHandler<HTMLTextAreaElement> = useCallback(\n (e) => {\n // Call the external onKeyDown handler first\n onKeyDown?.(e);\n\n // If the external handler prevented default, don't run internal logic\n if (e.defaultPrevented) {\n return;\n }\n\n if (e.key === \"Enter\") {\n if (isComposing || e.nativeEvent.isComposing) {\n return;\n }\n if (e.shiftKey) {\n return;\n }\n e.preventDefault();\n\n // Check if the submit button is disabled before submitting\n const { form } = e.currentTarget;\n const submitButton = form?.querySelector(\n 'button[type=\"submit\"]'\n ) as HTMLButtonElement | null;\n if (submitButton?.disabled) {\n return;\n }\n\n form?.requestSubmit();\n }\n\n // Remove last attachment when Backspace is pressed and textarea is empty\n if (\n e.key === \"Backspace\" &&\n e.currentTarget.value === \"\" &&\n attachments.files.length > 0\n ) {\n e.preventDefault();\n const lastAttachment = attachments.files.at(-1);\n if (lastAttachment) {\n attachments.remove(lastAttachment.id);\n }\n }\n },\n [onKeyDown, isComposing, attachments]\n );\n\n const handlePaste: ClipboardEventHandler<HTMLTextAreaElement> = useCallback(\n (event) => {\n const items = event.clipboardData?.items;\n\n if (!items) {\n return;\n }\n\n const files: File[] = [];\n\n for (const item of items) {\n if (item.kind === \"file\") {\n const file = item.getAsFile();\n if (file) {\n files.push(file);\n }\n }\n }\n\n if (files.length > 0) {\n event.preventDefault();\n attachments.add(files);\n }\n },\n [attachments]\n );\n\n const handleCompositionEnd = useCallback(() => setIsComposing(false), []);\n const handleCompositionStart = useCallback(() => setIsComposing(true), []);\n\n const controlledProps = controller\n ? {\n onChange: (e: ChangeEvent<HTMLTextAreaElement>) => {\n controller.textInput.setInput(e.currentTarget.value);\n onChange?.(e);\n },\n value: controller.textInput.value,\n }\n : {\n onChange,\n };\n\n return (\n <InputGroupTextarea\n className={cn(\"field-sizing-content max-h-48 min-h-16\", className)}\n name=\"message\"\n onCompositionEnd={handleCompositionEnd}\n onCompositionStart={handleCompositionStart}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder}\n {...props}\n {...controlledProps}\n />\n );\n};\n\nexport type PromptInputHeaderProps = Omit<\n ComponentProps<typeof InputGroupAddon>,\n \"align\"\n>;\n\nexport const PromptInputHeader = ({\n className,\n ...props\n}: PromptInputHeaderProps) => (\n <InputGroupAddon\n align=\"block-end\"\n className={cn(\"order-first flex-wrap gap-1\", className)}\n {...props}\n />\n);\n\nexport type PromptInputFooterProps = Omit<\n ComponentProps<typeof InputGroupAddon>,\n \"align\"\n>;\n\nexport const PromptInputFooter = ({\n className,\n ...props\n}: PromptInputFooterProps) => (\n <InputGroupAddon\n align=\"block-end\"\n className={cn(\"justify-between gap-1\", className)}\n {...props}\n />\n);\n\nexport type PromptInputToolsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTools = ({\n className,\n ...props\n}: PromptInputToolsProps) => (\n <div\n className={cn(\"flex min-w-0 items-center gap-1\", className)}\n {...props}\n />\n);\n\nexport type PromptInputButtonTooltip =\n | string\n | {\n content: ReactNode;\n shortcut?: string;\n side?: ComponentProps<typeof TooltipContent>[\"side\"];\n };\n\nexport type PromptInputButtonProps = ComponentProps<typeof InputGroupButton> & {\n tooltip?: PromptInputButtonTooltip;\n};\n\nexport const PromptInputButton = ({\n variant = \"ghost\",\n className,\n size,\n tooltip,\n ...props\n}: PromptInputButtonProps) => {\n const newSize =\n size ?? (Children.count(props.children) > 1 ? \"sm\" : \"icon-sm\");\n\n const button = (\n <InputGroupButton\n className={cn(className)}\n size={newSize}\n type=\"button\"\n variant={variant}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n const tooltipContent =\n typeof tooltip === \"string\" ? tooltip : tooltip.content;\n const shortcut = typeof tooltip === \"string\" ? undefined : tooltip.shortcut;\n const side = typeof tooltip === \"string\" ? \"top\" : (tooltip.side ?? \"top\");\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side={side}>\n {tooltipContent}\n {shortcut && (\n <span className=\"ml-2 text-muted-foreground\">{shortcut}</span>\n )}\n </TooltipContent>\n </Tooltip>\n );\n};\n\nexport type PromptInputActionMenuProps = ComponentProps<typeof DropdownMenu>;\nexport const PromptInputActionMenu = (props: PromptInputActionMenuProps) => (\n <DropdownMenu {...props} />\n);\n\nexport type PromptInputActionMenuTriggerProps = PromptInputButtonProps;\n\nexport const PromptInputActionMenuTrigger = ({\n className,\n children,\n ...props\n}: PromptInputActionMenuTriggerProps) => (\n <DropdownMenuTrigger asChild>\n <PromptInputButton className={className} {...props}>\n {children ?? <PlusIcon className=\"size-4\" />}\n </PromptInputButton>\n </DropdownMenuTrigger>\n);\n\nexport type PromptInputActionMenuContentProps = ComponentProps<\n typeof DropdownMenuContent\n>;\nexport const PromptInputActionMenuContent = ({\n className,\n ...props\n}: PromptInputActionMenuContentProps) => (\n <DropdownMenuContent align=\"start\" className={cn(className)} {...props} />\n);\n\nexport type PromptInputActionMenuItemProps = ComponentProps<\n typeof DropdownMenuItem\n>;\nexport const PromptInputActionMenuItem = ({\n className,\n ...props\n}: PromptInputActionMenuItemProps) => (\n <DropdownMenuItem className={cn(className)} {...props} />\n);\n\n// Note: Actions that perform side-effects (like opening a file dialog)\n// are provided in opt-in modules (e.g., prompt-input-attachments).\n\nexport type PromptInputSubmitProps = ComponentProps<typeof InputGroupButton> & {\n status?: ChatStatus;\n onStop?: () => void;\n};\n\nexport const PromptInputSubmit = ({\n className,\n variant = \"default\",\n size = \"icon-sm\",\n status,\n onStop,\n onClick,\n children,\n ...props\n}: PromptInputSubmitProps) => {\n const isGenerating = status === \"submitted\" || status === \"streaming\";\n\n let Icon = <CornerDownLeftIcon className=\"size-4\" />;\n\n if (status === \"submitted\") {\n Icon = <Spinner />;\n } else if (status === \"streaming\") {\n Icon = <SquareIcon className=\"size-4\" />;\n } else if (status === \"error\") {\n Icon = <XIcon className=\"size-4\" />;\n }\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n if (isGenerating && onStop) {\n e.preventDefault();\n onStop();\n return;\n }\n onClick?.(e);\n },\n [isGenerating, onStop, onClick]\n );\n\n return (\n <InputGroupButton\n aria-label={isGenerating ? \"Stop\" : \"Submit\"}\n className={cn(className)}\n onClick={handleClick}\n size={size}\n type={isGenerating && onStop ? \"button\" : \"submit\"}\n variant={variant}\n {...props}\n >\n {children ?? Icon}\n </InputGroupButton>\n );\n};\n\nexport type PromptInputSelectProps = ComponentProps<typeof Select>;\n\nexport const PromptInputSelect = (props: PromptInputSelectProps) => (\n <Select {...props} />\n);\n\nexport type PromptInputSelectTriggerProps = ComponentProps<\n typeof SelectTrigger\n>;\n\nexport const PromptInputSelectTrigger = ({\n className,\n ...props\n}: PromptInputSelectTriggerProps) => (\n <SelectTrigger\n className={cn(\n \"border-none bg-transparent font-medium text-muted-foreground shadow-none transition-colors\",\n \"hover:bg-accent hover:text-foreground aria-expanded:bg-accent aria-expanded:text-foreground\",\n className\n )}\n {...props}\n />\n);\n\nexport type PromptInputSelectContentProps = ComponentProps<\n typeof SelectContent\n>;\n\nexport const PromptInputSelectContent = ({\n className,\n ...props\n}: PromptInputSelectContentProps) => (\n <SelectContent className={cn(className)} {...props} />\n);\n\nexport type PromptInputSelectItemProps = ComponentProps<typeof SelectItem>;\n\nexport const PromptInputSelectItem = ({\n className,\n ...props\n}: PromptInputSelectItemProps) => (\n <SelectItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputSelectValueProps = ComponentProps<typeof SelectValue>;\n\nexport const PromptInputSelectValue = ({\n className,\n ...props\n}: PromptInputSelectValueProps) => (\n <SelectValue className={cn(className)} {...props} />\n);\n\nexport type PromptInputHoverCardProps = ComponentProps<typeof HoverCard>;\n\nexport const PromptInputHoverCard = ({\n openDelay = 0,\n closeDelay = 0,\n ...props\n}: PromptInputHoverCardProps) => (\n <HoverCard closeDelay={closeDelay} openDelay={openDelay} {...props} />\n);\n\nexport type PromptInputHoverCardTriggerProps = ComponentProps<\n typeof HoverCardTrigger\n>;\n\nexport const PromptInputHoverCardTrigger = (\n props: PromptInputHoverCardTriggerProps\n) => <HoverCardTrigger {...props} />;\n\nexport type PromptInputHoverCardContentProps = ComponentProps<\n typeof HoverCardContent\n>;\n\nexport const PromptInputHoverCardContent = ({\n align = \"start\",\n ...props\n}: PromptInputHoverCardContentProps) => (\n <HoverCardContent align={align} {...props} />\n);\n\nexport type PromptInputTabsListProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabsList = ({\n className,\n ...props\n}: PromptInputTabsListProps) => <div className={cn(className)} {...props} />;\n\nexport type PromptInputTabProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTab = ({\n className,\n ...props\n}: PromptInputTabProps) => <div className={cn(className)} {...props} />;\n\nexport type PromptInputTabLabelProps = HTMLAttributes<HTMLHeadingElement>;\n\nexport const PromptInputTabLabel = ({\n className,\n ...props\n}: PromptInputTabLabelProps) => (\n // Content provided via children in props\n // oxlint-disable-next-line eslint-plugin-jsx-a11y(heading-has-content)\n <h3\n className={cn(\n \"mb-2 px-3 font-medium text-muted-foreground text-xs\",\n className\n )}\n {...props}\n />\n);\n\nexport type PromptInputTabBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabBody = ({\n className,\n ...props\n}: PromptInputTabBodyProps) => (\n <div className={cn(\"space-y-1\", className)} {...props} />\n);\n\nexport type PromptInputTabItemProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabItem = ({\n className,\n ...props\n}: PromptInputTabItemProps) => (\n <div\n className={cn(\n \"flex items-center gap-2 px-3 py-2 text-xs hover:bg-accent\",\n className\n )}\n {...props}\n />\n);\n\nexport type PromptInputCommandProps = ComponentProps<typeof Command>;\n\nexport const PromptInputCommand = ({\n className,\n ...props\n}: PromptInputCommandProps) => <Command className={cn(className)} {...props} />;\n\nexport type PromptInputCommandInputProps = ComponentProps<typeof CommandInput>;\n\nexport const PromptInputCommandInput = ({\n className,\n ...props\n}: PromptInputCommandInputProps) => (\n <CommandInput className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandListProps = ComponentProps<typeof CommandList>;\n\nexport const PromptInputCommandList = ({\n className,\n ...props\n}: PromptInputCommandListProps) => (\n <CommandList className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandEmptyProps = ComponentProps<typeof CommandEmpty>;\n\nexport const PromptInputCommandEmpty = ({\n className,\n ...props\n}: PromptInputCommandEmptyProps) => (\n <CommandEmpty className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandGroupProps = ComponentProps<typeof CommandGroup>;\n\nexport const PromptInputCommandGroup = ({\n className,\n ...props\n}: PromptInputCommandGroupProps) => (\n <CommandGroup className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandItemProps = ComponentProps<typeof CommandItem>;\n\nexport const PromptInputCommandItem = ({\n className,\n ...props\n}: PromptInputCommandItemProps) => (\n <CommandItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandSeparatorProps = ComponentProps<\n typeof CommandSeparator\n>;\n\nexport const PromptInputCommandSeparator = ({\n className,\n ...props\n}: PromptInputCommandSeparatorProps) => (\n <CommandSeparator className={cn(className)} {...props} />\n);\n","import * as React from \"react\"\nimport { Progress as ProgressPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Progress({\n className,\n value,\n ...props\n}: React.ComponentProps<typeof ProgressPrimitive.Root>) {\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n className={cn(\n \"relative flex h-0.5 w-full items-center overflow-x-hidden rounded-none bg-muted\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className=\"size-full flex-1 bg-primary transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n )\n}\n\nexport { Progress }\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport {\n HoverCard,\n HoverCardContent,\n HoverCardTrigger,\n} from \"../ui/hover-card\";\nimport { Progress } from \"../ui/progress\";\nimport { cn } from \"../../lib/utils\";\nimport type { LanguageModelUsage } from \"ai\";\nimport type { ComponentProps } from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\nimport { getUsage } from \"tokenlens\";\n\nconst PERCENT_MAX = 100;\nconst ICON_RADIUS = 10;\nconst ICON_VIEWBOX = 24;\nconst ICON_CENTER = 12;\nconst ICON_STROKE_WIDTH = 2;\n\ntype ModelId = string;\n\ninterface ContextSchema {\n usedTokens: number;\n maxTokens: number;\n usage?: LanguageModelUsage;\n modelId?: ModelId;\n}\n\nconst ContextContext = createContext<ContextSchema | null>(null);\n\nconst useContextValue = () => {\n const context = useContext(ContextContext);\n\n if (!context) {\n throw new Error(\"Context components must be used within Context\");\n }\n\n return context;\n};\n\nexport type ContextProps = ComponentProps<typeof HoverCard> & ContextSchema;\n\nexport const Context = ({\n usedTokens,\n maxTokens,\n usage,\n modelId,\n ...props\n}: ContextProps) => {\n const contextValue = useMemo(\n () => ({ maxTokens, modelId, usage, usedTokens }),\n [maxTokens, modelId, usage, usedTokens]\n );\n\n return (\n <ContextContext.Provider value={contextValue}>\n <HoverCard closeDelay={100} openDelay={0} {...props} />\n </ContextContext.Provider>\n );\n};\n\nconst ContextIcon = () => {\n const { usedTokens, maxTokens } = useContextValue();\n const circumference = 2 * Math.PI * ICON_RADIUS;\n const usedPercent = usedTokens / maxTokens;\n const dashOffset = circumference * (1 - usedPercent);\n\n return (\n <svg\n aria-label=\"Model context usage\"\n height=\"20\"\n role=\"img\"\n style={{ color: \"currentcolor\" }}\n viewBox={`0 0 ${ICON_VIEWBOX} ${ICON_VIEWBOX}`}\n width=\"20\"\n >\n <circle\n cx={ICON_CENTER}\n cy={ICON_CENTER}\n fill=\"none\"\n opacity=\"0.25\"\n r={ICON_RADIUS}\n stroke=\"currentColor\"\n strokeWidth={ICON_STROKE_WIDTH}\n />\n <circle\n cx={ICON_CENTER}\n cy={ICON_CENTER}\n fill=\"none\"\n opacity=\"0.7\"\n r={ICON_RADIUS}\n stroke=\"currentColor\"\n strokeDasharray={`${circumference} ${circumference}`}\n strokeDashoffset={dashOffset}\n strokeLinecap=\"round\"\n strokeWidth={ICON_STROKE_WIDTH}\n style={{ transform: \"rotate(-90deg)\", transformOrigin: \"center\" }}\n />\n </svg>\n );\n};\n\nexport type ContextTriggerProps = ComponentProps<typeof Button>;\n\nexport const ContextTrigger = ({ children, ...props }: ContextTriggerProps) => { \n return (\n <HoverCardTrigger asChild>\n {children ?? (\n <Button type=\"button\" variant=\"ghost\" {...props}>\n <ContextIcon />\n </Button>\n )}\n </HoverCardTrigger>\n );\n};\n\nexport type ContextContentProps = ComponentProps<typeof HoverCardContent>;\n\nexport const ContextContent = ({\n className,\n ...props\n}: ContextContentProps) => (\n <HoverCardContent\n className={cn(\"min-w-60 divide-y overflow-hidden p-0\", className)}\n {...props}\n />\n);\n\nexport type ContextContentHeaderProps = ComponentProps<\"div\">;\n\nexport const ContextContentHeader = ({\n children,\n className,\n ...props\n}: ContextContentHeaderProps) => {\n const { usedTokens, maxTokens } = useContextValue();\n const usedPercent = usedTokens / maxTokens;\n const displayPct = new Intl.NumberFormat(\"en-US\", {\n maximumFractionDigits: 1,\n style: \"percent\",\n }).format(usedPercent);\n const used = new Intl.NumberFormat(\"en-US\", {\n notation: \"compact\",\n }).format(usedTokens);\n const total = new Intl.NumberFormat(\"en-US\", {\n notation: \"compact\",\n }).format(maxTokens);\n\n return (\n <div className={cn(\"w-full space-y-2 p-3\", className)} {...props}>\n {children ?? (\n <>\n <div className=\"flex items-center justify-between gap-3 text-xs\">\n <p>{displayPct}</p>\n <p className=\" text-muted-foreground\">\n {used} / {total}\n </p>\n </div>\n <div className=\"space-y-2\">\n <Progress className=\"bg-muted\" value={usedPercent * PERCENT_MAX} />\n </div>\n </>\n )}\n </div>\n );\n};\n\nexport type ContextContentBodyProps = ComponentProps<\"div\">;\n\nexport const ContextContentBody = ({\n children,\n className,\n ...props\n}: ContextContentBodyProps) => (\n <div className={cn(\"w-full p-3\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type ContextContentFooterProps = ComponentProps<\"div\">;\n\nexport const ContextContentFooter = ({\n children,\n className,\n ...props\n}: ContextContentFooterProps) => {\n const { modelId, usage } = useContextValue();\n const costUSD = modelId\n ? getUsage({\n modelId,\n usage: {\n input: usage?.inputTokens ?? 0,\n output: usage?.outputTokens ?? 0,\n },\n }).costUSD?.totalUSD\n : undefined;\n const totalCost = new Intl.NumberFormat(\"en-US\", {\n currency: \"USD\",\n style: \"currency\",\n }).format(costUSD ?? 0);\n\n return (\n <div\n className={cn(\n \"flex w-full items-center justify-between gap-3 bg-secondary p-3 text-xs\",\n className\n )}\n {...props}\n >\n {children ?? (\n <>\n <span className=\"text-muted-foreground\">Total cost</span>\n <span>{totalCost}</span>\n </>\n )}\n </div>\n );\n};\n\nconst TokensWithCost = ({\n tokens,\n costText,\n}: {\n tokens?: number;\n costText?: string;\n}) => (\n <span>\n {tokens === undefined\n ? \"—\"\n : new Intl.NumberFormat(\"en-US\", {\n notation: \"compact\",\n }).format(tokens)}\n {costText ? (\n <span className=\"ml-2 text-muted-foreground\">• {costText}</span>\n ) : null}\n </span>\n);\n\nexport type ContextInputUsageProps = ComponentProps<\"div\">;\n\nexport const ContextInputUsage = ({\n className,\n children,\n ...props\n}: ContextInputUsageProps) => {\n const { usage, modelId } = useContextValue();\n const inputTokens = usage?.inputTokens ?? 0;\n\n if (children) {\n return children;\n }\n\n if (!inputTokens) {\n return null;\n }\n\n const inputCost = modelId\n ? getUsage({\n modelId,\n usage: { input: inputTokens, output: 0 },\n }).costUSD?.totalUSD\n : undefined;\n const inputCostText = new Intl.NumberFormat(\"en-US\", {\n currency: \"USD\",\n style: \"currency\",\n }).format(inputCost ?? 0);\n\n return (\n <div\n className={cn(\"flex items-center justify-between text-xs\", className)}\n {...props}\n >\n <span className=\"text-muted-foreground\">Input</span>\n <TokensWithCost costText={inputCostText} tokens={inputTokens} />\n </div>\n );\n};\n\nexport type ContextOutputUsageProps = ComponentProps<\"div\">;\n\nexport const ContextOutputUsage = ({\n className,\n children,\n ...props\n}: ContextOutputUsageProps) => {\n const { usage, modelId } = useContextValue();\n const outputTokens = usage?.outputTokens ?? 0;\n\n if (children) {\n return children;\n }\n\n if (!outputTokens) {\n return null;\n }\n\n const outputCost = modelId\n ? getUsage({\n modelId,\n usage: { input: 0, output: outputTokens },\n }).costUSD?.totalUSD\n : undefined;\n const outputCostText = new Intl.NumberFormat(\"en-US\", {\n currency: \"USD\",\n style: \"currency\",\n }).format(outputCost ?? 0);\n\n return (\n <div\n className={cn(\"flex items-center justify-between text-xs\", className)}\n {...props}\n >\n <span className=\"text-muted-foreground\">Output</span>\n <TokensWithCost costText={outputCostText} tokens={outputTokens} />\n </div>\n );\n};\n\nexport type ContextReasoningUsageProps = ComponentProps<\"div\">;\n\nexport const ContextReasoningUsage = ({\n className,\n children,\n ...props\n}: ContextReasoningUsageProps) => {\n const { usage, modelId } = useContextValue();\n const reasoningTokens = usage?.reasoningTokens ?? 0;\n\n if (children) {\n return children;\n }\n\n if (!reasoningTokens) {\n return null;\n }\n\n const reasoningCost = modelId\n ? getUsage({\n modelId,\n usage: { reasoningTokens },\n }).costUSD?.totalUSD\n : undefined;\n const reasoningCostText = new Intl.NumberFormat(\"en-US\", {\n currency: \"USD\",\n style: \"currency\",\n }).format(reasoningCost ?? 0);\n\n return (\n <div\n className={cn(\"flex items-center justify-between text-xs\", className)}\n {...props}\n >\n <span className=\"text-muted-foreground\">Reasoning</span>\n <TokensWithCost costText={reasoningCostText} tokens={reasoningTokens} />\n </div>\n );\n};\n\nexport type ContextCacheUsageProps = ComponentProps<\"div\">;\n\nexport const ContextCacheUsage = ({\n className,\n children,\n ...props\n}: ContextCacheUsageProps) => {\n const { usage, modelId } = useContextValue();\n const cacheTokens = usage?.cachedInputTokens ?? 0;\n\n if (children) {\n return children;\n }\n\n if (!cacheTokens) {\n return null;\n }\n\n const cacheCost = modelId\n ? getUsage({\n modelId,\n usage: { cacheReads: cacheTokens, input: 0, output: 0 },\n }).costUSD?.totalUSD\n : undefined;\n const cacheCostText = new Intl.NumberFormat(\"en-US\", {\n currency: \"USD\",\n style: \"currency\",\n }).format(cacheCost ?? 0);\n\n return (\n <div\n className={cn(\"flex items-center justify-between text-xs\", className)}\n {...props}\n >\n <span className=\"text-muted-foreground\">Cache</span>\n <TokensWithCost costText={cacheCostText} tokens={cacheTokens} />\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\"\nimport { Separator } from \"./separator\"\n\nfunction ItemGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n role=\"list\"\n data-slot=\"item-group\"\n className={cn(\n \"group/item-group flex w-full flex-col gap-4 has-data-[size=sm]:gap-2.5 has-data-[size=xs]:gap-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"item-separator\"\n orientation=\"horizontal\"\n className={cn(\"my-2\", className)}\n {...props}\n />\n )\n}\n\nconst itemVariants = cva(\n \"group/item flex w-full flex-wrap items-center rounded-none border text-sm transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors [a]:hover:bg-muted\",\n {\n variants: {\n variant: {\n default: \"border-transparent\",\n outline: \"border-border\",\n muted: \"border-transparent bg-muted/50\",\n },\n size: {\n default: \"gap-3.5 px-4 py-3.5\",\n sm: \"gap-3.5 px-3.5 py-3\",\n xs: \"gap-2.5 px-3 py-2.5 in-data-[slot=dropdown-menu-content]:p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Item({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof itemVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\"\n return (\n <Comp\n data-slot=\"item\"\n data-variant={variant}\n data-size={size}\n className={cn(itemVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nconst itemMediaVariants = cva(\n \"flex shrink-0 items-center justify-center gap-2 group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start [&_svg]:pointer-events-none\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n icon: \"[&_svg:not([class*='size-'])]:size-4\",\n image:\n \"size-10 overflow-hidden rounded-none group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 group-data-[size=xs]/item:rounded-none [&_img]:size-full [&_img]:object-cover\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction ItemMedia({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof itemMediaVariants>) {\n return (\n <div\n data-slot=\"item-media\"\n data-variant={variant}\n className={cn(itemMediaVariants({ variant, className }))}\n {...props}\n />\n )\n}\n\nfunction ItemContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-content\"\n className={cn(\n \"flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0.5 [&+[data-slot=item-content]]:flex-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-title\"\n className={cn(\n \"line-clamp-1 flex w-fit items-center gap-2 text-xs leading-snug font-semibold uppercase underline-offset-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"item-description\"\n className={cn(\n \"line-clamp-2 text-left text-sm leading-relaxed font-normal text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemActions({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-actions\"\n className={cn(\"flex items-center gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction ItemHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-header\"\n className={cn(\n \"flex basis-full items-center justify-between gap-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-footer\"\n className={cn(\n \"flex basis-full items-center justify-between gap-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Item,\n ItemMedia,\n ItemContent,\n ItemActions,\n ItemGroup,\n ItemSeparator,\n ItemTitle,\n ItemDescription,\n ItemHeader,\n ItemFooter,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 flex w-72 origin-(--radix-popover-content-transform-origin) flex-col gap-4 rounded-none bg-popover p-4 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden 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-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 </PopoverPrimitive.Portal>\n )\n}\n\nfunction PopoverAnchor({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />\n}\n\nfunction PopoverHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"popover-header\"\n className={cn(\"flex flex-col gap-1 text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction PopoverTitle({ className, ...props }: React.ComponentProps<\"h2\">) {\n return (\n <div\n data-slot=\"popover-title\"\n className={cn(\"text-xs font-semibold uppercase\", className)}\n {...props}\n />\n )\n}\n\nfunction PopoverDescription({\n className,\n ...props\n}: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"popover-description\"\n className={cn(\n \"mt-0.5 text-sm leading-relaxed text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverDescription,\n PopoverHeader,\n PopoverTitle,\n PopoverTrigger,\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n File as FileIcon,\n FileArchive,\n FileAudio,\n FileCode,\n FileSpreadsheet,\n FileText,\n FileVideo,\n} from \"lucide-react\";\nimport type { PromptInputMessage } from \"../ai-elements/prompt-input\";\nimport { useProviderAttachments } from \"../ai-elements/prompt-input\";\nimport type {\n AgentChatImageAttachment,\n AgentChatPendingAttachment,\n AgentChatSlashCommand,\n TokenUsage,\n} from \"../../types\";\nimport { useAgentChatAdapterContext } from \"../../adapter-context\";\nimport {\n Context,\n ContextCacheUsage,\n ContextContent,\n ContextContentBody,\n ContextContentHeader,\n ContextInputUsage,\n ContextOutputUsage,\n ContextReasoningUsage,\n ContextTrigger,\n} from \"../ai-elements/context\";\nimport { Button } from \"../ui/button\";\nimport {\n Item,\n ItemActions,\n ItemContent,\n ItemDescription,\n ItemMedia,\n ItemTitle,\n} from \"../ui/item\";\nimport {\n PromptInput,\n PromptInputBody,\n PromptInputFooter,\n PromptInputSubmit,\n PromptInputTextarea,\n PromptInputTools,\n PromptInputActionMenu,\n PromptInputActionMenuTrigger,\n PromptInputActionMenuContent,\n PromptInputActionAddAttachments,\n PromptInputProvider,\n usePromptInputController,\n} from \"../ai-elements/prompt-input\";\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n} from \"../ui/popover\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from \"../ui/command\";\n\n// ── Slash command entry ──────────────────────────────────────────────\n\ntype SlashCommand = AgentChatSlashCommand;\n\n// ── Props ────────────────────────────────────────────────────────────\n\nexport interface ChatComposerError {\n /**\n * Stable error code so callers can route different rejections (e.g.\n * show a different toast variant per code) without parsing the\n * human-readable message.\n */\n code:\n | \"accept\"\n | \"max_files\"\n | \"max_file_size\"\n | \"max_images\"\n | \"max_image_size\"\n | \"max_attachments\"\n | \"max_attachment_size\"\n | \"max_attachments_total\";\n /** Display-ready, single-sentence reason. */\n message: string;\n}\n\ninterface ChatComposerProps {\n onSend: (\n text: string,\n images?: AgentChatImageAttachment[],\n attachments?: AgentChatPendingAttachment[],\n ) => void | Promise<void>;\n onStop: () => void | Promise<void>;\n isRunning: boolean;\n disabled?: boolean;\n disabledReason?: string;\n tokenUsage?: TokenUsage;\n /**\n * Optional handler for client-side rejections (size/count caps,\n * accept-pattern misses). Without it, rejections are silent — pass\n * a toast wiring at the host-app layer if you want them surfaced.\n */\n onComposerError?: (err: ChatComposerError) => void;\n}\n\n// ── Outer wrapper (provides controlled text state) ───────────────────\n\nexport function ChatComposer(props: ChatComposerProps) {\n return (\n <PromptInputProvider>\n <ChatComposerInner {...props} />\n </PromptInputProvider>\n );\n}\n\n// ── Attachment preview strip ─────────────────────────────────────────\n\nfunction iconForMime(mime?: string) {\n if (!mime) return FileIcon;\n if (mime.startsWith(\"audio/\")) return FileAudio;\n if (mime.startsWith(\"video/\")) return FileVideo;\n if (mime === \"application/pdf\" || mime.startsWith(\"text/\")) return FileText;\n if (\n mime === \"application/json\" ||\n mime === \"application/xml\" ||\n mime.endsWith(\"+xml\") ||\n mime.endsWith(\"+json\") ||\n mime.includes(\"javascript\") ||\n mime.includes(\"typescript\")\n ) {\n return FileCode;\n }\n if (\n mime === \"application/zip\" ||\n mime === \"application/x-7z-compressed\" ||\n mime === \"application/x-tar\" ||\n mime === \"application/gzip\" ||\n mime === \"application/x-rar-compressed\"\n ) {\n return FileArchive;\n }\n if (\n mime === \"text/csv\" ||\n mime === \"application/vnd.ms-excel\" ||\n mime.includes(\"spreadsheet\")\n ) {\n return FileSpreadsheet;\n }\n return FileIcon;\n}\n\nfunction formatBytes(n?: number): string {\n if (n == null || !Number.isFinite(n) || n < 0) return \"\";\n for (const [unit, divisor] of [\n [\"GB\", 1_000_000_000],\n [\"MB\", 1_000_000],\n [\"KB\", 1_000],\n ] as const) {\n if (n >= divisor) return `${(n / divisor).toFixed(1)} ${unit}`;\n }\n return `${n} B`;\n}\n\nfunction AttachmentPreviewStrip() {\n const attachments = useProviderAttachments();\n if (attachments.files.length === 0) return null;\n\n return (\n <div className=\"flex gap-2 px-3 pt-2 pb-1 flex-wrap\">\n {attachments.files.map((file) => {\n const isImage =\n file.mediaType?.startsWith(\"image/\") && !!file.url;\n const sizeLabel = formatBytes(file.file?.size);\n const Icon = iconForMime(file.mediaType);\n\n // Single uniform Item layout for both images and non-images:\n // the only thing that differs is the ItemMedia slot (a real\n // thumbnail when we have one, a mime-bucket icon otherwise).\n // Class overrides on the outer Item drop the list-row defaults\n // (``w-full``, ``rounded-none``) so the chips sit inline at\n // intrinsic width.\n return (\n <Item\n key={file.id}\n variant=\"outline\"\n size=\"xs\"\n className=\"group w-auto max-w-[18rem] rounded-md\"\n title={file.filename}\n >\n <ItemMedia variant={isImage ? \"image\" : \"icon\"}>\n {isImage ? (\n <img src={file.url} alt={file.filename} />\n ) : (\n <Icon />\n )}\n </ItemMedia>\n <ItemContent className=\"min-w-0\">\n {/*\n Override ``flex`` (which the shadcn ItemTitle bakes\n into its base classes) with ``block`` so the\n ``truncate`` utility's ``text-overflow: ellipsis``\n actually takes effect. Flex would override the\n ``display: -webkit-box`` that line-clamp-1 relies on\n AND defeat text-overflow. ``min-w-0`` on the parent\n ItemContent is also required: without it, flex's\n default ``min-width: auto`` lets the title push past\n the Item's max-width on filenames with long\n unbreakable runs.\n */}\n <ItemTitle className=\"block w-full truncate normal-case font-medium text-foreground\">\n {file.filename}\n </ItemTitle>\n {sizeLabel && (\n <ItemDescription className=\"text-xs\">\n {sizeLabel}\n </ItemDescription>\n )}\n </ItemContent>\n <ItemActions>\n <button\n type=\"button\"\n onClick={() => attachments.remove(file.id)}\n aria-label={`Remove ${file.filename}`}\n className=\"hidden group-hover:flex items-center justify-center w-4 h-4 rounded-full bg-destructive text-destructive-foreground text-[10px]\"\n >\n ×\n </button>\n </ItemActions>\n </Item>\n );\n })}\n </div>\n );\n}\n\n// ── Inner component (has access to controller) ──────────────────────\n\n// Per-message caps mirror the server-side limits so the composer can\n// reject without a server round-trip. Keep these in sync with\n// _MAX_IMAGES_PER_MESSAGE / _MAX_IMAGE_BYTES /\n// _MAX_ATTACHMENTS_PER_MESSAGE / _MAX_ATTACHMENT_BYTES /\n// _MAX_ATTACHMENTS_TOTAL_BYTES on the harness side.\nconst MAX_IMAGES_PER_MESSAGE = 5;\nconst MAX_IMAGE_BYTES = 20_000_000;\nconst MAX_ATTACHMENTS_PER_MESSAGE = 10;\nconst MAX_ATTACHMENT_BYTES = 50_000_000;\nconst MAX_ATTACHMENTS_TOTAL_BYTES = 200_000_000;\n\nfunction ChatComposerInner({\n onSend,\n onStop,\n isRunning,\n disabled = false,\n disabledReason,\n tokenUsage,\n onComposerError,\n}: ChatComposerProps) {\n const { adapter } = useAgentChatAdapterContext();\n const { textInput } = usePromptInputController();\n const status = isRunning ? \"streaming\" : disabled ? \"error\" : \"ready\";\n\n // ── Load skills from backend ─────────────────────────────────────\n\n const [adapterCommands, setAdapterCommands] = useState<SlashCommand[]>([]);\n const [buttonMenuOpen, setButtonMenuOpen] = useState(false);\n const [menuDismissed, setMenuDismissed] = useState(false);\n const showSlashMenu = !menuDismissed && (textInput.value.startsWith(\"/\") || buttonMenuOpen);\n\n // Re-open when user types a new `/` after dismissal.\n useEffect(() => {\n if (menuDismissed && !textInput.value.startsWith(\"/\") && !buttonMenuOpen) {\n setMenuDismissed(false);\n }\n }, [buttonMenuOpen, menuDismissed, textInput.value]);\n\n // Re-fetch app-provided commands each time the slash menu opens.\n const [wasClosed, setWasClosed] = useState(true);\n useEffect(() => {\n if (showSlashMenu && wasClosed) {\n setWasClosed(false);\n adapter.listSlashCommands?.()\n .then(setAdapterCommands)\n .catch(() => { /* best-effort */ });\n }\n if (!showSlashMenu && !wasClosed) {\n setWasClosed(true);\n }\n }, [adapter, showSlashMenu, wasClosed]);\n\n const builtinCommands = useMemo<SlashCommand[]>(\n () => [\n { value: \"/clear\", label: \"/clear\", description: \"Clear conversation\" },\n { value: \"/compress\", label: \"/compress\", description: \"Compress context\" },\n { value: \"/goal\", label: \"/goal\", description: \"Define an outcome goal\" },\n { value: \"/goal status\", label: \"/goal status\", description: \"Show outcome goal status\" },\n { value: \"/goal pause\", label: \"/goal pause\", description: \"Pause automatic goal continuation\" },\n { value: \"/goal resume\", label: \"/goal resume\", description: \"Resume a paused goal\" },\n { value: \"/goal clear\", label: \"/goal clear\", description: \"Clear the current goal\" },\n { value: \"/mission \", label: \"/mission\", description: \"Start an orchestrated rubric-judged mission\" },\n { value: \"/mission status\", label: \"/mission status\", description: \"Show current mission status\" },\n { value: \"/mission pause\", label: \"/mission pause\", description: \"Pause the mission evaluator\" },\n { value: \"/mission resume\", label: \"/mission resume\", description: \"Resume a paused mission\" },\n { value: \"/mission cancel\", label: \"/mission cancel\", description: \"Cancel the mission\" },\n { value: \"/loop\", label: \"/loop\", description: \"Schedule recurring prompt\" },\n { value: \"/loop list\", label: \"/loop list\", description: \"List active loops\" },\n { value: \"/loop cancel\", label: \"/loop cancel\", description: \"Cancel a loop by ID\" },\n ],\n [],\n );\n\n // ── Slash menu state ─────────────────────────────────────────────\n\n // The CommandInput inside the popup is the canonical search input\n // while the menu is open. Its value mirrors whatever follows the\n // leading ``/`` in the textarea — typing in either keeps both in\n // sync (onValueChange writes back to the textarea, the textarea's\n // controller updates ``searchQuery`` on every render). cmdk does\n // the filtering + arrow-key navigation + scroll-into-view itself,\n // so no manual ``selectedIndex`` or layout effect is needed: the\n // command palette behaves exactly like the shadcn example.\n const searchQuery = showSlashMenu ? textInput.value.slice(1) : \"\";\n\n const menuOpen = showSlashMenu;\n\n // When the slash popup closes — by command selection, Escape, or\n // click-outside — cmdk + Radix tear down the CommandInput that was\n // holding focus. Without an explicit hand-off, focus falls onto\n // the body and the user has to click back into the chat input.\n // We stash a ref on the textarea below and route every \"the user\n // is done with the popup\" path through this helper.\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n\n const focusTextareaAtEnd = useCallback(() => {\n // requestAnimationFrame waits for Radix's own close-focus step to\n // run first; focusing synchronously inside an onSelect or\n // onEscapeKeyDown handler races Radix and the textarea loses\n // focus on the next tick.\n requestAnimationFrame(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.focus();\n const end = textarea.value.length;\n textarea.setSelectionRange(end, end);\n });\n }, []);\n\n const handleCommandSelect = useCallback(\n (commandValue: string) => {\n textInput.setInput(commandValue + \" \");\n setButtonMenuOpen(false);\n setMenuDismissed(true);\n focusTextareaAtEnd();\n },\n [textInput, focusTextareaAtEnd],\n );\n\n const handleSearchChange = useCallback(\n (next: string) => {\n // Mirror the popup's CommandInput back into the textarea so the\n // two stay in sync and the chat submit picks up exactly what\n // the user sees in the palette.\n textInput.setInput(\"/\" + next);\n },\n [textInput],\n );\n\n // ── Submit ───────────────────────────────────────────────────────\n\n const handleSubmit = useCallback(\n async (message: PromptInputMessage) => {\n const text = message.text.trim();\n if (!text || disabled) return;\n\n // Split incoming files by MIME bucket: images go through the\n // existing vision-inline path (base64 data URL on the message\n // body), everything else becomes a pending attachment uploaded\n // to the workspace by the runtime.\n const images: AgentChatImageAttachment[] = [];\n const pending: AgentChatPendingAttachment[] = [];\n\n for (const file of message.files) {\n if (file.mediaType?.startsWith(\"image/\") && file.url) {\n images.push({ data: file.url, mimeType: file.mediaType });\n continue;\n }\n if (!file.file) {\n // Defensive: PromptInputProvider/local both stamp file: on\n // each item. If a future consumer constructs a FileUIPart\n // without it, drop the entry rather than pretending we can\n // upload nothing.\n continue;\n }\n pending.push({\n file: file.file,\n filename: file.filename ?? file.file.name,\n mimeType: file.mediaType ?? file.file.type ?? undefined,\n size: file.file.size,\n });\n }\n\n // Split-aware caps — the <PromptInput maxFiles/maxFileSize> caps\n // are a coarse first line that ignores the image/non-image\n // distinction; we re-check per bucket here.\n if (images.length > MAX_IMAGES_PER_MESSAGE) {\n onComposerError?.({\n code: \"max_images\",\n message: `Maximum ${MAX_IMAGES_PER_MESSAGE} images per message.`,\n });\n return;\n }\n if (pending.length > MAX_ATTACHMENTS_PER_MESSAGE) {\n onComposerError?.({\n code: \"max_attachments\",\n message: `Maximum ${MAX_ATTACHMENTS_PER_MESSAGE} attachments per message.`,\n });\n return;\n }\n for (const img of images) {\n // Best-effort image-size guard: a base64-encoded image is\n // roughly 4/3 the raw size, so 27 MB of base64 ≈ 20 MB raw.\n if (img.data.length > Math.ceil(MAX_IMAGE_BYTES * 4 / 3)) {\n onComposerError?.({\n code: \"max_image_size\",\n message: `Image exceeds ${MAX_IMAGE_BYTES / 1_000_000} MB.`,\n });\n return;\n }\n }\n let totalAttachmentBytes = 0;\n for (const a of pending) {\n if (a.file.size > MAX_ATTACHMENT_BYTES) {\n onComposerError?.({\n code: \"max_attachment_size\",\n message: `\"${a.filename}\" exceeds ${MAX_ATTACHMENT_BYTES / 1_000_000} MB.`,\n });\n return;\n }\n totalAttachmentBytes += a.file.size;\n }\n if (totalAttachmentBytes > MAX_ATTACHMENTS_TOTAL_BYTES) {\n onComposerError?.({\n code: \"max_attachments_total\",\n message: `Attachments exceed ${MAX_ATTACHMENTS_TOTAL_BYTES / 1_000_000} MB total for this message.`,\n });\n return;\n }\n\n if (isRunning) {\n await onStop();\n }\n await onSend(\n text,\n images.length > 0 ? images : undefined,\n pending.length > 0 ? pending : undefined,\n );\n },\n [onSend, onStop, onComposerError, isRunning, disabled],\n );\n\n const handlePromptInputError = useCallback(\n (err: { code: \"max_files\" | \"max_file_size\" | \"accept\"; message: string }) => {\n onComposerError?.({ code: err.code, message: err.message });\n },\n [onComposerError],\n );\n\n // ── Render ───────────────────────────────────────────────────────\n\n return (\n <Popover\n open={menuOpen}\n onOpenChange={(open) => {\n if (!open) {\n // Radix fires onOpenChange(false) for both Escape and\n // click-outside. Without latching ``menuDismissed`` here\n // the next render would recompute ``showSlashMenu`` from\n // the textarea (which still starts with ``/``) and the\n // popup would immediately reopen, undoing the user's\n // dismissal. ``menuDismissed`` resets in the useEffect\n // at the top of this component as soon as the textarea\n // stops starting with ``/`` (or the button menu fires),\n // so the next genuine ``/`` press reopens the popup.\n setButtonMenuOpen(false);\n setMenuDismissed(true);\n }\n }}\n >\n <AttachmentPreviewStrip />\n <PopoverAnchor asChild>\n <PromptInput\n onSubmit={handleSubmit}\n multiple\n maxFiles={MAX_IMAGES_PER_MESSAGE + MAX_ATTACHMENTS_PER_MESSAGE}\n maxFileSize={MAX_ATTACHMENT_BYTES}\n onError={handlePromptInputError}\n >\n <PromptInputBody>\n <PromptInputTextarea\n ref={textareaRef}\n placeholder={\n disabled\n ? disabledReason ?? \"Session disabled\"\n : \"Send a message...\"\n }\n disabled={disabled}\n />\n </PromptInputBody>\n <PromptInputFooter>\n <PromptInputTools>\n <PromptInputActionMenu>\n <PromptInputActionMenuTrigger />\n <PromptInputActionMenuContent>\n <PromptInputActionAddAttachments />\n </PromptInputActionMenuContent>\n </PromptInputActionMenu>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n className=\"text-muted-foreground\"\n onClick={(e) => {\n e.preventDefault();\n setButtonMenuOpen((v) => !v);\n }}\n aria-label=\"Slash commands\"\n >\n <span className=\"text-xs font-bold\">/</span>\n </Button>\n {tokenUsage && tokenUsage.contextWindow > 0 && (\n <Context\n usedTokens={tokenUsage.totalTokens}\n maxTokens={tokenUsage.contextWindow}\n modelId={tokenUsage.model}\n usage={{\n inputTokens: tokenUsage.inputTokens,\n outputTokens: tokenUsage.outputTokens,\n reasoningTokens: tokenUsage.reasoningTokens,\n cachedInputTokens: tokenUsage.cachedInputTokens,\n totalTokens: tokenUsage.totalTokens,\n inputTokenDetails: undefined as never,\n outputTokenDetails: undefined as never,\n }}\n >\n <ContextTrigger />\n <ContextContent>\n <ContextContentHeader />\n <ContextContentBody>\n {tokenUsage.totalTokens > 0 ? (\n <>\n <ContextInputUsage>\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-muted-foreground\">Input</span>\n <span>{tokenUsage.inputTokens.toLocaleString()}</span>\n </div>\n </ContextInputUsage>\n <ContextOutputUsage>\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-muted-foreground\">Output</span>\n <span>{tokenUsage.outputTokens.toLocaleString()}</span>\n </div>\n </ContextOutputUsage>\n {tokenUsage.reasoningTokens > 0 && (\n <ContextReasoningUsage>\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-muted-foreground\">Reasoning</span>\n <span>{tokenUsage.reasoningTokens.toLocaleString()}</span>\n </div>\n </ContextReasoningUsage>\n )}\n {tokenUsage.cachedInputTokens > 0 && (\n <ContextCacheUsage>\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-muted-foreground\">Cache</span>\n <span>{tokenUsage.cachedInputTokens.toLocaleString()}</span>\n </div>\n </ContextCacheUsage>\n )}\n </>\n ) : (\n <p className=\"text-xs text-muted-foreground text-center py-1\">Empty</p>\n )}\n </ContextContentBody>\n {tokenUsage.totalTokens > 0 && (\n <div className=\"flex w-full items-center justify-end gap-3 bg-secondary p-2\">\n <Button\n type=\"button\"\n size=\"xs\"\n onClick={() => onSend(\"/compress\")}\n >\n Compress\n </Button>\n </div>\n )}\n </ContextContent>\n </Context>\n )}\n </PromptInputTools>\n <PromptInputSubmit status={status} onStop={onStop} />\n </PromptInputFooter>\n </PromptInput>\n </PopoverAnchor>\n <PopoverContent\n side=\"top\"\n align=\"start\"\n className=\"overflow-hidden p-0\"\n style={{ width: \"var(--radix-popover-trigger-width)\" }}\n onCloseAutoFocus={(e) => e.preventDefault()}\n onEscapeKeyDown={() => {\n // Escape is the canonical \"back out of the popup, keep\n // typing in the chat\" gesture. Click-outside is\n // deliberately NOT routed here — if the user clicked some\n // other widget on the page they expect focus to land\n // wherever they clicked, not snap back to the textarea.\n focusTextareaAtEnd();\n }}\n >\n {/*\n Native shadcn / cmdk command palette: the CommandInput owns\n focus while the popup is open, cmdk runs the filter\n (matching ``value`` plus the ``keywords`` we pass per item,\n so descriptions count toward matches), and cmdk handles\n arrow keys / Enter / scroll-into-view itself. The CommandInput\n mirrors the textarea so the chat input still reflects the\n query and sending the message still works the same way.\n */}\n <Command>\n <CommandInput\n placeholder=\"Type a command or search...\"\n value={searchQuery}\n onValueChange={handleSearchChange}\n />\n <CommandList>\n <CommandEmpty>No commands found.</CommandEmpty>\n {builtinCommands.length > 0 && (\n <CommandGroup heading=\"Built-in commands\">\n {builtinCommands.map((cmd) => (\n <CommandItem\n key={cmd.value}\n value={cmd.value}\n keywords={[cmd.description]}\n onSelect={() => handleCommandSelect(cmd.value)}\n className=\"grid grid-cols-[12rem_1fr] items-baseline gap-3 [&_svg]:hidden\"\n >\n <span\n className=\"font-mono text-foreground truncate\"\n title={cmd.label}\n >\n {cmd.label}\n </span>\n <span\n className=\"min-w-0 truncate text-xs text-muted-foreground\"\n title={cmd.description}\n >\n {cmd.description}\n </span>\n </CommandItem>\n ))}\n </CommandGroup>\n )}\n {builtinCommands.length > 0 && adapterCommands.length > 0 && (\n <CommandSeparator />\n )}\n {adapterCommands.length > 0 && (\n <CommandGroup heading=\"Skills\">\n {adapterCommands.map((cmd) => (\n <CommandItem\n key={cmd.value}\n value={cmd.value}\n keywords={[cmd.description]}\n onSelect={() => handleCommandSelect(cmd.value)}\n className=\"grid grid-cols-[12rem_1fr] items-baseline gap-3 [&_svg]:hidden\"\n >\n <span\n className=\"font-mono text-foreground truncate\"\n title={cmd.label}\n >\n {cmd.label}\n </span>\n <span\n className=\"min-w-0 truncate text-xs text-muted-foreground\"\n title={cmd.description}\n >\n {cmd.description}\n </span>\n </CommandItem>\n ))}\n </CommandGroup>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nconst MIN_CPS = 40;\nconst MAX_CPS = 240;\nconst DRAIN_SECONDS = 0.25;\nconst SNAP_LAG = 800;\nconst MAX_FRAME_DT = 0.1;\n\n/**\n * Smooths a streaming string into a steady character-by-character reveal,\n * decoupling render cadence from token arrival. The reveal accelerates when\n * the backlog grows and decelerates when it drains.\n */\nexport function useSmoothStream(target: string, isStreaming: boolean): string {\n const [displayedLen, setDisplayedLen] = useState<number>(() =>\n isStreaming ? 0 : target.length,\n );\n\n const targetRef = useRef(target);\n targetRef.current = target;\n\n useEffect(() => {\n setDisplayedLen((cur) => (cur > target.length ? target.length : cur));\n }, [target]);\n\n const isActive = isStreaming || displayedLen < target.length;\n\n useEffect(() => {\n if (!isActive) return;\n\n let raf = 0;\n let carry = 0;\n let lastTime = 0;\n\n const tick = (now: number) => {\n const dt = lastTime ? Math.min(MAX_FRAME_DT, (now - lastTime) / 1000) : 0;\n lastTime = now;\n\n setDisplayedLen((current) => {\n const targetLen = targetRef.current.length;\n const lag = targetLen - current;\n if (lag <= 0) return current;\n if (lag >= SNAP_LAG) {\n carry = 0;\n return targetLen;\n }\n const cps = Math.min(\n MAX_CPS,\n Math.max(MIN_CPS, lag / DRAIN_SECONDS),\n );\n carry += cps * dt;\n const step = Math.floor(carry);\n if (step <= 0) return current;\n carry -= step;\n return Math.min(targetLen, current + step);\n });\n\n raf = requestAnimationFrame(tick);\n };\n\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }, [isActive]);\n\n return displayedLen >= target.length\n ? target\n : target.slice(0, displayedLen);\n}\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../ui/tooltip\";\nimport { cn } from \"../../lib/utils\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { XIcon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes } from \"react\";\n\nexport type ArtifactProps = HTMLAttributes<HTMLDivElement>;\n\nexport const Artifact = ({ className, ...props }: ArtifactProps) => (\n <div\n className={cn(\n \"flex flex-col overflow-hidden rounded-lg border bg-background shadow-sm\",\n className\n )}\n {...props}\n />\n);\n\nexport type ArtifactHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ArtifactHeader = ({\n className,\n ...props\n}: ArtifactHeaderProps) => (\n <div\n className={cn(\n \"flex items-center justify-between border-b bg-muted/50 px-4 py-3\",\n className\n )}\n {...props}\n />\n);\n\nexport type ArtifactCloseProps = ComponentProps<typeof Button>;\n\nexport const ArtifactClose = ({\n className,\n children,\n size = \"sm\",\n variant = \"ghost\",\n ...props\n}: ArtifactCloseProps) => (\n <Button\n className={cn(\n \"size-8 p-0 text-muted-foreground hover:text-foreground\",\n className\n )}\n size={size}\n type=\"button\"\n variant={variant}\n {...props}\n >\n {children ?? <XIcon className=\"size-4\" />}\n <span className=\"sr-only\">Close</span>\n </Button>\n);\n\nexport type ArtifactTitleProps = HTMLAttributes<HTMLParagraphElement>;\n\nexport const ArtifactTitle = ({ className, ...props }: ArtifactTitleProps) => (\n <p\n className={cn(\"font-medium text-foreground text-sm\", className)}\n {...props}\n />\n);\n\nexport type ArtifactDescriptionProps = HTMLAttributes<HTMLParagraphElement>;\n\nexport const ArtifactDescription = ({\n className,\n ...props\n}: ArtifactDescriptionProps) => (\n <p className={cn(\"text-muted-foreground text-sm\", className)} {...props} />\n);\n\nexport type ArtifactActionsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ArtifactActions = ({\n className,\n ...props\n}: ArtifactActionsProps) => (\n <div className={cn(\"flex items-center gap-1\", className)} {...props} />\n);\n\nexport type ArtifactActionProps = ComponentProps<typeof Button> & {\n tooltip?: string;\n label?: string;\n icon?: LucideIcon;\n};\n\nexport const ArtifactAction = ({\n tooltip,\n label,\n icon: Icon,\n children,\n className,\n size = \"sm\",\n variant = \"ghost\",\n ...props\n}: ArtifactActionProps) => {\n const button = (\n <Button\n className={cn(\n \"size-8 p-0 text-muted-foreground hover:text-foreground\",\n className\n )}\n size={size}\n type=\"button\"\n variant={variant}\n {...props}\n >\n {Icon ? <Icon className=\"size-4\" /> : children}\n <span className=\"sr-only\">{label || tooltip}</span>\n </Button>\n );\n\n if (tooltip) {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent>\n <p>{tooltip}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return button;\n};\n\nexport type ArtifactContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ArtifactContent = ({\n className,\n ...props\n}: ArtifactContentProps) => (\n <div className={cn(\"flex-1 overflow-auto p-4\", className)} {...props} />\n);\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Markdown artifact renderer — reuses the chat's Streamdown pipeline\n// so code blocks, math, mermaid, etc. work identically to assistant\n// messages.\n\nimport { MessageResponse } from \"../../ai-elements/message\";\nimport type { MarkdownArtifactSpec } from \"../../../types\";\n\nexport function ArtifactMarkdown({ spec }: { spec: MarkdownArtifactSpec }) {\n return <MessageResponse>{spec.content ?? \"\"}</MessageResponse>;\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Table artifact renderer — a compact HTML table with a horizontal\n// scroll area for wide datasets. No sorting/filtering yet; just a\n// faithful display of the spec.\n\nimport type { TableArtifactSpec } from \"../../../types\";\n\nfunction formatCell(value: unknown): string {\n if (value == null) return \"\";\n if (typeof value === \"number\" || typeof value === \"string\") return String(value);\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport function ArtifactTable({ spec }: { spec: TableArtifactSpec }) {\n const columns = spec.columns ?? [];\n const rows = spec.rows ?? [];\n\n return (\n <div className=\"overflow-auto\">\n <table className=\"w-full border-collapse text-sm\">\n {spec.caption && (\n <caption className=\"pb-2 text-left text-xs text-muted-foreground\">\n {spec.caption}\n </caption>\n )}\n <thead>\n <tr className=\"border-b border-border\">\n {columns.map((col) => (\n <th\n key={col}\n className=\"px-3 py-2 text-left font-medium text-foreground\"\n >\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, i) => (\n <tr\n key={i}\n className=\"border-b border-border/50 last:border-b-0 hover:bg-muted/50\"\n >\n {columns.map((col) => (\n <td\n key={col}\n className=\"px-3 py-2 align-top text-muted-foreground\"\n >\n {formatCell(row[col])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// HTML artifact renderer — sandboxed iframe with `srcdoc`.\n//\n// Security model: the iframe runs with `sandbox=\"allow-scripts\"` and NO\n// `allow-same-origin`, giving the document a unique opaque origin.\n// Scripts run but cannot reach the parent frame, cookies, localStorage,\n// or any same-origin API. Forms and top-level navigation are also\n// disallowed. The iframe sandbox is the load-bearing security\n// boundary; we intentionally do not sanitise the HTML payload because\n// the whole point of this artifact kind is that it renders as-is.\n\nimport { useState } from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport type { HtmlArtifactSpec } from \"../../../types\";\n\nconst DEFAULT_HEIGHT_PX = 480;\nconst EXPANDED_HEIGHT_PX = 800;\n\nconst MIN_ZOOM = 0.5;\nconst MAX_ZOOM = 2;\nconst ZOOM_STEP = 0.1;\n\nexport function ArtifactHtml({\n spec,\n fill = false,\n}: {\n spec: HtmlArtifactSpec;\n fill?: boolean;\n}) {\n const [expanded, setExpanded] = useState(false);\n const [zoom, setZoom] = useState(1);\n\n const viewportHeight = expanded ? EXPANDED_HEIGHT_PX : DEFAULT_HEIGHT_PX;\n const clamp = (v: number) =>\n Math.round(Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, v)) * 100) / 100;\n\n return (\n <div\n className={cn(\n \"flex flex-col gap-2\",\n fill && \"h-full min-h-0\",\n )}\n >\n <div\n className={cn(\"w-full overflow-hidden\", fill && \"min-h-0 flex-1\")}\n style={fill ? undefined : { height: `${viewportHeight}px` }}\n >\n <iframe\n title=\"artifact-html\"\n srcDoc={spec.html}\n sandbox=\"allow-scripts\"\n className={cn(\"border-0\", fill && \"h-full w-full\")}\n style={\n fill\n ? { zoom }\n : {\n // Keep width at 100% so the HTML's responsive CSS doesn't\n // reflow as the user zooms. Browsers resolve percentage\n // widths against the parent after zoom, so this stays full\n // width regardless of zoom. Pixel heights *are* scaled by\n // zoom, so compensate: at zoom 0.5 we set 960px which\n // renders as 480px (no empty space below), and the inner\n // viewport gets 960px of vertical room to show more\n // content. At zoom 1.5 the inner viewport shrinks to\n // 320px and the iframe's own scrollbar handles overflow.\n width: \"100%\",\n height: `${viewportHeight / zoom}px`,\n zoom,\n }\n }\n />\n </div>\n <div className=\"flex items-center justify-between\">\n {spec.caption ? <span>{spec.caption}</span> : <span />}\n <div className=\"flex items-center gap-2 \">\n <button\n type=\"button\"\n onClick={() => setZoom((z) => clamp(z - ZOOM_STEP))}\n disabled={zoom <= MIN_ZOOM}\n className=\"hover:text-foreground disabled:opacity-40 cursor-pointer\"\n aria-label=\"zoom out\"\n >\n −\n </button>\n <button\n type=\"button\"\n onClick={() => setZoom(1)}\n className=\"tabular-nums hover:text-foreground\"\n aria-label=\"reset zoom\"\n >\n {Math.round(zoom * 100)}%\n </button>\n <button\n type=\"button\"\n onClick={() => setZoom((z) => clamp(z + ZOOM_STEP))}\n disabled={zoom >= MAX_ZOOM}\n className=\"hover:text-foreground disabled:opacity-40\"\n aria-label=\"zoom in\"\n >\n +\n </button>\n {!fill && (\n <>\n <span className=\"text-border\">|</span>\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n className=\"hover:text-foreground\"\n >\n {expanded ? \"collapse\" : \"expand\"}\n </button>\n </>\n )}\n </div>\n </div>\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// SVG artifact renderer.\n//\n// Security model: the SVG is served via `<img src=\"data:image/svg+xml,...\">`.\n// Browsers explicitly disable script execution when an SVG is loaded\n// through an <img> element, which is what makes this safe without a\n// separate sanitisation step. (The same SVG inlined via innerHTML\n// WOULD run any <script> tags it contained — so we never do that.)\n\nimport { useMemo } from \"react\";\nimport type { SvgArtifactSpec } from \"../../../types\";\n\nexport function ArtifactSvg({ spec }: { spec: SvgArtifactSpec }) {\n const dataUrl = useMemo(() => {\n // URL-encode rather than base64 so the payload stays readable in\n // devtools and avoids the ~33% base64 size tax for large SVGs.\n return `data:image/svg+xml;utf8,${encodeURIComponent(spec.svg)}`;\n }, [spec.svg]);\n\n return (\n <div className=\"flex flex-col items-center gap-2\">\n <img\n src={dataUrl}\n alt={spec.caption ?? \"SVG artifact\"}\n className=\"max-h-[600px] w-full object-contain\"\n />\n {spec.caption && (\n <p className=\"text-xs text-muted-foreground\">{spec.caption}</p>\n )}\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Per-kind serialisers for copy-to-clipboard and download actions in\n// the artifact header. Each kind returns a ``{text, mime, extension}``\n// triple so both actions reuse the same canonical serialisation.\n\nimport type { ArtifactPayload } from \"../../../types\";\n\nexport interface ArtifactExport {\n text: string;\n mime: string;\n extension: string;\n}\n\nexport function exportArtifact(payload: ArtifactPayload): ArtifactExport {\n switch (payload.kind) {\n case \"markdown\":\n return {\n text: payload.spec.content,\n mime: \"text/markdown\",\n extension: \"md\",\n };\n case \"table\":\n return {\n text: tableToCsv(payload.spec.columns, payload.spec.rows),\n mime: \"text/csv\",\n extension: \"csv\",\n };\n case \"chart\":\n return {\n text: JSON.stringify(payload.spec.chart_js, null, 2),\n mime: \"application/json\",\n extension: \"json\",\n };\n case \"html\":\n return {\n text: payload.spec.html,\n mime: \"text/html\",\n extension: \"html\",\n };\n case \"svg\":\n return {\n text: payload.spec.svg,\n mime: \"image/svg+xml\",\n extension: \"svg\",\n };\n }\n}\n\nfunction tableToCsv(\n columns: string[],\n rows: Array<Record<string, unknown>>,\n): string {\n const lines: string[] = [];\n lines.push(columns.map(csvCell).join(\",\"));\n for (const row of rows) {\n lines.push(columns.map((c) => csvCell(row[c])).join(\",\"));\n }\n return lines.join(\"\\n\");\n}\n\nfunction csvCell(value: unknown): string {\n if (value == null) return \"\";\n const str =\n typeof value === \"string\" ? value : JSON.stringify(value) ?? String(value);\n // RFC 4180: escape cells containing commas, quotes, or newlines by\n // wrapping in double quotes and doubling any internal quotes.\n if (/[\",\\n\\r]/.test(str)) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n}\n\n/**\n * Build a safe filename slug from the artifact's user-supplied name.\n * Keeps letters, numbers, dashes, underscores, dots; collapses\n * everything else to ``-``.\n */\nexport function safeFilename(name: string): string {\n const slug = name\n .trim()\n .replace(/[^\\w.\\-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return slug || \"artifact\";\n}\n\n/** Download a string payload as a file with the given name + mime. */\nexport function downloadText(filename: string, text: string, mime: string): void {\n const blob = new Blob([text], { type: mime });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n // Revoke after the click so Safari has time to initiate the download.\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\n/** Copy text to the clipboard. Returns true on success. */\nexport async function copyText(text: string): Promise<boolean> {\n if (typeof window === \"undefined\" || !navigator?.clipboard?.writeText) {\n return false;\n }\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n return false;\n }\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Inline artifact block rendered in the chat timeline. Loads the\n// artifact payload on-demand from the API server the first time it\n// renders; the event carries only metadata.\n\nimport { lazy, Suspense, useEffect, useState } from \"react\";\nimport { CheckIcon, CopyIcon, DownloadIcon, Maximize2Icon } from \"lucide-react\";\nimport {\n Artifact,\n ArtifactAction,\n ArtifactActions,\n ArtifactContent,\n ArtifactDescription,\n ArtifactHeader,\n ArtifactTitle,\n} from \"../../ai-elements/artifact\";\nimport { Shimmer } from \"../../ai-elements/shimmer\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"../../ui/dialog\";\nimport { useAgentChatAdapterContext } from \"../../../adapter-context\";\nimport type { ArtifactKind, ArtifactPayload } from \"../../../types\";\nimport { ArtifactMarkdown } from \"./artifact-markdown\";\nimport { ArtifactTable } from \"./artifact-table\";\nimport { ArtifactHtml } from \"./artifact-html\";\nimport { ArtifactSvg } from \"./artifact-svg\";\nimport {\n copyText,\n downloadText,\n exportArtifact,\n safeFilename,\n} from \"./artifact-export\";\n\n// Chart.js ships in a separate chunk — only pay for it when a chart actually\n// appears in the thread.\nconst ArtifactChart = lazy(() =>\n import(\"./artifact-chart\").then((m) => ({ default: m.ArtifactChart })),\n);\n\ninterface ArtifactBlockProps {\n sessionId: string;\n artifactId: string;\n name: string;\n kind: ArtifactKind;\n version: number;\n}\n\nconst KIND_LABEL: Record<ArtifactKind, string> = {\n markdown: \"Markdown document\",\n table: \"Table\",\n chart: \"Chart\",\n html: \"HTML preview\",\n svg: \"SVG\",\n};\n\n// How long the copy icon shows the green check before reverting.\nconst COPY_FEEDBACK_MS = 1500;\n\nexport function ArtifactBlock({\n sessionId,\n artifactId,\n name,\n kind,\n version,\n}: ArtifactBlockProps) {\n const { adapter } = useAgentChatAdapterContext();\n const [payload, setPayload] = useState<ArtifactPayload | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n const [expanded, setExpanded] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n setPayload(null);\n setError(null);\n adapter.getArtifact({ sessionId, artifactId })\n .then((p) => {\n if (!cancelled) setPayload(p);\n })\n .catch((e: unknown) => {\n if (!cancelled) {\n setError(e instanceof Error ? e.message : \"Failed to load artifact\");\n }\n });\n return () => {\n cancelled = true;\n };\n }, [adapter, sessionId, artifactId, version]);\n\n const handleCopy = async () => {\n if (!payload) return;\n const { text } = exportArtifact(payload);\n const ok = await copyText(text);\n if (ok) {\n setCopied(true);\n setTimeout(() => setCopied(false), COPY_FEEDBACK_MS);\n }\n };\n\n const handleDownload = () => {\n if (!payload) return;\n const { text, mime, extension } = exportArtifact(payload);\n downloadText(`${safeFilename(name)}.${extension}`, text, mime);\n };\n\n const description = error ?? (payload ? KIND_LABEL[kind] : \"Loading…\");\n\n return (\n <>\n <Artifact className=\"my-2 w-full overflow-visible border-border\">\n <ArtifactHeader>\n <div className=\"flex min-w-0 flex-col\">\n <ArtifactTitle className=\"truncate\">{name}</ArtifactTitle>\n <ArtifactDescription>{description}</ArtifactDescription>\n </div>\n <ArtifactActions>\n <ArtifactAction\n tooltip={copied ? \"Copied!\" : \"Copy\"}\n label=\"Copy artifact\"\n icon={copied ? CheckIcon : CopyIcon}\n disabled={!payload}\n onClick={handleCopy}\n className={\n copied ? \"text-emerald-500 hover:text-emerald-500\" : \"\"\n }\n />\n <ArtifactAction\n tooltip=\"Download\"\n label=\"Download artifact\"\n icon={DownloadIcon}\n disabled={!payload}\n onClick={handleDownload}\n />\n <ArtifactAction\n tooltip=\"Full screen\"\n label=\"Open artifact in full screen\"\n icon={Maximize2Icon}\n disabled={!payload}\n onClick={() => setExpanded(true)}\n />\n </ArtifactActions>\n </ArtifactHeader>\n <ArtifactContent className=\"p-0 overflow-visible\">\n <ArtifactBody error={error} payload={payload} />\n </ArtifactContent>\n </Artifact>\n <Dialog open={expanded} onOpenChange={setExpanded}>\n <DialogContent className=\"flex h-[95vh] w-[95vw] max-w-[95vw] flex-col gap-4 overflow-hidden p-6 sm:max-w-[95vw]\">\n <DialogHeader>\n <DialogTitle className=\"truncate pr-10\">{name}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <div className=\"flex min-h-0 flex-1 flex-col overflow-auto\">\n <ArtifactBody error={error} payload={payload} fill />\n </div>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n\nfunction ArtifactBody({\n error,\n payload,\n fill = false,\n}: {\n error: string | null;\n payload: ArtifactPayload | null;\n fill?: boolean;\n}) {\n if (error) {\n return <p className=\"text-sm text-destructive\">{error}</p>;\n }\n if (!payload) {\n return (\n <Shimmer duration={5} className=\"text-sm text-muted-foreground\">\n Loading artifact…\n </Shimmer>\n );\n }\n switch (payload.kind) {\n case \"markdown\":\n return <ArtifactMarkdown spec={payload.spec} />;\n case \"table\":\n return <ArtifactTable spec={payload.spec} />;\n case \"chart\":\n return (\n <Suspense\n fallback={\n <Shimmer duration={5} className=\"text-sm text-muted-foreground\">\n Loading chart…\n </Shimmer>\n }\n >\n <ArtifactChart spec={payload.spec} fill={fill} />\n </Suspense>\n );\n case \"html\":\n return <ArtifactHtml spec={payload.spec} fill={fill} />;\n case \"svg\":\n return <ArtifactSvg spec={payload.spec} />;\n }\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Error bubble rendered inline when a session fails or an assistant\n// message lands with status=\"error\". Pairs the classifier's friendly\n// title with a collapsible detail block and an optional Retry action.\n//\n// Used both as a standalone timeline entry (when session.fail arrives\n// with no preceding assistant slot) and inline below an assistant\n// message that failed mid-turn.\n\nimport { memo, useState } from \"react\";\nimport { AlertTriangle, ChevronDown, ChevronRight, RefreshCw } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport { cn } from \"../../lib/utils\";\nimport type { ErrorInfo } from \"../../types\";\n\ninterface ErrorMessageProps {\n errorInfo: ErrorInfo;\n /** Retry handler — omit or leave undefined to hide the Retry button.\n * The button is also hidden when ``errorInfo.retryable`` is false. */\n onRetry?: () => Promise<void>;\n /** Local-only dismiss (hides the bubble without touching server state). */\n onDismiss?: () => void;\n className?: string;\n}\n\nexport const ErrorMessage = memo(function ErrorMessage({\n errorInfo,\n onRetry,\n onDismiss,\n className,\n}: ErrorMessageProps) {\n const [detailOpen, setDetailOpen] = useState(false);\n const [retryPending, setRetryPending] = useState(false);\n const [retryError, setRetryError] = useState<string | null>(null);\n\n const showRetry = errorInfo.retryable && !!onRetry;\n\n const handleRetry = async () => {\n if (!onRetry) return;\n setRetryPending(true);\n setRetryError(null);\n try {\n await onRetry();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(\"Retry failed\", err);\n setRetryError(msg || \"Retry failed.\");\n } finally {\n setRetryPending(false);\n }\n };\n\n return (\n <div\n role=\"alert\"\n className={cn(\n \"flex w-full gap-3 rounded-none border-l-4 border-destructive bg-destructive/5 p-4\",\n className,\n )}\n >\n <AlertTriangle className=\"mt-0.5 size-4 shrink-0 text-destructive\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <div className=\"text-sm font-semibold text-destructive\">\n {errorInfo.title}\n </div>\n\n {errorInfo.detail && (\n <button\n type=\"button\"\n onClick={() => setDetailOpen((open) => !open)}\n className=\"flex items-center gap-1 self-start text-xs text-muted-foreground hover:text-foreground\"\n aria-expanded={detailOpen}\n >\n {detailOpen ? (\n <ChevronDown className=\"size-3\" />\n ) : (\n <ChevronRight className=\"size-3\" />\n )}\n {detailOpen ? \"Hide details\" : \"Show details\"}\n </button>\n )}\n\n {detailOpen && errorInfo.detail && (\n <pre className=\"overflow-x-auto rounded-none border border-destructive/20 bg-background p-2 font-mono text-xs whitespace-pre-wrap wrap-break-word text-muted-foreground\">\n {errorInfo.detail}\n </pre>\n )}\n\n {(showRetry || onDismiss) && (\n <div className=\"flex gap-2 pt-1\">\n {showRetry && (\n <Button\n size=\"xs\"\n variant=\"secondary\"\n onClick={handleRetry}\n disabled={retryPending}\n >\n <RefreshCw\n className={cn(\"size-3\", retryPending && \"animate-spin\")}\n />\n {retryPending ? \"Retrying…\" : \"Retry\"}\n </Button>\n )}\n {onDismiss && (\n <Button size=\"xs\" variant=\"ghost\" onClick={onDismiss}>\n Dismiss\n </Button>\n )}\n </div>\n )}\n\n {retryError && (\n <div className=\"pt-1 text-xs text-destructive\" role=\"status\">\n Retry failed: {retryError}\n </div>\n )}\n </div>\n </div>\n );\n});\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Custom chat thread — uses ai-elements Conversation + Message\n// with a compact, Claude Code-inspired layout.\n//\nimport { useMemo } from \"react\";\nimport {\n Conversation,\n ConversationContent,\n ConversationEmptyState,\n ConversationScrollButton,\n} from \"../ai-elements/conversation\";\nimport {\n Message,\n MessageContent,\n MessageResponse,\n} from \"../ai-elements/message\";\nimport {\n Reasoning,\n ReasoningContent,\n ReasoningTrigger,\n} from \"../ai-elements/reasoning\";\nimport {\n Timeline,\n TimelineContent,\n TimelineHeader,\n TimelineIndicator,\n TimelineItem,\n TimelineSeparator,\n} from \"../reui/timeline\";\nimport { Shimmer } from \"../ai-elements/shimmer\";\nimport { BrowserActivityGroup } from \"../browser/browser-activity-group\";\nimport { ToolCallBlock } from \"./tool-call-block\";\nimport { WebSearchGroupBlock } from \"./tools/web-search-tool\";\nimport { parseTerminalResult } from \"./tools/terminal-tool\";\nimport { statusColorClass, effectiveStatus, toolErrorSummary, parseArgs } from \"./tools/shared\";\nimport { ChatMessage } from \"./chat-message\";\nimport { ChatComposer } from \"./chat-composer\";\nimport { useSmoothStream } from \"./use-smooth-stream\";\nimport { ArtifactBlock } from \"./artifacts/artifact-block\";\nimport { ErrorMessage } from \"./error-message\";\nimport { cn } from \"../../lib/utils\";\nimport { AlertTriangle, ChevronDown, ChevronRight, MessageSquareIcon } from \"lucide-react\";\nimport { useState } from \"react\";\nimport type {\n AgentChatImageAttachment,\n AgentChatPendingAttachment,\n ChatMessage as ChatMessageType,\n RetryIndicator,\n ToolCallInfo,\n TokenUsage,\n} from \"../../types\";\nimport type { ArtifactKind } from \"../../types\";\nimport type { ChatComposerError } from \"./chat-composer\";\n\ninterface ChatThreadProps {\n sessionId: string | null;\n messages: ChatMessageType[];\n isRunning: boolean;\n isLoadingHistory?: boolean;\n onSend: (\n text: string,\n images?: AgentChatImageAttachment[],\n attachments?: AgentChatPendingAttachment[],\n ) => void | Promise<void>;\n onStop: () => void | Promise<void>;\n onFileSelect?: (path: string) => void;\n disabled?: boolean;\n disabledReason?: string;\n tokenUsage?: TokenUsage;\n // Transient indicator shown during provider retries. Cleared by the\n // hook on the next successful llm.request/response or on session.fail.\n retryIndicator?: RetryIndicator | null;\n // User-initiated retry of a failed or paused session. Called from the\n // Retry button on standalone error bubbles.\n onRetry?: () => Promise<void>;\n // Forwarded to the composer to surface client-side rejections. The\n // SDK does not ship a toast subsystem; callers (e.g. surogate-ops)\n // wire their own.\n onComposerError?: (err: ChatComposerError) => void;\n}\n\n// ── Timeline item types ──────────────────────────────────────────────\n\ntype TimelineEntry =\n | { kind: \"reasoning\"; key: string; reasoning: string; isStreaming: boolean }\n | { kind: \"tool\"; key: string; tc: ToolCallInfo; resolvedArtifactName?: string }\n | { kind: \"browser_activity\"; key: string; calls: ToolCallInfo[] }\n | { kind: \"web_search_group\"; key: string; calls: ToolCallInfo[] }\n | { kind: \"text\"; key: string; content: string; isStreaming: boolean }\n | { kind: \"thinking\"; key: string }\n | { kind: \"skill_invoked\"; key: string; skill: string; stagedAt: string | null }\n | {\n kind: \"artifact\";\n key: string;\n artifactId: string;\n name: string;\n artifactKind: ArtifactKind;\n version: number;\n };\n\n/**\n * Flatten an assistant message into a list of timeline entries\n * (reasoning, tool calls, text content).\n *\n * ``artifactFallbacks`` maps a ``create_artifact`` tool-call id to the\n * name of the matching ``artifact.created`` system message that has\n * already landed. Used to backfill the timeline label during the brief\n * race where ``tool.result`` arrives before the tool-call args have\n * fully streamed.\n */\nfunction messageToEntries(\n msg: ChatMessageType,\n isLast: boolean,\n artifactFallbacks: Record<string, string>,\n): TimelineEntry[] {\n // System markers (skill.invoked, ...) become their own timeline entry --\n // a single row with a green dot + label, threaded into the assistant's\n // vertical timeline above its first reasoning/tool-call entry.\n if (msg.role === \"system\") {\n if (msg.systemKind === \"skill_invoked\") {\n return [{\n kind: \"skill_invoked\",\n key: msg.id,\n skill: (msg.systemMeta?.skill as string) ?? msg.content,\n stagedAt: (msg.systemMeta?.staged_at as string | null | undefined) ?? null,\n }];\n }\n if (msg.systemKind === \"artifact\") {\n const { artifactId, name, kind, version } = unpackArtifactMeta(\n msg.systemMeta, msg.content,\n );\n return [{\n kind: \"artifact\",\n key: msg.id,\n artifactId,\n name,\n artifactKind: kind,\n version,\n }];\n }\n return [];\n }\n\n const entries: TimelineEntry[] = [];\n const hasToolCalls = !!(msg.toolCalls && msg.toolCalls.length > 0);\n const hasContent = !!(msg.content && msg.content !== msg.reasoning);\n const isStreaming = msg.status === \"streaming\" && isLast;\n\n // When tool calls are present, the content text is just a preamble\n // (\"I'll run both tasks in parallel...\") — fold it into reasoning\n // instead of showing it as a separate text block.\n const effectiveReasoning = hasToolCalls && hasContent\n ? (msg.reasoning ? msg.reasoning + \"\\n\" + msg.content : msg.content)\n : msg.reasoning;\n const effectiveHasContent = hasContent && !hasToolCalls;\n\n if (effectiveReasoning) {\n entries.push({\n kind: \"reasoning\",\n key: `${msg.id}-reasoning`,\n reasoning: effectiveReasoning,\n isStreaming: isStreaming && !effectiveHasContent && !hasToolCalls,\n });\n }\n\n if (hasToolCalls) {\n for (const tc of msg.toolCalls!) {\n if (tc.toolName === \"create_artifact\") {\n // Skip the entry until either ``args.name`` parses or the matching\n // ``artifact.created`` system message has landed. Avoids the brief\n // \"empty green dot\" race where ``tool.result`` flips status to\n // complete before the tool-call args have fully streamed in.\n const resolvedName = parseArgs<{ name?: string }>(tc.args)?.name\n ?? artifactFallbacks[tc.id];\n const status = effectiveStatus(tc);\n if (!resolvedName && status !== \"error\") continue;\n entries.push({\n kind: \"tool\",\n key: tc.id,\n tc,\n resolvedArtifactName: resolvedName,\n });\n continue;\n }\n if (tc.toolName === \"terminal\" && tc.status !== \"running\") {\n const parsed = parseTerminalResult(tc.result, tc.args);\n if (parsed && (parsed.exit_code !== 0 || parsed.error)) continue;\n }\n entries.push({ kind: \"tool\", key: tc.id, tc });\n }\n }\n\n if (effectiveHasContent) {\n entries.push({\n kind: \"text\",\n key: `${msg.id}-text`,\n content: msg.content,\n isStreaming,\n });\n }\n\n // Show \"Working on it...\" shimmer whenever the turn is active but\n // nothing visible is progressing:\n // - initial thinking before the first reasoning/tool/content arrives\n // - post-reasoning gap (reasoning has landed but the next tool or\n // content hasn't -- common between llm.response and tool.call, or\n // while the LLM is still composing the next iteration)\n // - between tool rounds once every tool call has completed\n // A running tool call already shows its own shimmer, so skip then.\n const hasRunningTool = hasToolCalls && msg.toolCalls!.some(\n (tc) => tc.status === \"running\",\n );\n if (isStreaming && !effectiveHasContent && !hasRunningTool) {\n entries.push({ kind: \"thinking\", key: `${msg.id}-thinking` });\n }\n\n return entries;\n}\n\nfunction groupBrowserActivityEntries(entries: TimelineEntry[]): TimelineEntry[] {\n const grouped: TimelineEntry[] = [];\n let buffer: ToolCallInfo[] = [];\n\n const flush = () => {\n if (buffer.length === 0) return;\n grouped.push({\n kind: \"browser_activity\",\n key: `browser-activity-${buffer[0]?.id}-${buffer[buffer.length - 1]?.id}`,\n calls: buffer,\n });\n buffer = [];\n };\n\n for (const entry of entries) {\n if (entry.kind === \"tool\" && isBrowserToolCall(entry.tc)) {\n buffer.push(entry.tc);\n continue;\n }\n flush();\n grouped.push(entry);\n }\n\n flush();\n return grouped;\n}\n\nfunction isBrowserToolCall(call: ToolCallInfo): boolean {\n return call.toolName.startsWith(\"browser_\");\n}\n\nfunction groupWebSearchEntries(entries: TimelineEntry[]): TimelineEntry[] {\n const grouped: TimelineEntry[] = [];\n let buffer: ToolCallInfo[] = [];\n\n const flush = () => {\n if (buffer.length === 0) return;\n if (buffer.length === 1) {\n grouped.push({ kind: \"tool\", key: buffer[0].id, tc: buffer[0] });\n } else {\n grouped.push({\n kind: \"web_search_group\",\n key: `web-search-${buffer[0].id}-${buffer[buffer.length - 1].id}`,\n calls: buffer,\n });\n }\n buffer = [];\n };\n\n for (const entry of entries) {\n if (entry.kind === \"tool\" && entry.tc.toolName === \"web_search\") {\n buffer.push(entry.tc);\n continue;\n }\n flush();\n grouped.push(entry);\n }\n\n flush();\n return grouped;\n}\n\n/** A run of consecutive messages grouped by role.\n *\n * System markers (``skill.invoked``) are folded into the *following*\n * assistant group as leading messages, so they render as the first item\n * of the assistant's vertical timeline alongside its reasoning and tool\n * calls -- not as a floating row outside the timeline. Trailing system\n * markers (no assistant turn yet) get their own ``system`` group.\n */\ninterface MessageGroup {\n role: \"user\" | \"assistant\" | \"system\";\n messages: ChatMessageType[];\n lastGlobalIndex: number;\n}\n\nfunction groupMessages(messages: ChatMessageType[]): MessageGroup[] {\n const groups: MessageGroup[] = [];\n let pendingSystem: { msg: ChatMessageType; index: number }[] = [];\n\n const drainPendingAsOrphans = () => {\n for (const { msg, index } of pendingSystem) {\n groups.push({ role: \"system\", messages: [msg], lastGlobalIndex: index });\n }\n pendingSystem = [];\n };\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n\n if (msg.role === \"system\") {\n pendingSystem.push({ msg, index: i });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n const prev = groups[groups.length - 1];\n if (prev && prev.role === \"assistant\" && pendingSystem.length === 0) {\n prev.messages.push(msg);\n prev.lastGlobalIndex = i;\n } else {\n const folded = pendingSystem.map((p) => p.msg);\n pendingSystem = [];\n groups.push({\n role: \"assistant\",\n messages: [...folded, msg],\n lastGlobalIndex: i,\n });\n }\n continue;\n }\n\n // user — drain any orphan system markers (no assistant followed),\n // then push the user turn as its own group.\n drainPendingAsOrphans();\n groups.push({ role: \"user\", messages: [msg], lastGlobalIndex: i });\n }\n\n drainPendingAsOrphans();\n return groups;\n}\n\nfunction unpackArtifactMeta(\n systemMeta: Record<string, unknown> | undefined,\n fallbackName: string,\n): { artifactId: string; name: string; kind: ArtifactKind; version: number } {\n const meta = systemMeta ?? {};\n return {\n artifactId: (meta.artifact_id as string) ?? \"\",\n name: (meta.name as string) ?? fallbackName,\n kind: (meta.kind as ArtifactKind) ?? \"markdown\",\n version: (meta.version as number) ?? 1,\n };\n}\n\n// ── Orphan system marker (no following assistant yet) ───────────────\n//\n// Rendered only when a system event arrives but the LLM has not yet\n// produced an assistant turn to fold it into.\n\nfunction OrphanSystemMarker({\n message,\n sessionId,\n onRetry,\n}: {\n message: ChatMessageType;\n sessionId: string | null;\n onRetry?: () => Promise<void>;\n}) {\n if (message.systemKind === \"skill_invoked\") {\n const skill = (message.systemMeta?.skill as string) ?? message.content;\n return (\n <div className=\"my-2 flex items-center gap-2 px-4 text-xs text-muted-foreground \">\n <span className=\"size-2 rounded-full bg-emerald-500\" />\n <span>\n <span className=\"font-semibold text-foreground\">Skill</span>\n <span className=\"text-muted-foreground truncate\">{skill}</span>\n </span>\n </div>\n );\n }\n\n if (message.systemKind === \"artifact\" && sessionId) {\n const unpacked = unpackArtifactMeta(message.systemMeta, message.content);\n return (\n <ArtifactBlock\n sessionId={sessionId}\n artifactId={unpacked.artifactId}\n name={unpacked.name}\n kind={unpacked.kind}\n version={unpacked.version}\n />\n );\n }\n\n if (message.systemKind === \"error\" && message.errorInfo) {\n return (\n <div className=\"mx-auto my-2 w-full max-w-4xl\">\n <ErrorMessage errorInfo={message.errorInfo} onRetry={onRetry} />\n </div>\n );\n }\n\n return null;\n}\n\n// ── Cancelled tool row (parallel-batch sibling-error cancellation) ──\n\nfunction cancelledToolLabel(toolName: string): string {\n const map: Record<string, string> = {\n terminal: \"Command\",\n execute_code: \"Execute Code\",\n read_file: \"Read\",\n write_file: \"Write\",\n patch: \"Patch\",\n search_files: \"Search Files\",\n list_files: \"List Files\",\n web_search: \"Web Search\",\n web_extract: \"Web Fetch\",\n web_crawl: \"Web Crawl\",\n session_search: \"Session Search\",\n memory: \"Memory\",\n todo: \"Todo\",\n skills_list: \"Skills\",\n skill_view: \"Skill\",\n consult_expert: \"Expert\",\n delegate_task: \"Delegate\",\n clarify: \"Clarify\",\n process: \"Process\",\n create_artifact: \"Artifact\",\n };\n return map[toolName] ?? toolName;\n}\n\nfunction CancelledToolRow({ tc }: { tc: ToolCallInfo }) {\n return (\n <div className=\"flex items-center gap-1.5 text-sm\">\n <span className=\"font-semibold text-muted-foreground\">\n {cancelledToolLabel(tc.toolName)}\n </span>\n <span className=\"text-muted-foreground/70\">\n Cancelled\n </span>\n </div>\n );\n}\n\n// ── Timeline entry renderer ──────────────────────────────────────────\n\nfunction TimelineEntryItem({\n entry,\n step,\n sessionId,\n onFileSelect,\n}: {\n entry: TimelineEntry;\n step: number;\n sessionId: string | null;\n onFileSelect?: (path: string) => void;\n}) {\n if (entry.kind === \"reasoning\") {\n return <ReasoningEntry entry={entry} step={step} />;\n }\n\n if (entry.kind === \"tool\") {\n const rawStatus = effectiveStatus(entry.tc);\n // Failed ``create_artifact`` calls are almost always transient\n // (malformed shape, stringified spec) and immediately retried by\n // the model. We hide the failure from the UI so the user sees a\n // single coherent \"Creating artifact… → Created\" flow instead of a\n // red error followed by a successful retry. Treat the error as\n // \"still running\" for both the timeline dot and the failure text.\n const hideArtifactFailure =\n rawStatus === \"error\" && entry.tc.toolName === \"create_artifact\";\n const indicatorStatus = hideArtifactFailure ? \"running\" : rawStatus;\n const failureSummary =\n rawStatus === \"error\" && !hideArtifactFailure\n ? toolErrorSummary(entry.tc.result)\n : \"\";\n return (\n <TimelineItem step={step}>\n <TimelineHeader>\n <TimelineSeparator style={{ backgroundColor: \"var(--color-border)\" }} />\n <TimelineIndicator\n className={cn(\"size-2 border-none\", statusColorClass(indicatorStatus))}\n />\n </TimelineHeader>\n <TimelineContent>\n {entry.tc.cancelled ? (\n <CancelledToolRow tc={entry.tc} />\n ) : (\n <div className=\"space-y-1\">\n <ToolCallBlock\n tc={entry.tc}\n resolvedArtifactName={entry.resolvedArtifactName}\n onFileSelect={onFileSelect}\n />\n {failureSummary ? (\n <div className=\"max-w-full truncate text-xs text-destructive\" title={failureSummary}>\n {failureSummary}\n </div>\n ) : null}\n </div>\n )}\n </TimelineContent>\n </TimelineItem>\n );\n }\n\n if (entry.kind === \"browser_activity\") {\n return (\n <TimelineItem step={step}>\n <TimelineHeader>\n <TimelineSeparator style={{ backgroundColor: \"var(--color-border)\" }} />\n <TimelineIndicator className=\"size-2 border-none bg-amber-500\" />\n </TimelineHeader>\n <TimelineContent>\n <BrowserActivityGroup calls={entry.calls} />\n </TimelineContent>\n </TimelineItem>\n );\n }\n\n if (entry.kind === \"web_search_group\") {\n const allComplete = entry.calls.every((tc) => tc.status === \"complete\");\n const anyRunning = entry.calls.some((tc) => tc.status === \"running\");\n const indicatorClass = anyRunning\n ? \"bg-emerald-500 animate-pulse\"\n : allComplete\n ? \"bg-emerald-500\"\n : \"bg-red-500\";\n return (\n <TimelineItem step={step}>\n <TimelineHeader>\n <TimelineSeparator style={{ backgroundColor: \"var(--color-border)\" }} />\n <TimelineIndicator className={cn(\"size-2 border-none\", indicatorClass)} />\n </TimelineHeader>\n <TimelineContent>\n <WebSearchGroupBlock tcs={entry.calls} />\n </TimelineContent>\n </TimelineItem>\n );\n }\n\n if (entry.kind === \"text\") {\n return <TextEntry entry={entry} step={step} />;\n }\n\n if (entry.kind === \"skill_invoked\") {\n return (\n <TimelineItem step={step}>\n <TimelineHeader>\n <TimelineSeparator style={{ backgroundColor: \"var(--color-border)\" }} />\n <TimelineIndicator className=\"size-2 border-none bg-emerald-500\" />\n </TimelineHeader>\n <TimelineContent>\n <div className=\"flex items-center gap-1.5 py-1 text-sm \">\n <span className=\"font-semibold text-foreground\">Skill</span>\n <span className=\"text-muted-foreground truncate\">\n {entry.skill}\n </span>\n {entry.stagedAt && (\n <span className=\"text-xs text-muted-foreground/70 \">\n staged at {entry.stagedAt}\n </span>\n )}\n </div>\n </TimelineContent>\n </TimelineItem>\n );\n }\n\n if (entry.kind === \"artifact\") {\n return (\n <TimelineItem step={step}>\n <TimelineHeader>\n <TimelineSeparator style={{ backgroundColor: \"var(--color-border)\" }} />\n <TimelineIndicator className=\"size-2 border-none bg-sky-500\" />\n </TimelineHeader>\n <TimelineContent>\n {sessionId ? (\n <ArtifactBlock\n sessionId={sessionId}\n artifactId={entry.artifactId}\n name={entry.name}\n kind={entry.artifactKind}\n version={entry.version}\n />\n ) : null}\n </TimelineContent>\n </TimelineItem>\n );\n }\n\n // kind === \"thinking\"\n return (\n <TimelineItem step={step}>\n <TimelineHeader>\n <TimelineSeparator style={{ backgroundColor: \"var(--color-border)\" }} />\n <TimelineIndicator className=\"size-2 border-none bg-primary animate-pulse\" />\n </TimelineHeader>\n <TimelineContent>\n <Shimmer duration={3} spread={3} className=\"text-sm\">Working on it...</Shimmer>\n </TimelineContent>\n </TimelineItem>\n );\n}\n\n// ── Streamed-text timeline entries ───────────────────────────────────\n\nfunction ReasoningEntry({\n entry,\n step,\n}: {\n entry: Extract<TimelineEntry, { kind: \"reasoning\" }>;\n step: number;\n}) {\n const reasoning = useSmoothStream(entry.reasoning, entry.isStreaming);\n return (\n <TimelineItem step={step}>\n <TimelineHeader>\n <TimelineSeparator style={{ backgroundColor: \"var(--color-border)\" }} />\n <TimelineIndicator className=\"size-2\" />\n </TimelineHeader>\n <TimelineContent>\n <Reasoning isStreaming={entry.isStreaming}>\n <ReasoningTrigger />\n <ReasoningContent>{reasoning}</ReasoningContent>\n </Reasoning>\n </TimelineContent>\n </TimelineItem>\n );\n}\n\nfunction TextEntry({\n entry,\n step,\n}: {\n entry: Extract<TimelineEntry, { kind: \"text\" }>;\n step: number;\n}) {\n const content = useSmoothStream(entry.content, entry.isStreaming);\n return (\n <TimelineItem step={step}>\n <TimelineHeader>\n <TimelineSeparator style={{ backgroundColor: \"var(--color-border)\" }} />\n <TimelineIndicator className=\"size-2 border-none bg-foreground/40\" />\n </TimelineHeader>\n <TimelineContent>\n <MessageResponse>{content}</MessageResponse>\n </TimelineContent>\n </TimelineItem>\n );\n}\n\n// ── Assistant message group (single Timeline) ────────────────────────\n\nfunction AssistantGroup({\n messages,\n lastGlobalIndex,\n totalMessages,\n isRunning,\n sessionId,\n artifactFallbacks,\n onFileSelect,\n onRetry,\n}: {\n messages: ChatMessageType[];\n lastGlobalIndex: number;\n totalMessages: number;\n isRunning: boolean;\n sessionId: string | null;\n artifactFallbacks: Record<string, string>;\n onFileSelect?: (path: string) => void;\n onRetry?: () => Promise<void>;\n}) {\n let entries: TimelineEntry[] = [];\n for (let i = 0; i < messages.length; i++) {\n const isLast = i === messages.length - 1\n && lastGlobalIndex === totalMessages - 1;\n entries.push(...messageToEntries(messages[i], isLast, artifactFallbacks));\n }\n entries = groupBrowserActivityEntries(entries);\n entries = groupWebSearchEntries(entries);\n\n // Whenever this is the tail assistant group and the session is still\n // running, append a \"Working on it...\" row unless something visible is\n // already in progress (a running tool, or messageToEntries already added\n // a thinking entry for an empty streaming turn). This covers both the\n // mid-stream pause between text and the next tool call AND the gap\n // between LLM iterations after a turn has fully completed.\n const isTailGroup = lastGlobalIndex === totalMessages - 1;\n const lastEntry = entries[entries.length - 1];\n const hasRunningTool = entries.some(\n (e) => e.kind === \"tool\" && e.tc.status === \"running\",\n );\n const tailMsg = messages[messages.length - 1];\n if (\n isTailGroup\n && isRunning\n && !hasRunningTool\n && lastEntry?.kind !== \"thinking\"\n ) {\n entries.push({ kind: \"thinking\", key: `${tailMsg.id}-tail-thinking` });\n }\n\n // Surface the classifier's error info inline below the timeline when\n // the last assistant message in the group ended in error.\n const tail = messages[messages.length - 1];\n const showErrorInfo =\n tail && tail.role === \"assistant\"\n && tail.status === \"error\"\n && !!tail.errorInfo;\n\n return (\n <Message from=\"assistant\">\n <MessageContent>\n <Timeline defaultValue={999} className=\"gap-0\">\n {entries.map((entry, i) => (\n <TimelineEntryItem\n key={entry.key}\n entry={entry}\n step={i + 1}\n sessionId={sessionId}\n onFileSelect={onFileSelect}\n />\n ))}\n </Timeline>\n {showErrorInfo && (\n <div className=\"mt-3\">\n <ErrorMessage errorInfo={tail.errorInfo!} onRetry={onRetry} />\n </div>\n )}\n </MessageContent>\n </Message>\n );\n}\n\n// Transient banner shown above the composer while the orchestrator is\n// retrying after a provider error. Collapsible for the raw detail.\nfunction RetryBanner({ indicator }: { indicator: RetryIndicator }) {\n const [open, setOpen] = useState(false);\n return (\n <div\n role=\"status\"\n className=\"flex flex-col gap-1 border-l-2 border-amber-500 bg-amber-500/5 px-3 py-2 text-xs\"\n >\n <button\n type=\"button\"\n onClick={() => setOpen((prev) => !prev)}\n className=\"flex items-center gap-2 text-left text-amber-600 hover:text-amber-700\"\n aria-expanded={open}\n >\n <AlertTriangle className=\"size-3 shrink-0\" />\n <span className=\"flex-1 truncate font-medium\">{indicator.title}</span>\n <span className=\"text-[10px] text-muted-foreground\">\n attempt {indicator.attempt}\n </span>\n {indicator.detail && (\n open ? <ChevronDown className=\"size-3\" /> : <ChevronRight className=\"size-3\" />\n )}\n </button>\n {open && indicator.detail && (\n <pre className=\"mt-1 overflow-x-auto rounded-none bg-background p-2 font-mono text-[11px] whitespace-pre-wrap wrap-break-word text-muted-foreground\">\n {indicator.detail}\n </pre>\n )}\n </div>\n );\n}\n\n// ── Main thread ──────────────────────────────────────────────────────\n\nexport function ChatThread({\n sessionId,\n messages,\n isRunning,\n isLoadingHistory = false,\n onSend,\n onStop,\n onFileSelect,\n disabled = false,\n disabledReason,\n tokenUsage,\n retryIndicator,\n onRetry,\n onComposerError,\n}: ChatThreadProps) {\n const groups = useMemo(() => groupMessages(messages), [messages]);\n\n // Pair ``create_artifact`` tool calls to their matching\n // ``artifact.created`` system messages by emission order across the\n // whole thread (the events live in different group-buckets, but the\n // 1:1 ordering is stable). The map is keyed by tool-call id so a\n // ``create_artifact`` whose args have not yet streamed in can still\n // render with the artifact's name as a fallback label.\n //\n // Errored and cancelled calls never emit ``artifact.created``, so they\n // are excluded from the pairing — including them would slip the index\n // and attribute a successful call's artifact name to a failed sibling.\n const artifactFallbacks = useMemo<Record<string, string>>(() => {\n const fallbacks: Record<string, string> = {};\n const createArtifactToolCallIds: string[] = [];\n let artifactIdx = 0;\n for (const msg of messages) {\n if (msg.role === \"assistant\" && msg.toolCalls) {\n for (const tc of msg.toolCalls) {\n if (tc.toolName === \"create_artifact\"\n && !tc.cancelled\n && tc.status !== \"error\") {\n createArtifactToolCallIds.push(tc.id);\n }\n }\n } else if (msg.role === \"system\" && msg.systemKind === \"artifact\") {\n const tcId = createArtifactToolCallIds[artifactIdx];\n if (tcId) {\n const { name } = unpackArtifactMeta(msg.systemMeta, msg.content);\n if (name) fallbacks[tcId] = name;\n }\n artifactIdx += 1;\n }\n }\n return fallbacks;\n }, [messages]);\n\n // Retry is only actionable for the most recent unresolved failure.\n // An error bubble (standalone system or inline assistant) is \"active\"\n // only when it is the tail of the message list — anything after it\n // (a new user message, a later successful turn, another failure)\n // means the server-side state has moved on and clicking the older\n // button would 409. We resolve the active failure's id once here\n // and pass onRetry only to the matching render site.\n const activeFailureId = useMemo<string | null>(() => {\n if (messages.length === 0) return null;\n const tail = messages[messages.length - 1];\n if (tail.role === \"system\" && tail.systemKind === \"error\" && tail.errorInfo) {\n return tail.id;\n }\n if (tail.role === \"assistant\" && tail.status === \"error\" && tail.errorInfo) {\n return tail.id;\n }\n return null;\n }, [messages]);\n\n return (\n <div className=\"flex flex-1 flex-col overflow-hidden bg-background text-sm\">\n <Conversation className=\"relative flex-1 min-h-0\">\n <ConversationContent className=\"mx-auto w-full max-w-4xl\">\n {messages.length === 0 && isLoadingHistory ? (\n <ConversationEmptyState\n icon={<MessageSquareIcon className=\"size-8 opacity-40\" />}\n title=\"Loading conversation\"\n description=\"Fetching the session history.\"\n />\n ) : messages.length === 0 && !disabled ? (\n <ConversationEmptyState\n icon={<MessageSquareIcon className=\"size-8 opacity-40\" />}\n title=\"Start a conversation\"\n description=\"Ask me anything — I can search, analyze, write code, and more.\"\n />\n ) : (\n <>\n {groups.map((group) => {\n if (group.role === \"user\") {\n const msg = group.messages[0];\n return (\n <ChatMessage\n key={msg.id}\n message={msg}\n onFileSelect={onFileSelect}\n />\n );\n }\n\n if (group.role === \"system\") {\n const msg = group.messages[0];\n const groupRetry =\n msg.id === activeFailureId ? onRetry : undefined;\n return (\n <OrphanSystemMarker\n key={msg.id}\n message={msg}\n sessionId={sessionId}\n onRetry={groupRetry}\n />\n );\n }\n\n // Only the assistant group whose tail message is the\n // active failure gets the onRetry callback; earlier\n // failed turns render read-only.\n const groupTail = group.messages[group.messages.length - 1];\n const groupRetry =\n groupTail.id === activeFailureId ? onRetry : undefined;\n return (\n <AssistantGroup\n key={group.messages[0].id}\n messages={group.messages}\n lastGlobalIndex={group.lastGlobalIndex}\n totalMessages={messages.length}\n isRunning={isRunning}\n sessionId={sessionId}\n artifactFallbacks={artifactFallbacks}\n onFileSelect={onFileSelect}\n onRetry={groupRetry}\n />\n );\n })}\n {isRunning && messages.length > 0 && messages[messages.length - 1].role === \"user\" && (\n <Message from=\"assistant\">\n <MessageContent>\n <Shimmer duration={3} spread={3} className=\"text-sm\">Working on it...</Shimmer>\n </MessageContent>\n </Message>\n )}\n </>\n )}\n </ConversationContent>\n <ConversationScrollButton />\n </Conversation>\n\n <div className=\"mx-auto w-full max-w-4xl px-6 pb-5 pt-3\">\n {retryIndicator && (\n <div className=\"mb-2\">\n <RetryBanner indicator={retryIndicator} />\n </div>\n )}\n {disabled && disabledReason ? (\n <div\n className=\"rounded border border-line bg-muted/40 px-3 py-2 text-sm text-muted-foreground\"\n role=\"status\"\n >\n {disabledReason}\n </div>\n ) : (\n <ChatComposer\n onSend={onSend}\n onStop={onStop}\n isRunning={isRunning}\n disabled={disabled}\n disabledReason={disabledReason}\n tokenUsage={tokenUsage}\n onComposerError={onComposerError}\n />\n )}\n </div>\n </div>\n );\n}\n","import {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../ui/collapsible\";\nimport { cn } from \"../../lib/utils\";\nimport {\n ChevronRightIcon,\n FileIcon,\n FolderIcon,\n FolderOpenIcon,\n} from \"lucide-react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\n\ninterface FileTreeContextType {\n expandedPaths: Set<string>;\n togglePath: (path: string) => void;\n selectedPath?: string;\n onSelect?: (path: string) => void;\n}\n\nconst noop = () => {};\n\nconst FileTreeContext = createContext<FileTreeContextType>({\n expandedPaths: new Set(),\n togglePath: noop,\n});\n\nexport type FileTreeProps = Omit<HTMLAttributes<HTMLDivElement>, \"onSelect\"> & {\n expanded?: Set<string>;\n defaultExpanded?: Set<string>;\n selectedPath?: string | null;\n onSelect?: (path: string) => void;\n onExpandedChange?: (expanded: Set<string>) => void;\n};\n\nexport function FileTree({\n expanded: controlledExpanded,\n defaultExpanded = new Set(),\n selectedPath,\n onSelect,\n onExpandedChange,\n className,\n children,\n ...props\n}: FileTreeProps) {\n const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n const expandedPaths = controlledExpanded ?? internalExpanded;\n\n const togglePath = useCallback(\n (path: string) => {\n const next = new Set(expandedPaths);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n setInternalExpanded(next);\n onExpandedChange?.(next);\n },\n [expandedPaths, onExpandedChange],\n );\n\n const contextValue = useMemo(\n () => ({\n expandedPaths,\n onSelect,\n selectedPath: selectedPath ?? undefined,\n togglePath,\n }),\n [expandedPaths, onSelect, selectedPath, togglePath],\n );\n\n return (\n <FileTreeContext.Provider value={contextValue}>\n <div\n className={cn(\"rounded-lg border bg-background text-sm\", className)}\n role=\"tree\"\n {...props}\n >\n <div className=\"p-2\">{children}</div>\n </div>\n </FileTreeContext.Provider>\n );\n}\n\nexport type FileTreeIconProps = HTMLAttributes<HTMLSpanElement>;\n\nexport function FileTreeIcon({\n className,\n children,\n ...props\n}: FileTreeIconProps) {\n return (\n <span className={cn(\"shrink-0\", className)} {...props}>\n {children}\n </span>\n );\n}\n\nexport type FileTreeNameProps = HTMLAttributes<HTMLSpanElement>;\n\nexport function FileTreeName({\n className,\n children,\n ...props\n}: FileTreeNameProps) {\n return (\n <span className={cn(\"truncate\", className)} {...props}>\n {children}\n </span>\n );\n}\n\nexport type FileTreeFolderProps = HTMLAttributes<HTMLDivElement> & {\n path: string;\n name: string;\n};\n\nexport function FileTreeFolder({\n path,\n name,\n className,\n children,\n ...props\n}: FileTreeFolderProps) {\n const { expandedPaths, togglePath, selectedPath, onSelect } =\n useContext(FileTreeContext);\n const isExpanded = expandedPaths.has(path);\n const isSelected = selectedPath === path;\n\n const handleOpenChange = useCallback(() => {\n togglePath(path);\n }, [togglePath, path]);\n\n const handleSelect = useCallback(() => {\n onSelect?.(path);\n }, [onSelect, path]);\n\n return (\n <Collapsible onOpenChange={handleOpenChange} open={isExpanded}>\n <div className={cn(\"\", className)} role=\"treeitem\" tabIndex={0} {...props}>\n <div\n className={cn(\n \"flex w-full items-center gap-1 rounded px-2 py-1 text-left transition-colors hover:bg-muted/50\",\n isSelected && \"bg-muted\",\n )}\n >\n <CollapsibleTrigger asChild>\n <button\n className=\"flex shrink-0 cursor-pointer items-center border-none bg-transparent p-0\"\n type=\"button\"\n aria-label={isExpanded ? `Collapse ${name}` : `Expand ${name}`}\n >\n <ChevronRightIcon\n className={cn(\n \"size-4 shrink-0 text-muted-foreground transition-transform\",\n isExpanded && \"rotate-90\",\n )}\n />\n </button>\n </CollapsibleTrigger>\n <button\n className=\"flex min-w-0 flex-1 cursor-pointer items-center gap-1 border-none bg-transparent p-0 text-left\"\n onClick={handleSelect}\n type=\"button\"\n >\n <FileTreeIcon>\n {isExpanded ? (\n <FolderOpenIcon className=\"size-4 text-blue-500\" />\n ) : (\n <FolderIcon className=\"size-4 text-blue-500\" />\n )}\n </FileTreeIcon>\n <FileTreeName>{name}</FileTreeName>\n </button>\n </div>\n <CollapsibleContent>\n <div className=\"ml-4 border-l border-muted-foreground/50 pl-2\">\n {children}\n </div>\n </CollapsibleContent>\n </div>\n </Collapsible>\n );\n}\n\nexport type FileTreeFileProps = HTMLAttributes<HTMLDivElement> & {\n path: string;\n name: string;\n icon?: ReactNode;\n};\n\nexport function FileTreeFile({\n path,\n name,\n icon,\n className,\n children,\n ...props\n}: FileTreeFileProps) {\n const { selectedPath, onSelect } = useContext(FileTreeContext);\n const isSelected = selectedPath === path;\n\n const handleClick = useCallback(() => {\n onSelect?.(path);\n }, [onSelect, path]);\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n onSelect?.(path);\n }\n },\n [onSelect, path],\n );\n\n return (\n <div\n className={cn(\n \"group flex cursor-pointer items-center gap-1 rounded px-2 py-1 transition-colors hover:bg-muted/50\",\n isSelected && \"bg-muted\",\n className,\n )}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role=\"treeitem\"\n tabIndex={0}\n {...props}\n >\n {children ?? (\n <>\n <span className=\"size-4 shrink-0\" />\n <FileTreeIcon>\n {icon ?? <FileIcon className=\"size-4 text-muted-foreground\" />}\n </FileTreeIcon>\n <FileTreeName>{name}</FileTreeName>\n </>\n )}\n </div>\n );\n}\n\n","import type { ComponentProps } from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport function Skeleton({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n );\n}\n\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n\n/**\n * Format a byte count as a human-readable size string (B / KB / MB).\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Infer a language hint from a file path for syntax display.\n *\n * Extracts the extension from the filename component only, so directory\n * names containing dots (e.g. ``some.dir/Makefile``) are handled correctly.\n */\nexport function getLanguageHint(path: string): string {\n const name = path.split(\"/\").pop() ?? path;\n const dot = name.lastIndexOf(\".\");\n if (dot < 0) return \"plaintext\";\n const ext = name.slice(dot).toLowerCase();\n const map: Record<string, string> = {\n \".py\": \"python\",\n \".js\": \"javascript\",\n \".ts\": \"typescript\",\n \".tsx\": \"tsx\",\n \".jsx\": \"jsx\",\n \".json\": \"json\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\",\n \".toml\": \"toml\",\n \".sql\": \"sql\",\n \".sh\": \"bash\",\n \".css\": \"css\",\n \".html\": \"html\",\n \".md\": \"markdown\",\n \".rs\": \"rust\",\n \".go\": \"go\",\n \".java\": \"java\",\n \".rb\": \"ruby\",\n \".php\": \"php\",\n \".c\": \"c\",\n \".cpp\": \"cpp\",\n \".h\": \"c\",\n \".hpp\": \"cpp\",\n };\n return map[ext] ?? \"plaintext\";\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport {\n AlertCircleIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n DownloadIcon,\n FileTextIcon,\n ImageIcon,\n MinusIcon,\n PlusIcon,\n SearchIcon,\n TrashIcon,\n XIcon,\n} from \"lucide-react\";\nimport \"pdfjs-dist/web/pdf_viewer.css\";\nimport { formatFileSize, getLanguageHint } from \"../../lib/format\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { ScrollArea } from \"../ui/scroll-area\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport type { AgentChatWorkspaceFile } from \"../../types\";\nimport type {\n PDFDocumentLoadingTask,\n PDFDocumentProxy,\n} from \"pdfjs-dist\";\nimport type {\n EventBus,\n PDFFindController,\n PDFViewer,\n} from \"pdfjs-dist/web/pdf_viewer.mjs\";\n\nconst SKELETON_WIDTHS = [70, 85, 55, 90, 60, 78, 45, 82, 65, 72];\nconst PDF_WORKER_SRC = new URL(\n \"pdfjs-dist/legacy/build/pdf.worker.mjs\",\n import.meta.url,\n).toString();\n\ninterface FileViewerProps {\n file: AgentChatWorkspaceFile | null;\n loading: boolean;\n error: string | null;\n /** Same-origin URL the browser can navigate to for download. */\n downloadUrl: string | null;\n onDelete: (() => void) | null;\n onClose: () => void;\n}\n\nexport function FileViewer({\n file,\n loading,\n error,\n downloadUrl,\n onDelete,\n onClose,\n}: FileViewerProps) {\n const visible = loading || file !== null || error !== null;\n if (!visible) return null;\n\n const fileName = file?.path.split(\"/\").pop() ?? \"File\";\n const lang = file ? getLanguageHint(file.path) : \"\";\n const isPdf =\n file?.mime_type === \"application/pdf\" ||\n file?.path.toLowerCase().endsWith(\".pdf\") ||\n false;\n const isImage = file?.encoding === \"base64\" && !isPdf;\n const HeaderIcon = isImage ? ImageIcon : FileTextIcon;\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col border-t border-line\">\n <div className=\"flex shrink-0 items-center gap-2 border-b border-line px-3 py-2\">\n <HeaderIcon className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-xs font-medium\">{fileName}</div>\n <div className=\"truncate text-[10px] text-muted-foreground\">\n {file?.path ?? \"Loading...\"}\n {file && (\n <span className=\"ml-1.5\">\n {formatFileSize(file.size)}\n {file.truncated && \" (truncated)\"}\n </span>\n )}\n </div>\n </div>\n {downloadUrl && (\n <a\n href={downloadUrl}\n download={fileName}\n className=\"shrink-0 rounded p-0.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n aria-label={`Download ${fileName}`}\n title=\"Download\"\n >\n <DownloadIcon className=\"size-3.5\" />\n </a>\n )}\n {onDelete && (\n <button\n type=\"button\"\n onClick={onDelete}\n className=\"shrink-0 rounded p-0.5 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive\"\n aria-label={`Delete ${fileName}`}\n title=\"Delete\"\n >\n <TrashIcon className=\"size-3.5\" />\n </button>\n )}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"shrink-0 rounded p-0.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n aria-label=\"Close file\"\n >\n <XIcon className=\"size-3.5\" />\n </button>\n </div>\n\n <ScrollArea className=\"min-h-0 flex-1\">\n {loading && (\n <div className=\"space-y-1.5 p-3\">\n {Array.from({ length: 10 }).map((_, index) => (\n <Skeleton\n key={index}\n className=\"h-3.5 rounded\"\n style={{\n width: `${SKELETON_WIDTHS[index % SKELETON_WIDTHS.length]}%`,\n }}\n />\n ))}\n </div>\n )}\n\n {error && (\n <div className=\"flex items-start gap-2 p-3 text-xs text-destructive\">\n <AlertCircleIcon className=\"mt-0.5 size-3.5 shrink-0\" />\n <span>{error}</span>\n </div>\n )}\n\n {file && isPdf && file.encoding !== \"base64\" && (\n <FileViewerError message=\"PDF preview requires base64 file content.\" />\n )}\n\n {file && isPdf && file.encoding === \"base64\" && (\n <PdfPreview file={file} fileName={fileName} />\n )}\n\n {file && isImage && (\n <div className=\"flex items-center justify-center p-4\">\n <img\n src={`data:${file.mime_type ?? \"image/png\"};base64,${file.content}`}\n alt={fileName}\n className=\"max-h-[60vh] max-w-full rounded object-contain\"\n />\n </div>\n )}\n\n {file && !isImage && !isPdf && (\n <pre className=\"wrap-break-word whitespace-pre-wrap p-3 text-[11px] leading-relaxed text-foreground\">\n <code data-language={lang}>{file.content}</code>\n </pre>\n )}\n </ScrollArea>\n </div>\n );\n}\n\nfunction FileViewerError({ message }: { message: string }) {\n return (\n <div className=\"flex items-start gap-2 p-3 text-xs text-destructive\">\n <AlertCircleIcon className=\"mt-0.5 size-3.5 shrink-0\" />\n <span>{message}</span>\n </div>\n );\n}\n\nfunction PdfPreview({\n file,\n fileName,\n}: {\n file: AgentChatWorkspaceFile;\n fileName: string;\n}) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<HTMLDivElement>(null);\n const pdfViewerRef = useRef<PDFViewer | null>(null);\n const eventBusRef = useRef<EventBus | null>(null);\n const findControllerRef = useRef<PDFFindController | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [pageNumber, setPageNumber] = useState(1);\n const [pagesCount, setPagesCount] = useState(0);\n const [scale, setScale] = useState(1);\n const [query, setQuery] = useState(\"\");\n\n useEffect(() => {\n let cancelled = false;\n let loadingTask: PDFDocumentLoadingTask | null = null;\n let pdfDocument: PDFDocumentProxy | null = null;\n\n const renderPdf = async () => {\n setError(null);\n const container = containerRef.current;\n const viewerElement = viewerRef.current;\n if (!container || !viewerElement) return;\n\n const pdfBytes = decodeBase64(file.content);\n const pdfjs = await import(\"pdfjs-dist/legacy/build/pdf.mjs\");\n pdfjs.GlobalWorkerOptions.workerSrc = PDF_WORKER_SRC;\n (\n globalThis as typeof globalThis & {\n pdfjsLib?: typeof pdfjs;\n }\n ).pdfjsLib = pdfjs;\n const pdfViewerModule = await import(\"pdfjs-dist/web/pdf_viewer.mjs\");\n loadingTask = pdfjs.getDocument({ data: pdfBytes });\n const pdf = await loadingTask.promise;\n pdfDocument = pdf;\n if (cancelled) return;\n\n const eventBus = new pdfViewerModule.EventBus();\n const linkService = new pdfViewerModule.PDFLinkService({ eventBus });\n const findController = new pdfViewerModule.PDFFindController({\n eventBus,\n linkService,\n });\n const pdfViewer = new pdfViewerModule.PDFViewer({\n container,\n viewer: viewerElement,\n eventBus,\n linkService,\n findController,\n removePageBorders: true,\n });\n linkService.setViewer(pdfViewer);\n linkService.setDocument(pdf);\n findController.setDocument(pdf);\n\n const onPagesInit = () => {\n pdfViewer.currentScaleValue = \"page-width\";\n setScale(pdfViewer.currentScale || 1);\n setPagesCount(pdfViewer.pagesCount);\n setPageNumber(pdfViewer.currentPageNumber);\n };\n const onPageChanging = (event: { pageNumber?: number }) => {\n if (typeof event.pageNumber === \"number\") {\n setPageNumber(event.pageNumber);\n }\n };\n const onScaleChanging = (event: { scale?: number }) => {\n if (typeof event.scale === \"number\") {\n setScale(event.scale);\n }\n };\n\n eventBus.on(\"pagesinit\", onPagesInit);\n eventBus.on(\"pagechanging\", onPageChanging);\n eventBus.on(\"scalechanging\", onScaleChanging);\n\n pdfViewerRef.current = pdfViewer;\n eventBusRef.current = eventBus;\n findControllerRef.current = findController;\n setPagesCount(pdf.numPages);\n pdfViewer.setDocument(pdf);\n };\n\n void renderPdf().catch((nextError) => {\n if (cancelled) return;\n if (\n nextError instanceof Error &&\n nextError.name === \"RenderingCancelledException\"\n ) {\n return;\n }\n setError(formatPdfPreviewError(nextError));\n });\n\n return () => {\n cancelled = true;\n loadingTask?.destroy();\n pdfDocument?.destroy();\n pdfViewerRef.current?.cleanup();\n pdfViewerRef.current = null;\n eventBusRef.current = null;\n findControllerRef.current = null;\n };\n }, [file.content]);\n\n const setViewerPage = (nextPage: number) => {\n const viewer = pdfViewerRef.current;\n if (!viewer) return;\n const clampedPage = Math.min(\n Math.max(1, nextPage),\n Math.max(1, viewer.pagesCount),\n );\n viewer.currentPageNumber = clampedPage;\n setPageNumber(clampedPage);\n };\n\n const setViewerScale = (nextScale: number) => {\n const viewer = pdfViewerRef.current;\n if (!viewer) return;\n const clampedScale = Math.min(3, Math.max(0.5, nextScale));\n viewer.currentScale = clampedScale;\n setScale(clampedScale);\n };\n\n const runFind = (findPrevious = false) => {\n const eventBus = eventBusRef.current;\n if (!eventBus || !query.trim()) return;\n eventBus.dispatch(\"find\", {\n source: eventBus,\n type: \"again\",\n query,\n phraseSearch: true,\n caseSensitive: false,\n entireWord: false,\n highlightAll: true,\n findPrevious,\n matchDiacritics: true,\n });\n };\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <div className=\"flex shrink-0 flex-wrap items-center gap-1.5 border-b border-line px-2 py-1.5\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={() => setViewerPage(pageNumber - 1)}\n disabled={pageNumber <= 1}\n aria-label=\"Previous PDF page\"\n title=\"Previous page\"\n >\n <ChevronLeftIcon className=\"size-3.5\" />\n </Button>\n <Input\n type=\"number\"\n min={1}\n max={pagesCount || 1}\n value={pageNumber}\n onChange={(event) => setViewerPage(Number(event.target.value))}\n aria-label=\"PDF page number\"\n className=\"h-7 w-12 border-input px-1 text-center text-xs\"\n />\n <span className=\"text-xs text-muted-foreground\">\n / {pagesCount || \"-\"}\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={() => setViewerPage(pageNumber + 1)}\n disabled={pagesCount > 0 && pageNumber >= pagesCount}\n aria-label=\"Next PDF page\"\n title=\"Next page\"\n >\n <ChevronRightIcon className=\"size-3.5\" />\n </Button>\n\n <div className=\"mx-1 h-5 w-px bg-line\" />\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={() => setViewerScale(scale - 0.1)}\n disabled={scale <= 0.5}\n aria-label=\"Zoom out PDF\"\n title=\"Zoom out\"\n >\n <MinusIcon className=\"size-3.5\" />\n </Button>\n <button\n type=\"button\"\n className=\"h-7 min-w-12 px-1 text-xs text-muted-foreground hover:text-foreground\"\n onClick={() => {\n const viewer = pdfViewerRef.current;\n if (!viewer) return;\n viewer.currentScaleValue = \"page-width\";\n setScale(viewer.currentScale || 1);\n }}\n aria-label=\"Fit PDF to width\"\n title=\"Fit width\"\n >\n {Math.round(scale * 100)}%\n </button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={() => setViewerScale(scale + 0.1)}\n disabled={scale >= 3}\n aria-label=\"Zoom in PDF\"\n title=\"Zoom in\"\n >\n <PlusIcon className=\"size-3.5\" />\n </Button>\n\n <div className=\"mx-1 h-5 w-px bg-line\" />\n\n <SearchIcon className=\"size-3.5 text-muted-foreground\" />\n <Input\n type=\"search\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") runFind(event.shiftKey);\n }}\n placeholder=\"Find\"\n aria-label=\"Find in PDF\"\n className=\"h-7 w-28 border-input px-1 text-xs\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"xs\"\n onClick={() => runFind(false)}\n disabled={!query.trim()}\n >\n Find\n </Button>\n </div>\n {error && (\n <div className=\"flex w-full items-start gap-2 p-3 text-xs text-destructive\">\n <AlertCircleIcon className=\"mt-0.5 size-3.5 shrink-0\" />\n <span>{error}</span>\n </div>\n )}\n {!error && (\n <div className=\"relative h-[70vh] min-h-[420px] flex-1 bg-muted/20\">\n <div\n ref={containerRef}\n aria-label={`PDF viewer for ${fileName}`}\n className=\"absolute inset-0 overflow-auto\"\n >\n <div ref={viewerRef} className=\"pdfViewer\" />\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction decodeBase64(content: string): Uint8Array {\n const binary = globalThis.atob(content);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n\nfunction formatPdfPreviewError(error: unknown): string {\n if (\n error instanceof Error &&\n (error.name === \"InvalidCharacterError\" || error.message === \"Invalid character\")\n ) {\n return \"PDF preview data is not valid base64.\";\n }\n return error instanceof Error ? error.message : \"Failed to render PDF preview.\";\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { MouseEvent, ReactNode } from \"react\";\nimport {\n AlertCircleIcon,\n DownloadIcon,\n FolderOpenIcon,\n Loader2Icon,\n RefreshCwIcon,\n TrashIcon,\n UploadIcon,\n} from \"lucide-react\";\nimport {\n FileTree,\n FileTreeFile,\n FileTreeFolder,\n} from \"../ai-elements/file-tree\";\nimport { Button } from \"../ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\";\nimport { ScrollArea } from \"../ui/scroll-area\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../ui/tooltip\";\nimport { cn } from \"../../lib/utils\";\nimport { formatFileSize } from \"../../lib/format\";\nimport type {\n AgentChatAdapter,\n AgentChatWorkspaceEntry,\n AgentChatWorkspaceFile,\n} from \"../../types\";\nimport { FileViewer } from \"./file-viewer\";\n\nconst SKELETON_WIDTHS = [75, 60, 90, 65, 80, 70, 85, 55];\nconst DEFAULT_WIDTH = 400;\nconst MIN_WIDTH = 300;\nconst MAX_WIDTH = 900;\n\ninterface WorkspacePanelProps {\n adapter: AgentChatAdapter;\n sessionId: string | null;\n selectedPath: string | null;\n onSelectedPathChange: (path: string | null) => void;\n refreshSignal?: number;\n disabled?: boolean;\n fillParent?: boolean;\n}\n\nfunction collectExpandedPaths(\n entries: AgentChatWorkspaceEntry[],\n depth = 0,\n): string[] {\n const paths: string[] = [];\n for (const entry of entries) {\n if (entry.kind === \"dir\" && depth < 1) {\n paths.push(entry.path);\n if (entry.children) {\n paths.push(...collectExpandedPaths(entry.children, depth + 1));\n }\n }\n }\n return paths;\n}\n\nfunction findEntry(\n entries: AgentChatWorkspaceEntry[],\n path: string,\n): AgentChatWorkspaceEntry | null {\n for (const entry of entries) {\n if (entry.path === path) return entry;\n if (entry.kind === \"dir\" && entry.children) {\n const found = findEntry(entry.children, path);\n if (found) return found;\n }\n }\n return null;\n}\n\nfunction RenderEntries({\n entries,\n onDelete,\n downloadUrlFor,\n}: {\n entries: AgentChatWorkspaceEntry[];\n onDelete: (path: string) => void;\n downloadUrlFor: (path: string) => string;\n}) {\n return (\n <>\n {entries.map((entry) => {\n if (entry.kind === \"dir\") {\n return (\n <FileTreeFolder key={entry.path} name={entry.name} path={entry.path}>\n {entry.children && entry.children.length > 0 && (\n <RenderEntries\n entries={entry.children}\n onDelete={onDelete}\n downloadUrlFor={downloadUrlFor}\n />\n )}\n </FileTreeFolder>\n );\n }\n\n const fileName = entry.name;\n\n return (\n <FileTreeFile key={entry.path} name={entry.name} path={entry.path}>\n <span className=\"size-4 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">{entry.name}</span>\n {entry.size != null && (\n <span className=\"ml-1 shrink-0 text-xs text-muted-foreground/60\">\n {formatFileSize(entry.size)}\n </span>\n )}\n <div className=\"ml-1 flex shrink-0 items-center gap-0 opacity-0 transition-opacity group-hover:opacity-100\">\n <a\n href={downloadUrlFor(entry.path)}\n download={fileName}\n className=\"rounded p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground\"\n onClick={(event) => event.stopPropagation()}\n title=\"Download\"\n aria-label={`Download ${fileName}`}\n >\n <DownloadIcon className=\"size-3\" />\n </a>\n <button\n type=\"button\"\n className=\"rounded p-0.5 text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n onClick={(event) => {\n event.stopPropagation();\n onDelete(entry.path);\n }}\n title=\"Delete\"\n aria-label={`Delete ${fileName}`}\n >\n <TrashIcon className=\"size-3\" />\n </button>\n </div>\n </FileTreeFile>\n );\n })}\n </>\n );\n}\n\nexport function WorkspacePanel({\n adapter,\n sessionId,\n selectedPath,\n onSelectedPathChange,\n refreshSignal = 0,\n disabled = false,\n fillParent = false,\n}: WorkspacePanelProps) {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [entries, setEntries] = useState<AgentChatWorkspaceEntry[]>([]);\n const [rootName, setRootName] = useState(\"workspace\");\n const [treeLoading, setTreeLoading] = useState(false);\n const [treeError, setTreeError] = useState<string | null>(null);\n const [file, setFile] = useState<AgentChatWorkspaceFile | null>(null);\n const [fileLoading, setFileLoading] = useState(false);\n const [fileError, setFileError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [uploading, setUploading] = useState(false);\n const [deleteTarget, setDeleteTarget] = useState<string | null>(null);\n const [expandedPaths, setExpandedPaths] = useState<Set<string>>(new Set());\n const [width, setWidth] = useState(DEFAULT_WIDTH);\n const sessionIdRef = useRef(sessionId);\n const isResizing = useRef(false);\n const startX = useRef(0);\n const startWidth = useRef(DEFAULT_WIDTH);\n\n sessionIdRef.current = sessionId;\n\n const fetchTree = useCallback(async () => {\n if (!sessionId) {\n setEntries([]);\n setRootName(\"workspace\");\n setExpandedPaths(new Set());\n setTreeLoading(false);\n setTreeError(null);\n return;\n }\n const requestedSessionId = sessionId;\n setTreeLoading(true);\n setTreeError(null);\n try {\n const tree = await adapter.getWorkspaceTree({\n sessionId: requestedSessionId,\n });\n if (sessionIdRef.current !== requestedSessionId) return;\n setEntries(tree.entries);\n setRootName(tree.root || \"workspace\");\n setExpandedPaths(new Set(collectExpandedPaths(tree.entries)));\n } catch (error) {\n if (sessionIdRef.current !== requestedSessionId) return;\n setEntries([]);\n setRootName(\"workspace\");\n setTreeError((error as Error).message);\n } finally {\n if (sessionIdRef.current === requestedSessionId) {\n setTreeLoading(false);\n }\n }\n }, [adapter, sessionId]);\n\n const fetchFile = useCallback(\n async (path: string) => {\n if (!sessionId) return;\n const requestedSessionId = sessionId;\n setFileLoading(true);\n setFileError(null);\n try {\n const nextFile = await adapter.getWorkspaceFile({\n sessionId: requestedSessionId,\n path,\n });\n if (sessionIdRef.current !== requestedSessionId) return;\n setFile(nextFile);\n } catch (error) {\n if (sessionIdRef.current !== requestedSessionId) return;\n setFile(null);\n setFileError((error as Error).message);\n } finally {\n if (sessionIdRef.current === requestedSessionId) {\n setFileLoading(false);\n }\n }\n },\n [adapter, sessionId],\n );\n\n useEffect(() => {\n void fetchTree();\n }, [fetchTree]);\n\n useEffect(() => {\n if (!sessionId || refreshSignal === 0) return;\n const timer = setTimeout(() => {\n void fetchTree();\n }, 300);\n return () => clearTimeout(timer);\n }, [refreshSignal, sessionId, fetchTree]);\n\n useEffect(() => {\n if (!sessionId) {\n setFile(null);\n setFileError(null);\n onSelectedPathChange(null);\n }\n }, [onSelectedPathChange, sessionId]);\n\n useEffect(() => {\n if (!selectedPath) return;\n const parts = selectedPath.split(\"/\");\n if (parts.length <= 1) return;\n setExpandedPaths((prev) => {\n const next = new Set(prev);\n let path = \"\";\n for (let index = 0; index < parts.length - 1; index += 1) {\n path = path ? `${path}/${parts[index]}` : parts[index];\n next.add(path);\n }\n return next;\n });\n }, [selectedPath]);\n\n useEffect(() => {\n if (!selectedPath || !sessionId || entries.length === 0) return;\n const entry = findEntry(entries, selectedPath);\n if (entry?.kind === \"file\" && file?.path !== selectedPath) {\n void fetchFile(selectedPath);\n }\n }, [entries, fetchFile, file?.path, selectedPath, sessionId]);\n\n const handleSelect = useCallback(\n (path: string) => {\n onSelectedPathChange(path);\n const entry = findEntry(entries, path);\n if (entry?.kind === \"file\") {\n void fetchFile(path);\n }\n },\n [entries, fetchFile, onSelectedPathChange],\n );\n\n const handleUpload = useCallback(\n async (files: FileList) => {\n if (disabled || !sessionId || files.length === 0) return;\n setUploading(true);\n setNotice(null);\n try {\n for (const uploadedFile of Array.from(files)) {\n await adapter.uploadWorkspaceFile({\n sessionId,\n file: uploadedFile,\n });\n }\n setNotice(\n files.length === 1\n ? `Uploaded ${files[0]?.name ?? \"file\"}`\n : `Uploaded ${files.length} files`,\n );\n await fetchTree();\n } catch (error) {\n setNotice((error as Error).message);\n } finally {\n setUploading(false);\n if (fileInputRef.current) fileInputRef.current.value = \"\";\n }\n },\n [adapter, disabled, fetchTree, sessionId],\n );\n\n const handleDelete = useCallback(\n async (path: string) => {\n if (disabled || !sessionId) return;\n try {\n await adapter.deleteWorkspaceFile({ sessionId, path });\n if (selectedPath === path) {\n onSelectedPathChange(null);\n setFile(null);\n setFileError(null);\n }\n setNotice(`Deleted ${path.split(\"/\").pop() ?? path}`);\n await fetchTree();\n } catch (error) {\n setNotice((error as Error).message);\n } finally {\n setDeleteTarget(null);\n }\n },\n [adapter, disabled, fetchTree, onSelectedPathChange, selectedPath, sessionId],\n );\n\n const onResizeStart = useCallback(\n (event: MouseEvent) => {\n event.preventDefault();\n isResizing.current = true;\n startX.current = event.clientX;\n startWidth.current = width;\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n },\n [width],\n );\n\n useEffect(() => {\n const onMouseMove = (event: globalThis.MouseEvent) => {\n if (!isResizing.current) return;\n const delta = startX.current - event.clientX;\n setWidth(\n Math.min(MAX_WIDTH, Math.max(MIN_WIDTH, startWidth.current + delta)),\n );\n };\n const onMouseUp = () => {\n if (!isResizing.current) return;\n isResizing.current = false;\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n };\n window.addEventListener(\"mousemove\", onMouseMove);\n window.addEventListener(\"mouseup\", onMouseUp);\n return () => {\n window.removeEventListener(\"mousemove\", onMouseMove);\n window.removeEventListener(\"mouseup\", onMouseUp);\n };\n }, []);\n\n return (\n <aside\n data-testid=\"workspace-panel\"\n className={cn(\n \"relative z-10 flex h-full min-h-0 flex-col overflow-hidden border-l border-muted-foreground/20 bg-card\",\n fillParent && \"w-full\",\n )}\n style={\n fillParent\n ? undefined\n : { width, minWidth: MIN_WIDTH, maxWidth: MAX_WIDTH }\n }\n >\n {!fillParent && (\n <div\n className=\"absolute inset-y-0 left-0 z-20 w-1.5 cursor-col-resize transition-colors hover:bg-primary/20 active:bg-primary/30\"\n onMouseDown={onResizeStart}\n />\n )}\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n disabled={disabled}\n onChange={(event) => {\n if (event.target.files) void handleUpload(event.target.files);\n }}\n />\n\n <div className=\"flex min-h-14 items-center gap-2 border-b border-line px-3 py-3\">\n <FolderOpenIcon className=\"size-4 shrink-0 text-amber-500\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium text-foreground\">\n {rootName}\n </div>\n <div className=\"truncate text-xs text-faint\">\n {disabled ? \"Workspace - Read-only\" : \"Workspace\"}\n </div>\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => fileInputRef.current?.click()}\n disabled={disabled || !sessionId || uploading}\n aria-label=\"Upload files\"\n >\n {uploading ? (\n <Loader2Icon className=\"size-4 animate-spin\" />\n ) : (\n <UploadIcon className=\"size-4\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Upload files</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => void fetchTree()}\n disabled={!sessionId || treeLoading}\n aria-label=\"Refresh workspace\"\n >\n <RefreshCwIcon\n className={cn(\"size-4\", treeLoading && \"animate-spin\")}\n />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Refresh</TooltipContent>\n </Tooltip>\n </div>\n\n {notice && (\n <div className=\"border-b border-line px-3 py-2 text-xs text-muted-foreground\">\n {notice}\n </div>\n )}\n\n <ScrollArea className=\"min-h-0 flex-1\">\n <div className=\"px-1 py-1\">\n {treeLoading && entries.length === 0 && (\n <div className=\"space-y-1 p-2\">\n {Array.from({ length: 8 }).map((_, index) => (\n <Skeleton\n key={index}\n className=\"h-5 rounded\"\n style={{\n width: `${SKELETON_WIDTHS[index % SKELETON_WIDTHS.length]}%`,\n }}\n />\n ))}\n </div>\n )}\n\n {treeError && (\n <div className=\"flex items-start gap-2 p-3 text-sm text-destructive\">\n <AlertCircleIcon className=\"mt-0.5 size-4 shrink-0\" />\n <span>{treeError}</span>\n </div>\n )}\n\n {!treeLoading && !treeError && entries.length === 0 && (\n <div className=\"px-4 py-8 text-center text-sm text-faint\">\n <p>No workspace files</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-3 gap-1.5\"\n onClick={() => fileInputRef.current?.click()}\n disabled={disabled || !sessionId}\n >\n <UploadIcon className=\"size-3.5\" />\n Upload files\n </Button>\n </div>\n )}\n\n {entries.length > 0 && (\n <FileTree\n expanded={expandedPaths}\n onExpandedChange={setExpandedPaths}\n selectedPath={selectedPath}\n onSelect={handleSelect}\n className=\"rounded-none border-0\"\n >\n <RenderEntries\n entries={entries}\n onDelete={setDeleteTarget}\n downloadUrlFor={(path) =>\n sessionId\n ? adapter.getWorkspaceDownloadUrl({ sessionId, path })\n : \"#\"\n }\n />\n </FileTree>\n )}\n </div>\n </ScrollArea>\n\n <FileViewer\n file={file}\n loading={fileLoading}\n error={fileError}\n downloadUrl={\n file && sessionId\n ? adapter.getWorkspaceDownloadUrl({\n sessionId,\n path: file.path,\n })\n : null\n }\n onDelete={file && !disabled ? () => setDeleteTarget(file.path) : null}\n onClose={() => {\n onSelectedPathChange(null);\n setFile(null);\n setFileError(null);\n }}\n />\n\n <ConfirmDialog\n open={deleteTarget !== null}\n title=\"Delete file?\"\n description={`This will permanently delete ${\n deleteTarget?.split(\"/\").pop() ?? \"this file\"\n } from the workspace.`}\n confirmLabel=\"Delete\"\n onConfirm={() =>\n deleteTarget ? handleDelete(deleteTarget) : Promise.resolve()\n }\n onCancel={() => setDeleteTarget(null)}\n />\n </aside>\n );\n}\n\ninterface ConfirmDialogProps {\n open: boolean;\n title: string;\n description: ReactNode;\n confirmLabel: string;\n onConfirm: () => Promise<void> | void;\n onCancel: () => void;\n}\n\nfunction ConfirmDialog({\n open,\n title,\n description,\n confirmLabel,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n const [loading, setLoading] = useState(false);\n\n const handleConfirm = async () => {\n setLoading(true);\n try {\n await onConfirm();\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Dialog\n open={open}\n onOpenChange={(nextOpen) => {\n if (!nextOpen && !loading) onCancel();\n }}\n >\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" disabled={loading} onClick={onCancel}>\n Cancel\n </Button>\n <Button variant=\"destructive\" disabled={loading} onClick={handleConfirm}>\n {loading && <Loader2Icon className=\"mr-1.5 size-3.5 animate-spin\" />}\n {confirmLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import type { AgentChatSession } from \"../types\";\n\nexport function isScheduledRunSession(\n session: AgentChatSession | null | undefined,\n): boolean {\n return Boolean(\n session?.channel === \"scheduled\" || session?.config?.scheduled_session_id,\n );\n}\n","import type { AgentChatEventType } from \"../types\";\n\nexport const WORKSPACE_MUTATING_TOOLS: ReadonlySet<string> = new Set([\n \"terminal\",\n \"write_file\",\n \"patch\",\n \"execute_code\",\n \"browser_screenshot\",\n]);\n\nexport const AGENT_CHAT_LISTENED_EVENTS = [\n \"user.message\",\n \"llm.request\",\n \"llm.response\",\n \"llm.thinking\",\n \"llm.delta\",\n \"tool.call\",\n \"tool.result\",\n \"session.start\",\n \"session.pause\",\n \"session.resume\",\n \"session.complete\",\n \"session.fail\",\n \"session.done\",\n \"harness.wake\",\n \"harness.crash\",\n \"context.compact\",\n \"skill.invoked\",\n \"policy.denied\",\n \"stream.timeout\",\n \"expert.result\",\n \"expert.endorse\",\n \"expert.override\",\n \"artifact.created\",\n \"artifact.updated\",\n \"browser.provisioned\",\n \"browser.destroyed\",\n \"browser.control_granted\",\n \"browser.control_returned\",\n \"clarify.response\",\n] as const satisfies readonly AgentChatEventType[];\n","import type {\n AgentChatBrowserState,\n AgentChatDisplayAttachment,\n AgentChatErrorInfo,\n AgentChatImageAttachment,\n AgentChatMessage,\n AgentChatRuntimeEvent,\n AgentChatState,\n AgentChatTokenUsage,\n AgentChatToolCallInfo,\n} from \"../types\";\nimport { WORKSPACE_MUTATING_TOOLS } from \"./events\";\n\nexport const EMPTY_TOKEN_USAGE: AgentChatTokenUsage = {\n inputTokens: 0,\n outputTokens: 0,\n reasoningTokens: 0,\n cachedInputTokens: 0,\n totalTokens: 0,\n contextWindow: 0,\n model: \"\",\n};\n\nexport function createInitialAgentChatState(\n options: { isLoadingHistory?: boolean } = {},\n): AgentChatState {\n return {\n messages: [],\n isRunning: false,\n isLoadingHistory: options.isLoadingHistory ?? false,\n tokenUsage: EMPTY_TOKEN_USAGE,\n retryIndicator: null,\n lastEventId: 0,\n sessionDone: false,\n hadDeltas: false,\n terminal: false,\n workspaceRefreshKey: 0,\n browser: null,\n };\n}\n\nexport function applyAgentChatEvent(\n state: AgentChatState,\n event: AgentChatRuntimeEvent,\n): AgentChatState {\n let nextState: AgentChatState = {\n ...state,\n isLoadingHistory: false,\n lastEventId: Math.max(state.lastEventId, event.eventId),\n sessionDone: state.sessionDone || event.type === \"session.done\",\n };\n\n nextState = applyRetryIndicator(nextState, event);\n\n switch (event.type) {\n case \"user.message\":\n return withMessages(nextState, applyUserMessage(\n nextState.messages,\n event.eventId,\n event.data,\n ));\n\n case \"skill.invoked\":\n return withMessages(nextState, [\n ...nextState.messages,\n {\n id: `evt-${event.eventId}`,\n role: \"system\",\n content: stringValue(event.data.skill),\n createdAt: new Date(),\n status: \"complete\",\n systemKind: \"skill_invoked\",\n systemMeta: {\n skill: event.data.skill,\n staged_at: event.data.staged_at,\n },\n },\n ]);\n\n case \"artifact.created\":\n case \"artifact.updated\":\n return withMessages(nextState, [\n ...nextState.messages,\n {\n id: `evt-${event.eventId}`,\n role: \"system\",\n content: stringValue(event.data.name),\n createdAt: new Date(),\n status: \"complete\",\n systemKind: \"artifact\",\n systemMeta: {\n artifact_id: event.data.artifact_id,\n name: event.data.name,\n kind: event.data.kind,\n version: event.data.version,\n size: event.data.size,\n },\n },\n ]);\n\n case \"browser.provisioned\":\n return applyBrowserEvent(nextState, event, {\n status: \"live\",\n controlOwner: null,\n });\n\n case \"browser.control_granted\":\n return applyBrowserEvent(nextState, event, {\n status: \"user-control\",\n controlOwner: stringValue(event.data.owner_user_id) || null,\n });\n\n case \"browser.control_returned\":\n return applyBrowserEvent(nextState, event, {\n status: \"live\",\n controlOwner: null,\n });\n\n case \"browser.destroyed\":\n return applyBrowserEvent(nextState, event, null);\n\n case \"llm.delta\":\n return applyLlmDelta(nextState, event);\n\n case \"llm.response\":\n return applyLlmResponse(nextState, event);\n\n case \"llm.thinking\":\n return applyLlmThinking(nextState, event);\n\n case \"tool.call\":\n return applyToolCall(nextState, event);\n\n case \"tool.result\": {\n const toolCallId = stringValue(event.data.tool_call_id);\n const toolName = findToolNameById(nextState.messages, toolCallId);\n const messages = applyToolResult(nextState.messages, event.data);\n const mutatesWorkspace =\n toolName !== null && WORKSPACE_MUTATING_TOOLS.has(toolName);\n return {\n ...nextState,\n messages,\n workspaceRefreshKey: mutatesWorkspace\n ? nextState.workspaceRefreshKey + 1\n : nextState.workspaceRefreshKey,\n };\n }\n\n case \"harness.wake\":\n case \"llm.request\":\n return nextState.terminal ? nextState : { ...nextState, isRunning: true };\n\n case \"harness.crash\":\n case \"stream.timeout\":\n return nextState;\n\n case \"session.resume\":\n return {\n ...nextState,\n terminal: false,\n isRunning: true,\n };\n\n case \"session.pause\":\n case \"session.complete\":\n case \"session.fail\":\n case \"session.done\":\n return applyTerminalEvent(nextState, event);\n\n case \"context.compact\":\n if (event.data.strategy === \"clear\") {\n return {\n ...nextState,\n messages: [],\n tokenUsage: EMPTY_TOKEN_USAGE,\n };\n }\n return nextState;\n\n case \"expert.result\":\n return withMessages(\n nextState,\n applyExpertResult(nextState.messages, event.eventId),\n );\n\n case \"expert.endorse\":\n case \"expert.override\":\n return withMessages(\n nextState,\n applyExpertFeedback(nextState.messages, event.type, event.data),\n );\n\n case \"clarify.response\":\n return withMessages(\n nextState,\n applyClarifyResponse(nextState.messages, event.data),\n );\n\n case \"policy.denied\":\n return applyPolicyDenied(nextState, event.data);\n\n case \"session.start\":\n return nextState;\n }\n}\n\nfunction applyRetryIndicator(\n state: AgentChatState,\n event: AgentChatRuntimeEvent,\n): AgentChatState {\n switch (event.type) {\n case \"harness.wake\":\n case \"llm.request\":\n case \"llm.response\":\n case \"session.resume\":\n case \"session.pause\":\n case \"session.complete\":\n case \"session.fail\":\n case \"session.done\":\n return { ...state, retryIndicator: null };\n case \"harness.crash\": {\n const title = stringValue(event.data.error_title) ||\n \"A transient error occurred, retrying...\";\n const detail = stringValue(event.data.error_detail) ||\n stringValue(event.data.error);\n return {\n ...state,\n retryIndicator: {\n title,\n detail,\n attempt: (state.retryIndicator?.attempt ?? 0) + 1,\n },\n };\n }\n default:\n return state;\n }\n}\n\nfunction applyUserMessage(\n messages: AgentChatMessage[],\n eventId: number,\n data: Record<string, unknown>,\n): AgentChatMessage[] {\n const content = stringValue(data.content);\n const images = parseUserMessageImages(data.images);\n const attachments = parseUserMessageAttachments(data.attachments);\n const next = [...messages];\n const localIdx = next.findIndex(\n (m) =>\n m.role === \"user\" &&\n m.id.startsWith(\"local-\") &&\n m.content === content,\n );\n if (localIdx >= 0) {\n const local = next[localIdx]!;\n next[localIdx] = {\n ...local,\n id: `evt-${eventId}`,\n // Server-confirmed lists replace any optimistic display-only\n // entries: chips that were rendered while the upload was in\n // flight become clickable because the persisted refs include a\n // workspace path.\n images: images ?? local.images,\n attachments: attachments ?? local.attachments,\n };\n return next;\n }\n next.push({\n id: `evt-${eventId}`,\n role: \"user\",\n content,\n createdAt: new Date(),\n status: \"complete\",\n images,\n attachments,\n });\n return next;\n}\n\nfunction parseUserMessageImages(\n raw: unknown,\n): AgentChatImageAttachment[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: AgentChatImageAttachment[] = [];\n for (const item of raw) {\n if (!item || typeof item !== \"object\") continue;\n const r = item as Record<string, unknown>;\n const data = typeof r.data === \"string\" ? r.data : undefined;\n if (!data) continue;\n const mimeType =\n typeof r.mime_type === \"string\"\n ? r.mime_type\n : typeof r.mimeType === \"string\"\n ? r.mimeType\n : undefined;\n out.push({ data, mimeType });\n }\n return out.length > 0 ? out : undefined;\n}\n\nfunction parseUserMessageAttachments(\n raw: unknown,\n): AgentChatDisplayAttachment[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const out: AgentChatDisplayAttachment[] = [];\n for (const item of raw) {\n if (!item || typeof item !== \"object\") continue;\n const r = item as Record<string, unknown>;\n const filename = typeof r.filename === \"string\" ? r.filename : undefined;\n if (!filename) continue;\n const path = typeof r.path === \"string\" ? r.path : undefined;\n if (!path) continue;\n const mimeType =\n typeof r.mime_type === \"string\"\n ? r.mime_type\n : typeof r.mimeType === \"string\"\n ? r.mimeType\n : undefined;\n const size = typeof r.size === \"number\" ? r.size : undefined;\n out.push({ path, filename, mimeType, size });\n }\n return out.length > 0 ? out : undefined;\n}\n\nfunction applyBrowserEvent(\n state: AgentChatState,\n event: AgentChatRuntimeEvent,\n browser: AgentChatBrowserState | null,\n): AgentChatState {\n return withMessages(\n { ...state, browser },\n [...state.messages, browserMarker(event)],\n );\n}\n\nfunction browserMarker(event: AgentChatRuntimeEvent): AgentChatMessage {\n const labels: Record<string, { content: string; warning: boolean }> = {\n \"browser.provisioned\": {\n content: \"Browser ready.\",\n warning: false,\n },\n \"browser.control_granted\": {\n content: \"A user took control of the browser.\",\n warning: true,\n },\n \"browser.control_returned\": {\n content: \"Browser control returned to the agent.\",\n warning: false,\n },\n \"browser.destroyed\": {\n content: \"Browser closed.\",\n warning: false,\n },\n };\n const label = labels[event.type] ?? {\n content: \"Browser updated.\",\n warning: false,\n };\n return {\n id: `browser-marker-${event.eventId}`,\n role: \"system\",\n content: label.content,\n createdAt: new Date(),\n status: \"complete\",\n systemKind: label.warning ? \"browser_marker_warning\" : \"browser_marker\",\n };\n}\n\nfunction applyLlmDelta(\n state: AgentChatState,\n event: AgentChatRuntimeEvent,\n): AgentChatState {\n const deltaContent = stringValue(event.data.content);\n const deltaReasoning = stringValue(event.data.reasoning);\n const messages = [...state.messages];\n const lastIdx = findLastAssistantIndex(messages);\n const lastMsg = lastIdx >= 0 ? messages[lastIdx] : null;\n const hasUserAfter = lastIdx >= 0 && hasUserAfterIndex(messages, lastIdx);\n const allToolsDone = Boolean(\n lastMsg?.toolCalls?.length &&\n lastMsg.toolCalls.every((tc) => tc.status !== \"running\"),\n );\n const canAppend = Boolean(\n lastMsg &&\n lastMsg.status === \"streaming\" &&\n !allToolsDone &&\n !hasUserAfter,\n );\n\n if (canAppend && lastMsg) {\n messages[lastIdx] = {\n ...lastMsg,\n content: deltaContent ? lastMsg.content + deltaContent : lastMsg.content,\n reasoning: deltaReasoning\n ? (lastMsg.reasoning ?? \"\") + deltaReasoning\n : lastMsg.reasoning,\n };\n } else {\n messages.push({\n id: `evt-${event.eventId}`,\n role: \"assistant\",\n content: deltaContent,\n reasoning: deltaReasoning || undefined,\n createdAt: new Date(),\n status: \"streaming\",\n });\n }\n\n return {\n ...state,\n messages,\n hadDeltas: state.hadDeltas || Boolean(deltaContent),\n isRunning: state.terminal ? state.isRunning : true,\n };\n}\n\nfunction applyLlmResponse(\n state: AgentChatState,\n event: AgentChatRuntimeEvent,\n): AgentChatState {\n const messages = [...state.messages];\n const message = objectValue(event.data.message);\n const responseContent = stringValue(message?.content) ||\n stringValue(event.data.content);\n const toolCalls = Array.isArray(message?.tool_calls)\n ? message?.tool_calls\n : [];\n const hasToolCalls = toolCalls.length > 0;\n const responseToolCallIds = toolCallIdsFromResponse(toolCalls);\n const idx = findLastAssistantIndex(messages);\n const prevAssistant = idx >= 0 ? messages[idx] : undefined;\n const prevHasTools = Boolean(prevAssistant?.toolCalls?.length);\n const hasUserAfter = idx >= 0 && hasUserAfterIndex(messages, idx);\n const matchesExistingToolTurn = Boolean(\n hasToolCalls &&\n prevAssistant?.toolCalls?.length &&\n responseToolCallIds.length > 0 &&\n !hasUserAfter &&\n responseToolCallIds.every((id) =>\n prevAssistant.toolCalls?.some((tc) => tc.id === id)\n ),\n );\n\n if (state.hadDeltas && idx >= 0 && !hasUserAfter) {\n const current = messages[idx]!;\n if (hasToolCalls) {\n messages[idx] = {\n ...current,\n reasoning: (current.reasoning ?? \"\") + current.content,\n content: \"\",\n status: \"streaming\",\n };\n } else {\n messages[idx] = { ...current, status: \"complete\" };\n }\n } else if (matchesExistingToolTurn && idx >= 0) {\n const current = messages[idx]!;\n messages[idx] = {\n ...current,\n reasoning: responseContent\n ? appendText(current.reasoning, responseContent)\n : current.reasoning,\n status: \"streaming\",\n };\n } else if (prevHasTools || !prevAssistant || hasUserAfter) {\n messages.push({\n id: `evt-${event.eventId}`,\n role: \"assistant\",\n content: hasToolCalls ? \"\" : responseContent,\n reasoning: hasToolCalls && responseContent ? responseContent : undefined,\n createdAt: new Date(),\n status: hasToolCalls ? \"streaming\" : \"complete\",\n });\n } else {\n const current = messages[idx]!;\n if (hasToolCalls && responseContent) {\n messages[idx] = {\n ...current,\n reasoning: (current.reasoning ?? \"\") + responseContent,\n status: \"streaming\",\n };\n } else {\n messages[idx] = {\n ...current,\n content: responseContent || current.content,\n status: hasToolCalls ? \"streaming\" : \"complete\",\n };\n }\n }\n\n const inputTokens = numberValue(event.data.input_tokens);\n const outputTokens = numberValue(event.data.output_tokens);\n return {\n ...state,\n messages,\n hadDeltas: false,\n isRunning: hasToolCalls,\n tokenUsage: {\n inputTokens,\n outputTokens,\n reasoningTokens: numberValue(event.data.reasoning_tokens),\n cachedInputTokens: numberValue(event.data.cache_read_tokens),\n totalTokens: inputTokens + outputTokens,\n contextWindow: numberValue(event.data.context_window),\n model: stringValue(event.data.model),\n },\n };\n}\n\nfunction toolCallIdsFromResponse(toolCalls: unknown[]): string[] {\n return toolCalls\n .map((toolCall) => stringValue(objectValue(toolCall)?.id))\n .filter((id) => id.length > 0);\n}\n\nfunction appendText(existing: string | undefined, addition: string): string {\n if (!existing) return addition;\n if (existing.includes(addition)) return existing;\n return `${existing}\\n${addition}`;\n}\n\nfunction applyLlmThinking(\n state: AgentChatState,\n event: AgentChatRuntimeEvent,\n): AgentChatState {\n const reasoningText = stringValue(event.data.reasoning) ||\n stringValue(event.data.content);\n const messages = [...state.messages];\n const idx = findLastAssistantIndex(messages);\n const prev = idx >= 0 ? messages[idx] : null;\n const allToolsDone = Boolean(\n prev?.toolCalls?.length &&\n prev.toolCalls.every((tc) => tc.status !== \"running\"),\n );\n const hasUserAfter = idx >= 0 && hasUserAfterIndex(messages, idx);\n\n if (!prev || allToolsDone || hasUserAfter) {\n messages.push({\n id: `evt-${event.eventId}`,\n role: \"assistant\",\n content: \"\",\n reasoning: reasoningText,\n createdAt: new Date(),\n status: \"streaming\",\n });\n } else {\n messages[idx] = {\n ...prev,\n reasoning: (prev.reasoning ?? \"\") + reasoningText,\n };\n }\n\n return {\n ...state,\n messages,\n isRunning: state.terminal ? state.isRunning : true,\n };\n}\n\nfunction applyToolCall(\n state: AgentChatState,\n event: AgentChatRuntimeEvent,\n): AgentChatState {\n const messages = [...state.messages];\n const assistantIdx = findLastAssistantIndex(messages);\n let assistant = assistantIdx >= 0 ? messages[assistantIdx] : null;\n const userAfterAssistant = assistantIdx >= 0 &&\n hasUserAfterIndex(messages, assistantIdx);\n\n if (!assistant || assistant.status === \"complete\" || userAfterAssistant) {\n assistant = {\n id: `evt-${event.eventId}-tc`,\n role: \"assistant\",\n content: \"\",\n createdAt: new Date(),\n status: \"streaming\",\n };\n messages.push(assistant);\n } else {\n assistant = { ...assistant };\n messages[assistantIdx] = assistant;\n }\n\n const existingCalls = assistant.toolCalls ?? [];\n const toolCallId = stringValue(event.data.tool_call_id) || `tc-${event.eventId}`;\n if (!existingCalls.some((tc) => tc.id === toolCallId)) {\n const entry: AgentChatToolCallInfo = {\n id: toolCallId,\n toolName: stringValue(event.data.name) ||\n stringValue(event.data.tool_name) ||\n \"unknown\",\n args: typeof event.data.arguments === \"string\"\n ? event.data.arguments\n : JSON.stringify(event.data.arguments ?? {}),\n status: \"running\",\n };\n if (event.data.checkpoint_hash) {\n entry.checkpointHash = String(event.data.checkpoint_hash);\n }\n assistant.toolCalls = [...existingCalls, entry];\n }\n\n return {\n ...state,\n messages,\n isRunning: state.terminal ? state.isRunning : true,\n };\n}\n\nfunction applyToolResult(\n messages: AgentChatMessage[],\n data: Record<string, unknown>,\n): AgentChatMessage[] {\n const targetId = stringValue(data.tool_call_id);\n let matchIdx = -1;\n for (let i = messages.length - 1; i >= 0; i--) {\n if (\n messages[i]?.role === \"assistant\" &&\n messages[i]?.toolCalls?.some((tc) => tc.id === targetId)\n ) {\n matchIdx = i;\n break;\n }\n }\n if (matchIdx < 0) return messages;\n\n const next = [...messages];\n const matchMsg = next[matchIdx]!;\n const rawResult = data.content ?? data.result;\n const formattedResult = typeof rawResult === \"string\"\n ? rawResult\n : JSON.stringify(rawResult ?? null);\n const isCancelled = data.cancelled === true ||\n formattedResult === \"[cancelled (sibling error)]\";\n next[matchIdx] = {\n ...matchMsg,\n toolCalls: matchMsg.toolCalls!.map((tc) =>\n tc.id === targetId\n ? {\n ...tc,\n result: formattedResult,\n status: isCancelled ? \"error\" : \"complete\",\n cancelled: isCancelled || undefined,\n }\n : tc,\n ),\n };\n return next;\n}\n\nfunction applyTerminalEvent(\n state: AgentChatState,\n event: AgentChatRuntimeEvent,\n): AgentChatState {\n const messages = [...state.messages];\n const errorInfo = buildErrorInfo(event);\n const doneIdx = findLastAssistantIndex(messages);\n\n if (doneIdx >= 0 && messages[doneIdx]?.status === \"streaming\") {\n const doneMsg = messages[doneIdx]!;\n messages[doneIdx] = {\n ...doneMsg,\n toolCalls: doneMsg.toolCalls?.map((tc) =>\n tc.status === \"running\"\n ? {\n ...tc,\n status: event.type === \"session.pause\" ? \"complete\" : \"error\",\n result: tc.result ??\n (event.type === \"session.pause\" ? \"[interrupted]\" : \"[failed]\"),\n }\n : tc,\n ),\n status: event.type === \"session.fail\" ? \"error\" : \"complete\",\n errorInfo: errorInfo ?? doneMsg.errorInfo,\n };\n } else if (event.type === \"session.fail\" && errorInfo) {\n messages.push({\n id: `error-${event.eventId}`,\n role: \"system\",\n systemKind: \"error\",\n content: \"\",\n createdAt: new Date(),\n status: \"error\",\n errorInfo,\n });\n }\n\n return {\n ...state,\n messages,\n terminal: true,\n isRunning: false,\n };\n}\n\nfunction buildErrorInfo(\n event: AgentChatRuntimeEvent,\n): AgentChatErrorInfo | undefined {\n if (\n event.type !== \"session.fail\" ||\n typeof event.data.error_category !== \"string\"\n ) {\n return undefined;\n }\n return {\n category: event.data.error_category as AgentChatErrorInfo[\"category\"],\n title: stringValue(event.data.error_title) ||\n \"The session failed due to an internal error.\",\n detail: stringValue(event.data.error_detail) || stringValue(event.data.error),\n retryable: Boolean(event.data.retryable),\n };\n}\n\nfunction applyExpertResult(\n messages: AgentChatMessage[],\n eventId: number,\n): AgentChatMessage[] {\n const match = findLatestConsultExpertCall(messages);\n if (!match) return messages;\n const next = [...messages];\n const msg = next[match.msgIdx]!;\n next[match.msgIdx] = {\n ...msg,\n toolCalls: msg.toolCalls?.map((tc) =>\n tc.id === match.toolId\n ? { ...tc, expertResultEventId: eventId }\n : tc,\n ),\n };\n return next;\n}\n\nfunction applyExpertFeedback(\n messages: AgentChatMessage[],\n type: \"expert.endorse\" | \"expert.override\",\n data: Record<string, unknown>,\n): AgentChatMessage[] {\n const resultEventId = typeof data.target_event_id === \"number\"\n ? data.target_event_id\n : undefined;\n if (resultEventId == null) return messages;\n const rating = type === \"expert.endorse\" ? \"up\" : \"down\";\n const reason = typeof data.reason === \"string\" ? data.reason : undefined;\n const next = [...messages];\n for (let i = next.length - 1; i >= 0; i--) {\n const msg = next[i];\n if (!msg?.toolCalls) continue;\n const hit = msg.toolCalls.find(\n (tc) => tc.expertResultEventId === resultEventId,\n );\n if (!hit) continue;\n if (\n hit.expertFeedback?.rating === rating &&\n hit.expertFeedback?.reason === reason\n ) {\n return messages;\n }\n next[i] = {\n ...msg,\n toolCalls: msg.toolCalls.map((tc) =>\n tc.expertResultEventId === resultEventId\n ? { ...tc, expertFeedback: { rating, reason } }\n : tc,\n ),\n };\n return next;\n }\n return messages;\n}\n\nfunction applyClarifyResponse(\n messages: AgentChatMessage[],\n data: Record<string, unknown>,\n): AgentChatMessage[] {\n const targetToolId = stringValue(data.tool_call_id);\n const responses = Array.isArray(data.responses) ? data.responses : undefined;\n if (!targetToolId || !responses) return messages;\n const next = [...messages];\n for (let i = next.length - 1; i >= 0; i--) {\n const msg = next[i];\n if (!msg?.toolCalls?.some((tc) => tc.id === targetToolId)) continue;\n next[i] = {\n ...msg,\n toolCalls: msg.toolCalls.map((tc) =>\n tc.id === targetToolId\n ? {\n ...tc,\n clarifyAnswers: responses.map((response) => {\n const row = objectValue(response) ?? {};\n return {\n question: stringValue(row.question),\n answer: stringValue(row.answer),\n is_other: Boolean(row.is_other),\n };\n }),\n }\n : tc,\n ),\n };\n return next;\n }\n return messages;\n}\n\nfunction applyPolicyDenied(\n state: AgentChatState,\n data: Record<string, unknown>,\n): AgentChatState {\n const messages = [...state.messages];\n const policyIdx = findLastAssistantIndex(messages);\n if (policyIdx >= 0) {\n const policyMsg = messages[policyIdx]!;\n messages[policyIdx] = {\n ...policyMsg,\n content: `${policyMsg.content}\\n\\n**Policy denied**: ${\n stringValue(data.reason) || \"Action blocked by governance policy.\"\n }`,\n status: \"error\",\n };\n }\n return {\n ...state,\n messages,\n isRunning: false,\n };\n}\n\nfunction withMessages(\n state: AgentChatState,\n messages: AgentChatMessage[],\n): AgentChatState {\n return { ...state, messages };\n}\n\nfunction findLastAssistantIndex(messages: AgentChatMessage[]): number {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]?.role === \"assistant\") return i;\n }\n return -1;\n}\n\nfunction hasUserAfterIndex(messages: AgentChatMessage[], idx: number): boolean {\n for (let i = idx + 1; i < messages.length; i++) {\n if (messages[i]?.role === \"user\") return true;\n }\n return false;\n}\n\nfunction findToolNameById(\n messages: AgentChatMessage[],\n toolCallId: string,\n): string | null {\n if (!toolCallId) return null;\n for (let i = messages.length - 1; i >= 0; i--) {\n const tc = messages[i]?.toolCalls?.find((c) => c.id === toolCallId);\n if (tc) return tc.toolName;\n }\n return null;\n}\n\nfunction findLatestConsultExpertCall(\n messages: AgentChatMessage[],\n): { msgIdx: number; toolId: string } | null {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (!msg?.toolCalls) continue;\n for (let j = msg.toolCalls.length - 1; j >= 0; j--) {\n const tc = msg.toolCalls[j];\n if (\n tc?.toolName === \"consult_expert\" &&\n tc.expertResultEventId === undefined\n ) {\n return { msgIdx: i, toolId: tc.id };\n }\n }\n }\n return null;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | undefined {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return undefined;\n}\n\nfunction stringValue(value: unknown): string {\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction numberValue(value: unknown): number {\n return typeof value === \"number\" ? value : 0;\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type {\n AgentChatAdapter,\n AgentChatAttachment,\n AgentChatDisplayAttachment,\n AgentChatEventStream,\n AgentChatImageAttachment,\n AgentChatPendingAttachment,\n AgentChatRuntimeApi,\n AgentChatSession,\n AgentChatState,\n} from \"../types\";\nimport { AGENT_CHAT_LISTENED_EVENTS } from \"./events\";\nimport {\n applyAgentChatEvent,\n createInitialAgentChatState,\n} from \"./reducer\";\n\nexport interface UseAgentChatRuntimeInput {\n adapter: AgentChatAdapter;\n agentId?: string;\n sessionId: string | null;\n onSessionChange?: (sessionId: string) => void;\n}\n\nexport function useAgentChatRuntime({\n adapter,\n agentId,\n sessionId,\n onSessionChange,\n}: UseAgentChatRuntimeInput): AgentChatRuntimeApi {\n const [state, setState] = useState<AgentChatState>(() =>\n createInitialAgentChatState({ isLoadingHistory: Boolean(sessionId) }),\n );\n const [session, setSession] = useState<AgentChatSession | null>(null);\n const stateRef = useRef(state);\n const streamRef = useRef<AgentChatEventStream | null>(null);\n const reconnectTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const previousSessionIdRef = useRef<string | null>(sessionId);\n const sessionIdRef = useRef<string | null>(sessionId);\n\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n useEffect(() => {\n sessionIdRef.current = sessionId;\n }, [sessionId]);\n\n const clearReconnectTimer = useCallback(() => {\n if (reconnectTimerRef.current) {\n clearTimeout(reconnectTimerRef.current);\n reconnectTimerRef.current = null;\n }\n }, []);\n\n const closeStream = useCallback(() => {\n const stream = streamRef.current;\n streamRef.current = null;\n stream?.close();\n }, []);\n\n const openStream = useCallback(\n (targetSessionId: string, after?: number) => {\n const stream = adapter.openEventStream({\n sessionId: targetSessionId,\n after: after ?? stateRef.current.lastEventId,\n });\n streamRef.current = stream;\n\n for (const eventType of AGENT_CHAT_LISTENED_EVENTS) {\n stream.addEventListener(eventType, (messageEvent) => {\n if (streamRef.current !== stream) return;\n const data = parseEventData(messageEvent.data);\n const eventId = messageEvent.lastEventId\n ? Number(messageEvent.lastEventId)\n : 0;\n setState((prev) =>\n applyAgentChatEvent(prev, {\n type: eventType,\n eventId,\n data,\n }),\n );\n });\n }\n\n stream.onerror = () => {\n stream.close();\n if (streamRef.current === stream) {\n streamRef.current = null;\n }\n if (\n !stateRef.current.sessionDone &&\n sessionIdRef.current === targetSessionId\n ) {\n reconnectTimerRef.current = setTimeout(\n () => openStream(targetSessionId),\n 3000,\n );\n }\n };\n },\n [adapter],\n );\n\n const ensureStreamForNewTurn = useCallback(\n (targetSessionId: string) => {\n if (streamRef.current && !stateRef.current.sessionDone) return;\n\n const after = stateRef.current.lastEventId;\n clearReconnectTimer();\n closeStream();\n stateRef.current = {\n ...stateRef.current,\n sessionDone: false,\n terminal: false,\n };\n openStream(targetSessionId, after);\n },\n [clearReconnectTimer, closeStream, openStream],\n );\n\n useEffect(() => {\n const previousSessionId = previousSessionIdRef.current;\n previousSessionIdRef.current = sessionId;\n clearReconnectTimer();\n closeStream();\n\n if (!sessionId) {\n setSession(null);\n setState(createInitialAgentChatState());\n return;\n }\n\n const currentState = stateRef.current;\n const preservePendingFirstMessage =\n previousSessionId === null &&\n currentState.isRunning &&\n currentState.messages.some(\n (message) =>\n message.role === \"user\" && message.id.startsWith(\"local-\"),\n );\n const initialState = preservePendingFirstMessage\n ? {\n ...createInitialAgentChatState({ isLoadingHistory: false }),\n messages: currentState.messages,\n isRunning: true,\n }\n : createInitialAgentChatState({\n isLoadingHistory: true,\n });\n stateRef.current = initialState;\n setSession(null);\n setState(initialState);\n openStream(sessionId, 0);\n\n adapter\n .getSession({ sessionId })\n .then((loadedSession) => {\n if (sessionIdRef.current !== sessionId) return;\n setSession(loadedSession);\n if (loadedSession.messageCount === 0) {\n setState((prev) => ({\n ...prev,\n isLoadingHistory: false,\n }));\n }\n if (isTerminalStatus(loadedSession.status)) {\n setState((prev) => ({\n ...prev,\n terminal: true,\n isRunning: false,\n }));\n }\n })\n .catch(() => undefined);\n\n return () => {\n clearReconnectTimer();\n closeStream();\n };\n }, [adapter, clearReconnectTimer, closeStream, openStream, sessionId]);\n\n const markSending = useCallback(\n (\n content: string,\n images?: AgentChatImageAttachment[],\n attachments?: AgentChatDisplayAttachment[],\n ) => {\n setState((prev) => ({\n ...prev,\n terminal: false,\n sessionDone: false,\n isRunning: true,\n messages: [\n ...prev.messages,\n {\n id: `local-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n role: \"user\",\n content,\n createdAt: new Date(),\n status: \"complete\",\n images: images?.length ? images : undefined,\n attachments: attachments?.length ? attachments : undefined,\n },\n ],\n }));\n },\n [],\n );\n\n const markSendError = useCallback((errorText: string) => {\n setState((prev) => {\n for (let i = prev.messages.length - 1; i >= 0; i--) {\n const message = prev.messages[i];\n if (message?.role === \"user\" && message.id.startsWith(\"local-\")) {\n const messages = [...prev.messages];\n messages[i] = {\n ...message,\n status: \"error\",\n content: `${message.content}\\n\\n*Failed to send: ${errorText}*`,\n };\n return {\n ...prev,\n isRunning: false,\n messages,\n };\n }\n }\n return { ...prev, isRunning: false };\n });\n }, []);\n\n const forceStop = useCallback(() => {\n setState((prev) => {\n const messages = [...prev.messages];\n const idx = findLastAssistantIndex(messages);\n if (idx >= 0 && messages[idx]?.status === \"streaming\") {\n const message = messages[idx]!;\n messages[idx] = {\n ...message,\n status: \"complete\",\n toolCalls: message.toolCalls?.map((toolCall) =>\n toolCall.status === \"running\"\n ? {\n ...toolCall,\n status: \"complete\",\n result: toolCall.result ?? \"[interrupted]\",\n }\n : toolCall,\n ),\n };\n }\n return {\n ...prev,\n terminal: true,\n isRunning: false,\n messages,\n };\n });\n }, []);\n\n const send = useCallback(\n async (\n content: string,\n images?: AgentChatImageAttachment[],\n pendingAttachments?: AgentChatPendingAttachment[],\n ) => {\n // Display-only mirror of pendingAttachments for the optimistic\n // local user-message: same filename + size, no path (chip renders\n // disabled). The reducer reconciles these with the persisted\n // refs when the user.message event arrives.\n const displayAttachments: AgentChatDisplayAttachment[] | undefined =\n pendingAttachments?.length\n ? pendingAttachments.map((a) => ({\n filename: a.filename,\n mimeType: a.mimeType,\n size: a.size ?? a.file.size,\n // path absent until upload completes.\n }))\n : undefined;\n\n markSending(content, images, displayAttachments);\n // Slash-command parsing is suppressed when the user is sending\n // image vision OR file attachments — neither shape participates\n // in /goal control flow.\n const goal =\n images?.length || pendingAttachments?.length\n ? null\n : parseGoalDefinition(content);\n\n const runUploadsAndSend = async (sid: string): Promise<void> => {\n let refs: AgentChatAttachment[] | undefined;\n if (pendingAttachments?.length) {\n // Same epoch timestamp shared across this batch so all files\n // from this turn cluster together in the workspace listing.\n const stamp = Date.now();\n refs = await Promise.all(\n pendingAttachments.map(async (a, index) => {\n const safeName = sanitizeUploadFilename(a.file.name);\n const renamed = new File(\n [a.file],\n `${stamp}-${index}-${safeName}`,\n { type: a.file.type },\n );\n const up = await adapter.uploadWorkspaceFile({\n sessionId: sid,\n file: renamed,\n directory: \"uploads\",\n });\n return {\n path: up.path,\n filename: a.filename,\n mimeType: a.mimeType ?? a.file.type ?? undefined,\n size: up.size,\n } satisfies AgentChatAttachment;\n }),\n );\n }\n await sendTurn(adapter, sid, content, images, refs, goal);\n };\n\n if (!sessionId) {\n try {\n const session = await adapter.createSession({ agentId });\n onSessionChange?.(session.id);\n await runUploadsAndSend(session.id);\n } catch (error) {\n markSendError(error instanceof Error ? error.message : \"send failed\");\n throw error;\n }\n return;\n }\n\n try {\n ensureStreamForNewTurn(sessionId);\n await runUploadsAndSend(sessionId);\n } catch (error) {\n markSendError(error instanceof Error ? error.message : \"send failed\");\n throw error;\n }\n },\n [\n adapter,\n agentId,\n ensureStreamForNewTurn,\n markSendError,\n markSending,\n onSessionChange,\n sessionId,\n ],\n );\n\n const stop = useCallback(async () => {\n if (!sessionId) return;\n forceStop();\n await adapter.pauseSession({ sessionId });\n }, [adapter, forceStop, sessionId]);\n\n const retry = useCallback(async () => {\n if (!sessionId) return;\n setState((prev) => ({\n ...prev,\n terminal: false,\n retryIndicator: null,\n isRunning: true,\n }));\n try {\n await adapter.retrySession({ sessionId });\n } catch (error) {\n setState((prev) => ({\n ...prev,\n terminal: true,\n isRunning: false,\n }));\n throw error;\n }\n }, [adapter, sessionId]);\n\n return {\n state,\n session,\n messages: state.messages,\n isRunning: state.isRunning,\n isLoadingHistory: state.isLoadingHistory,\n tokenUsage: state.tokenUsage,\n retryIndicator: state.retryIndicator,\n workspaceRefreshKey: state.workspaceRefreshKey,\n send,\n stop,\n retry,\n markSending,\n markSendError,\n };\n}\n\nfunction parseEventData(data: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(data) as unknown;\n return typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {};\n } catch {\n return {};\n }\n}\n\nfunction isTerminalStatus(status: string): boolean {\n return status === \"paused\" || status === \"completed\" || status === \"failed\";\n}\n\nfunction findLastAssistantIndex(messages: AgentChatState[\"messages\"]): number {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]?.role === \"assistant\") return i;\n }\n return -1;\n}\n\ntype ParsedGoalDefinition = {\n description: string;\n rubric?: string;\n};\n\nconst GOAL_RUBRIC_RE = /\\n\\s*(?:rubric|criteria)\\s*:\\s*\\n/i;\nconst GOAL_CONTROL_COMMANDS = new Set([\"\", \"status\", \"pause\", \"resume\", \"clear\"]);\n\nasync function sendTurn(\n adapter: AgentChatAdapter,\n sessionId: string,\n content: string,\n images: AgentChatImageAttachment[] | undefined,\n attachments: AgentChatAttachment[] | undefined,\n goal: ParsedGoalDefinition | null,\n): Promise<void> {\n if (goal && adapter.defineOutcome) {\n await adapter.defineOutcome({\n sessionId,\n description: goal.description,\n rubric: goal.rubric,\n });\n return;\n }\n await adapter.sendMessage({ sessionId, content, images, attachments });\n}\n\n/**\n * Strip characters the harness or storage backend will reject from an\n * upload filename: path separators, NUL. When the resulting string is\n * empty (e.g. the original name was made up entirely of stripped\n * characters), fall back to a generic placeholder so the workspace key\n * stays well-formed. The harness re-validates the path on its end.\n */\nfunction sanitizeUploadFilename(name: string): string {\n const stripped = name.replace(/[\\/\\\\\\0]/g, \"\").trim();\n return stripped.length > 0 ? stripped : \"attachment\";\n}\n\nfunction parseGoalDefinition(content: string): ParsedGoalDefinition | null {\n const text = content.trim();\n if (text !== \"/goal\" && !text.startsWith(\"/goal \")) return null;\n\n const args = text.slice(\"/goal\".length).trim();\n if (GOAL_CONTROL_COMMANDS.has(args.toLowerCase())) return null;\n\n const match = GOAL_RUBRIC_RE.exec(args);\n const description = (match ? args.slice(0, match.index) : args).trim();\n if (!description) return null;\n\n const rubric = match ? args.slice(match.index + match[0].length).trim() : \"\";\n return rubric ? { description, rubric } : { description };\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { AgentChatAdapterProvider } from \"./adapter-context\";\nimport { BrowserPane } from \"./components/browser/browser-pane\";\nimport { ChatThread } from \"./components/chat/chat-thread\";\nimport { TooltipProvider } from \"./components/ui/tooltip\";\nimport { WorkspacePanel } from \"./components/workspace/workspace-panel\";\nimport { isScheduledRunSession } from \"./lib/sessions\";\nimport { useAgentChatRuntime } from \"./runtime/use-agent-chat-runtime\";\nimport type {\n AgentChatAdapter,\n AgentChatMessage,\n} from \"./types\";\nimport type { ChatComposerError } from \"./components/chat/chat-composer\";\n\nexport interface AgentChatProps {\n adapter: AgentChatAdapter;\n agentId?: string;\n sessionId: string | null;\n onSessionChange?: (sessionId: string) => void;\n onFileSelect?: (path: string) => void;\n onMessagesChange?: (messages: AgentChatMessage[]) => void;\n disabled?: boolean;\n /**\n * Called when the composer rejects a file selection before sending —\n * size/count caps, accept-pattern misses. Host apps wire this to\n * their toast system; the SDK does not surface these on its own.\n */\n onComposerError?: (err: ChatComposerError) => void;\n}\n\nexport function AgentChat({\n adapter,\n agentId,\n sessionId,\n onSessionChange,\n onFileSelect,\n onMessagesChange,\n disabled,\n onComposerError,\n}: AgentChatProps) {\n const [workspacePath, setWorkspacePath] = useState<string | null>(null);\n const runtime = useAgentChatRuntime({\n adapter,\n agentId,\n sessionId,\n onSessionChange,\n });\n const isReadOnlySession = isScheduledRunSession(runtime.session);\n const effectiveDisabled = disabled || isReadOnlySession;\n const disabledReason = isReadOnlySession\n ? \"Scheduled run is read-only\"\n : undefined;\n const browserState = runtime.state.browser;\n const hasBrowserPanel = browserState !== null && sessionId;\n\n useEffect(() => {\n onMessagesChange?.(runtime.messages);\n }, [onMessagesChange, runtime.messages]);\n\n const handleFileSelect = useCallback(\n (path: string) => {\n setWorkspacePath(path);\n onFileSelect?.(path);\n },\n [onFileSelect],\n );\n\n return (\n <AgentChatAdapterProvider\n value={{\n adapter,\n sessionId,\n onFileSelect: handleFileSelect,\n }}\n >\n <TooltipProvider>\n <section\n data-testid=\"agent-chat-layout\"\n className={\n hasBrowserPanel\n ? \"relative min-h-0 flex-1 overflow-hidden bg-background text-sm text-foreground\"\n : \"flex min-h-0 flex-1 overflow-hidden bg-background text-sm text-foreground\"\n }\n style={{ direction: \"ltr\" }}\n >\n <div\n data-testid=\"chat-panel\"\n className={\n hasBrowserPanel\n ? \"absolute inset-y-0 left-0 flex min-h-0 min-w-0 flex-col overflow-hidden\"\n : \"flex min-w-0 flex-1 flex-col overflow-hidden\"\n }\n style={hasBrowserPanel ? { right: 440 } : undefined}\n >\n <ChatThread\n sessionId={sessionId}\n messages={runtime.messages}\n isRunning={runtime.isRunning}\n isLoadingHistory={runtime.isLoadingHistory}\n onSend={(content, images, attachments) =>\n runtime.send(content, images, attachments)\n }\n onStop={() => runtime.stop()}\n onRetry={runtime.retry}\n onFileSelect={handleFileSelect}\n disabled={effectiveDisabled}\n disabledReason={disabledReason}\n tokenUsage={runtime.tokenUsage}\n retryIndicator={runtime.retryIndicator}\n onComposerError={onComposerError}\n />\n </div>\n <div\n data-testid=\"right-stack\"\n className={\n hasBrowserPanel\n ? \"absolute inset-y-0 flex min-h-0 flex-col overflow-hidden\"\n : \"flex min-h-0 shrink-0 flex-col\"\n }\n style={hasBrowserPanel ? { right: 0, width: 440 } : undefined}\n >\n {hasBrowserPanel && (\n <div\n data-testid=\"browser-panel\"\n className=\"h-1/2 min-h-0 w-full overflow-hidden border-b border-line\"\n >\n <BrowserPane\n sessionId={sessionId}\n state={browserState}\n adapter={adapter}\n />\n </div>\n )}\n <div\n data-testid=\"workspace-panel-frame\"\n className={\n hasBrowserPanel\n ? \"h-1/2 min-h-0 w-full overflow-hidden\"\n : \"min-h-0 h-full\"\n }\n >\n <WorkspacePanel\n adapter={adapter}\n sessionId={sessionId}\n selectedPath={workspacePath}\n onSelectedPathChange={setWorkspacePath}\n refreshSignal={runtime.workspaceRefreshKey}\n disabled={effectiveDisabled}\n fillParent={Boolean(hasBrowserPanel)}\n />\n </div>\n </div>\n </section>\n </TooltipProvider>\n </AgentChatAdapterProvider>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport {\n CheckIcon,\n CircleDotIcon,\n ClipboardCheckIcon,\n ExternalLinkIcon,\n InboxIcon,\n MessageSquareIcon,\n ShieldAlertIcon,\n TimerIcon,\n Trash2Icon,\n} from \"lucide-react\";\nimport { Badge } from \"../ui/badge\";\nimport { Button } from \"../ui/button\";\nimport { cn } from \"../../lib/utils\";\nimport type {\n AgentChatAdapter,\n AgentChatClarifyAnswer,\n AgentChatInboxEventStream,\n AgentChatInboxItem,\n AgentChatInboxKind,\n AgentChatInboxList,\n} from \"../../types\";\n\nexport interface InboxPanelProps {\n adapter: AgentChatAdapter;\n title?: string;\n selectedId?: number | null;\n onSelectedIdChange?: (itemId: number | null) => void;\n onSessionSelect?: (sessionId: string) => void;\n hideHeader?: boolean;\n limit?: number;\n}\n\nconst DEFAULT_LIMIT = 50;\n\ntype InboxAdapter = AgentChatAdapter & {\n listInbox(input?: Parameters<NonNullable<AgentChatAdapter[\"listInbox\"]>>[0]): Promise<AgentChatInboxList>;\n getInboxItem(input: { itemId: number }): Promise<AgentChatInboxItem>;\n markInboxItemRead(input: { itemId: number }): Promise<AgentChatInboxItem>;\n acknowledgeInboxItem(input: { itemId: number }): Promise<AgentChatInboxItem>;\n deleteInboxItem?(input: { itemId: number }): Promise<void>;\n respondGovernanceInboxItem(input: {\n itemId: number;\n decision: \"approve\" | \"reject\";\n }): Promise<AgentChatInboxItem>;\n respondActionRequiredInboxItem?(input: {\n itemId: number;\n }): Promise<AgentChatInboxItem>;\n openInboxStream(): AgentChatInboxEventStream;\n};\n\nfunction requireInboxAdapter(adapter: AgentChatAdapter): InboxAdapter {\n if (\n !adapter.listInbox ||\n !adapter.getInboxItem ||\n !adapter.markInboxItemRead ||\n !adapter.acknowledgeInboxItem ||\n !adapter.respondGovernanceInboxItem ||\n !adapter.openInboxStream\n ) {\n throw new Error(\"Inbox is not supported by this adapter.\");\n }\n return adapter as InboxAdapter;\n}\n\nconst KIND_LABEL: Record<string, string> = {\n input_required: \"Input needed\",\n action_required: \"Action needed\",\n task_complete: \"Task complete\",\n governance_gate: \"Approval\",\n progress_checkin: \"Progress\",\n};\n\nfunction kindLabel(kind: AgentChatInboxKind): string {\n return KIND_LABEL[kind] ?? kind.replace(/[_-]+/g, \" \");\n}\n\nfunction statusLabel(status: string): string {\n return status\n .split(/[_-]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nfunction formatRelative(value: string): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"\";\n return formatDistanceToNow(date, { addSuffix: true });\n}\n\nfunction kindIcon(kind: AgentChatInboxKind) {\n if (kind === \"input_required\") return MessageSquareIcon;\n if (kind === \"action_required\") return ExternalLinkIcon;\n if (kind === \"task_complete\") return ClipboardCheckIcon;\n if (kind === \"governance_gate\") return ShieldAlertIcon;\n if (kind === \"progress_checkin\") return TimerIcon;\n return CircleDotIcon;\n}\n\nfunction sortItems(items: AgentChatInboxItem[]): AgentChatInboxItem[] {\n return [...items].sort((a, b) => {\n if (a.createdAt !== b.createdAt) return a.createdAt > b.createdAt ? -1 : 1;\n return b.id - a.id;\n });\n}\n\nfunction QuestionInput({\n prompt,\n choices,\n disabled,\n value,\n onChange,\n}: {\n prompt: string;\n choices?: Array<{ label: string; description?: string }>;\n disabled: boolean;\n value: string;\n onChange: (value: string) => void;\n}) {\n if (choices && choices.length > 0) {\n return (\n <select\n aria-label={prompt}\n className=\"h-9 w-full border border-line bg-background px-2 text-sm text-foreground outline-none focus:border-primary disabled:opacity-50\"\n disabled={disabled}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n >\n <option value=\"\">Select</option>\n {choices.map((choice) => (\n <option key={choice.label} value={choice.label}>\n {choice.label}\n </option>\n ))}\n </select>\n );\n }\n\n return (\n <input\n aria-label={prompt}\n className=\"h-9 w-full border border-line bg-background px-2 text-sm text-foreground outline-none focus:border-primary disabled:opacity-50\"\n disabled={disabled}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n />\n );\n}\n\nfunction InboxDetailActions({\n item,\n adapter,\n onDeleted,\n onSessionSelect,\n children,\n}: {\n item: AgentChatInboxItem;\n adapter: InboxAdapter;\n onDeleted: (itemId: number) => Promise<void>;\n onSessionSelect?: (sessionId: string) => void;\n children?: ReactNode;\n}) {\n const [deleting, setDeleting] = useState(false);\n\n async function deleteItem() {\n if (!adapter.deleteInboxItem) return;\n setDeleting(true);\n try {\n await onDeleted(item.id);\n } finally {\n setDeleting(false);\n }\n }\n\n return (\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => onSessionSelect?.(item.sessionId)}\n aria-label=\"Open session\"\n >\n <ExternalLinkIcon className=\"size-3.5\" />\n Open session\n </Button>\n {children}\n {adapter.deleteInboxItem && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => void deleteItem()}\n disabled={deleting}\n aria-label=\"Delete inbox item\"\n title=\"Delete inbox item\"\n >\n <Trash2Icon className=\"size-3.5\" />\n {deleting ? \"Deleting\" : \"Delete\"}\n </Button>\n )}\n </div>\n );\n}\n\nfunction InputRequiredDetail({\n item,\n adapter,\n onUpdated,\n onDeleted,\n onSessionSelect,\n}: {\n item: AgentChatInboxItem;\n adapter: InboxAdapter;\n onUpdated: (item: AgentChatInboxItem) => void;\n onDeleted: (itemId: number) => Promise<void>;\n onSessionSelect?: (sessionId: string) => void;\n}) {\n const questions = Array.isArray(item.payload.questions)\n ? (item.payload.questions as Array<{\n prompt?: unknown;\n choices?: unknown;\n }>)\n .map((question) => ({\n prompt: typeof question.prompt === \"string\" ? question.prompt : \"\",\n choices: Array.isArray(question.choices)\n ? (question.choices as Array<{ label?: unknown; description?: unknown }>)\n .map((choice) => ({\n label: typeof choice.label === \"string\" ? choice.label : \"\",\n description:\n typeof choice.description === \"string\"\n ? choice.description\n : undefined,\n }))\n .filter((choice) => choice.label)\n : undefined,\n }))\n .filter((question) => question.prompt)\n : [];\n const [answers, setAnswers] = useState<Record<string, string>>({});\n const [submitting, setSubmitting] = useState(false);\n const disabled = item.status !== \"pending\" || submitting;\n const canSubmit = questions.every((question) => answers[question.prompt]?.trim());\n\n async function submit() {\n const toolCallId =\n typeof item.payload.tool_call_id === \"string\"\n ? item.payload.tool_call_id\n : \"\";\n if (!toolCallId || !canSubmit) return;\n setSubmitting(true);\n try {\n const responses: AgentChatClarifyAnswer[] = questions.map((question) => ({\n question: question.prompt,\n answer: answers[question.prompt]?.trim() ?? \"\",\n is_other: false,\n }));\n await adapter.submitClarifyResponse({\n sessionId: item.sessionId,\n toolCallId,\n responses,\n });\n onUpdated(await adapter.getInboxItem({ itemId: item.id }));\n } finally {\n setSubmitting(false);\n }\n }\n\n return (\n <div className=\"space-y-4\">\n {item.body && (\n <p className=\"whitespace-pre-wrap text-sm text-muted-foreground\">\n {item.body}\n </p>\n )}\n {questions.map((question) => (\n <label key={question.prompt} className=\"block space-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">\n {question.prompt}\n </span>\n <QuestionInput\n prompt={question.prompt}\n choices={question.choices}\n disabled={disabled}\n value={answers[question.prompt] ?? \"\"}\n onChange={(value) =>\n setAnswers((current) => ({\n ...current,\n [question.prompt]: value,\n }))\n }\n />\n </label>\n ))}\n <InboxDetailActions\n item={item}\n adapter={adapter}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n >\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void submit()}\n disabled={disabled || !canSubmit}\n aria-label=\"Submit inbox response\"\n >\n {submitting ? \"Submitting\" : \"Submit\"}\n </Button>\n </InboxDetailActions>\n </div>\n );\n}\n\nfunction AckDetail({\n item,\n adapter,\n onUpdated,\n onDeleted,\n onSessionSelect,\n}: {\n item: AgentChatInboxItem;\n adapter: InboxAdapter;\n onUpdated: (item: AgentChatInboxItem) => void;\n onDeleted: (itemId: number) => Promise<void>;\n onSessionSelect?: (sessionId: string) => void;\n}) {\n async function acknowledge() {\n onUpdated(await adapter.acknowledgeInboxItem({ itemId: item.id }));\n }\n const outcome = typeof item.payload.outcome === \"string\" ? item.payload.outcome : \"\";\n const duration =\n typeof item.payload.duration_seconds === \"number\"\n ? item.payload.duration_seconds\n : null;\n return (\n <div className=\"space-y-3\">\n {outcome && <Badge variant=\"secondary\">{outcome}</Badge>}\n {item.body && <p className=\"whitespace-pre-wrap text-sm\">{item.body}</p>}\n {typeof item.payload.error === \"string\" && (\n <pre className=\"overflow-x-auto bg-destructive/10 p-3 text-xs text-destructive\">\n {item.payload.error}\n </pre>\n )}\n {duration !== null && (\n <p className=\"text-xs text-muted-foreground\">\n Duration: {Math.round(duration / 60)} min ({duration} s)\n </p>\n )}\n <InboxDetailActions\n item={item}\n adapter={adapter}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n >\n {item.status === \"pending\" && (\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void acknowledge()}\n aria-label=\"Acknowledge inbox item\"\n >\n <CheckIcon className=\"size-3.5\" />\n Acknowledge\n </Button>\n )}\n </InboxDetailActions>\n </div>\n );\n}\n\nfunction GovernanceDetail({\n item,\n adapter,\n onUpdated,\n onDeleted,\n onSessionSelect,\n}: {\n item: AgentChatInboxItem;\n adapter: InboxAdapter;\n onUpdated: (item: AgentChatInboxItem) => void;\n onDeleted: (itemId: number) => Promise<void>;\n onSessionSelect?: (sessionId: string) => void;\n}) {\n async function decide(decision: \"approve\" | \"reject\") {\n onUpdated(\n await adapter.respondGovernanceInboxItem({ itemId: item.id, decision }),\n );\n }\n const toolName =\n typeof item.payload.tool_name === \"string\" ? item.payload.tool_name : \"tool\";\n const args =\n typeof item.payload.arguments_excerpt === \"string\"\n ? item.payload.arguments_excerpt\n : \"\";\n const reason =\n typeof item.payload.deny_reason === \"string\" ? item.payload.deny_reason : \"\";\n const disabled = item.status !== \"pending\";\n return (\n <div className=\"space-y-4\">\n <div>\n <div className=\"text-base font-semibold text-foreground\">\n Approve {toolName}?\n </div>\n {reason && <p className=\"mt-1 text-sm text-muted-foreground\">{reason}</p>}\n </div>\n {args && (\n <pre className=\"overflow-x-auto border border-line bg-muted p-3 text-xs\">\n {args}\n </pre>\n )}\n <InboxDetailActions\n item={item}\n adapter={adapter}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n >\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={disabled}\n onClick={() => void decide(\"approve\")}\n >\n Approve\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"destructive\"\n disabled={disabled}\n onClick={() => void decide(\"reject\")}\n >\n Reject\n </Button>\n </InboxDetailActions>\n </div>\n );\n}\n\nfunction ActionRequiredDetail({\n item,\n adapter,\n onUpdated,\n onDeleted,\n onSessionSelect,\n}: {\n item: AgentChatInboxItem;\n adapter: InboxAdapter;\n onUpdated: (item: AgentChatInboxItem) => void;\n onDeleted: (itemId: number) => Promise<void>;\n onSessionSelect?: (sessionId: string) => void;\n}) {\n const [submitting, setSubmitting] = useState(false);\n const actionType =\n typeof item.payload.action_type === \"string\"\n ? item.payload.action_type\n : \"\";\n const context =\n typeof item.payload.context === \"string\" ? item.payload.context : \"\";\n const disabled =\n item.status !== \"pending\" || submitting || !adapter.respondActionRequiredInboxItem;\n\n async function complete() {\n if (!adapter.respondActionRequiredInboxItem) return;\n setSubmitting(true);\n try {\n onUpdated(await adapter.respondActionRequiredInboxItem({ itemId: item.id }));\n } finally {\n setSubmitting(false);\n }\n }\n\n return (\n <div className=\"space-y-4\">\n {item.body && <p className=\"whitespace-pre-wrap text-sm\">{item.body}</p>}\n {context && context !== item.body && (\n <p className=\"whitespace-pre-wrap text-sm text-muted-foreground\">\n {context}\n </p>\n )}\n {actionType && <Badge variant=\"secondary\">{actionType}</Badge>}\n <InboxDetailActions\n item={item}\n adapter={adapter}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n >\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void complete()}\n disabled={disabled}\n aria-label=\"Mark action complete\"\n >\n <CheckIcon className=\"size-3.5\" />\n {submitting ? \"Marking\" : \"I completed this\"}\n </Button>\n </InboxDetailActions>\n </div>\n );\n}\n\nfunction ProgressDetail({\n item,\n adapter,\n onUpdated,\n onDeleted,\n onSessionSelect,\n}: {\n item: AgentChatInboxItem;\n adapter: InboxAdapter;\n onUpdated: (item: AgentChatInboxItem) => void;\n onDeleted: (itemId: number) => Promise<void>;\n onSessionSelect?: (sessionId: string) => void;\n}) {\n async function acknowledge() {\n onUpdated(await adapter.acknowledgeInboxItem({ itemId: item.id }));\n }\n const rows: Array<[string, unknown]> = [];\n for (const row of [\n [\"Iterations\", item.payload.iterations] as [string, unknown],\n [\"Last tool\", item.payload.last_tool] as [string, unknown],\n [\"Elapsed\", item.payload.elapsed_seconds] as [string, unknown],\n ]) {\n if (row[1] !== undefined && row[1] !== null && row[1] !== \"\") {\n rows.push(row);\n }\n }\n return (\n <div className=\"space-y-3\">\n {item.body && <p className=\"whitespace-pre-wrap text-sm\">{item.body}</p>}\n {rows.length > 0 && (\n <dl className=\"space-y-1 text-xs text-muted-foreground\">\n {rows.map(([label, value]) => (\n <div key={String(label)} className=\"flex gap-2\">\n <dt className=\"w-20 shrink-0\">{String(label)}</dt>\n <dd className=\"min-w-0\">{String(value)}</dd>\n </div>\n ))}\n </dl>\n )}\n <InboxDetailActions\n item={item}\n adapter={adapter}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n >\n {item.status === \"pending\" && (\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void acknowledge()}\n aria-label=\"Acknowledge inbox item\"\n >\n <CheckIcon className=\"size-3.5\" />\n Acknowledge\n </Button>\n )}\n </InboxDetailActions>\n </div>\n );\n}\n\nfunction InboxDetail({\n item,\n adapter,\n onUpdated,\n onDeleted,\n onSessionSelect,\n}: {\n item: AgentChatInboxItem;\n adapter: InboxAdapter;\n onUpdated: (item: AgentChatInboxItem) => void;\n onDeleted: (itemId: number) => Promise<void>;\n onSessionSelect?: (sessionId: string) => void;\n}) {\n const Icon = kindIcon(item.kind);\n\n return (\n <section className=\"min-w-0 flex-1 overflow-y-auto p-6\">\n <div className=\"mb-5 flex min-w-0 items-start gap-3\">\n <div className=\"mt-0.5 flex size-8 shrink-0 items-center justify-center border border-line text-muted-foreground\">\n <Icon className=\"size-4\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"secondary\">{kindLabel(item.kind)}</Badge>\n <Badge variant={item.status === \"pending\" ? \"default\" : \"secondary\"}>\n {statusLabel(item.status)}\n </Badge>\n </div>\n <h2 className=\"mt-2 text-lg font-semibold leading-snug text-foreground\">\n {item.title}\n </h2>\n </div>\n </div>\n\n {item.kind === \"input_required\" ? (\n <InputRequiredDetail\n item={item}\n adapter={adapter}\n onUpdated={onUpdated}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n />\n ) : item.kind === \"action_required\" ? (\n <ActionRequiredDetail\n item={item}\n adapter={adapter}\n onUpdated={onUpdated}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n />\n ) : item.kind === \"governance_gate\" ? (\n <GovernanceDetail\n item={item}\n adapter={adapter}\n onUpdated={onUpdated}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n />\n ) : item.kind === \"progress_checkin\" ? (\n <ProgressDetail\n item={item}\n adapter={adapter}\n onUpdated={onUpdated}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n />\n ) : (\n <AckDetail\n item={item}\n adapter={adapter}\n onUpdated={onUpdated}\n onDeleted={onDeleted}\n onSessionSelect={onSessionSelect}\n />\n )}\n </section>\n );\n}\n\nexport function InboxPanel({\n adapter,\n title = \"Inbox\",\n selectedId,\n onSelectedIdChange,\n onSessionSelect,\n hideHeader = false,\n limit = DEFAULT_LIMIT,\n}: InboxPanelProps) {\n const inboxAdapter = useMemo(() => requireInboxAdapter(adapter), [adapter]);\n const [items, setItems] = useState<AgentChatInboxItem[]>([]);\n const [nextCursor, setNextCursor] = useState<string | null>(null);\n const [internalSelectedId, setInternalSelectedId] = useState<number | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const requestId = useRef(0);\n const selectedItemId = selectedId ?? internalSelectedId;\n const selectedItem = useMemo(\n () => items.find((item) => item.id === selectedItemId) ?? null,\n [items, selectedItemId],\n );\n\n const applyItem = useCallback((nextItem: AgentChatInboxItem) => {\n setItems((current) =>\n sortItems(\n current.map((item) => (item.id === nextItem.id ? nextItem : item)),\n ),\n );\n }, []);\n\n const selectItem = useCallback(\n async (itemId: number) => {\n if (selectedId === undefined) setInternalSelectedId(itemId);\n onSelectedIdChange?.(itemId);\n const item = await inboxAdapter.getInboxItem({ itemId });\n applyItem(item);\n if (!item.readAt) {\n applyItem(await inboxAdapter.markInboxItemRead({ itemId }));\n }\n },\n [applyItem, inboxAdapter, onSelectedIdChange, selectedId],\n );\n\n const load = useCallback(\n async (cursor?: string | null) => {\n const id = ++requestId.current;\n setLoading(true);\n setError(null);\n try {\n const response = await inboxAdapter.listInbox({\n cursor: cursor ?? undefined,\n limit,\n });\n if (id !== requestId.current) return;\n setItems((current) =>\n sortItems(cursor ? [...current, ...response.items] : response.items),\n );\n setNextCursor(response.nextCursor);\n } catch (err) {\n if (id === requestId.current) {\n setError(err instanceof Error ? err.message : \"Failed to load inbox\");\n }\n } finally {\n if (id === requestId.current) setLoading(false);\n }\n },\n [inboxAdapter, limit],\n );\n\n useEffect(() => {\n void load(null);\n }, [load]);\n\n useEffect(() => {\n const stream = inboxAdapter.openInboxStream();\n stream.addEventListener(\"item\", (event) => {\n const payload = JSON.parse(event.data) as { item_id?: unknown };\n if (typeof payload.item_id !== \"number\") return;\n void inboxAdapter.getInboxItem({ itemId: payload.item_id }).then(applyItem);\n });\n return () => stream.close();\n }, [applyItem, inboxAdapter]);\n\n function updateSelectedItem(item: AgentChatInboxItem) {\n applyItem(item);\n }\n\n const deleteItem = useCallback(\n async (itemId: number) => {\n if (!inboxAdapter.deleteInboxItem) return;\n await inboxAdapter.deleteInboxItem({ itemId });\n setItems((current) => current.filter((item) => item.id !== itemId));\n if (selectedItemId === itemId) {\n if (selectedId === undefined) setInternalSelectedId(null);\n onSelectedIdChange?.(null);\n }\n },\n [inboxAdapter, onSelectedIdChange, selectedId, selectedItemId],\n );\n\n return (\n <div className=\"flex h-full min-h-0 min-w-0 bg-background text-foreground\">\n <aside className=\"flex w-80 min-w-72 max-w-sm shrink-0 flex-col border-r border-line\">\n {!hideHeader && (\n <div className=\"flex min-h-14 items-center gap-2 border-b border-line px-4\">\n <InboxIcon className=\"size-4 text-muted-foreground\" />\n <h1 className=\"font-semibold\">{title}</h1>\n </div>\n )}\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {error && (\n <div className=\"px-4 py-3 text-sm text-destructive\">{error}</div>\n )}\n {!error && items.length === 0 && !loading && (\n <div className=\"px-4 py-8 text-sm text-muted-foreground\">\n No inbox items\n </div>\n )}\n {items.map((item) => {\n const Icon = kindIcon(item.kind);\n const selected = item.id === selectedItemId;\n return (\n <button\n key={item.id}\n type=\"button\"\n aria-label={`Open inbox item ${item.title}`}\n className={cn(\n \"flex w-full min-w-0 gap-3 border-l-2 px-3 py-3 text-left transition-colors hover:bg-input\",\n selected\n ? \"border-l-primary bg-line text-foreground\"\n : \"border-l-transparent text-subtle\",\n !item.readAt && \"font-medium text-foreground\",\n )}\n onClick={() => void selectItem(item.id)}\n >\n <Icon className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex min-w-0 items-center justify-between gap-2\">\n <span className=\"truncate text-xs uppercase tracking-wide text-muted-foreground\">\n {kindLabel(item.kind)}\n </span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {formatRelative(item.createdAt)}\n </span>\n </span>\n <span className=\"mt-1 block truncate text-sm\">{item.title}</span>\n <span className=\"mt-1 block text-xs text-muted-foreground\">\n {statusLabel(item.status)}\n </span>\n </span>\n </button>\n );\n })}\n {nextCursor && (\n <button\n type=\"button\"\n className=\"w-full px-3 py-3 text-sm text-muted-foreground hover:bg-input\"\n onClick={() => void load(nextCursor)}\n disabled={loading}\n >\n {loading ? \"Loading\" : \"Load more\"}\n </button>\n )}\n </div>\n </aside>\n {selectedItem ? (\n <InboxDetail\n item={selectedItem}\n adapter={inboxAdapter}\n onUpdated={updateSelectedItem}\n onDeleted={deleteItem}\n onSessionSelect={onSessionSelect}\n />\n ) : (\n <main className=\"flex min-w-0 flex-1 items-center justify-center px-4 text-sm text-muted-foreground\">\n Select an item\n </main>\n )}\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n\nimport { useEffect, useState } from \"react\";\nimport type { AgentChatAdapter, AgentChatInboxEventStream } from \"../../types\";\n\nexport interface InboxUnreadCountState {\n unreadCount: number;\n hasLoaded: boolean;\n error: string | null;\n}\n\nexport function useInboxUnreadCount(\n adapter: AgentChatAdapter,\n): InboxUnreadCountState {\n const [unreadCount, setUnreadCount] = useState(0);\n const [hasLoaded, setHasLoaded] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n let stream: AgentChatInboxEventStream | null = null;\n\n if (!adapter.listInbox || !adapter.openInboxStream) {\n setError(\"Inbox is not supported by this adapter.\");\n setHasLoaded(true);\n return () => {\n cancelled = true;\n };\n }\n\n adapter\n .listInbox({ status: \"pending\", limit: 200 })\n .then((response) => {\n if (cancelled) return;\n setUnreadCount(response.items.filter((item) => !item.readAt).length);\n setHasLoaded(true);\n })\n .catch((err) => {\n if (cancelled) return;\n setError(err instanceof Error ? err.message : \"Failed to load inbox\");\n setHasLoaded(true);\n });\n\n try {\n stream = adapter.openInboxStream();\n stream.addEventListener(\"snapshot\", (event) => {\n if (cancelled) return;\n const payload = JSON.parse(event.data) as { unread_ids?: unknown };\n const ids = Array.isArray(payload.unread_ids) ? payload.unread_ids : [];\n setUnreadCount(ids.length);\n setHasLoaded(true);\n });\n stream.addEventListener(\"item\", () => {\n if (cancelled) return;\n setUnreadCount((count) => count + 1);\n setHasLoaded(true);\n });\n stream.onerror = () => {\n if (!cancelled) setError(\"Inbox stream disconnected.\");\n };\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to open inbox stream\");\n }\n\n return () => {\n cancelled = true;\n stream?.close();\n };\n }, [adapter]);\n\n return { unreadCount, hasLoaded, error };\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Card({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\n \"group/card flex flex-col gap-8 overflow-hidden bg-card py-8 text-sm text-card-foreground shadow-sm ring-1 ring-foreground/5 has-[>img:first-child]:pt-0 data-[size=sm]:gap-5 data-[size=sm]:py-5 *:[img:first-child]:rounded-none *:[img:last-child]:rounded-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"group/card-header @container/card-header grid auto-rows-min items-start gap-1.5 rounded-none px-8 group-data-[size=sm]/card:px-5 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-8 group-data-[size=sm]/card:[.border-b]:pb-5\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\n \"font-heading text-lg font-semibold tracking-wider uppercase\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm leading-relaxed text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-8 group-data-[size=sm]/card:px-5\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center px-8 group-data-[size=sm]/card:px-5 [.border-t]:pt-8 group-data-[size=sm]/card:[.border-t]:pt-5\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Pure derivers for the mission dashboard. Extracted so the logic can\n// be unit-tested without rendering React and shared across host apps.\nimport type {\n AgentChatMissionStatus,\n AgentChatMissionTask,\n AgentChatMissionWorker,\n} from \"../../types\";\n\n\n/** Mission statuses that are still actively producing events. */\nexport const ACTIVE_MISSION_STATUSES: ReadonlySet<AgentChatMissionStatus> =\n new Set([\"active\", \"paused\"]);\n\n\n/** Mission statuses past which no further work happens. */\nexport function isTerminalMissionStatus(\n status: AgentChatMissionStatus,\n): boolean {\n return !ACTIVE_MISSION_STATUSES.has(status);\n}\n\n\n/** Bucket label for grouping tasks in the dashboard. */\nexport type MissionTaskBucket =\n | \"in_flight\"\n | \"done\"\n | \"blocked\"\n | \"failed_or_cancelled\";\n\n\nexport function missionTaskBucket(status: string): MissionTaskBucket {\n if (status === \"done\") return \"done\";\n if (status === \"blocked\") return \"blocked\";\n if (status === \"failed\" || status === \"cancelled\") {\n return \"failed_or_cancelled\";\n }\n return \"in_flight\";\n}\n\n\nexport function groupMissionTasksByBucket(\n tasks: AgentChatMissionTask[],\n): Record<MissionTaskBucket, AgentChatMissionTask[]> {\n const buckets: Record<MissionTaskBucket, AgentChatMissionTask[]> = {\n in_flight: [],\n done: [],\n blocked: [],\n failed_or_cancelled: [],\n };\n for (const t of tasks) {\n buckets[missionTaskBucket(t.status)].push(t);\n }\n return buckets;\n}\n\n\n/**\n * Derive a human-friendly activity label for a worker row. The server\n * exposes raw event metadata; the client picks the most informative\n * signal in this order: a recent tool.call summary, a recent\n * llm.response, else the worker's session status.\n */\nexport function deriveMissionWorkerActivityLabel(\n worker: AgentChatMissionWorker,\n): string {\n const kind = worker.latestEventKind;\n if (kind === \"tool.call\" && worker.latestEventSummary) {\n return `tool: ${truncate(worker.latestEventSummary, 80)}`;\n }\n if (kind === \"llm.response\") {\n return \"thinking\";\n }\n if (kind === \"tool.result\") {\n return \"received tool result\";\n }\n if (kind && worker.latestEventSummary) {\n return `${kind}: ${truncate(worker.latestEventSummary, 60)}`;\n }\n return worker.sessionStatus || \"active\";\n}\n\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return `${s.slice(0, max - 1)}…`;\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// MissionDashboard — host-agnostic component that renders the full\n// mission state: header (status + iteration + last verdict), task DAG,\n// live workers, and the controls (pause/resume/cancel-with-cascade).\n//\n// Hosts wrap this in their own page shell (sidebar, layout, route\n// title). The dashboard owns its data layer: polls the adapter every\n// 5s while active/paused, stops on terminal status.\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Ban,\n Loader2,\n Pause,\n Play,\n RefreshCw,\n AlertCircle,\n} from \"lucide-react\";\n\nimport { Badge } from \"../ui/badge\";\nimport { Button } from \"../ui/button\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"../ui/card\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\";\nimport { Separator } from \"../ui/separator\";\n\nimport type {\n AgentChatAdapter,\n AgentChatMissionSummary,\n AgentChatMissionTask,\n AgentChatMissionWorker,\n} from \"../../types\";\n\nimport {\n ACTIVE_MISSION_STATUSES,\n deriveMissionWorkerActivityLabel,\n groupMissionTasksByBucket,\n isTerminalMissionStatus,\n} from \"./mission-derive\";\n\n\nconst DEFAULT_POLL_INTERVAL_MS = 5_000;\n\n\nexport interface MissionDashboardProps {\n adapter: AgentChatAdapter;\n missionId: string;\n /** Override the 5s default while testing or in lower-traffic embeddings. */\n pollIntervalMs?: number;\n /** Optional click handler for the \"Back\" button shown on terminal missions. */\n onNavigateBack?: () => void;\n /** Optional click handler for a worker row's transcript link.\n * When unset, the dashboard renders the raw URL the server provided as\n * an `<a target=\"_blank\">` link — appropriate for hosts that haven't\n * registered an in-app session view. */\n onOpenTranscript?: (workerSessionId: string) => void;\n}\n\n\ntype DashboardState = {\n mission: AgentChatMissionSummary | null;\n tasks: AgentChatMissionTask[];\n workers: AgentChatMissionWorker[];\n loading: boolean;\n error: string | null;\n};\n\n\nconst INITIAL_STATE: DashboardState = {\n mission: null,\n tasks: [],\n workers: [],\n loading: true,\n error: null,\n};\n\n\n/** Bind the adapter's optional mission methods so the dashboard can fail\n * loud at mount time rather than late at click time with a cryptic\n * \"undefined is not a function\". */\nfunction requireMissionApi(adapter: AgentChatAdapter) {\n const required = {\n getMission: adapter.getMission,\n getMissionTasks: adapter.getMissionTasks,\n getMissionWorkers: adapter.getMissionWorkers,\n pauseMission: adapter.pauseMission,\n resumeMission: adapter.resumeMission,\n cancelMission: adapter.cancelMission,\n };\n for (const [name, fn] of Object.entries(required)) {\n if (typeof fn !== \"function\") {\n throw new Error(\n `MissionDashboard requires adapter.${name} to be implemented; this adapter is missing the mission surface.`,\n );\n }\n }\n return required as {\n getMission: NonNullable<AgentChatAdapter[\"getMission\"]>;\n getMissionTasks: NonNullable<AgentChatAdapter[\"getMissionTasks\"]>;\n getMissionWorkers: NonNullable<AgentChatAdapter[\"getMissionWorkers\"]>;\n pauseMission: NonNullable<AgentChatAdapter[\"pauseMission\"]>;\n resumeMission: NonNullable<AgentChatAdapter[\"resumeMission\"]>;\n cancelMission: NonNullable<AgentChatAdapter[\"cancelMission\"]>;\n };\n}\n\n\nexport function MissionDashboard({\n adapter,\n missionId,\n pollIntervalMs = DEFAULT_POLL_INTERVAL_MS,\n onNavigateBack,\n onOpenTranscript,\n}: MissionDashboardProps) {\n const api = useMemo(() => requireMissionApi(adapter), [adapter]);\n\n const [state, setState] = useState<DashboardState>(INITIAL_STATE);\n const [cancelOpen, setCancelOpen] = useState(false);\n const [cancelCascade, setCancelCascade] = useState(false);\n const [busy, setBusy] = useState(false);\n const isMounted = useRef(true);\n\n useEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n }, []);\n\n const refresh = useCallback(async () => {\n try {\n const [mission, tasksResp, workersResp] = await Promise.all([\n api.getMission({ missionId }),\n api.getMissionTasks({ missionId }),\n api.getMissionWorkers({ missionId }),\n ]);\n if (!isMounted.current) return;\n setState({\n mission,\n tasks: tasksResp.tasks,\n workers: workersResp.workers,\n loading: false,\n error: null,\n });\n } catch (err) {\n if (!isMounted.current) return;\n setState((prev) => ({\n ...prev,\n loading: false,\n error: err instanceof Error ? err.message : String(err),\n }));\n }\n }, [api, missionId]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n // 5s polling — stops on terminal status.\n useEffect(() => {\n if (!state.mission) return;\n if (isTerminalMissionStatus(state.mission.status)) return;\n const id = window.setInterval(() => {\n void refresh();\n }, pollIntervalMs);\n return () => {\n window.clearInterval(id);\n };\n }, [refresh, state.mission, pollIntervalMs]);\n\n const taskBuckets = useMemo(\n () => groupMissionTasksByBucket(state.tasks),\n [state.tasks],\n );\n\n const runningWorkerCount = useMemo(\n () => state.workers.filter((w) => w.taskStatus === \"running\").length,\n [state.workers],\n );\n\n if (state.loading && !state.mission) {\n return (\n <div className=\"flex h-full items-center justify-center p-6\">\n <Loader2 className=\"size-5 animate-spin text-foreground/70\" />\n </div>\n );\n }\n\n if (state.error && !state.mission) {\n return (\n <div className=\"p-6 space-y-3\">\n <div className=\"flex items-center gap-2 text-destructive\">\n <AlertCircle className=\"size-4\" />\n Failed to load mission: {state.error}\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n setState(INITIAL_STATE);\n void refresh();\n }}\n >\n <RefreshCw className=\"size-4\" /> Retry\n </Button>\n </div>\n );\n }\n\n const mission = state.mission!;\n\n const doPause = async () => {\n setBusy(true);\n try {\n await api.pauseMission({ missionId });\n await refresh();\n } finally {\n setBusy(false);\n }\n };\n const doResume = async () => {\n setBusy(true);\n try {\n await api.resumeMission({ missionId });\n await refresh();\n } finally {\n setBusy(false);\n }\n };\n const doCancel = async () => {\n setBusy(true);\n try {\n await api.cancelMission({\n missionId,\n cascadeToWorkers: cancelCascade,\n });\n await refresh();\n setCancelOpen(false);\n } finally {\n setBusy(false);\n }\n };\n\n const statusVariant: \"default\" | \"destructive\" | \"secondary\" =\n mission.status === \"satisfied\"\n ? \"default\"\n : mission.status === \"failed\" || mission.status === \"cancelled\"\n ? \"destructive\"\n : \"secondary\";\n\n return (\n <div className=\"flex flex-col gap-6 p-6 max-w-6xl mx-auto\">\n {/* ----- Header ------------------------------------------------ */}\n <Card>\n <CardHeader>\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"space-y-1\">\n <CardTitle className=\"wrap-break-word -uppercase text-sm\">\n {mission.description}\n </CardTitle>\n <CardDescription className=\"wrap-break-word text-foreground/70\">\n Rubric: {mission.rubric}\n </CardDescription>\n <div className=\"flex items-center gap-3 pt-2 text-xs text-foreground/70\">\n <Badge variant={statusVariant} className=\"font-mono text-foreground\">{mission.status}</Badge>\n <span className=\"font-mono text-primary\">\n Iteration {mission.iteration}/{mission.maxIterations}\n </span>\n {mission.lastEvaluationResult ? (\n <span>\n Last verdict:{\" \"}\n <span className=\"font-mono text-primary\">\n {mission.lastEvaluationResult}\n </span>\n </span>\n ) : null}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n {ACTIVE_MISSION_STATUSES.has(mission.status) ? (\n <>\n {mission.status === \"active\" ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={doPause}\n disabled={busy}\n >\n <Pause className=\"size-4\" /> Pause\n </Button>\n ) : (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={doResume}\n disabled={busy}\n >\n <Play className=\"size-4\" /> Resume\n </Button>\n )}\n <Button\n size=\"sm\"\n variant=\"destructive\"\n onClick={() => {\n setCancelCascade(false);\n setCancelOpen(true);\n }}\n disabled={busy}\n >\n <Ban className=\"size-4\" /> Cancel\n </Button>\n </>\n ) : onNavigateBack ? (\n <Button size=\"sm\" variant=\"outline\" onClick={onNavigateBack}>\n Back\n </Button>\n ) : null}\n </div>\n </div>\n </CardHeader>\n {mission.lastEvaluationFeedback ? (\n <CardContent className=\"space-y-2\">\n <div className=\"text-xs font-semibold uppercase tracking-widest text-foreground/70\">\n Evaluator feedback\n </div>\n <p className=\"text-sm whitespace-pre-wrap wrap-break-word\">\n {mission.lastEvaluationFeedback}\n </p>\n {mission.lastEvaluationExplanation ? (\n <p className=\"text-xs text-foreground/70 whitespace-pre-wrap wrap-break-word\">\n {mission.lastEvaluationExplanation}\n </p>\n ) : null}\n </CardContent>\n ) : null}\n </Card>\n\n {/* ----- Tasks -------------------------------------------------- */}\n <Card>\n <CardHeader>\n <CardTitle>Tasks ({state.tasks.length})</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {(\n [\"in_flight\", \"blocked\", \"done\", \"failed_or_cancelled\"] as const\n ).map((bucket) => {\n const rows = taskBuckets[bucket];\n if (rows.length === 0) return null;\n const heading = (\n {\n in_flight: \"In flight\",\n blocked: \"Blocked\",\n done: \"Done\",\n failed_or_cancelled: \"Failed / cancelled\",\n } as const\n )[bucket];\n return (\n <div key={bucket} className=\"space-y-2\">\n <div className=\"text-xs font-semibold uppercase tracking-widest text-foreground/70\">\n {heading} ({rows.length})\n </div>\n <ul className=\"space-y-1.5\">\n {rows.map((task) => (\n <li\n key={task.id}\n className=\"flex items-start justify-between gap-3 rounded border border-border/40 px-3 py-2 text-sm\"\n >\n <div className=\"min-w-0 flex-1 space-y-1\">\n <div className=\"flex items-center gap-2\">\n {task.agentDefName ? (\n <span className=\"text-xs text-foreground/70\">\n {task.agentDefName}\n </span>\n ) : null}\n {task.attemptCount > 1 ? (\n <span className=\"text-xs text-foreground/70\">\n attempt {task.attemptCount}/{task.maxAttempts}\n </span>\n ) : null}\n </div>\n <div className=\"text-sm wrap-break-word\">\n {task.goal}\n </div>\n {task.parentIds.length > 0 ? (\n <div className=\"text-xs text-foreground/70\">\n after:{\" \"}\n {task.parentIds\n .map((p) => p.slice(0, 8))\n .join(\", \")}\n </div>\n ) : null}\n {task.result ? (\n <pre className=\"text-xs whitespace-pre-wrap bg-muted/30 rounded px-2 py-1 max-h-32 overflow-auto\">\n {task.result}\n </pre>\n ) : null}\n {task.resultMetadata ? (\n <pre className=\"text-xs whitespace-pre-wrap bg-muted/30 rounded px-2 py-1 max-h-32 overflow-auto\">\n {JSON.stringify(task.resultMetadata, null, 2)}\n </pre>\n ) : null}\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n })}\n {state.tasks.length === 0 ? (\n <div className=\"text-sm text-foreground/70\">\n No tasks spawned yet.\n </div>\n ) : null}\n </CardContent>\n </Card>\n\n {/* ----- Live workers ------------------------------------------ */}\n <Card>\n <CardHeader>\n <CardTitle>Live workers ({state.workers.length})</CardTitle>\n </CardHeader>\n <CardContent>\n {state.workers.length === 0 ? (\n <div className=\"text-sm text-foreground/70\">\n No workers attached to this mission right now.\n </div>\n ) : (\n <ul className=\"space-y-1.5\">\n {state.workers.map((w) => {\n const onTranscriptClick = (\n e: React.MouseEvent<HTMLAnchorElement>,\n ) => {\n if (onOpenTranscript) {\n e.preventDefault();\n onOpenTranscript(w.workerSessionId);\n }\n };\n return (\n <li\n key={w.workerSessionId}\n className=\"flex items-start justify-between gap-3 rounded border border-border/40 px-3 py-2 text-sm\"\n >\n <div className=\"min-w-0 flex-1 space-y-1\">\n <div className=\"flex items-center gap-2\">\n <Badge className=\"text-foreground/70\">{w.taskStatus}</Badge>\n {w.agentDefName ? (\n <span className=\"text-xs text-foreground/70\">\n {w.agentDefName}\n </span>\n ) : null}\n </div>\n <div className=\"text-sm wrap-break-word\">\n {deriveMissionWorkerActivityLabel(w)}\n </div>\n {w.latestEventAt ? (\n <div className=\"text-xs text-foreground/70\">\n {new Date(w.latestEventAt).toLocaleTimeString()}\n </div>\n ) : null}\n </div>\n <a\n href={w.transcriptUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n onClick={onTranscriptClick}\n className=\"text-xs text-primary hover:underline self-start\"\n >\n View session\n </a>\n </li>\n );\n })}\n </ul>\n )}\n </CardContent>\n </Card>\n\n <Separator />\n <div className=\"flex justify-between items-center text-xs text-foreground/70\">\n <span>\n Auto-refresh every {pollIntervalMs / 1000}s while mission is active.\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n void refresh();\n }}\n disabled={busy}\n >\n <RefreshCw className=\"size-4\" /> Refresh\n </Button>\n </div>\n\n {/* ----- Cancel confirm dialog --------------------------------- */}\n <Dialog\n open={cancelOpen}\n onOpenChange={(open) => {\n if (!open && !busy) setCancelOpen(false);\n }}\n >\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Cancel mission?</DialogTitle>\n <DialogDescription>\n This terminates the mission and clears its evaluator loop.\n </DialogDescription>\n </DialogHeader>\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={cancelCascade}\n onChange={(e) => setCancelCascade(e.target.checked)}\n />\n <span>\n Also cancel <strong>{runningWorkerCount}</strong> running worker\n {runningWorkerCount === 1 ? \"\" : \"s\"} (sends an interrupt to each\n worker session).\n </span>\n </label>\n <DialogFooter>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCancelOpen(false)}\n disabled={busy}\n >\n Keep mission\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={doCancel}\n disabled={busy}\n >\n {busy ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Ban className=\"size-4\" />\n )}\n Cancel mission\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// MissionsPanel — sidebar entry for the user's in-flight missions.\n//\n// Layout/behaviour mirrors ``ScheduledWorkPanel`` so the two sit\n// together in the sidebar with a consistent expand/collapse rhythm.\n// Polls ``adapter.listMissions`` on a 30s cadence; renders one row per\n// active/paused mission with a destination link the host wires to the\n// mission dashboard route.\nimport {\n type KeyboardEvent,\n type MouseEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport {\n Ban,\n ChevronDownIcon,\n ChevronRightIcon,\n Pause,\n Play,\n TargetIcon,\n} from \"lucide-react\";\nimport { Badge } from \"../ui/badge\";\nimport { cn } from \"../../lib/utils\";\nimport type {\n AgentChatAdapter,\n AgentChatMissionSummary,\n} from \"../../types\";\n\n\nexport interface MissionsPanelProps {\n adapter: AgentChatAdapter;\n agentId?: string;\n title?: string;\n /** Comma-separated status filter passed to ``listMissions``. */\n status?: string;\n hideHeader?: boolean;\n pollIntervalMs?: number;\n onMissionSelect?: (missionId: string) => void;\n onMissionPause?: (missionId: string) => void;\n onMissionResume?: (missionId: string) => void;\n onMissionCancel?: (missionId: string) => void;\n}\n\n\nconst DEFAULT_POLL_INTERVAL_MS = 30_000;\nconst DEFAULT_STATUS = \"active,paused\";\n\n\nfunction fingerprint(items: AgentChatMissionSummary[]): string {\n return items\n .map(\n (m) =>\n `${m.id}:${m.status}:${m.iteration}:${m.lastEvaluationResult ?? \"\"}:` +\n `${m.lastEvaluationAt ?? \"\"}:${m.pausedReason ?? \"\"}:${m.updatedAt}`,\n )\n .join(\"|\");\n}\n\n\nfunction sortMissions(\n items: AgentChatMissionSummary[],\n): AgentChatMissionSummary[] {\n return [...items].sort((a, b) => {\n // Active first, then paused, then everything else (terminal rows\n // shouldn't normally appear here but we don't drop them silently).\n const rank = (s: string) =>\n s === \"active\" ? 0 : s === \"paused\" ? 1 : 2;\n const diff = rank(a.status) - rank(b.status);\n if (diff !== 0) return diff;\n return (a.updatedAt ?? \"\") > (b.updatedAt ?? \"\") ? -1 : 1;\n });\n}\n\n\nfunction MissionRow({\n mission,\n onOpen,\n onPause,\n onResume,\n onCancel,\n busy,\n canMutate,\n}: {\n mission: AgentChatMissionSummary;\n onOpen: (id: string) => void;\n onPause: (id: string) => void;\n onResume: (id: string) => void;\n onCancel: (id: string) => void;\n busy: boolean;\n canMutate: {\n pause: boolean;\n resume: boolean;\n cancel: boolean;\n };\n}) {\n const isActive = mission.status === \"active\";\n const isPaused = mission.status === \"paused\";\n const description = mission.description.trim() || \"(no description)\";\n const verdict = mission.lastEvaluationResult;\n const verdictAt = mission.lastEvaluationAt\n ? formatDistanceToNow(new Date(mission.lastEvaluationAt), {\n addSuffix: true,\n })\n : null;\n const meta = [\n `Iter ${mission.iteration}/${mission.maxIterations}`,\n verdict ? `Verdict: ${verdict}${verdictAt ? ` (${verdictAt})` : \"\"}` : null,\n isPaused && mission.pausedReason\n ? `Paused: ${mission.pausedReason}`\n : null,\n ].filter(Boolean) as string[];\n\n const stopActionClick = (e: MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n };\n const openMission = () => onOpen(mission.id);\n const handleRowKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key !== \"Enter\" && e.key !== \" \") return;\n e.preventDefault();\n openMission();\n };\n\n return (\n <div\n className={cn(\n \"group flex min-w-0 items-start gap-2 border-l-2 border-l-transparent px-3 py-2 text-sm transition-colors cursor-pointer hover:border-l-primary hover:bg-input\",\n )}\n onClick={openMission}\n onKeyDown={handleRowKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-label={`Open mission ${description}`}\n title=\"Open mission dashboard\"\n >\n <div className=\"mt-0.5 flex size-5 shrink-0 items-center justify-center text-faint\">\n <TargetIcon className=\"size-3.5\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-foreground\">{description}</div>\n <div className=\"mt-0.5 flex min-w-0 items-center gap-2\">\n <Badge\n variant={isActive ? \"default\" : \"secondary\"}\n className=\"shrink-0\"\n >\n {mission.status}\n </Badge>\n </div>\n {meta.length > 0 && (\n <div className=\"mt-0.5 space-y-0.5 text-xs text-faint\">\n {meta.map((line) => (\n <div key={line} className=\"truncate\">\n {line}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {isActive && canMutate.pause && (\n <button\n type=\"button\"\n className=\"rounded p-1 text-faint opacity-70 transition-all hover:bg-line hover:text-foreground disabled:pointer-events-none disabled:opacity-40 group-hover:opacity-100\"\n onClick={(e) => {\n stopActionClick(e);\n onPause(mission.id);\n }}\n aria-label=\"Pause mission\"\n title=\"Pause mission\"\n disabled={busy}\n >\n <Pause className=\"size-3.5\" />\n </button>\n )}\n {isPaused && canMutate.resume && (\n <button\n type=\"button\"\n className=\"rounded p-1 text-faint opacity-70 transition-all hover:bg-line hover:text-foreground disabled:pointer-events-none disabled:opacity-40 group-hover:opacity-100\"\n onClick={(e) => {\n stopActionClick(e);\n onResume(mission.id);\n }}\n aria-label=\"Resume mission\"\n title=\"Resume mission\"\n disabled={busy}\n >\n <Play className=\"size-3.5\" />\n </button>\n )}\n {(isActive || isPaused) && canMutate.cancel && (\n <button\n type=\"button\"\n className=\"rounded p-1 text-faint opacity-70 transition-all hover:bg-destructive/10 hover:text-destructive disabled:pointer-events-none disabled:opacity-40 group-hover:opacity-100\"\n onClick={(e) => {\n stopActionClick(e);\n onCancel(mission.id);\n }}\n aria-label=\"Cancel mission\"\n title=\"Cancel mission\"\n disabled={busy}\n >\n <Ban className=\"size-3.5\" />\n </button>\n )}\n </div>\n </div>\n );\n}\n\n\nexport function MissionsPanel({\n adapter,\n agentId,\n title = \"Missions\",\n status = DEFAULT_STATUS,\n hideHeader = false,\n pollIntervalMs = DEFAULT_POLL_INTERVAL_MS,\n onMissionSelect,\n onMissionPause,\n onMissionResume,\n onMissionCancel,\n}: MissionsPanelProps) {\n const [items, setItems] = useState<AgentChatMissionSummary[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [hasEverLoaded, setHasEverLoaded] = useState(false);\n const [busyMissionId, setBusyMissionId] = useState<string | null>(null);\n const [collapsed, setCollapsed] = useState(false);\n const mounted = useRef(true);\n const requestId = useRef(0);\n const lastFingerprint = useRef(\"\");\n\n const refetch = useCallback(\n async (opts?: { silent?: boolean }) => {\n if (!adapter.listMissions) {\n setItems([]);\n setHasEverLoaded(true);\n return;\n }\n const currentRequestId = ++requestId.current;\n try {\n const list = await adapter.listMissions({ agentId, status });\n if (!mounted.current || currentRequestId !== requestId.current) return;\n const next = sortMissions(list.missions);\n const fp = fingerprint(next);\n if (fp !== lastFingerprint.current) {\n lastFingerprint.current = fp;\n setItems(next);\n }\n setError(null);\n setHasEverLoaded(true);\n } catch (e) {\n if (!mounted.current || currentRequestId !== requestId.current) return;\n if (!opts?.silent) {\n setError(\n e instanceof Error ? e.message : \"Failed to load missions\",\n );\n setHasEverLoaded(true);\n }\n }\n },\n [adapter, agentId, status],\n );\n\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n useEffect(() => {\n setError(null);\n lastFingerprint.current = \"\";\n void refetch();\n }, [refetch]);\n\n useEffect(() => {\n if (!adapter.listMissions || pollIntervalMs <= 0) return;\n const id = setInterval(() => {\n void refetch({ silent: true });\n }, pollIntervalMs);\n return () => clearInterval(id);\n }, [adapter.listMissions, pollIntervalMs, refetch]);\n\n const activeCount = useMemo(\n () => items.filter((m) => m.status === \"active\").length,\n [items],\n );\n\n const handleOpen = useCallback(\n (missionId: string) => {\n onMissionSelect?.(missionId);\n },\n [onMissionSelect],\n );\n\n const handlePause = useCallback(\n async (missionId: string) => {\n if (!adapter.pauseMission || busyMissionId) return;\n setBusyMissionId(missionId);\n try {\n await adapter.pauseMission({ missionId });\n onMissionPause?.(missionId);\n await refetch({ silent: true });\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to pause mission\");\n } finally {\n if (mounted.current) setBusyMissionId(null);\n }\n },\n [adapter, busyMissionId, onMissionPause, refetch],\n );\n\n const handleResume = useCallback(\n async (missionId: string) => {\n if (!adapter.resumeMission || busyMissionId) return;\n setBusyMissionId(missionId);\n try {\n await adapter.resumeMission({ missionId });\n onMissionResume?.(missionId);\n await refetch({ silent: true });\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to resume mission\");\n } finally {\n if (mounted.current) setBusyMissionId(null);\n }\n },\n [adapter, busyMissionId, onMissionResume, refetch],\n );\n\n const handleCancel = useCallback(\n async (missionId: string) => {\n if (!adapter.cancelMission || busyMissionId) return;\n setBusyMissionId(missionId);\n try {\n await adapter.cancelMission({ missionId });\n setItems((current) => {\n const next = current.filter((m) => m.id !== missionId);\n lastFingerprint.current = fingerprint(next);\n return next;\n });\n onMissionCancel?.(missionId);\n await refetch({ silent: true });\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to cancel mission\");\n } finally {\n if (mounted.current) setBusyMissionId(null);\n }\n },\n [adapter, busyMissionId, onMissionCancel, refetch],\n );\n\n if (!hasEverLoaded) return null;\n if (!adapter.listMissions) return null;\n\n const showBody = hideHeader || !collapsed;\n const canMutate = {\n pause: Boolean(adapter.pauseMission),\n resume: Boolean(adapter.resumeMission),\n cancel: Boolean(adapter.cancelMission),\n };\n\n return (\n <section className=\"min-w-0 border-t border-line\">\n {!hideHeader && (\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-1.5 px-3 py-2 text-left text-xs font-semibold uppercase tracking-wide text-foreground transition-colors hover:bg-input\"\n onClick={() => setCollapsed((c) => !c)}\n aria-expanded={!collapsed}\n >\n <TargetIcon className=\"size-3.5\" />\n <span className=\"truncate\">{title}</span>\n {activeCount > 0 && (\n <Badge variant=\"default\" className=\"ml-auto\">\n {activeCount}\n </Badge>\n )}\n {collapsed ? (\n <ChevronRightIcon className=\"size-3.5 shrink-0 text-faint\" />\n ) : (\n <ChevronDownIcon className=\"size-3.5 shrink-0 text-faint\" />\n )}\n </button>\n )}\n {showBody && error && (\n <div className=\"px-3 py-2 text-xs text-destructive\">{error}</div>\n )}\n {showBody && !error && items.length === 0 && (\n <div className=\"px-3 py-2 text-xs text-faint\">No missions</div>\n )}\n {showBody && !error && items.length > 0 && (\n <div className={cn(\"pb-2\", hideHeader && \"pt-1\")}>\n {items.map((mission) => (\n <MissionRow\n key={mission.id}\n mission={mission}\n busy={busyMissionId === mission.id}\n canMutate={canMutate}\n onOpen={handleOpen}\n onPause={handlePause}\n onResume={handleResume}\n onCancel={handleCancel}\n />\n ))}\n </div>\n )}\n </section>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n\nimport {\n type KeyboardEvent,\n type MouseEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport {\n CalendarClockIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n Trash2Icon,\n} from \"lucide-react\";\nimport { Badge } from \"../ui/badge\";\nimport { cn } from \"../../lib/utils\";\nimport type {\n AgentChatAdapter,\n AgentChatScheduledWorkItem,\n} from \"../../types\";\n\nexport interface ScheduledWorkPanelProps {\n adapter: AgentChatAdapter;\n agentId?: string;\n title?: string;\n limit?: number;\n status?: string;\n hideHeader?: boolean;\n pollIntervalMs?: number;\n onSessionSelect?: (sessionId: string) => void;\n onScheduleCancel?: (scheduleId: string) => void;\n onScheduleRunNow?: (scheduleId: string, sessionId?: string) => void;\n}\n\nconst DEFAULT_LIMIT = 50;\nconst DEFAULT_POLL_INTERVAL_MS = 30000;\n\nfunction fingerprint(items: AgentChatScheduledWorkItem[]): string {\n return items\n .map(\n (item) =>\n `${item.id}:${item.status}:${item.kind ?? \"\"}:${item.name ?? \"\"}:${\n item.prompt\n }:${item.scheduleDisplay}:${item.runCount}:${item.nextRunAt ?? \"\"}:${\n item.lastRunAt ?? \"\"\n }:${item.lastSessionId ?? \"\"}:${item.lastError ?? \"\"}:${\n item.updatedAt\n }`,\n )\n .join(\"|\");\n}\n\nfunction formatKind(value: string | null | undefined): string {\n if (value === \"dynamic_loop\") return \"Dynamic loop\";\n if (value === \"cron\") return \"Cron\";\n if (value === \"one_shot\") return \"One-shot\";\n if (value === \"scheduled\") return \"Scheduled\";\n if (!value) return \"Scheduled\";\n return value\n .split(/[_-]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nfunction formatRelative(\n value: string | null | undefined,\n label: string,\n future = false,\n): string | null {\n if (!value) return null;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n if (future && date.getTime() <= Date.now()) return `${label} due now`;\n return `${label} ${formatDistanceToNow(date, { addSuffix: true })}`;\n}\n\nfunction formatRuns(count: number): string {\n return `${count} ${count === 1 ? \"run\" : \"runs\"}`;\n}\n\nfunction scheduleTitle(item: AgentChatScheduledWorkItem): string {\n const title = item.name?.trim();\n if (title) return title;\n return item.prompt;\n}\n\nfunction canRunScheduleNow(item: AgentChatScheduledWorkItem): boolean {\n return item.repeatLimit === 1;\n}\n\nfunction scheduleDisplay(item: AgentChatScheduledWorkItem): string | null {\n if (item.kind === \"dynamic_loop\") return null;\n return item.scheduleDisplay;\n}\n\nfunction sortScheduledWork(\n items: AgentChatScheduledWorkItem[],\n): AgentChatScheduledWorkItem[] {\n return [...items].sort((a, b) => {\n if (a.status === \"active\" && b.status !== \"active\") return -1;\n if (a.status !== \"active\" && b.status === \"active\") return 1;\n const aNext = a.nextRunAt ?? \"\";\n const bNext = b.nextRunAt ?? \"\";\n if (aNext && bNext && aNext !== bNext) return aNext < bNext ? -1 : 1;\n if (aNext && !bNext) return -1;\n if (!aNext && bNext) return 1;\n return (a.updatedAt ?? \"\") > (b.updatedAt ?? \"\") ? -1 : 1;\n });\n}\n\nfunction ScheduledWorkRow({\n item,\n canRunNow,\n canCancel,\n actionScheduleId,\n onOpenLastRun,\n onRunNow,\n onCancel,\n}: {\n item: AgentChatScheduledWorkItem;\n canRunNow: boolean;\n canCancel: boolean;\n actionScheduleId: string | null;\n onOpenLastRun: (sessionId: string) => void;\n onRunNow: (scheduleId: string) => void;\n onCancel: (scheduleId: string) => void;\n}) {\n const isActive = item.status === \"active\";\n const disabled = actionScheduleId === item.id;\n const title = scheduleTitle(item);\n const statusText = item.status === \"active\" ? null : item.status;\n const showRunNow = canRunNow && isActive && canRunScheduleNow(item);\n const lastSessionId = item.lastSessionId ?? null;\n const meta = [\n scheduleDisplay(item),\n formatRelative(item.nextRunAt, \"Next\", true),\n formatRelative(item.lastRunAt, \"Last\"),\n formatRuns(item.runCount),\n item.expiresAt ? formatRelative(item.expiresAt, \"Expires\", true) : null,\n ].filter(Boolean);\n const openLastRun = () => {\n if (lastSessionId) onOpenLastRun(lastSessionId);\n };\n const handleRowKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (!lastSessionId) return;\n if (e.key !== \"Enter\" && e.key !== \" \") return;\n e.preventDefault();\n openLastRun();\n };\n const stopActionClick = (e: MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n };\n\n return (\n <div\n className={cn(\n \"group flex min-w-0 items-start gap-2 border-l-2 border-l-transparent px-3 py-2 text-sm transition-colors hover:border-l-primary hover:bg-input\",\n lastSessionId && \"cursor-pointer\",\n )}\n onClick={openLastRun}\n onKeyDown={handleRowKeyDown}\n role={lastSessionId ? \"button\" : undefined}\n tabIndex={lastSessionId ? 0 : undefined}\n aria-label={lastSessionId ? `Open last run for ${title}` : undefined}\n title={lastSessionId ? \"Open last run\" : undefined}\n >\n <div className=\"mt-0.5 flex size-5 shrink-0 items-center justify-center text-faint\">\n <CalendarClockIcon className=\"size-3.5\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-foreground\">{title}</div>\n <div className=\"mt-0.5 flex min-w-0 items-center gap-2\">\n <Badge variant=\"secondary\" className=\"shrink-0\">\n {formatKind(item.kind)}\n </Badge>\n </div>\n {meta.length > 0 && (\n <div className=\"mt-0.5 space-y-0.5 text-xs text-faint\">\n {meta.map((line) => (\n <div key={line} className=\"truncate\">\n {line}\n </div>\n ))}\n </div>\n )}\n </div>\n {statusText && (\n <Badge variant=\"destructive\" className=\"shrink-0\">\n {statusText}\n </Badge>\n )}\n </div>\n {item.lastError && (\n <div className=\"mt-1 line-clamp-2 text-xs text-destructive\">\n {item.lastError}\n </div>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {showRunNow && (\n <button\n type=\"button\"\n className=\"rounded p-1 text-faint opacity-70 transition-all hover:bg-line hover:text-foreground disabled:pointer-events-none disabled:opacity-40 group-hover:opacity-100\"\n onClick={(e) => {\n stopActionClick(e);\n onRunNow(item.id);\n }}\n aria-label=\"Run schedule now\"\n title=\"Run schedule now\"\n disabled={disabled}\n >\n <CalendarClockIcon className=\"size-3.5\" />\n </button>\n )}\n {canCancel && isActive && (\n <button\n type=\"button\"\n className=\"rounded p-1 text-faint opacity-70 transition-all hover:bg-destructive/10 hover:text-destructive disabled:pointer-events-none disabled:opacity-40 group-hover:opacity-100\"\n onClick={(e) => {\n stopActionClick(e);\n onCancel(item.id);\n }}\n aria-label=\"Cancel schedule\"\n title=\"Cancel schedule\"\n disabled={disabled}\n >\n <Trash2Icon className=\"size-3.5\" />\n </button>\n )}\n </div>\n </div>\n );\n}\n\nexport function ScheduledWorkPanel({\n adapter,\n agentId,\n title = \"Scheduled Work\",\n limit = DEFAULT_LIMIT,\n status = \"active\",\n hideHeader = false,\n pollIntervalMs = DEFAULT_POLL_INTERVAL_MS,\n onSessionSelect,\n onScheduleCancel,\n onScheduleRunNow,\n}: ScheduledWorkPanelProps) {\n const [items, setItems] = useState<AgentChatScheduledWorkItem[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [hasEverLoaded, setHasEverLoaded] = useState(false);\n const [actionScheduleId, setActionScheduleId] = useState<string | null>(null);\n const [collapsed, setCollapsed] = useState(false);\n const mounted = useRef(true);\n const requestId = useRef(0);\n const lastFingerprint = useRef(\"\");\n\n const refetch = useCallback(\n async (opts?: { silent?: boolean }) => {\n if (!adapter.listScheduledWork) {\n setItems([]);\n setHasEverLoaded(true);\n return;\n }\n const currentRequestId = ++requestId.current;\n try {\n const list = await adapter.listScheduledWork({\n agentId,\n status,\n limit,\n });\n if (!mounted.current || currentRequestId !== requestId.current) return;\n const nextItems = sortScheduledWork(list.items);\n const fp = fingerprint(nextItems);\n if (fp !== lastFingerprint.current) {\n lastFingerprint.current = fp;\n setItems(nextItems);\n }\n setError(null);\n setHasEverLoaded(true);\n } catch (e) {\n if (!mounted.current || currentRequestId !== requestId.current) return;\n if (!opts?.silent) {\n setError(\n e instanceof Error ? e.message : \"Failed to load scheduled work\",\n );\n setHasEverLoaded(true);\n }\n }\n },\n [adapter, agentId, limit, status],\n );\n\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n useEffect(() => {\n setError(null);\n lastFingerprint.current = \"\";\n void refetch();\n }, [refetch]);\n\n useEffect(() => {\n if (!adapter.listScheduledWork || pollIntervalMs <= 0) return;\n const id = setInterval(() => {\n void refetch({ silent: true });\n }, pollIntervalMs);\n return () => clearInterval(id);\n }, [adapter.listScheduledWork, pollIntervalMs, refetch]);\n\n const activeCount = useMemo(\n () => items.filter((item) => item.status === \"active\").length,\n [items],\n );\n\n const handleOpenLastRun = useCallback(\n (sessionId: string) => {\n onSessionSelect?.(sessionId);\n },\n [onSessionSelect],\n );\n\n const handleRunNow = useCallback(\n async (scheduleId: string) => {\n if (!adapter.runScheduledWorkNow || actionScheduleId) return;\n setActionScheduleId(scheduleId);\n try {\n const result = await adapter.runScheduledWorkNow({ scheduleId });\n onScheduleRunNow?.(scheduleId, result?.sessionId);\n await refetch({ silent: true });\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to run schedule\");\n } finally {\n if (mounted.current) setActionScheduleId(null);\n }\n },\n [actionScheduleId, adapter, onScheduleRunNow, refetch],\n );\n\n const handleCancel = useCallback(\n async (scheduleId: string) => {\n if (!adapter.cancelScheduledWork || actionScheduleId) return;\n setActionScheduleId(scheduleId);\n try {\n await adapter.cancelScheduledWork({ scheduleId });\n setItems((current) => {\n const next = current.filter((item) => item.id !== scheduleId);\n lastFingerprint.current = fingerprint(next);\n return next;\n });\n onScheduleCancel?.(scheduleId);\n await refetch({ silent: true });\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to cancel schedule\");\n } finally {\n if (mounted.current) setActionScheduleId(null);\n }\n },\n [actionScheduleId, adapter, onScheduleCancel, refetch],\n );\n\n if (!hasEverLoaded) return null;\n if (!adapter.listScheduledWork) return null;\n\n const showBody = hideHeader || !collapsed;\n\n return (\n <section className=\"min-w-0 border-t border-line\">\n {!hideHeader && (\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-1.5 px-3 py-2 text-left text-xs font-semibold uppercase tracking-wide text-foreground transition-colors hover:bg-input\"\n onClick={() => setCollapsed((current) => !current)}\n aria-expanded={!collapsed}\n >\n <CalendarClockIcon className=\"size-3.5\" />\n <span className=\"truncate\">{title}</span>\n {activeCount > 0 && (\n <Badge variant=\"default\" className=\"ml-auto\">\n {activeCount}\n </Badge>\n )}\n {collapsed ? (\n <ChevronRightIcon className=\"size-3.5 shrink-0 text-faint\" />\n ) : (\n <ChevronDownIcon className=\"size-3.5 shrink-0 text-faint\" />\n )}\n </button>\n )}\n {showBody && error && (\n <div className=\"px-3 py-2 text-xs text-destructive\">{error}</div>\n )}\n {showBody && !error && items.length === 0 && (\n <div className=\"px-3 py-2 text-xs text-faint\">No scheduled work</div>\n )}\n {showBody && !error && items.length > 0 && (\n <div className={cn(\"pb-2\", hideHeader && \"pt-1\")}>\n {items.map((item) => (\n <ScheduledWorkRow\n key={item.id}\n item={item}\n canRunNow={Boolean(adapter.runScheduledWorkNow)}\n canCancel={Boolean(adapter.cancelScheduledWork)}\n actionScheduleId={actionScheduleId}\n onOpenLastRun={handleOpenLastRun}\n onRunNow={handleRunNow}\n onCancel={handleCancel}\n />\n ))}\n </div>\n )}\n </section>\n );\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// \"Running\" panel -- live view of the current session's sub-agents and\n// delegation children. Loads `/v1/sessions/{id}/tree`, polls on a\n// cadence that adapts to whether any child is still running, and lets\n// the user open or stop each child.\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport {\n ChevronDownIcon,\n ChevronRightIcon,\n Loader2Icon,\n SquareIcon,\n Trash2Icon,\n UsersIcon,\n} from \"lucide-react\";\nimport { Badge } from \"../ui/badge\";\nimport { cn } from \"../../lib/utils\";\nimport type {\n AgentChatAdapter,\n AgentChatSession,\n AgentChatSessionTreeNode,\n} from \"../../types\";\n\nexport interface SessionTreePanelProps {\n adapter: AgentChatAdapter;\n sessionId?: string | null;\n activeSessionId?: string;\n agentId?: string;\n title?: string;\n sessionListLimit?: number;\n /** Treat the root as hidden, so its children appear as top-level rows. */\n hideRoot?: boolean;\n /** Suppress the header row (icon + title + running count badge). */\n hideHeader?: boolean;\n /**\n * Fetch the tenant's full session list via ``adapter.listSessions`` and\n * merge it with the per-session tree. Off by default; the panel renders\n * only the tree of ``sessionId`` unless this is set.\n */\n loadList?: boolean;\n onSessionSelect?: (sessionId: string) => void;\n onSessionDelete?: (sessionId: string) => void;\n}\n\ninterface TreeEntry extends AgentChatSessionTreeNode {\n children: TreeEntry[];\n}\n\n// Poll cadence: tight while any sub-agent is still running, relaxed\n// when every child has settled. The idle cadence still exists so\n// newly-spawned children surface without a page reload, but without\n// charging the user 15 req/min for a frozen tree.\nconst POLL_INTERVAL_ACTIVE_MS = 4000;\nconst POLL_INTERVAL_IDLE_MS = 30000;\nconst DEFAULT_SESSION_LIST_LIMIT = 50;\n\nfunction buildTree(nodes: AgentChatSessionTreeNode[]): TreeEntry[] {\n const byId = new Map<string, TreeEntry>();\n for (const n of nodes) byId.set(n.id, { ...n, children: [] });\n const roots: TreeEntry[] = [];\n for (const n of byId.values()) {\n const parent = n.parentId ? byId.get(n.parentId) : undefined;\n if (parent) {\n parent.children.push(n);\n } else {\n roots.push(n);\n }\n }\n const sortRec = (e: TreeEntry) => {\n // ISO-8601 timestamps sort lexicographically; plain string compare\n // is ~10x faster than localeCompare and poll frequency keeps this\n // on the hot path for large trees.\n e.children.sort((a, b) => (a.createdAt < b.createdAt ? -1 : 1));\n for (const c of e.children) sortRec(c);\n };\n for (const r of roots) sortRec(r);\n return roots;\n}\n\nfunction treeFingerprint(nodes: AgentChatSessionTreeNode[]): string {\n // Cheap signature: only the fields that affect rendering. If the\n // server returns structurally-identical data, skip the setState and\n // the entire rebuild / re-render cascade.\n return nodes\n .map(\n (n) =>\n `${n.id}:${n.parentId ?? \"\"}:${n.status}:${n.agentType ?? \"\"}:${\n n.runKind ?? \"\"\n }:${n.title ?? \"\"}:${n.messageCount ?? 0}:${n.toolCallCount ?? 0}:${\n n.updatedAt\n }`,\n )\n .join(\"|\");\n}\n\nfunction sessionToTreeNode(session: AgentChatSession): AgentChatSessionTreeNode {\n const timestamp = session.updatedAt ?? session.createdAt ?? \"\";\n return {\n id: session.id,\n parentId: session.parentId ?? null,\n agentId: session.agentId,\n channel: session.channel,\n runKind: session.runKind ?? deriveRunKind(session.channel, session.config),\n status: session.status,\n title: session.title,\n model: session.model,\n messageCount: session.messageCount,\n toolCallCount: session.toolCallCount,\n createdAt: session.createdAt ?? timestamp,\n updatedAt: session.updatedAt ?? timestamp,\n };\n}\n\nfunction mergeNodeFields(\n current: AgentChatSessionTreeNode,\n next: AgentChatSessionTreeNode,\n): AgentChatSessionTreeNode {\n return {\n ...current,\n ...Object.fromEntries(\n Object.entries(next).filter(([, value]) => value !== undefined),\n ),\n messageCount: next.messageCount ?? current.messageCount,\n toolCallCount: next.toolCallCount ?? current.toolCallCount,\n } as AgentChatSessionTreeNode;\n}\n\nfunction mergeTreeNodes(\n groups: AgentChatSessionTreeNode[][],\n): AgentChatSessionTreeNode[] {\n const byId = new Map<string, AgentChatSessionTreeNode>();\n for (const group of groups) {\n for (const node of group) {\n const current = byId.get(node.id);\n byId.set(node.id, current ? mergeNodeFields(current, node) : node);\n }\n }\n return Array.from(byId.values());\n}\n\nfunction pruneDeletedSessionNodes(\n nodes: AgentChatSessionTreeNode[],\n deletedSessionId: string,\n): AgentChatSessionTreeNode[] {\n const deletedIds = new Set([deletedSessionId]);\n let changed = true;\n while (changed) {\n changed = false;\n for (const node of nodes) {\n if (node.parentId && deletedIds.has(node.parentId) && !deletedIds.has(node.id)) {\n deletedIds.add(node.id);\n changed = true;\n }\n }\n }\n return nodes.filter((node) => !deletedIds.has(node.id));\n}\n\nfunction formatSessionTime(value: string): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"\";\n return formatDistanceToNow(date, { addSuffix: true });\n}\n\nfunction deriveRunKind(\n channel: string | null | undefined,\n config: Record<string, unknown> | undefined,\n): string | null {\n if (channel === \"scheduled\" && config?.scheduled_dynamic_loop === true) {\n return \"dynamic_loop\";\n }\n if (channel === \"scheduled\") return \"scheduled\";\n return null;\n}\n\nfunction formatRunKind(value: string | null | undefined): string | null {\n if (value === \"dynamic_loop\") return \"Loop\";\n if (value === \"scheduled\") return \"Scheduled\";\n return null;\n}\n\nfunction fallbackSessionTitle(entry: AgentChatSessionTreeNode): string {\n if (entry.runKind === \"dynamic_loop\") return \"Loop run\";\n if (entry.runKind === \"scheduled\") return \"Scheduled run\";\n return \"New session\";\n}\n\nfunction TreeNodeRow({\n entry,\n depth,\n activeSessionId,\n canStop,\n canDelete,\n deletingSessionId,\n onSelect,\n onStop,\n onDelete,\n}: {\n entry: TreeEntry;\n depth: number;\n activeSessionId: string;\n canStop: boolean;\n canDelete: boolean;\n deletingSessionId: string | null;\n onSelect: (sessionId: string) => void;\n onStop: (sessionId: string) => void;\n onDelete: (sessionId: string) => void;\n}) {\n const [expanded, setExpanded] = useState(true);\n const hasChildren = entry.children.length > 0;\n const isActive = entry.id === activeSessionId;\n const isRunning = entry.status === \"active\";\n // Only child sessions can be stopped from the tree; top-level sessions use\n // the main composer stop control.\n const isChildSession = entry.parentId != null;\n const title = entry.title ?? fallbackSessionTitle(entry);\n const subtitle = [\n formatRunKind(entry.runKind),\n entry.model ?? entry.agentType,\n formatSessionTime(entry.updatedAt),\n ].filter(Boolean).join(\" · \");\n\n return (\n <>\n {/* eslint-disable-next-line jsx-a11y/prefer-tag-over-role --\n The row has nested interactive elements (chevron + stop); a\n button-in-button would be invalid HTML. Match the existing\n pattern from navbar.tsx / skills-page.tsx sidebar rows. */}\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => onSelect(entry.id)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") onSelect(entry.id);\n }}\n className={cn(\n \"group flex items-center gap-2 w-full py-2 pr-2 text-left cursor-pointer transition-colors border-l-2\",\n isActive\n ? \"bg-line text-foreground border-l-primary\"\n : \"bg-transparent text-subtle hover:bg-input hover:text-foreground border-l-transparent\",\n )}\n style={{ paddingLeft: `${depth * 12 + 12}px` }}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n className=\"p-0.5 rounded hover:bg-line shrink-0\"\n onClick={(e) => {\n e.stopPropagation();\n setExpanded(!expanded);\n }}\n aria-label={expanded ? \"Collapse\" : \"Expand\"}\n aria-expanded={expanded}\n >\n {expanded ? (\n <ChevronDownIcon className=\"w-3.5 h-3.5\" />\n ) : (\n <ChevronRightIcon className=\"w-3.5 h-3.5\" />\n )}\n </button>\n ) : (\n <span className=\"w-4 h-4 shrink-0\" />\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm truncate\">{title}</div>\n <div className=\"text-xs text-faint truncate\">{subtitle}</div>\n </div>\n {isRunning && canStop && isChildSession && (\n <button\n type=\"button\"\n className=\"p-1 rounded opacity-0 group-hover:opacity-100 hover:bg-destructive/10 hover:text-destructive transition-all\"\n onClick={(e) => {\n e.stopPropagation();\n onStop(entry.id);\n }}\n aria-label=\"Stop child session\"\n title=\"Stop child session\"\n >\n <SquareIcon className=\"w-3 h-3\" fill=\"currentColor\" />\n </button>\n )}\n {canDelete && (\n <button\n type=\"button\"\n className={cn(\n \"p-1 rounded hover:bg-destructive/10 hover:text-destructive disabled:pointer-events-none transition-all\",\n deletingSessionId === entry.id\n ? \"opacity-100\"\n : \"opacity-0 group-hover:opacity-100 focus-visible:opacity-100\",\n )}\n onClick={(e) => {\n e.stopPropagation();\n onDelete(entry.id);\n }}\n aria-label=\"Delete session\"\n title=\"Delete session\"\n disabled={deletingSessionId === entry.id}\n >\n {deletingSessionId === entry.id ? (\n <Loader2Icon className=\"w-3 h-3 animate-spin\" />\n ) : (\n <Trash2Icon className=\"w-3 h-3\" />\n )}\n </button>\n )}\n </div>\n {hasChildren && expanded &&\n entry.children.map((child) => (\n <TreeNodeRow\n key={child.id}\n entry={child}\n depth={depth + 1}\n activeSessionId={activeSessionId}\n canStop={canStop}\n canDelete={canDelete}\n deletingSessionId={deletingSessionId}\n onSelect={onSelect}\n onStop={onStop}\n onDelete={onDelete}\n />\n ))}\n </>\n );\n}\n\nexport function SessionTreePanel({\n adapter,\n sessionId = null,\n activeSessionId = sessionId ?? undefined,\n agentId,\n title = \"Running\",\n sessionListLimit = DEFAULT_SESSION_LIST_LIMIT,\n hideRoot = false,\n hideHeader = false,\n loadList = false,\n onSessionSelect,\n onSessionDelete,\n}: SessionTreePanelProps) {\n const [nodes, setNodes] = useState<AgentChatSessionTreeNode[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [hasEverLoaded, setHasEverLoaded] = useState(false);\n const [deletingSessionId, setDeletingSessionId] = useState<string | null>(\n null,\n );\n\n // Guard async setters from firing after unmount.\n const mounted = useRef(true);\n // Monotonic fetch id. If a route change or newer poll starts while an\n // older request is in flight, only the newest response may update state.\n const requestId = useRef(0);\n // Previous payload fingerprint -- skip setState when unchanged so we\n // don't rebuild the tree and re-render every row on every poll of a\n // frozen session.\n const lastFingerprint = useRef<string>(\"\");\n const resetContext = useRef<{\n loadList: boolean;\n agentId?: string;\n sessionListLimit: number;\n } | null>(null);\n\n const refetch = useCallback(\n async (opts?: { silent?: boolean }) => {\n const canLoadSessionList = Boolean(loadList && adapter.listSessions);\n const canLoadSessionTree = Boolean(sessionId && adapter.getSessionTree);\n if (!canLoadSessionList && !canLoadSessionTree) {\n setNodes([]);\n setHasEverLoaded(true);\n return;\n }\n const currentRequestId = ++requestId.current;\n try {\n const sessionListPromise =\n loadList && adapter.listSessions\n ? adapter.listSessions({\n agentId,\n limit: sessionListLimit,\n })\n : Promise.resolve(null);\n const sessionTreePromise =\n sessionId && adapter.getSessionTree\n ? adapter.getSessionTree({ sessionId })\n : Promise.resolve(null);\n const [sessionList, sessionTree] = await Promise.all([\n sessionListPromise,\n sessionTreePromise,\n ]);\n if (!mounted.current || currentRequestId !== requestId.current) return;\n const nextNodes = mergeTreeNodes([\n sessionList?.sessions.map(sessionToTreeNode) ?? [],\n sessionTree?.nodes ?? [],\n ]);\n const fp = treeFingerprint(nextNodes);\n if (fp !== lastFingerprint.current) {\n lastFingerprint.current = fp;\n setNodes(nextNodes);\n }\n setError(null);\n setHasEverLoaded(true);\n } catch (e) {\n if (!mounted.current || currentRequestId !== requestId.current) return;\n // Silent polls must not clobber the last-known-good view --\n // one transient failure would otherwise flip the panel to a\n // red error block until the next successful poll.\n if (!opts?.silent) {\n setError(e instanceof Error ? e.message : \"Failed to load tree\");\n }\n }\n },\n [adapter, agentId, loadList, sessionId, sessionListLimit],\n );\n\n // Mount / unmount flag for the component lifetime.\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n useEffect(() => {\n const previous = resetContext.current;\n const shouldReset =\n !previous ||\n previous.loadList !== loadList ||\n previous.agentId !== agentId ||\n previous.sessionListLimit !== sessionListLimit;\n resetContext.current = { loadList, agentId, sessionListLimit };\n\n if (shouldReset) {\n setNodes([]);\n setHasEverLoaded(false);\n lastFingerprint.current = \"\";\n }\n setError(null);\n void refetch();\n }, [adapter, agentId, loadList, refetch, sessionListLimit]);\n\n // Adaptive polling: 4s while any child is running, 30s when every\n // child has settled. Pulling the interval from ``nodes`` lets the\n // effect re-run whenever the tree changes state.\n const runningCount = useMemo(\n () => nodes.filter((n) => n.status === \"active\").length,\n [nodes],\n );\n useEffect(() => {\n const interval =\n runningCount > 0 ? POLL_INTERVAL_ACTIVE_MS : POLL_INTERVAL_IDLE_MS;\n const id = setInterval(() => {\n void refetch({ silent: true });\n }, interval);\n return () => clearInterval(id);\n }, [refetch, runningCount]);\n\n const roots = useMemo(() => buildTree(nodes), [nodes]);\n\n const handleSelect = useCallback(\n (id: string) => {\n onSessionSelect?.(id);\n },\n [onSessionSelect],\n );\n\n const handleStop = useCallback(\n async (id: string) => {\n if (!adapter.stopSession) return;\n try {\n await adapter.stopSession({ sessionId: id });\n await refetch({ silent: true });\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to stop sub-agent\");\n }\n },\n [adapter, refetch],\n );\n\n const handleDelete = useCallback(\n async (id: string) => {\n if (!adapter.deleteSession || deletingSessionId) return;\n setDeletingSessionId(id);\n try {\n await adapter.deleteSession({ sessionId: id });\n setNodes((current) => {\n const next = pruneDeletedSessionNodes(current, id);\n lastFingerprint.current = treeFingerprint(next);\n return next;\n });\n onSessionDelete?.(id);\n await refetch({ silent: true });\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to delete session\");\n } finally {\n if (mounted.current) setDeletingSessionId(null);\n }\n },\n [adapter, deletingSessionId, onSessionDelete, refetch],\n );\n\n // Hide the panel until the first fetch has completed so we don't\n // flash an empty \"Loading...\" header for sessions with no sub-agents.\n if (!hasEverLoaded) return null;\n if (nodes.length === 0) return null;\n\n const topLevel: TreeEntry[] = hideRoot\n ? roots.flatMap((r) => r.children)\n : roots;\n if (topLevel.length === 0) return null;\n\n return (\n <>\n {!hideHeader && (\n <div className=\"border-t border-line flex items-center gap-1.5 px-3 py-2 text-xs font-semibold uppercase tracking-wide\">\n <UsersIcon className=\"w-3.5 h-3.5\" />\n <span>{title}</span>\n {runningCount > 0 && (\n <Badge variant=\"default\" className=\"h-4 px-1.5 text-[10px] ml-auto\">\n {runningCount}\n </Badge>\n )}\n </div>\n )}\n {error && (\n <div className=\"px-3 py-2 text-xs text-destructive\">{error}</div>\n )}\n {!error && (\n <div className=\"px-1 pb-2\">\n {topLevel.map((entry) => (\n <TreeNodeRow\n key={entry.id}\n entry={entry}\n depth={0}\n activeSessionId={activeSessionId ?? \"\"}\n canStop={Boolean(adapter.stopSession)}\n canDelete={Boolean(adapter.deleteSession)}\n deletingSessionId={deletingSessionId}\n onSelect={handleSelect}\n onStop={handleStop}\n onDelete={handleDelete}\n />\n ))}\n </div>\n )}\n </>\n );\n}\n"]}
|