@invergent/agent-chat-react 1.5.4 → 1.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/components/chat/artifacts/artifact-chart.tsx","../src/adapter-context.tsx","../src/components/ui/button.tsx","../src/components/ai-elements/conversation.tsx","../src/components/ui/tooltip.tsx","../src/components/ai-elements/message.tsx","../src/components/ui/collapsible.tsx","../src/components/ai-elements/reasoning.tsx","../src/components/ai-elements/shimmer.tsx","../src/components/reui/timeline.tsx","../src/components/chat/tools/terminal-tool.tsx","../src/components/chat/tools/shared.ts","../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/ai-elements/sandbox.tsx","../src/components/ui/badge.tsx","../src/components/ai-elements/tool.tsx","../src/components/chat/tools/execute-code-tool.tsx","../src/components/chat/tools/oneliner-tools.tsx","../src/components/ui/dialog.tsx","../src/components/chat/tools/file-tools.tsx","../src/components/chat/diff-viewer.tsx","../src/components/ai-elements/terminal.tsx","../src/components/chat/tools/process-tool.tsx","../src/components/chat/tools/expert-tool.tsx","../src/components/ui/textarea.tsx","../src/components/chat/tools/skill-tools.tsx","../src/components/chat/tools/clarify-tool.tsx","../src/components/ui/input.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/chat-message.tsx","../src/components/ui/hover-card.tsx","../src/components/ui/progress.tsx","../src/components/ai-elements/context.tsx","../src/components/ui/command.tsx","../src/components/ui/input-group.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/spinner.tsx","../src/components/ai-elements/prompt-input.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/components/workspace/workspace-panel.tsx","../src/lib/format.ts","../src/components/workspace/file-viewer.tsx","../src/runtime/events.ts","../src/runtime/reducer.ts","../src/runtime/use-agent-chat-runtime.ts","../src/agent-chat.tsx","../src/components/sessions/session-tree-panel.tsx"],"names":["twMerge","clsx","useTheme","useRef","useState","useMemo","useEffect","ChartJS","jsxs","jsx","createContext","useContext","cva","Slot","StickToBottom","Fragment","useStickToBottomContext","useCallback","ArrowDownIcon","TooltipPrimitive","cjk","code","math","mermaid","memo","Streamdown","CollapsiblePrimitive","useControllableState","ChevronDownIcon","streamdownPlugins","CheckCircle2Icon","CopyIcon","ScrollAreaPrimitive","ListTodoIcon","Loader2Icon","createHighlighter","CheckIcon","TabsPrimitive","ClockIcon","CheckCircleIcon","CircleIcon","XCircleIcon","Code","SearchIcon","toolLabel","GlobeIcon","DialogPrimitive","XIcon","i","diffWordsWithSpace","DiffViewer","fileName","diffLines","TerminalIcon","Trash2Icon","Ansi","parseArgs","CircleDotIcon","CircleCheckIcon","CircleXIcon","SkullIcon","ActivityIcon","ChevronRightIcon","ThumbsUpIcon","ThumbsDownIcon","GitBranchIcon","firstLine","ChatMessage","HoverCardPrimitive","ProgressPrimitive","getUsage","CommandPrimitive","DropdownMenuPrimitive","nanoid","ImageIcon","Children","PlusIcon","CornerDownLeftIcon","SquareIcon","PopoverPrimitive","ArtifactChart","lazy","DownloadIcon","Maximize2Icon","Suspense","ErrorMessage","AlertTriangle","ChevronDown","ChevronRight","RefreshCw","MessageSquareIcon","groupRetry","FolderOpenIcon","FolderIcon","FileIcon","FileTextIcon","TrashIcon","AlertCircleIcon","ChevronLeftIcon","MinusIcon","SKELETON_WIDTHS","UploadIcon","RefreshCwIcon","findLastAssistantIndex","formatDistanceToNow","UsersIcon"],"mappings":"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","file":"index.cjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Chart artifact renderer — embeds a Chart.js configuration object.\n// Respects the app's dark/light theme and resizes with the thread column.\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Chart as ChartJS } from \"chart.js/auto\";\nimport type { ChartConfiguration, ChartOptions } from \"chart.js\";\nimport { useTheme } from \"next-themes\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ChartArtifactSpec } from \"../../../types\";\n\nconst DEFAULT_CHART_HEIGHT = 320;\nconst MAX_INLINE_CHART_HEIGHT = 800;\n\nconst LIGHT_THEME = {\n text: \"#444\",\n title: \"#111\",\n grid: \"#e5e7eb\",\n border: \"#d1d5db\",\n};\n\nconst DARK_THEME = {\n text: \"#cbd5e1\",\n title: \"#f1f5f9\",\n grid: \"#374151\",\n border: \"#4b5563\",\n};\n\nexport function ArtifactChart({\n spec,\n fill = false,\n}: {\n spec: ChartArtifactSpec;\n fill?: boolean;\n}) {\n const { resolvedTheme } = useTheme();\n const isDark = resolvedTheme === \"dark\";\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const chartRef = useRef<ChartJS | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const config = useMemo<ChartConfiguration>(() => {\n const base = cloneChartConfig(spec.chart_js ?? {});\n return {\n ...base,\n options: mergeThemeOptions(base.options, base.type, isDark),\n } as ChartConfiguration;\n }, [spec.chart_js, isDark]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n chartRef.current?.destroy();\n chartRef.current = null;\n setError(null);\n\n try {\n chartRef.current = new ChartJS(canvas, config);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n }\n\n return () => {\n chartRef.current?.destroy();\n chartRef.current = null;\n };\n }, [config]);\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div\n className={cn(\"relative w-full\", fill && \"h-full min-h-80\")}\n style={\n fill\n ? undefined\n : {\n height: DEFAULT_CHART_HEIGHT,\n maxHeight: MAX_INLINE_CHART_HEIGHT,\n }\n }\n >\n <canvas ref={canvasRef} />\n </div>\n {error && (\n <p className=\"text-xs text-destructive\">Chart error: {error}</p>\n )}\n {spec.caption && (\n <p className=\"text-xs text-muted-foreground\">{spec.caption}</p>\n )}\n </div>\n );\n}\n\nfunction cloneChartConfig(\n value: Record<string, unknown>,\n): Record<string, unknown> {\n return JSON.parse(JSON.stringify(value)) as Record<string, unknown>;\n}\n\nfunction mergeThemeOptions(\n options: unknown,\n chartType: unknown,\n isDark: boolean,\n): ChartOptions {\n const theme = isDark ? DARK_THEME : LIGHT_THEME;\n const base = isRecord(options) ? options : {};\n const plugins = isRecord(base.plugins) ? base.plugins : {};\n const legend = isRecord(plugins.legend) ? plugins.legend : {};\n const legendLabels = isRecord(legend.labels) ? legend.labels : {};\n const title = isRecord(plugins.title) ? plugins.title : {};\n const scales = isRecord(base.scales) ? base.scales : {};\n\n return {\n responsive: true,\n maintainAspectRatio: false,\n color: theme.text,\n ...base,\n plugins: {\n ...plugins,\n legend: {\n ...legend,\n labels: {\n color: theme.text,\n ...legendLabels,\n },\n },\n title: {\n color: theme.title,\n ...title,\n },\n },\n scales: mergeScales(scales, chartType, theme),\n } as ChartOptions;\n}\n\nfunction mergeScales(\n scales: Record<string, unknown>,\n chartType: unknown,\n theme: typeof LIGHT_THEME,\n): Record<string, unknown> {\n const names = new Set([...defaultScaleNames(chartType), ...Object.keys(scales)]);\n const merged: Record<string, unknown> = {};\n\n for (const name of names) {\n const scale = isRecord(scales[name]) ? scales[name] : {};\n const ticks = isRecord(scale.ticks) ? scale.ticks : {};\n const grid = isRecord(scale.grid) ? scale.grid : {};\n const title = isRecord(scale.title) ? scale.title : {};\n merged[name] = {\n ...scale,\n ticks: {\n color: theme.text,\n ...ticks,\n },\n grid: {\n color: theme.grid,\n ...grid,\n },\n border: {\n color: theme.border,\n ...(isRecord(scale.border) ? scale.border : {}),\n },\n title: {\n color: theme.title,\n ...title,\n },\n };\n }\n\n return merged;\n}\n\nfunction defaultScaleNames(chartType: unknown): string[] {\n if (chartType === \"bar\" || chartType === \"line\" || chartType === \"scatter\") {\n return [\"x\", \"y\"];\n }\n if (chartType === \"bubble\") {\n return [\"x\", \"y\"];\n }\n if (chartType === \"radar\" || chartType === \"polarArea\") {\n return [\"r\"];\n }\n return [];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","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 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","\"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","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","\"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 { 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 useState,\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 AUTO_CLOSE_DELAY = 1000;\nconst AUTO_OPEN_DELAY = 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 // Always start closed. During session replay, past messages briefly\n // flicker through ``isStreaming=true`` (as llm.delta events are replayed\n // one by one before llm.response lands) -- auto-opening on that flicker\n // would force every historical Reasoning's Streamdown to render at once\n // and then close again, which is the dominant cost of replaying long\n // conversations. The debounced useEffect below handles genuine live\n // streaming.\n const resolvedDefaultOpen = defaultOpen ?? false;\n // Track if defaultOpen was explicitly set to false (to prevent auto-open)\n const isExplicitlyClosed = 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 hasEverStreamedRef = useRef(false);\n const [hasAutoClosed, setHasAutoClosed] = useState(false);\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 >= AUTO_OPEN_DELAY) {\n hasEverStreamedRef.current = true;\n setDuration(Math.ceil(elapsed / MS_IN_S));\n }\n }\n }, [isStreaming, setDuration]);\n\n // Auto-open when streaming starts (unless explicitly closed). Debounced\n // so replay flickers (isStreaming true → false within the same render\n // burst) don't force the block open.\n useEffect(() => {\n if (!isStreaming || isOpen || isExplicitlyClosed) return;\n const timer = setTimeout(() => {\n hasEverStreamedRef.current = true;\n setIsOpen(true);\n }, AUTO_OPEN_DELAY);\n return () => clearTimeout(timer);\n }, [isStreaming, isOpen, setIsOpen, isExplicitlyClosed]);\n\n // Auto-close when streaming ends (once only, and only if it ever streamed)\n useEffect(() => {\n if (\n hasEverStreamedRef.current &&\n !isStreaming &&\n isOpen &&\n !hasAutoClosed\n ) {\n const timer = setTimeout(() => {\n setIsOpen(false);\n setHasAutoClosed(true);\n }, AUTO_CLOSE_DELAY);\n\n return () => clearTimeout(timer);\n }\n }, [isStreaming, isOpen, setIsOpen, hasAutoClosed]);\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","\"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","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}","// 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 result</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 output = result.output || result.error || \"\";\n return (\n <TerminalCollapsible\n command={result.command}\n output={output}\n isRunning={isRunning}\n hasError={result.exit_code !== 0 || Boolean(result.error)}\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","// 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","\"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","\"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","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","// 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 fetch / search / crawl\n\nimport { SearchIcon, GlobeIcon } 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 &ldquo;{query}&rdquo;\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_extract\") {\n const urls: string[] = args.urls ?? [];\n displayText = urls[0] ?? \"\";\n } else 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_extract: \"Web Fetch\",\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 <GlobeIcon className=\"size-3.5 text-muted-foreground/60 shrink-0\" />\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","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","// 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\">&quot;{pattern}&quot;</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\">&quot;{pattern}&quot;</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","// 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","\"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}","// 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","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// 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","// 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","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// 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\nimport type { ToolCallInfo } from \"../../../types\";\nimport { parseArgs, effectiveStatus } from \"./shared\";\n\nexport function ArtifactToolBlock({ tc }: { tc: ToolCallInfo }) {\n const args = parseArgs<{ name?: string; kind?: string }>(tc.args) ?? {};\n const status = effectiveStatus(tc);\n\n const label =\n status === \"running\"\n ? \"Creating artifact…\"\n : status === \"error\"\n ? \"Tried to create\"\n : \"Created\";\n\n return (\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">{label}</span>\n {args.name && (\n <span className=\"text-muted-foreground truncate\">{args.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 } from \"./tools/oneliner-tools\";\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({ tc, onFileSelect }: { tc: ToolCallInfo; onFileSelect?: (path: string) => void }) {\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 case \"web_search\":\n case \"web_crawl\":\n return <WebToolBlock 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} />;\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//\nimport { memo } from \"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 { ChatMessage as ChatMessageType } 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>{message.content}</MessageContent>\n </Message>\n );\n }\n\n return <AssistantMessage message={message} isLast={isLast} onFileSelect={onFileSelect} />;\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 { 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 * 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={0} 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","\"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","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 { 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 { 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\";\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: (FileUIPart & { id: string })[];\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 (FileUIPart & { id: string })[]\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((file) => ({\n filename: file.name,\n id: nanoid(),\n mediaType: file.type,\n type: \"file\" as const,\n url: URL.createObjectURL(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: FileUIPart[];\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<(FileUIPart & { id: string })[]>([]);\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: (FileUIPart & { id: string })[] = [];\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 });\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\n const convertedFiles: FileUIPart[] = await Promise.all(\n files.map(async ({ id: _id, ...item }) => {\n if (item.url?.startsWith(\"blob:\")) {\n const dataUrl = await convertBlobUrlToDataUrl(item.url);\n // If conversion failed, keep the original blob URL\n return {\n ...item,\n url: dataUrl ?? item.url,\n };\n }\n return item;\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","\"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, useState } from \"react\";\nimport type { KeyboardEvent as ReactKeyboardEvent } from \"react\";\nimport type { PromptInputMessage } from \"../ai-elements/prompt-input\";\nimport type { AgentChatSlashCommand, TokenUsage } 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 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 CommandList,\n CommandGroup,\n CommandItem,\n CommandEmpty,\n} from \"../ui/command\";\n\n// ── Slash command entry ──────────────────────────────────────────────\n\ntype SlashCommand = AgentChatSlashCommand;\n\n// ── Props ────────────────────────────────────────────────────────────\n\ninterface ChatComposerProps {\n onSend: (text: string) => void;\n onStop: () => void;\n isRunning: boolean;\n disabled?: boolean;\n tokenUsage?: TokenUsage;\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// ── Inner component (has access to controller) ──────────────────────\n\nfunction ChatComposerInner({\n onSend,\n onStop,\n isRunning,\n disabled = false,\n tokenUsage,\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 slashCommands = useMemo(() => {\n const builtin: SlashCommand[] = [\n { value: \"/clear\", label: \"/clear\", description: \"Clear conversation\" },\n { value: \"/compress\", label: \"/compress\", description: \"Compress context\" },\n ];\n return [...adapterCommands, ...builtin];\n }, [adapterCommands]);\n\n // ── Slash menu state ─────────────────────────────────────────────\n\n const searchQuery = showSlashMenu ? textInput.value.slice(1).toLowerCase() : \"\";\n\n const filteredCommands = useMemo(\n () =>\n slashCommands.filter(\n (cmd) =>\n cmd.value.slice(1).toLowerCase().includes(searchQuery) ||\n cmd.description.toLowerCase().includes(searchQuery),\n ),\n [slashCommands, searchQuery],\n );\n\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n // Reset selection when filter changes.\n useEffect(() => {\n setSelectedIndex(0);\n }, [searchQuery]);\n\n useEffect(() => {\n setSelectedIndex((index) =>\n Math.min(index, Math.max(filteredCommands.length - 1, 0)),\n );\n }, [filteredCommands.length]);\n\n const menuOpen = showSlashMenu && filteredCommands.length > 0;\n\n const handleCommandSelect = useCallback(\n (commandValue: string) => {\n textInput.setInput(commandValue + \" \");\n setButtonMenuOpen(false);\n setMenuDismissed(true);\n },\n [textInput],\n );\n\n // ── Key handling (runs before PromptInputTextarea internals) ─────\n\n const handleKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLTextAreaElement>) => {\n if (!menuOpen) return;\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setSelectedIndex((i) => Math.min(i + 1, filteredCommands.length - 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setSelectedIndex((i) => Math.max(i - 1, 0));\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n const command = filteredCommands[selectedIndex];\n if (command) handleCommandSelect(command.value);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n textInput.setInput(\"\");\n setButtonMenuOpen(false);\n setMenuDismissed(true);\n } else if (e.key === \"Tab\") {\n e.preventDefault();\n const command = filteredCommands[selectedIndex];\n if (command) handleCommandSelect(command.value);\n }\n },\n [menuOpen, filteredCommands, selectedIndex, handleCommandSelect, textInput],\n );\n\n // ── Submit ───────────────────────────────────────────────────────\n\n const handleSubmit = useCallback(\n (message: PromptInputMessage) => {\n const text = message.text.trim();\n if (!text || isRunning || disabled) return;\n onSend(text);\n },\n [onSend, isRunning, disabled],\n );\n\n // ── Render ───────────────────────────────────────────────────────\n\n return (\n <Popover open={menuOpen} onOpenChange={(open) => {\n if (!open) {\n setButtonMenuOpen(false);\n }\n }}>\n <PopoverAnchor asChild>\n <PromptInput onSubmit={handleSubmit}>\n <PromptInputBody>\n <PromptInputTextarea\n placeholder={disabled ? \"Session disabled\" : \"Send a message...\"}\n disabled={disabled}\n onKeyDown={handleKeyDown}\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-3\">\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=\"p-0\"\n style={{ width: \"var(--radix-popover-trigger-width)\" }}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <Command value={filteredCommands[selectedIndex]?.value} filter={() => 1}>\n <CommandList>\n <CommandGroup>\n {filteredCommands.map((cmd) => (\n <CommandItem\n key={cmd.value}\n value={cmd.value}\n onSelect={() => handleCommandSelect(cmd.value)}\n className=\"grid grid-cols-[6rem_1fr] gap-2 [&_svg]:hidden\"\n >\n <span className=\"\">{cmd.label}</span>\n <span className=\"text-muted-foreground\">\n {cmd.description}\n </span>\n </CommandItem>\n ))}\n </CommandGroup>\n <CommandEmpty>No commands found</CommandEmpty>\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 { ToolCallBlock } from \"./tool-call-block\";\nimport { statusColorClass, effectiveStatus, toolErrorSummary } 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 ChatMessage as ChatMessageType,\n RetryIndicator,\n ToolCallInfo,\n TokenUsage,\n} from \"../../types\";\nimport type { ArtifactKind } from \"../../types\";\n\ninterface ChatThreadProps {\n sessionId: string | null;\n messages: ChatMessageType[];\n isRunning: boolean;\n isLoadingHistory?: boolean;\n onSend: (text: string) => void;\n onStop: () => void;\n onFileSelect?: (path: string) => void;\n disabled?: boolean;\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}\n\n// ── Timeline item types ──────────────────────────────────────────────\n\ntype TimelineEntry =\n | { kind: \"reasoning\"; key: string; reasoning: string; isStreaming: boolean }\n | { kind: \"tool\"; key: string; tc: 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 */\nfunction messageToEntries(\n msg: ChatMessageType,\n isLast: boolean,\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 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\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 failureSummary =\n effectiveStatus(entry.tc) === \"error\"\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(effectiveStatus(entry.tc)))}\n />\n </TimelineHeader>\n <TimelineContent>\n {entry.tc.cancelled ? (\n <CancelledToolRow tc={entry.tc} />\n ) : (\n <div className=\"space-y-1\">\n <ToolCallBlock tc={entry.tc} onFileSelect={onFileSelect} />\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 === \"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={5} className=\"text-sm text-foreground\">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 sessionId,\n onFileSelect,\n onRetry,\n}: {\n messages: ChatMessageType[];\n lastGlobalIndex: number;\n totalMessages: number;\n sessionId: string | null;\n onFileSelect?: (path: string) => void;\n onRetry?: () => Promise<void>;\n}) {\n const 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));\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 tokenUsage,\n retryIndicator,\n onRetry,\n}: ChatThreadProps) {\n const groups = useMemo(() => groupMessages(messages), [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 sessionId={sessionId}\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={5} 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 <ChatComposer\n onSend={onSend}\n onStop={onStop}\n isRunning={isRunning}\n disabled={disabled}\n tokenUsage={tokenUsage}\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","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { MouseEvent, ReactNode } from \"react\";\nimport {\n AlertCircleIcon,\n ChevronRightIcon,\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 collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n disabled?: 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 collapsed = false,\n onCollapsedChange,\n disabled = 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) {\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 (!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, 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 if (collapsed) {\n return (\n <aside\n role=\"button\"\n tabIndex={0}\n className=\"relative z-10 flex min-h-0 w-10 shrink-0 cursor-pointer items-center justify-center border-l border-muted-foreground/20 bg-card text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30\"\n aria-label=\"Expand workspace\"\n onClick={() => onCollapsedChange?.(false)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onCollapsedChange?.(false);\n }\n }}\n >\n <FolderOpenIcon className=\"size-4 text-amber-500\" />\n </aside>\n );\n }\n\n return (\n <aside\n className=\"relative z-10 flex min-h-0 flex-col overflow-hidden border-l border-muted-foreground/20 bg-card\"\n style={{ width, minWidth: MIN_WIDTH, maxWidth: MAX_WIDTH }}\n >\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 <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\">Workspace</div>\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => onCollapsedChange?.(true)}\n aria-label=\"Collapse workspace\"\n >\n <ChevronRightIcon className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Collapse</TooltipContent>\n </Tooltip>\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 ? () => 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","// 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 type { AgentChatEventType } from \"../types\";\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 \"clarify.response\",\n] as const satisfies readonly AgentChatEventType[];\n","import type {\n AgentChatErrorInfo,\n AgentChatMessage,\n AgentChatRuntimeEvent,\n AgentChatState,\n AgentChatTokenUsage,\n AgentChatToolCallInfo,\n} from \"../types\";\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 };\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 \"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 return withMessages(\n nextState,\n applyToolResult(nextState.messages, event.data),\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 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 next[localIdx] = { ...next[localIdx]!, id: `evt-${eventId}` };\n return next;\n }\n next.push({\n id: `evt-${eventId}`,\n role: \"user\",\n content,\n createdAt: new Date(),\n status: \"complete\",\n });\n return next;\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 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\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 (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 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 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 AgentChatEventStream,\n AgentChatRuntimeApi,\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 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\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\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 useEffect(() => {\n const previousSessionId = previousSessionIdRef.current;\n previousSessionIdRef.current = sessionId;\n clearReconnectTimer();\n closeStream();\n\n if (!sessionId) {\n setState(createInitialAgentChatState());\n return;\n }\n\n let cancelled = false;\n\n const connect = (after?: number) => {\n if (cancelled) return;\n const stream = adapter.openEventStream({\n sessionId,\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 (!stateRef.current.sessionDone && !cancelled) {\n reconnectTimerRef.current = setTimeout(() => connect(), 3000);\n }\n };\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 setState(initialState);\n connect(0);\n\n adapter\n .getSession({ sessionId })\n .then((session) => {\n if (cancelled) return;\n if (session.messageCount === 0) {\n setState((prev) => ({\n ...prev,\n isLoadingHistory: false,\n }));\n }\n if (isTerminalStatus(session.status)) {\n setState((prev) => ({\n ...prev,\n terminal: true,\n isRunning: false,\n }));\n }\n })\n .catch(() => undefined);\n\n return () => {\n cancelled = true;\n clearReconnectTimer();\n closeStream();\n };\n }, [adapter, clearReconnectTimer, closeStream, sessionId]);\n\n const markSending = useCallback((content: string) => {\n setState((prev) => ({\n ...prev,\n terminal: 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 },\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 (content: string) => {\n markSending(content);\n\n if (!sessionId) {\n try {\n const session = await adapter.createSession({ agentId });\n onSessionChange?.(session.id);\n await adapter.sendMessage({ sessionId: session.id, content });\n } catch (error) {\n markSendError(error instanceof Error ? error.message : \"send failed\");\n throw error;\n }\n return;\n }\n\n try {\n await adapter.sendMessage({ sessionId, content });\n } catch (error) {\n markSendError(error instanceof Error ? error.message : \"send failed\");\n throw error;\n }\n },\n [adapter, agentId, markSendError, markSending, onSessionChange, sessionId],\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 messages: state.messages,\n isRunning: state.isRunning,\n isLoadingHistory: state.isLoadingHistory,\n tokenUsage: state.tokenUsage,\n retryIndicator: state.retryIndicator,\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","import { useCallback, useEffect, useState } from \"react\";\nimport { AgentChatAdapterProvider } from \"./adapter-context\";\nimport { ChatThread } from \"./components/chat/chat-thread\";\nimport { TooltipProvider } from \"./components/ui/tooltip\";\nimport { WorkspacePanel } from \"./components/workspace/workspace-panel\";\nimport { useAgentChatRuntime } from \"./runtime/use-agent-chat-runtime\";\nimport type {\n AgentChatAdapter,\n AgentChatMessage,\n} from \"./types\";\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\nexport function AgentChat({\n adapter,\n agentId,\n sessionId,\n onSessionChange,\n onFileSelect,\n onMessagesChange,\n disabled,\n}: AgentChatProps) {\n const [workspacePath, setWorkspacePath] = useState<string | null>(null);\n const [workspaceCollapsed, setWorkspaceCollapsed] = useState(false);\n const runtime = useAgentChatRuntime({\n adapter,\n agentId,\n sessionId,\n onSessionChange,\n });\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 className=\"flex flex-1 min-h-0 overflow-hidden bg-background text-sm text-foreground\">\n <div className=\"flex min-w-0 flex-1 flex-col overflow-hidden\">\n <ChatThread\n sessionId={sessionId}\n messages={runtime.messages}\n isRunning={runtime.isRunning}\n isLoadingHistory={runtime.isLoadingHistory}\n onSend={(content) => void runtime.send(content)}\n onStop={() => void runtime.stop()}\n onRetry={runtime.retry}\n onFileSelect={handleFileSelect}\n disabled={disabled}\n tokenUsage={runtime.tokenUsage}\n retryIndicator={runtime.retryIndicator}\n />\n </div>\n <WorkspacePanel\n adapter={adapter}\n sessionId={sessionId}\n selectedPath={workspacePath}\n onSelectedPathChange={setWorkspacePath}\n collapsed={workspaceCollapsed}\n onCollapsedChange={setWorkspaceCollapsed}\n disabled={disabled}\n />\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//\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 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.messageCount ?? 0\n }:${n.toolCallCount ?? 0}:${n.updatedAt}`,\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 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 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 const title = entry.title ?? \"New session\";\n const subtitle = [\n entry.model ?? \"default\",\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 && (\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 sub-agent\"\n title=\"Stop sub-agent\"\n >\n <SquareIcon className=\"w-3 h-3\" fill=\"currentColor\" />\n </button>\n )}\n {canDelete && (\n <button\n type=\"button\"\n className=\"p-1 rounded opacity-0 group-hover:opacity-100 focus-visible:opacity-100 hover:bg-destructive/10 hover:text-destructive disabled:pointer-events-none disabled:opacity-50 transition-all\"\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 <Trash2Icon className=\"w-3 h-3\" />\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/lib/utils.ts","../src/components/chat/artifacts/artifact-chart.tsx","../src/adapter-context.tsx","../src/components/ui/button.tsx","../src/components/ai-elements/conversation.tsx","../src/components/ui/tooltip.tsx","../src/components/ai-elements/message.tsx","../src/components/ui/collapsible.tsx","../src/components/ai-elements/reasoning.tsx","../src/components/ai-elements/shimmer.tsx","../src/components/reui/timeline.tsx","../src/components/chat/tools/terminal-tool.tsx","../src/components/chat/tools/shared.ts","../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/ai-elements/sandbox.tsx","../src/components/ui/badge.tsx","../src/components/ai-elements/tool.tsx","../src/components/chat/tools/execute-code-tool.tsx","../src/components/chat/tools/oneliner-tools.tsx","../src/components/ui/dialog.tsx","../src/components/chat/tools/file-tools.tsx","../src/components/chat/diff-viewer.tsx","../src/components/ai-elements/terminal.tsx","../src/components/chat/tools/process-tool.tsx","../src/components/chat/tools/expert-tool.tsx","../src/components/ui/textarea.tsx","../src/components/chat/tools/skill-tools.tsx","../src/components/chat/tools/clarify-tool.tsx","../src/components/ui/input.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/chat-message.tsx","../src/components/ui/hover-card.tsx","../src/components/ui/progress.tsx","../src/components/ai-elements/context.tsx","../src/components/ui/command.tsx","../src/components/ui/input-group.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/spinner.tsx","../src/components/ai-elements/prompt-input.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/components/workspace/workspace-panel.tsx","../src/lib/format.ts","../src/components/workspace/file-viewer.tsx","../src/runtime/events.ts","../src/runtime/reducer.ts","../src/runtime/use-agent-chat-runtime.ts","../src/agent-chat.tsx","../src/components/sessions/session-tree-panel.tsx"],"names":["twMerge","clsx","useTheme","useRef","useState","useMemo","useEffect","ChartJS","jsxs","jsx","createContext","useContext","cva","Slot","StickToBottom","Fragment","useStickToBottomContext","useCallback","ArrowDownIcon","TooltipPrimitive","cjk","code","math","mermaid","memo","Streamdown","CollapsiblePrimitive","useControllableState","ChevronDownIcon","streamdownPlugins","CheckCircle2Icon","CopyIcon","ScrollAreaPrimitive","ListTodoIcon","Loader2Icon","createHighlighter","CheckIcon","TabsPrimitive","ClockIcon","CheckCircleIcon","CircleIcon","XCircleIcon","Code","SearchIcon","toolLabel","GlobeIcon","DialogPrimitive","XIcon","i","diffWordsWithSpace","DiffViewer","fileName","diffLines","TerminalIcon","Trash2Icon","Ansi","parseArgs","CircleDotIcon","CircleCheckIcon","CircleXIcon","SkullIcon","ActivityIcon","ChevronRightIcon","ThumbsUpIcon","ThumbsDownIcon","GitBranchIcon","firstLine","ChatMessage","HoverCardPrimitive","ProgressPrimitive","getUsage","CommandPrimitive","DropdownMenuPrimitive","nanoid","ImageIcon","Children","PlusIcon","CornerDownLeftIcon","SquareIcon","PopoverPrimitive","ArtifactChart","lazy","DownloadIcon","Maximize2Icon","Suspense","ErrorMessage","AlertTriangle","ChevronDown","ChevronRight","RefreshCw","MessageSquareIcon","groupRetry","FolderOpenIcon","FolderIcon","FileIcon","FileTextIcon","TrashIcon","AlertCircleIcon","ChevronLeftIcon","MinusIcon","SKELETON_WIDTHS","UploadIcon","RefreshCwIcon","findLastAssistantIndex","formatDistanceToNow","UsersIcon"],"mappings":"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","file":"index.cjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// Chart artifact renderer — embeds a Chart.js configuration object.\n// Respects the app's dark/light theme and resizes with the thread column.\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Chart as ChartJS } from \"chart.js/auto\";\nimport type { ChartConfiguration, ChartOptions } from \"chart.js\";\nimport { useTheme } from \"next-themes\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ChartArtifactSpec } from \"../../../types\";\n\nconst DEFAULT_CHART_HEIGHT = 320;\nconst MAX_INLINE_CHART_HEIGHT = 800;\n\nconst LIGHT_THEME = {\n text: \"#444\",\n title: \"#111\",\n grid: \"#e5e7eb\",\n border: \"#d1d5db\",\n};\n\nconst DARK_THEME = {\n text: \"#cbd5e1\",\n title: \"#f1f5f9\",\n grid: \"#374151\",\n border: \"#4b5563\",\n};\n\nexport function ArtifactChart({\n spec,\n fill = false,\n}: {\n spec: ChartArtifactSpec;\n fill?: boolean;\n}) {\n const { resolvedTheme } = useTheme();\n const isDark = resolvedTheme === \"dark\";\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const chartRef = useRef<ChartJS | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const config = useMemo<ChartConfiguration>(() => {\n const base = cloneChartConfig(spec.chart_js ?? {});\n return {\n ...base,\n options: mergeThemeOptions(base.options, base.type, isDark),\n } as ChartConfiguration;\n }, [spec.chart_js, isDark]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n chartRef.current?.destroy();\n chartRef.current = null;\n setError(null);\n\n try {\n chartRef.current = new ChartJS(canvas, config);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n }\n\n return () => {\n chartRef.current?.destroy();\n chartRef.current = null;\n };\n }, [config]);\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div\n className={cn(\"relative w-full\", fill && \"h-full min-h-80\")}\n style={\n fill\n ? undefined\n : {\n height: DEFAULT_CHART_HEIGHT,\n maxHeight: MAX_INLINE_CHART_HEIGHT,\n }\n }\n >\n <canvas ref={canvasRef} />\n </div>\n {error && (\n <p className=\"text-xs text-destructive\">Chart error: {error}</p>\n )}\n {spec.caption && (\n <p className=\"text-xs text-muted-foreground\">{spec.caption}</p>\n )}\n </div>\n );\n}\n\nfunction cloneChartConfig(\n value: Record<string, unknown>,\n): Record<string, unknown> {\n return JSON.parse(JSON.stringify(value)) as Record<string, unknown>;\n}\n\nfunction mergeThemeOptions(\n options: unknown,\n chartType: unknown,\n isDark: boolean,\n): ChartOptions {\n const theme = isDark ? DARK_THEME : LIGHT_THEME;\n const base = isRecord(options) ? options : {};\n const plugins = isRecord(base.plugins) ? base.plugins : {};\n const legend = isRecord(plugins.legend) ? plugins.legend : {};\n const legendLabels = isRecord(legend.labels) ? legend.labels : {};\n const title = isRecord(plugins.title) ? plugins.title : {};\n const scales = isRecord(base.scales) ? base.scales : {};\n\n return {\n responsive: true,\n maintainAspectRatio: false,\n color: theme.text,\n ...base,\n plugins: {\n ...plugins,\n legend: {\n ...legend,\n labels: {\n color: theme.text,\n ...legendLabels,\n },\n },\n title: {\n color: theme.title,\n ...title,\n },\n },\n scales: mergeScales(scales, chartType, theme),\n } as ChartOptions;\n}\n\nfunction mergeScales(\n scales: Record<string, unknown>,\n chartType: unknown,\n theme: typeof LIGHT_THEME,\n): Record<string, unknown> {\n const names = new Set([...defaultScaleNames(chartType), ...Object.keys(scales)]);\n const merged: Record<string, unknown> = {};\n\n for (const name of names) {\n const scale = isRecord(scales[name]) ? scales[name] : {};\n const ticks = isRecord(scale.ticks) ? scale.ticks : {};\n const grid = isRecord(scale.grid) ? scale.grid : {};\n const title = isRecord(scale.title) ? scale.title : {};\n merged[name] = {\n ...scale,\n ticks: {\n color: theme.text,\n ...ticks,\n },\n grid: {\n color: theme.grid,\n ...grid,\n },\n border: {\n color: theme.border,\n ...(isRecord(scale.border) ? scale.border : {}),\n },\n title: {\n color: theme.title,\n ...title,\n },\n };\n }\n\n return merged;\n}\n\nfunction defaultScaleNames(chartType: unknown): string[] {\n if (chartType === \"bar\" || chartType === \"line\" || chartType === \"scatter\") {\n return [\"x\", \"y\"];\n }\n if (chartType === \"bubble\") {\n return [\"x\", \"y\"];\n }\n if (chartType === \"radar\" || chartType === \"polarArea\") {\n return [\"r\"];\n }\n return [];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","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 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","\"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","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","\"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 { 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 useState,\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 AUTO_CLOSE_DELAY = 1000;\nconst AUTO_OPEN_DELAY = 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 // Always start closed. During session replay, past messages briefly\n // flicker through ``isStreaming=true`` (as llm.delta events are replayed\n // one by one before llm.response lands) -- auto-opening on that flicker\n // would force every historical Reasoning's Streamdown to render at once\n // and then close again, which is the dominant cost of replaying long\n // conversations. The debounced useEffect below handles genuine live\n // streaming.\n const resolvedDefaultOpen = defaultOpen ?? false;\n // Track if defaultOpen was explicitly set to false (to prevent auto-open)\n const isExplicitlyClosed = 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 hasEverStreamedRef = useRef(false);\n const [hasAutoClosed, setHasAutoClosed] = useState(false);\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 >= AUTO_OPEN_DELAY) {\n hasEverStreamedRef.current = true;\n setDuration(Math.ceil(elapsed / MS_IN_S));\n }\n }\n }, [isStreaming, setDuration]);\n\n // Auto-open when streaming starts (unless explicitly closed). Debounced\n // so replay flickers (isStreaming true → false within the same render\n // burst) don't force the block open.\n useEffect(() => {\n if (!isStreaming || isOpen || isExplicitlyClosed) return;\n const timer = setTimeout(() => {\n hasEverStreamedRef.current = true;\n setIsOpen(true);\n }, AUTO_OPEN_DELAY);\n return () => clearTimeout(timer);\n }, [isStreaming, isOpen, setIsOpen, isExplicitlyClosed]);\n\n // Auto-close when streaming ends (once only, and only if it ever streamed)\n useEffect(() => {\n if (\n hasEverStreamedRef.current &&\n !isStreaming &&\n isOpen &&\n !hasAutoClosed\n ) {\n const timer = setTimeout(() => {\n setIsOpen(false);\n setHasAutoClosed(true);\n }, AUTO_CLOSE_DELAY);\n\n return () => clearTimeout(timer);\n }\n }, [isStreaming, isOpen, setIsOpen, hasAutoClosed]);\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","\"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","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}","// 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 result</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 output = result.output || result.error || \"\";\n return (\n <TerminalCollapsible\n command={result.command}\n output={output}\n isRunning={isRunning}\n hasError={result.exit_code !== 0 || Boolean(result.error)}\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","// 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","\"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","\"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","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","// 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 fetch / search / crawl\n\nimport { SearchIcon, GlobeIcon } 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 &ldquo;{query}&rdquo;\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_extract\") {\n const urls: string[] = args.urls ?? [];\n displayText = urls[0] ?? \"\";\n } else 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_extract: \"Web Fetch\",\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 <GlobeIcon className=\"size-3.5 text-muted-foreground/60 shrink-0\" />\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","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","// 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\">&quot;{pattern}&quot;</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\">&quot;{pattern}&quot;</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","// 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","\"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}","// 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","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// 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","// 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","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// 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({ tc }: { tc: ToolCallInfo }) {\n const args = parseArgs<{ name?: string; kind?: string }>(tc.args) ?? {};\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 return (\n <div className=\"flex items-center gap-1.5 text-sm \">\n <span className=\"font-semibold text-foreground\">{label}</span>\n {args.name && (\n <span className=\"text-muted-foreground truncate\">{args.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 } from \"./tools/oneliner-tools\";\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({ tc, onFileSelect }: { tc: ToolCallInfo; onFileSelect?: (path: string) => void }) {\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 case \"web_search\":\n case \"web_crawl\":\n return <WebToolBlock 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} />;\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//\nimport { memo } from \"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 { ChatMessage as ChatMessageType } 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>{message.content}</MessageContent>\n </Message>\n );\n }\n\n return <AssistantMessage message={message} isLast={isLast} onFileSelect={onFileSelect} />;\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 { 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 * 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={0} 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","\"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","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 { 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 { 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\";\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: (FileUIPart & { id: string })[];\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 (FileUIPart & { id: string })[]\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((file) => ({\n filename: file.name,\n id: nanoid(),\n mediaType: file.type,\n type: \"file\" as const,\n url: URL.createObjectURL(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: FileUIPart[];\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<(FileUIPart & { id: string })[]>([]);\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: (FileUIPart & { id: string })[] = [];\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 });\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\n const convertedFiles: FileUIPart[] = await Promise.all(\n files.map(async ({ id: _id, ...item }) => {\n if (item.url?.startsWith(\"blob:\")) {\n const dataUrl = await convertBlobUrlToDataUrl(item.url);\n // If conversion failed, keep the original blob URL\n return {\n ...item,\n url: dataUrl ?? item.url,\n };\n }\n return item;\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","\"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, useState } from \"react\";\nimport type { KeyboardEvent as ReactKeyboardEvent } from \"react\";\nimport type { PromptInputMessage } from \"../ai-elements/prompt-input\";\nimport type { AgentChatSlashCommand, TokenUsage } 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 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 CommandList,\n CommandGroup,\n CommandItem,\n CommandEmpty,\n} from \"../ui/command\";\n\n// ── Slash command entry ──────────────────────────────────────────────\n\ntype SlashCommand = AgentChatSlashCommand;\n\n// ── Props ────────────────────────────────────────────────────────────\n\ninterface ChatComposerProps {\n onSend: (text: string) => void;\n onStop: () => void;\n isRunning: boolean;\n disabled?: boolean;\n tokenUsage?: TokenUsage;\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// ── Inner component (has access to controller) ──────────────────────\n\nfunction ChatComposerInner({\n onSend,\n onStop,\n isRunning,\n disabled = false,\n tokenUsage,\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 slashCommands = useMemo(() => {\n const builtin: SlashCommand[] = [\n { value: \"/clear\", label: \"/clear\", description: \"Clear conversation\" },\n { value: \"/compress\", label: \"/compress\", description: \"Compress context\" },\n ];\n return [...adapterCommands, ...builtin];\n }, [adapterCommands]);\n\n // ── Slash menu state ─────────────────────────────────────────────\n\n const searchQuery = showSlashMenu ? textInput.value.slice(1).toLowerCase() : \"\";\n\n const filteredCommands = useMemo(\n () =>\n slashCommands.filter(\n (cmd) =>\n cmd.value.slice(1).toLowerCase().includes(searchQuery) ||\n cmd.description.toLowerCase().includes(searchQuery),\n ),\n [slashCommands, searchQuery],\n );\n\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n // Reset selection when filter changes.\n useEffect(() => {\n setSelectedIndex(0);\n }, [searchQuery]);\n\n useEffect(() => {\n setSelectedIndex((index) =>\n Math.min(index, Math.max(filteredCommands.length - 1, 0)),\n );\n }, [filteredCommands.length]);\n\n const menuOpen = showSlashMenu && filteredCommands.length > 0;\n\n const handleCommandSelect = useCallback(\n (commandValue: string) => {\n textInput.setInput(commandValue + \" \");\n setButtonMenuOpen(false);\n setMenuDismissed(true);\n },\n [textInput],\n );\n\n // ── Key handling (runs before PromptInputTextarea internals) ─────\n\n const handleKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLTextAreaElement>) => {\n if (!menuOpen) return;\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setSelectedIndex((i) => Math.min(i + 1, filteredCommands.length - 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setSelectedIndex((i) => Math.max(i - 1, 0));\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n const command = filteredCommands[selectedIndex];\n if (command) handleCommandSelect(command.value);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n textInput.setInput(\"\");\n setButtonMenuOpen(false);\n setMenuDismissed(true);\n } else if (e.key === \"Tab\") {\n e.preventDefault();\n const command = filteredCommands[selectedIndex];\n if (command) handleCommandSelect(command.value);\n }\n },\n [menuOpen, filteredCommands, selectedIndex, handleCommandSelect, textInput],\n );\n\n // ── Submit ───────────────────────────────────────────────────────\n\n const handleSubmit = useCallback(\n (message: PromptInputMessage) => {\n const text = message.text.trim();\n if (!text || isRunning || disabled) return;\n onSend(text);\n },\n [onSend, isRunning, disabled],\n );\n\n // ── Render ───────────────────────────────────────────────────────\n\n return (\n <Popover open={menuOpen} onOpenChange={(open) => {\n if (!open) {\n setButtonMenuOpen(false);\n }\n }}>\n <PopoverAnchor asChild>\n <PromptInput onSubmit={handleSubmit}>\n <PromptInputBody>\n <PromptInputTextarea\n placeholder={disabled ? \"Session disabled\" : \"Send a message...\"}\n disabled={disabled}\n onKeyDown={handleKeyDown}\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-3\">\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=\"p-0\"\n style={{ width: \"var(--radix-popover-trigger-width)\" }}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <Command value={filteredCommands[selectedIndex]?.value} filter={() => 1}>\n <CommandList>\n <CommandGroup>\n {filteredCommands.map((cmd) => (\n <CommandItem\n key={cmd.value}\n value={cmd.value}\n onSelect={() => handleCommandSelect(cmd.value)}\n className=\"grid grid-cols-[6rem_1fr] gap-2 [&_svg]:hidden\"\n >\n <span className=\"\">{cmd.label}</span>\n <span className=\"text-muted-foreground\">\n {cmd.description}\n </span>\n </CommandItem>\n ))}\n </CommandGroup>\n <CommandEmpty>No commands found</CommandEmpty>\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 { ToolCallBlock } from \"./tool-call-block\";\nimport { statusColorClass, effectiveStatus, toolErrorSummary } 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 ChatMessage as ChatMessageType,\n RetryIndicator,\n ToolCallInfo,\n TokenUsage,\n} from \"../../types\";\nimport type { ArtifactKind } from \"../../types\";\n\ninterface ChatThreadProps {\n sessionId: string | null;\n messages: ChatMessageType[];\n isRunning: boolean;\n isLoadingHistory?: boolean;\n onSend: (text: string) => void;\n onStop: () => void;\n onFileSelect?: (path: string) => void;\n disabled?: boolean;\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}\n\n// ── Timeline item types ──────────────────────────────────────────────\n\ntype TimelineEntry =\n | { kind: \"reasoning\"; key: string; reasoning: string; isStreaming: boolean }\n | { kind: \"tool\"; key: string; tc: 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 */\nfunction messageToEntries(\n msg: ChatMessageType,\n isLast: boolean,\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 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\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 tc={entry.tc} onFileSelect={onFileSelect} />\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 === \"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 onFileSelect,\n onRetry,\n}: {\n messages: ChatMessageType[];\n lastGlobalIndex: number;\n totalMessages: number;\n isRunning: boolean;\n sessionId: string | null;\n onFileSelect?: (path: string) => void;\n onRetry?: () => Promise<void>;\n}) {\n const 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));\n }\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 tokenUsage,\n retryIndicator,\n onRetry,\n}: ChatThreadProps) {\n const groups = useMemo(() => groupMessages(messages), [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 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 <ChatComposer\n onSend={onSend}\n onStop={onStop}\n isRunning={isRunning}\n disabled={disabled}\n tokenUsage={tokenUsage}\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","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { MouseEvent, ReactNode } from \"react\";\nimport {\n AlertCircleIcon,\n ChevronRightIcon,\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 collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n refreshSignal?: number;\n disabled?: 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 collapsed = false,\n onCollapsedChange,\n refreshSignal = 0,\n disabled = 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 (!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, 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 if (collapsed) {\n return (\n <aside\n role=\"button\"\n tabIndex={0}\n className=\"relative z-10 flex min-h-0 w-10 shrink-0 cursor-pointer items-center justify-center border-l border-muted-foreground/20 bg-card text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30\"\n aria-label=\"Expand workspace\"\n onClick={() => onCollapsedChange?.(false)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onCollapsedChange?.(false);\n }\n }}\n >\n <FolderOpenIcon className=\"size-4 text-amber-500\" />\n </aside>\n );\n }\n\n return (\n <aside\n className=\"relative z-10 flex min-h-0 flex-col overflow-hidden border-l border-muted-foreground/20 bg-card\"\n style={{ width, minWidth: MIN_WIDTH, maxWidth: MAX_WIDTH }}\n >\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 <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\">Workspace</div>\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => onCollapsedChange?.(true)}\n aria-label=\"Collapse workspace\"\n >\n <ChevronRightIcon className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Collapse</TooltipContent>\n </Tooltip>\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 ? () => 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","// 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 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]);\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 \"clarify.response\",\n] as const satisfies readonly AgentChatEventType[];\n","import type {\n AgentChatErrorInfo,\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 };\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 \"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 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 next[localIdx] = { ...next[localIdx]!, id: `evt-${eventId}` };\n return next;\n }\n next.push({\n id: `evt-${eventId}`,\n role: \"user\",\n content,\n createdAt: new Date(),\n status: \"complete\",\n });\n return next;\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 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\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 (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 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 AgentChatEventStream,\n AgentChatRuntimeApi,\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 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\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\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 useEffect(() => {\n const previousSessionId = previousSessionIdRef.current;\n previousSessionIdRef.current = sessionId;\n clearReconnectTimer();\n closeStream();\n\n if (!sessionId) {\n setState(createInitialAgentChatState());\n return;\n }\n\n let cancelled = false;\n\n const connect = (after?: number) => {\n if (cancelled) return;\n const stream = adapter.openEventStream({\n sessionId,\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 (!stateRef.current.sessionDone && !cancelled) {\n reconnectTimerRef.current = setTimeout(() => connect(), 3000);\n }\n };\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 setState(initialState);\n connect(0);\n\n adapter\n .getSession({ sessionId })\n .then((session) => {\n if (cancelled) return;\n if (session.messageCount === 0) {\n setState((prev) => ({\n ...prev,\n isLoadingHistory: false,\n }));\n }\n if (isTerminalStatus(session.status)) {\n setState((prev) => ({\n ...prev,\n terminal: true,\n isRunning: false,\n }));\n }\n })\n .catch(() => undefined);\n\n return () => {\n cancelled = true;\n clearReconnectTimer();\n closeStream();\n };\n }, [adapter, clearReconnectTimer, closeStream, sessionId]);\n\n const markSending = useCallback((content: string) => {\n setState((prev) => ({\n ...prev,\n terminal: 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 },\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 (content: string) => {\n markSending(content);\n\n if (!sessionId) {\n try {\n const session = await adapter.createSession({ agentId });\n onSessionChange?.(session.id);\n await adapter.sendMessage({ sessionId: session.id, content });\n } catch (error) {\n markSendError(error instanceof Error ? error.message : \"send failed\");\n throw error;\n }\n return;\n }\n\n try {\n await adapter.sendMessage({ sessionId, content });\n } catch (error) {\n markSendError(error instanceof Error ? error.message : \"send failed\");\n throw error;\n }\n },\n [adapter, agentId, markSendError, markSending, onSessionChange, sessionId],\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 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","import { useCallback, useEffect, useState } from \"react\";\nimport { AgentChatAdapterProvider } from \"./adapter-context\";\nimport { ChatThread } from \"./components/chat/chat-thread\";\nimport { TooltipProvider } from \"./components/ui/tooltip\";\nimport { WorkspacePanel } from \"./components/workspace/workspace-panel\";\nimport { useAgentChatRuntime } from \"./runtime/use-agent-chat-runtime\";\nimport type {\n AgentChatAdapter,\n AgentChatMessage,\n} from \"./types\";\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\nexport function AgentChat({\n adapter,\n agentId,\n sessionId,\n onSessionChange,\n onFileSelect,\n onMessagesChange,\n disabled,\n}: AgentChatProps) {\n const [workspacePath, setWorkspacePath] = useState<string | null>(null);\n const [workspaceCollapsed, setWorkspaceCollapsed] = useState(false);\n const runtime = useAgentChatRuntime({\n adapter,\n agentId,\n sessionId,\n onSessionChange,\n });\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 className=\"flex flex-1 min-h-0 overflow-hidden bg-background text-sm text-foreground\">\n <div className=\"flex min-w-0 flex-1 flex-col overflow-hidden\">\n <ChatThread\n sessionId={sessionId}\n messages={runtime.messages}\n isRunning={runtime.isRunning}\n isLoadingHistory={runtime.isLoadingHistory}\n onSend={(content) => void runtime.send(content)}\n onStop={() => void runtime.stop()}\n onRetry={runtime.retry}\n onFileSelect={handleFileSelect}\n disabled={disabled}\n tokenUsage={runtime.tokenUsage}\n retryIndicator={runtime.retryIndicator}\n />\n </div>\n <WorkspacePanel\n adapter={adapter}\n sessionId={sessionId}\n selectedPath={workspacePath}\n onSelectedPathChange={setWorkspacePath}\n collapsed={workspaceCollapsed}\n onCollapsedChange={setWorkspaceCollapsed}\n refreshSignal={runtime.workspaceRefreshKey}\n disabled={disabled}\n />\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//\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 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.messageCount ?? 0\n }:${n.toolCallCount ?? 0}:${n.updatedAt}`,\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 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 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 // The stop button is \"Stop sub-agent\" -- only show it on rows that are\n // actually sub-agents (have a parent), not top-level user sessions.\n const isSubAgent = entry.parentId != null;\n const title = entry.title ?? \"New session\";\n const subtitle = [\n entry.model ?? \"default\",\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 && isSubAgent && (\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 sub-agent\"\n title=\"Stop sub-agent\"\n >\n <SquareIcon className=\"w-3 h-3\" fill=\"currentColor\" />\n </button>\n )}\n {canDelete && (\n <button\n type=\"button\"\n className=\"p-1 rounded opacity-0 group-hover:opacity-100 focus-visible:opacity-100 hover:bg-destructive/10 hover:text-destructive disabled:pointer-events-none disabled:opacity-50 transition-all\"\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 <Trash2Icon className=\"w-3 h-3\" />\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"]}