@miiflow/assistant-ui 0.10.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/styled/AttachmentPreview.tsx","../src/styled/Avatar.tsx","../src/styled/ChatContainer.tsx","../src/styled/ComposerToolbar.tsx","../src/styled/LoadingDots.tsx","../src/styled/MarkdownContent.tsx","../src/styled/MediaLightbox.tsx","../src/styled/CitationSources.tsx","../src/styled/ClarificationPanel.tsx","../src/styled/ToolApprovalPanel.tsx","../src/styled/MessageActionBar.tsx","../src/styled/MessageAttachments.tsx","../src/utils/beamer.ts","../src/styled/StatusBadge.tsx","../src/styled/Timeline.tsx","../src/styled/EventContent.tsx","../src/styled/EventTimeline.tsx","../src/styled/TimelineRow.tsx","../src/styled/PlanTimeline.tsx","../src/styled/ReasoningPanel.tsx","../src/styled/StreamingText.tsx","../src/styled/SuggestedActions.tsx","../src/styled/visualizations/ChartVisualization.tsx","../src/styled/visualizations/TableVisualization.tsx","../src/styled/visualizations/CardVisualization.tsx","../src/styled/visualizations/KpiVisualization.tsx","../src/styled/visualizations/CodePreviewVisualization.tsx","../src/styled/visualizations/FormVisualization.tsx","../src/styled/visualizations/registry.ts","../src/styled/visualizations/schemas.ts","../src/styled/visualizations/VisualizationRenderer.tsx","../src/styled/artifacts/ArtifactInlineCard.tsx","../src/styled/artifacts/registry.ts","../src/styled/artifacts/ArtifactList.tsx","../src/utils/inline-markers.ts","../src/hooks/use-streaming-min-height.ts","../src/styled/Message.tsx","../src/styled/MessageComposer.tsx","../src/styled/ScrollToBottomButton.tsx","../src/styled/MessageList.tsx","../src/styled/TimeMarker.tsx","../src/styled/TypingIndicator.tsx","../src/styled/ChatHeader.tsx","../src/styled/ToolStatusIndicator.tsx","../src/styled/ChatLayout.tsx","../src/styled/WelcomeScreen.tsx","../src/styled/subagent/SubagentPanel.tsx"],"names":["getFileIcon","mimeType","ImageIcon","FileText","FileIcon","formatFileSize","bytes","AttachmentPreview","forwardRef","attachment","onRemove","removable","className","ref","Icon","isImage","jsxs","cn","jsx","X","sizeClasses","iconSizes","getRoleIcon","role","size","iconSize","Bot","User","Avatar","name","src","alt","props","ChatContainer","children","GHOST_BUTTON","ComposerToolbar","onAttachClick","disabled","hint","showHint","endSlot","Plus","gapClasses","LoadingDots","dotClass","HIDDEN_CHIP_KINDS","splitTextWithCommandTokens","text","resolve","matches","findInlineCommandTokens","parts","cursor","m","i","resolved","CommandTokenView","processInlineCommandTokens","Children","child","idx","Fragment","isValidElement","type","tagName","childChildren","cloneElement","LANGUAGE_MAP","normalizeLanguage","lang","slugify","CopyButton","copied","setCopied","useState","handleCopy","useCallback","Check","Copy","MarkdownContent","baselineFontSize","darkCodeTheme","useDarkCode","fontStyle","resolveCommandToken","useContext","ChatContext","ReactMarkdown","remarkGfm","id","LinkIcon","href","codeClassName","match","codeText","language","SyntaxHighlighter","oneLight","oneDark","YOUTUBE_ID_RE","extractYouTubeId","url","parseMediaValue","value","fallbackId","medias","raw","refId","hit","isVideo","v","PlayOverlay","label","MediaLightbox","items","index","onClose","onNavigate","active","useEffect","handleKey","e","prevOverflow","ytId","hasMany","overlay","createPortal","useMediaLightbox","setIndex","open","close","navigate","direction","current","getSourceTypeDisplay","sourceType","CitationSources","sources","selectedSource","setSelectedSource","showAll","setShowAll","MAX_VISIBLE","visibleSources","hiddenCount","source","typeDisplay","SourceDetailModal","AnimatePresence","motion","ExternalLink","InlineCitation","resolveQuestions","c","q","resolveSelected","picked","typed","t","buildStructuredAnswers","questions","selections","freeText","formatAnswer","ans","ClarificationPanel","clarification","onSubmit","onOptionSelect","loading","answer","useMemo","setSelections","setFreeText","activeTab","setActiveTab","isAnswered","advanceTimer","useRef","advanceFrom","from","sel","toggle","qIndex","option","multi","prev","next","o","updated","allAnswered","_","submit","structured","ChevronDown","accent","multiQuestion","renderQuestion","qi","HelpCircle","oi","selected","isActive","isDone","ChevronLeft","ChevronRight","Send","INLINE_STRING_LIMIT","formatPrimitive","isPrimitive","ValueCell","expanded","setExpanded","pretty","DefaultAllowButton","onClick","DefaultRejectButton","DefaultGhostButton","DefaultSendButton","DefaultChatInput","onChange","onCancel","placeholder","autoFocus","INLINE_CHIP_LIMIT","INLINE_CHIP_VALUE_MAX","formatChipValue","ToolApprovalPanel","approval","onApprove","onReject","slots","mode","setMode","chatInput","setChatInput","detailsOpen","setDetailsOpen","handleAllow","handleReject","handleChatSubmit","handleChatCancel","onKeyDown","target","tag","summary","toolIdentity","inputEntries","key","inlineChips","AllowButton","RejectButton","SendButton","CancelButton","ChatInput","FEEDBACK_CATEGORIES","MessageActionBar","textContent","onRegenerate","onEdit","onReportIncorrect","onConfirmCorrect","feedbackState","setFeedbackState","feedbackOpen","setFeedbackOpen","selectedCategory","setSelectedCategory","details","setDetails","handleDismissFeedback","handleSubmitFeedback","trimmed","reason","textarea","FEEDBACK_MODAL_CSS","cat","MessageAttachments","attachments","onDownload","onPreview","lightboxUrl","setLightboxUrl","handleDownload","link","handlePreview","AttachmentCard","sizeLabel","FileTypeIcon","Download","Video","k","sizes","KEYFRAME_STYLE_ID","KEYFRAME_CONTENT","injectBeamerKeyframes","el","root","container","existing","style","StatusBadge","status","kind","haloSize","isSubagent","isTool","spacingFor","Timeline","badgeSize","containerRef","railCenter","item","isLast","showFlow","bottomPad","TimelineItem","itemRef","ToolCallMark","MONO_STACK","TEXT_SHIMMER_STYLE","DurationTrail","seconds","maxSeconds","fraction","EventContent","event","isRunning","maxDurationSeconds","hasDuration","description","hasDescription","accentVar","data","nestedEvents","convertChunkToEvent","SubagentChip","slug","durationSeconds","isFailed","defaultExpanded","isExpanded","setIsExpanded","hasNested","showCaret","handleColor","EventTimeline","INTERNAL_TOOLS","isInternalTool","toolName","chunk","isComplete","convertTimelineToEvents","timeline","events","eventTimestamps","ts","thought","tool","cur","diff","eventKind","max","timelineItems","TimelineRow","hideChevron","showChevron","convertChunksToEvents","chunks","SubtaskContent","subtask","executionChunks","isCompleted","PlanTimeline","plan","streamingChunks","subtaskChunks","useLiveStreamDuration","isStreaming","startTimeRef","elapsed","setElapsed","finalSecondsRef","interval","secs","hasSubagentChunks","convertTimelineToChunks","formatDuration","HeaderIndicator","justCompleted","ReasoningPanel","executionTimeline","userMessageTimestamp","executionTime","controlledExpanded","onExpandedChange","localExpanded","setLocalExpanded","liveElapsed","wallClockSeconds","prevStreamingRef","setJustCompleted","justFinished","lockScroll","useScrollLock","streamingEvents","completedEvents","completedChunks","totalExecutionTime","sum","st","lastEvent","firstEvent","summaryPreview","toolCount","visit","lower","hasContent","lastChunk","hasSubagent","getLiveLabel","lastToolName","lastIsInternal","completedDuration","showPlanTimeline","StreamingText","content","renderMarkdown","markdownProps","ACTION_ICONS","Navigation","Mail","Search","Zap","getActionIcon","ArrowRight","SuggestedActions","actions","onSelect","showIcons","loadingIndex","setLoadingIndex","handleAction","action","isLoading","isDisabled","Loader2","DEFAULT_COLORS","ChartVisualization","config","chartType","series","xAxis","yAxis","colors","height","showLegend","showGrid","showTooltip","animate","stacked","chartData","dataMap","s","point","xVal","commonProps","axisStyle","tooltipStyle","ResponsiveContainer","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","Legend","Line","BarChart","Bar","AreaChart","Area","PieChart","Pie","percent","Cell","ScatterChart","Scatter","p","_NOWRAP_TYPES","_cellToText","CellHoverPopover","anchorRect","onEnter","onLeave","VIEWPORT_MARGIN","POPOVER_MAX_WIDTH","spaceBelow","placeBelow","left","CopyIcon","MediaCell","onOpen","ytMatch","posterSrc","badgeColors","formatCellValue","column","strValue","colorClass","numValue","descendingComparator","a","b","orderBy","aValue","bValue","TableVisualization","columns","rows","sortable","paginated","pageSize","order","setOrder","setOrderBy","page","setPage","handleRequestSort","processedRows","sorted","totalPages","mediaIndex","lookup","mediaColumns","row","rowIdx","col","cell","parsed","lightboxIndex","openLightbox","closeLightbox","navigateLightbox","hoveredCell","setHoveredCell","showTimerRef","hideTimerRef","cancelShowTimer","cancelHideTimer","scheduleShow","colKey","rect","scheduleHide","keepOpen","hoveredCol","hoveredText","ChevronUp","nowrap","cellText","CardVisualization","onAction","subtitle","imageUrl","sections","collapsible","initiallyCollapsed","handleActionClick","renderSection","section","itemIdx","mainContent","BENTO_PALETTE","paletteForIndex","KpiMetricCard","metric","color","trendIcon","ArrowUp","ArrowDown","Minus","trendColor","sparklineData","KpiBentoCard","isHero","palette","showSparkline","TrendIcon","trendPillColor","showTrend","pickHeroIndex","metrics","explicit","KpiBentoLayout","heroIdx","hero","satellites","satCount","satCols","KpiVisualization","layout","isGrid","CodePreviewVisualization","code","lineNumbers","highlightLines","startLine","normalizedLanguage","timer","lineNumber","FormVisualization","fields","submitAction","submitButtonText","cancelButtonText","formData","setFormData","initial","field","errors","setErrors","submitted","setSubmitted","handleChange","validate","newErrors","min","pattern","message","handleSubmit","handleCancel","inputClass","errorClass","renderField","hasError","opt","REGISTRY_KEY","registry","registerVisualization","entry","getVisualization","getRegisteredTypes","registerBuiltinSchemas","schemas","schema","chartSeriesSchema","z","chartAxisSchema","chartVisualizationSchema","tableColumnSchema","tableVisualizationSchema","cardSectionSchema","cardActionSchema","cardVisualizationSchema","kpiMetricSchema","kpiVisualizationSchema","codePreviewVisualizationSchema","formFieldSchema","formVisualizationSchema","VisualizationRenderer","title","vizData","AlertCircle","result","issues","issue","Component","ArtifactInlineCard","artifact","isPending","registerArtifact","getArtifact","getRegisteredArtifactTypes","ArtifactList","artifacts","Card","INLINE_MARKER_REGEX","parseContentWithInlineMarkers","lastIndex","markerType","UNMEASURABLE_PATTERNS","isMeasurable","re","useStreamingMinHeight","minHeight","setMinHeight","cancelled","measure","width","measureMessageHeight","ro","LazyYouTubeEmbed","altText","loaded","setLoaded","posterUrl","LazyHtmlVideo","MediaGridTile","media","Message","viewerRole","showAvatar","showTimestamp","reasoning","executionPlan","suggestedActions","onSuggestedAction","reasoningExpanded","onReasoningExpandedChange","citations","visualizations","onArtifactOpen","pendingClarification","onClarificationSubmit","pendingToolApproval","onToolApprove","onToolReject","renderInlineSuggestedAction","onEditSubmit","onVisualizationAction","isEditing","setIsEditing","participantRole","viewerRoleLower","isViewer","isAssistant","reasoningChunks","hasReasoningChunks","hasCompletedReasoning","hasReasoning","isWaitingForContent","hasAttachments","vizMap","map","viz","hasInlineMarkers","contentParts","cleanTextContent","renderContent","renderedVizIds","part","filteredMedias","renderMediaItems","wasStreamingRef","showFadeIn","bubbleRef","streamingMinHeight","UserMessageEditor","newText","MessageContent","unreferenced","MessageTimestamp","initialText","draft","setDraft","textareaRef","canSubmit","resize","createdAt","dateString","MAX_FILE_SIZE","ALLOWED_IMAGE_TYPES","ALLOWED_DOCUMENT_TYPES","ALLOWED_VIDEO_TYPES","DEFAULT_ALLOWED_TYPES","validateFile","file","allowedTypes","maxSize","AttachmentBar","att","isError","isUploading","Image","MessageComposer","onAttach","onUploadFile","onRemoveUploadedAttachment","supportsAttachments","allowedFileTypes","maxFileSize","isSubmitting","centered","onStopStreaming","commandProvider","commandProviders","hasText","setHasText","setAttachments","isDragOver","setIsDragOver","fileInputRef","inputRef","dragCounterRef","isSubmittingRef","isSubmitDisabled","isAnyUploading","uploadedIds","processFiles","files","newAttachments","error","attachmentId","err","submitWithText","rawFiles","savedAttachments","handleSendButtonClick","handleFileSelect","handlePaste","clipboardData","handleRemoveAttachment","removed","handleDragEnter","handleDragLeave","handleDragOver","handleDrop","LexicalChatInput","Square","ScrollToBottomButton","isAtBottom","onScrollToBottom","MASK","ScrollToEndControl","end","useMessageScrollerScrollable","scrollToEnd","useMessageScroller","MessageList","autoScroll","showScrollToBottom","MessageScroller","TimeMarker","TypingIndicator","ChatHeader","logo","showClose","menuOpen","setMenuOpen","menuRef","buttonRef","handleClickOutside","path","MoreVertical","ToolStatusIndicator","StatusIcon","ChatLayout","isEmpty","header","welcomeScreen","messageList","composer","footer","useRotatingPlaceholder","placeholders","intervalMs","intervalRef","start","handleVisibility","DefaultInput","setFiles","removeFile","SuggestionPill","WelcomeScreen","suggestions","onSuggestionClick","welcomeText","composerSlot","assistantAvatar","assistantName","handleSuggestionClick","msg","humanizeHandle","handle","w","SubagentPanel"],"mappings":"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","file":"chunk-HYFMOOLH.js","sourcesContent":["import { forwardRef } from \"react\";\nimport { X, FileText, Image as ImageIcon, File as FileIcon } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport type { Attachment } from \"../types\";\n\nexport interface AttachmentPreviewProps {\n /** The attachment to preview */\n attachment: Attachment;\n /** Callback when remove button is clicked */\n onRemove?: () => void;\n /** Whether removal is allowed */\n removable?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nfunction getFileIcon(mimeType: string) {\n if (mimeType.startsWith(\"image/\")) {\n return ImageIcon;\n }\n if (\n mimeType === \"application/pdf\" ||\n mimeType.startsWith(\"text/\")\n ) {\n return FileText;\n }\n return FileIcon;\n}\n\nfunction 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 * Styled attachment preview card.\n */\nexport const AttachmentPreview = forwardRef<HTMLDivElement, AttachmentPreviewProps>(\n ({ attachment, onRemove, removable = true, className }, ref) => {\n const Icon = getFileIcon(attachment.mimeType);\n const isImage = attachment.mimeType.startsWith(\"image/\");\n\n return (\n <div\n ref={ref}\n className={cn(\n \"relative group\",\n \"flex items-center gap-2\",\n \"p-2 rounded-lg\",\n \"border border-chat-border\",\n \"bg-chat-panel-bg\",\n className\n )}\n >\n {/* Preview or Icon */}\n <div\n className={cn(\n \"w-10 h-10 rounded\",\n \"flex items-center justify-center\",\n \"bg-gray-100 dark:bg-gray-800\",\n \"overflow-hidden flex-shrink-0\"\n )}\n >\n {isImage && attachment.previewUrl ? (\n <img\n src={attachment.previewUrl}\n alt={attachment.filename}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <Icon className=\"w-5 h-5 text-chat-subtle\" />\n )}\n </div>\n\n {/* File info */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate text-chat-text\">\n {attachment.filename}\n </p>\n <p className=\"text-xs text-chat-subtle\">\n {formatFileSize(attachment.size)}\n </p>\n </div>\n\n {/* Remove button */}\n {removable && onRemove && (\n <button\n type=\"button\"\n onClick={onRemove}\n className={cn(\n \"absolute -top-1.5 -right-1.5\",\n \"w-5 h-5 rounded-full\",\n \"flex items-center justify-center\",\n \"bg-gray-500 text-white\",\n \"opacity-0 group-hover:opacity-100\",\n \"hover:bg-gray-600\",\n \"transition-opacity duration-200\"\n )}\n aria-label={`Remove ${attachment.filename}`}\n >\n <X className=\"w-3 h-3\" />\n </button>\n )}\n </div>\n );\n }\n);\n\nAttachmentPreview.displayName = \"AttachmentPreview\";\n","import { forwardRef } from \"react\";\nimport { Bot, User } from \"lucide-react\";\nimport { Avatar as AvatarPrimitive, type AvatarProps as AvatarPrimitiveProps } from \"../primitives\";\nimport { cn } from \"../utils/cn\";\nimport type { ParticipantRole } from \"../types\";\n\nexport interface AvatarProps extends Omit<AvatarPrimitiveProps, \"fallback\"> {\n /** Size variant */\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst sizeClasses = {\n sm: \"w-6 h-6 text-xs\",\n md: \"w-8 h-8 text-sm\",\n lg: \"w-10 h-10 text-base\",\n};\n\nconst iconSizes = {\n sm: 14,\n md: 16,\n lg: 20,\n};\n\nfunction getRoleIcon(role: ParticipantRole | undefined, size: \"sm\" | \"md\" | \"lg\") {\n const iconSize = iconSizes[size];\n\n switch (role) {\n case \"assistant\":\n return <Bot size={iconSize} />;\n case \"user\":\n return <User size={iconSize} />;\n default:\n return <User size={iconSize} />;\n }\n}\n\n/**\n * Styled Avatar component with role-based icons.\n */\nexport const Avatar = forwardRef<HTMLDivElement, AvatarProps>(\n ({ name, src, alt, role, size = \"md\", className, ...props }, ref) => {\n return (\n <AvatarPrimitive\n ref={ref}\n name={name}\n src={src}\n alt={alt}\n role={role}\n className={cn(\n \"rounded-full overflow-hidden flex-shrink-0\",\n \"flex items-center justify-center\",\n \"font-medium\",\n role === \"assistant\"\n ? \"bg-primary/10 text-primary\"\n : \"bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-300\",\n sizeClasses[size],\n className\n )}\n fallback={getRoleIcon(role, size)}\n {...props}\n />\n );\n }\n);\n\nAvatar.displayName = \"Avatar\";\n","import { forwardRef, type ReactNode, type HTMLAttributes } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface ChatContainerProps extends HTMLAttributes<HTMLDivElement> {\n /** Children to render */\n children: ReactNode;\n}\n\n/**\n * Styled container for the chat interface.\n * Provides flex layout and base styling.\n */\nexport const ChatContainer = forwardRef<HTMLDivElement, ChatContainerProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col h-full\",\n \"bg-white dark:bg-gray-900\",\n \"font-sans text-chat-text\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nChatContainer.displayName = \"ChatContainer\";\n","import { Plus } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nconst GHOST_BUTTON = cn(\n\t\"flex-shrink-0 rounded-lg flex items-center justify-center\",\n\t\"text-[var(--chat-text-subtle,rgba(0,0,0,0.5))]\",\n\t\"hover:bg-[var(--chat-panel-bg,rgba(0,0,0,0.02))] hover:text-[var(--chat-text,#1d2033)]\",\n\t\"disabled:opacity-40 disabled:cursor-not-allowed\",\n\t\"transition-colors duration-150\",\n);\n\n/**\n * Bottom toolbar row for composers: attach button, an Enter-to-send hint that\n * fades in while the composer is focused (requires `group` on the shell), and\n * a trailing slot for the send/stop button.\n */\nexport function ComposerToolbar({\n\tonAttachClick,\n\tdisabled,\n\thint = \"Enter to send\",\n\tshowHint = true,\n\tendSlot,\n\tclassName,\n}: {\n\t/** Renders the \"+\" attach button when provided. */\n\tonAttachClick?: () => void;\n\tdisabled?: boolean;\n\t/** Keyboard hint shown while focused. Pass showHint={false} to hide. */\n\thint?: string;\n\tshowHint?: boolean;\n\t/** Send / stop button. */\n\tendSlot?: ReactNode;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div className={cn(\"flex items-center gap-1 min-w-0\", className)}>\n\t\t\t{onAttachClick && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttitle=\"Attach files\"\n\t\t\t\t\taria-label=\"Attach files\"\n\t\t\t\t\tonClick={onAttachClick}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tclassName={cn(GHOST_BUTTON, \"w-7 h-7\")}>\n\t\t\t\t\t<Plus size={16} />\n\t\t\t\t</button>\n\t\t\t)}\n\n\t\t\t<div className=\"flex-1 min-w-0\" />\n\n\t\t\t{showHint && (\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"hidden sm:block flex-shrink-0 mr-1.5 text-[11px] select-none\",\n\t\t\t\t\t\t\"text-[var(--chat-placeholder,rgba(0,0,0,0.4))]\",\n\t\t\t\t\t\t\"opacity-0 group-focus-within:opacity-100 transition-opacity duration-200\",\n\t\t\t\t\t)}>\n\t\t\t\t\t{hint}\n\t\t\t\t</span>\n\t\t\t)}\n\n\t\t\t{endSlot}\n\t\t</div>\n\t);\n}\n","import { cn } from \"../utils/cn\";\n\nexport interface LoadingDotsProps {\n\t/** Size variant */\n\tsize?: \"small\" | \"medium\" | \"large\";\n\t/** Additional CSS classes */\n\tclassName?: string;\n}\n\nconst sizeClasses = {\n\tsmall: \"w-1.5 h-1.5\",\n\tmedium: \"w-2 h-2\",\n\tlarge: \"w-2.5 h-2.5\",\n};\n\nconst gapClasses = {\n\tsmall: \"gap-1\",\n\tmedium: \"gap-1.5\",\n\tlarge: \"gap-2\",\n};\n\n/**\n * Animated loading dots indicator\n */\nexport function LoadingDots({ size = \"medium\", className }: LoadingDotsProps) {\n\tconst dotClass = sizeClasses[size];\n\n\treturn (\n\t\t<div className={cn(\"flex items-center\", gapClasses[size], className)}>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\tdotClass,\n\t\t\t\t\t\"rounded-full bg-[var(--chat-text-subtle)]\",\n\t\t\t\t\t\"animate-loading-dot animate-loading-dot-1\"\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\tdotClass,\n\t\t\t\t\t\"rounded-full bg-[var(--chat-text-subtle)]\",\n\t\t\t\t\t\"animate-loading-dot animate-loading-dot-2\"\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\tdotClass,\n\t\t\t\t\t\"rounded-full bg-[var(--chat-text-subtle)]\",\n\t\t\t\t\t\"animate-loading-dot animate-loading-dot-3\"\n\t\t\t\t)}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","import { Children, Fragment, isValidElement, cloneElement, useContext, useState, useCallback, type ReactNode } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport { Prism as SyntaxHighlighter } from \"react-syntax-highlighter\";\nimport { oneDark, oneLight } from \"react-syntax-highlighter/dist/esm/styles/prism\";\nimport { Check, Copy, Link as LinkIcon } from \"lucide-react\";\nimport { CommandTokenView } from \"../composer/CommandTokenView\";\nimport { findInlineCommandTokens } from \"../composer/CommandTokenNode\";\nimport { ChatContext } from \"../context/ChatProvider\";\nimport { cn } from \"../utils/cn\";\n\ntype CommandTokenResolver = (\n id: string,\n kind: string,\n) => { label?: string; tag?: ReactNode } | undefined;\n\n// Chip kinds that are routing/behavior signals — not content. We strip them\n// from the rendered message so the bubble shows the user's words, not the\n// scaffolding.\n//\n// Visible kinds (ad-account, guideline) describe the scope or reference\n// material attached to the question — that's meaningful context the user\n// wants to see in their own bubble after sending.\nconst HIDDEN_CHIP_KINDS = new Set<string>([\"mode\", \"skill\"]);\n\nfunction splitTextWithCommandTokens(\n text: string,\n resolve?: CommandTokenResolver,\n): ReactNode[] {\n const matches = findInlineCommandTokens(text);\n if (matches.length === 0) return [text];\n const parts: ReactNode[] = [];\n let cursor = 0;\n matches.forEach((m, i) => {\n if (m.index > cursor) parts.push(text.slice(cursor, m.index));\n if (HIDDEN_CHIP_KINDS.has(m.kind)) {\n // Skip emitting a chip. Also consume one trailing space so we don't\n // leave a double-space (\"hello world\") where the chip used to sit.\n cursor = m.endIndex;\n if (text[cursor] === \" \") cursor += 1;\n return;\n }\n const resolved = resolve?.(m.id, m.kind);\n parts.push(\n <CommandTokenView\n key={`tok-${i}`}\n id={m.id}\n kind={m.kind}\n label={resolved?.label}\n tag={resolved?.tag}\n variant=\"chip\"\n />,\n );\n cursor = m.endIndex;\n });\n if (cursor < text.length) parts.push(text.slice(cursor));\n return parts;\n}\n\n/**\n * Recursively walk children of a markdown-rendered element, splitting any\n * string descendants on `/id:kind` matches and replacing matches with\n * `CommandTokenChip`. Non-text children (e.g. <code>, <a>, <strong>) are\n * preserved as-is so markdown formatting still works.\n */\nfunction processInlineCommandTokens(\n children: ReactNode,\n resolve?: CommandTokenResolver,\n): ReactNode {\n return Children.map(children, (child, idx) => {\n if (typeof child === \"string\") {\n const parts = splitTextWithCommandTokens(child, resolve);\n if (parts.length === 1 && parts[0] === child) return child;\n return <Fragment key={`text-${idx}`}>{parts}</Fragment>;\n }\n if (isValidElement(child)) {\n // Don't descend into code spans / pre — tokens inside literal code\n // should render verbatim.\n const type = child.type as { name?: string; displayName?: string } | string | undefined;\n const tagName = typeof type === \"string\" ? type : undefined;\n if (tagName === \"code\" || tagName === \"pre\") return child;\n const childChildren = (child.props as { children?: ReactNode }).children;\n if (childChildren == null) return child;\n return cloneElement(child, undefined, processInlineCommandTokens(childChildren, resolve));\n }\n return child;\n });\n}\n\n// Language alias mapping\nconst LANGUAGE_MAP: Record<string, string> = {\n js: \"javascript\",\n ts: \"typescript\",\n jsx: \"jsx\",\n tsx: \"tsx\",\n py: \"python\",\n rb: \"ruby\",\n rs: \"rust\",\n go: \"go\",\n java: \"java\",\n cpp: \"cpp\",\n c: \"c\",\n cs: \"csharp\",\n swift: \"swift\",\n kt: \"kotlin\",\n php: \"php\",\n sql: \"sql\",\n sh: \"bash\",\n bash: \"bash\",\n zsh: \"bash\",\n shell: \"bash\",\n html: \"html\",\n css: \"css\",\n scss: \"scss\",\n json: \"json\",\n yaml: \"yaml\",\n yml: \"yaml\",\n xml: \"xml\",\n md: \"markdown\",\n graphql: \"graphql\",\n dockerfile: \"docker\",\n toml: \"toml\",\n};\n\nfunction normalizeLanguage(lang: string): string {\n return LANGUAGE_MAP[lang.toLowerCase()] || lang.toLowerCase();\n}\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .trim();\n}\n\nfunction CopyButton({ text }: { text: string }) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback: noop\n }\n }, [text]);\n\n return (\n <button\n onClick={handleCopy}\n className=\"flex items-center gap-1 px-2 py-1 text-xs rounded hover:bg-white/10 transition-colors text-gray-400 hover:text-gray-200\"\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n >\n {copied ? <Check size={14} /> : <Copy size={14} />}\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n );\n}\n\nexport interface MarkdownContentProps {\n /** Markdown content to render */\n children: string;\n /** Additional CSS classes */\n className?: string;\n /** Base font size multiplier for responsive scaling */\n baselineFontSize?: number;\n /** Use dark theme for code blocks */\n darkCodeTheme?: boolean;\n}\n\n/**\n * Styled markdown renderer with syntax highlighting, copy-to-clipboard,\n * and heading anchor links.\n */\nexport function MarkdownContent({\n children,\n className,\n baselineFontSize,\n darkCodeTheme,\n}: MarkdownContentProps) {\n // Detect dark mode from CSS if not explicitly set\n const useDarkCode = darkCodeTheme ??\n (typeof window !== \"undefined\" && window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches);\n\n // Apply whenever a baseline is provided — even 1 (16px). Without the\n // inline style the text inherits the host font (e.g. MUI body1 at\n // 0.875rem), so an explicit baseline must always win.\n const fontStyle = baselineFontSize != null\n ? { fontSize: `${baselineFontSize}rem` }\n : undefined;\n\n // Optional chip resolver from ChatProvider. Used to swap chip ids like\n // `ad_acct_…` for the human-friendly account name and platform logo at\n // render time — the wire format only carries `<id>:<kind>`. Undefined\n // outside a chat context (e.g. MarkdownContent inside a card\n // visualization).\n const resolveCommandToken = useContext(ChatContext)?.resolveCommandToken;\n\n return (\n <ReactMarkdown\n className={cn(\"chat-prose\", className)}\n remarkPlugins={[remarkGfm]}\n components={{\n h1: ({ children }) => {\n const text = String(children);\n const id = slugify(text);\n return (\n <h1 id={id} className=\"group text-xl font-semibold mt-4 mb-2 first:mt-0\" style={fontStyle}>\n {children}\n <a href={`#${id}`} className=\"ml-2 opacity-0 group-hover:opacity-50 transition-opacity\" aria-label=\"Link to heading\">\n <LinkIcon size={16} className=\"inline\" />\n </a>\n </h1>\n );\n },\n h2: ({ children }) => {\n const text = String(children);\n const id = slugify(text);\n return (\n <h2 id={id} className=\"group text-lg font-semibold mt-3 mb-2 first:mt-0\" style={fontStyle}>\n {children}\n <a href={`#${id}`} className=\"ml-2 opacity-0 group-hover:opacity-50 transition-opacity\" aria-label=\"Link to heading\">\n <LinkIcon size={14} className=\"inline\" />\n </a>\n </h2>\n );\n },\n h3: ({ children }) => {\n const text = String(children);\n const id = slugify(text);\n return (\n <h3 id={id} className=\"group text-base font-medium mt-2 mb-1 first:mt-0\" style={fontStyle}>\n {children}\n <a href={`#${id}`} className=\"ml-2 opacity-0 group-hover:opacity-50 transition-opacity\" aria-label=\"Link to heading\">\n <LinkIcon size={12} className=\"inline\" />\n </a>\n </h3>\n );\n },\n h4: ({ children }) => (\n <h4 className=\"text-base font-medium mt-2 mb-1 first:mt-0\" style={fontStyle}>{processInlineCommandTokens(children, resolveCommandToken)}</h4>\n ),\n p: ({ children }) => (\n <p className=\"mb-2 last:mb-0 leading-relaxed\" style={fontStyle}>{processInlineCommandTokens(children, resolveCommandToken)}</p>\n ),\n a: ({ href, children }) => {\n const isImageUrl = href && /\\.(png|jpe?g|gif|webp|svg)([?#]|$)/i.test(href);\n if (isImageUrl) {\n return (\n <img\n src={href}\n alt={typeof children === \"string\" ? children : \"\"}\n className=\"max-w-full h-auto rounded-lg my-2\"\n loading=\"lazy\"\n />\n );\n }\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary underline hover:opacity-80 transition-opacity\"\n style={fontStyle}\n >\n {children}\n </a>\n );\n },\n ul: ({ children }) => (\n <ul className=\"list-disc pl-4 mb-2 space-y-1\">{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className=\"list-decimal pl-4 mb-2 space-y-1\">{children}</ol>\n ),\n li: ({ children }) => <li className=\"leading-relaxed\" style={fontStyle}>{processInlineCommandTokens(children, resolveCommandToken)}</li>,\n blockquote: ({ children }) => (\n <blockquote className=\"border-l-2 border-gray-300 dark:border-gray-600 pl-3 my-2 italic text-chat-subtle\" style={fontStyle}>\n {processInlineCommandTokens(children, resolveCommandToken)}\n </blockquote>\n ),\n code: ({ className: codeClassName, children }) => {\n const match = /language-(\\w+)/.exec(codeClassName || \"\");\n const codeText = String(children).replace(/\\n$/, \"\");\n const isInline = !match && !codeText.includes(\"\\n\");\n\n if (isInline) {\n return (\n <code className=\"bg-gray-100 dark:bg-gray-800 px-1.5 py-0.5 rounded text-sm font-mono\" style={fontStyle}>\n {children}\n </code>\n );\n }\n\n const language = match ? normalizeLanguage(match[1]) : \"text\";\n\n return (\n <div className=\"relative group my-2 rounded-lg overflow-hidden border border-gray-200 dark:border-gray-700\">\n {/* Header with language badge and copy button */}\n <div className=\"flex items-center justify-between px-3 py-1.5 bg-gray-800 dark:bg-gray-900 border-b border-gray-700\">\n <span className=\"text-xs font-mono text-gray-400\">{language}</span>\n <CopyButton text={codeText} />\n </div>\n <SyntaxHighlighter\n language={language}\n style={useDarkCode === false ? oneLight : oneDark}\n customStyle={{\n margin: 0,\n borderRadius: 0,\n fontSize: \"0.8125rem\",\n lineHeight: \"1.6\",\n }}\n codeTagProps={{\n style: { fontFamily: \"'Fira Code', 'JetBrains Mono', monospace\" },\n }}\n >\n {codeText}\n </SyntaxHighlighter>\n </div>\n );\n },\n pre: ({ children }) => <>{children}</>,\n table: ({ children }) => (\n <div className=\"overflow-x-auto my-2 rounded-lg border border-gray-200 dark:border-gray-700\">\n <table className=\"min-w-full\">\n {children}\n </table>\n </div>\n ),\n thead: ({ children }) => (\n <thead className=\"bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700\">{children}</thead>\n ),\n th: ({ children }) => (\n <th className=\"px-3 py-2 text-left text-sm font-medium\" style={fontStyle}>\n {processInlineCommandTokens(children, resolveCommandToken)}\n </th>\n ),\n td: ({ children }) => (\n <td className=\"px-3 py-2 text-sm border-t border-gray-100 dark:border-gray-700\" style={fontStyle}>\n {processInlineCommandTokens(children, resolveCommandToken)}\n </td>\n ),\n hr: () => <hr className=\"my-4 border-gray-200 dark:border-gray-700\" />,\n strong: ({ children }) => (\n <strong className=\"font-semibold\">{children}</strong>\n ),\n em: ({ children }) => <em className=\"italic\">{children}</em>,\n img: ({ src, alt }) => (\n <img\n src={src}\n alt={alt ?? \"\"}\n className=\"max-w-full h-auto rounded-lg my-2\"\n loading=\"lazy\"\n />\n ),\n }}\n >\n {children}\n </ReactMarkdown>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../utils/cn\";\n\n// ── Shared media types + helpers ─────────────────────────────────────\n\nexport interface MediaItem {\n\tid: string;\n\turl: string;\n\tmediaType: string;\n\taltText?: string;\n}\n\nexport const YOUTUBE_ID_RE =\n\t/(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/|youtube\\.com\\/embed\\/)([A-Za-z0-9_-]{11})/;\n\nexport const extractYouTubeId = (url: string): string | null => {\n\tconst m = url.match(YOUTUBE_ID_RE);\n\treturn m ? m[1] : null;\n};\n\n/** Parse a table cell / MediaResult-shaped value into a MediaItem.\n *\n * Strings prefixed with `media_ref:<id>` are resolved against the optional\n * `medias` lookup (the message-level media bag emitted alongside tool\n * results). This lets tool outputs reference full media records by id\n * without inlining URLs into every cell.\n */\nexport function parseMediaValue(\n\tvalue: unknown,\n\tfallbackId: string,\n\tmedias?: ReadonlyArray<{\n\t\tid: string;\n\t\turl: string;\n\t\tmediaType?: string;\n\t\taltText?: string;\n\t}>,\n): MediaItem | null {\n\tif (typeof value === \"string\") {\n\t\tconst raw = value.trim();\n\t\tif (!raw) return null;\n\t\tif (raw.startsWith(\"media_ref:\") && medias && medias.length > 0) {\n\t\t\tconst refId = raw.slice(\"media_ref:\".length);\n\t\t\tconst hit = medias.find((m) => m.id === refId);\n\t\t\tif (!hit) return null;\n\t\t\treturn {\n\t\t\t\tid: hit.id,\n\t\t\t\turl: hit.url,\n\t\t\t\tmediaType:\n\t\t\t\t\thit.mediaType ||\n\t\t\t\t\t(YOUTUBE_ID_RE.test(hit.url) ||\n\t\t\t\t\t/\\.(mp4|mov|webm|m4v|mkv)(\\?|$)/i.test(hit.url)\n\t\t\t\t\t\t? \"video\"\n\t\t\t\t\t\t: \"image\"),\n\t\t\t\taltText: hit.altText,\n\t\t\t};\n\t\t}\n\t\tconst url = raw;\n\t\tconst isVideo =\n\t\t\tYOUTUBE_ID_RE.test(url) || /\\.(mp4|mov|webm|m4v|mkv)(\\?|$)/i.test(url);\n\t\treturn {\n\t\t\tid: fallbackId,\n\t\t\turl,\n\t\t\tmediaType: isVideo ? \"video\" : \"image\",\n\t\t};\n\t}\n\tif (value && typeof value === \"object\") {\n\t\tconst v = value as Record<string, unknown>;\n\t\tconst url = (v.url || v.image_url || v.video_url) as string | undefined;\n\t\tif (!url || typeof url !== \"string\") return null;\n\t\tconst type = (v.media_type || v.mediaType || v.type) as\n\t\t\t| string\n\t\t\t| undefined;\n\t\tconst alt = (v.alt || v.alt_text || v.altText) as string | undefined;\n\t\tconst id = ((v.id as string) || fallbackId) as string;\n\t\treturn {\n\t\t\tid,\n\t\t\turl,\n\t\t\tmediaType:\n\t\t\t\ttype ||\n\t\t\t\t(YOUTUBE_ID_RE.test(url) || /\\.(mp4|mov|webm|m4v|mkv)(\\?|$)/i.test(url)\n\t\t\t\t\t? \"video\"\n\t\t\t\t\t: \"image\"),\n\t\t\taltText: alt,\n\t\t};\n\t}\n\treturn null;\n}\n\n// ── Play overlay shared by grid tile + inline video preview ──────────\n\nexport const PlayOverlay = ({ label }: { label: string }) => (\n\t<div\n\t\tclassName={cn(\n\t\t\t\"absolute inset-0 flex cursor-pointer items-center justify-center\",\n\t\t\t\"bg-black/20 transition-colors hover:bg-black/35\",\n\t\t)}\n\t\taria-label={label}\n\t>\n\t\t<div className=\"flex h-14 w-14 items-center justify-center rounded-full bg-black/55 shadow-lg\">\n\t\t\t<svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"white\" aria-hidden=\"true\">\n\t\t\t\t<path d=\"M8 5v14l11-7z\" />\n\t\t\t</svg>\n\t\t</div>\n\t</div>\n);\n\n// ── Lightbox ──────────────────────────────────────────────────────────\n\nexport interface MediaLightboxProps {\n\titems: MediaItem[];\n\tindex: number;\n\tonClose: () => void;\n\tonNavigate: (direction: -1 | 1) => void;\n}\n\n/**\n * Viewport-level lightbox for images/videos. Rendered via createPortal into\n * document.body so it escapes transformed ancestors (common in chat scroll\n * containers) and anchors to the real viewport.\n *\n * Keyboard: Esc closes, ArrowLeft/ArrowRight navigate between items.\n * Click outside the media closes; clicks on the media itself do not.\n * Body scroll is locked while open.\n */\nexport function MediaLightbox({\n\titems,\n\tindex,\n\tonClose,\n\tonNavigate,\n}: MediaLightboxProps) {\n\tconst active = items[index];\n\n\tuseEffect(() => {\n\t\tconst handleKey = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") onClose();\n\t\t\telse if (e.key === \"ArrowLeft\") onNavigate(-1);\n\t\t\telse if (e.key === \"ArrowRight\") onNavigate(1);\n\t\t};\n\t\twindow.addEventListener(\"keydown\", handleKey);\n\n\t\tconst prevOverflow =\n\t\t\ttypeof document !== \"undefined\" ? document.body.style.overflow : \"\";\n\t\tif (typeof document !== \"undefined\") {\n\t\t\tdocument.body.style.overflow = \"hidden\";\n\t\t}\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"keydown\", handleKey);\n\t\t\tif (typeof document !== \"undefined\") {\n\t\t\t\tdocument.body.style.overflow = prevOverflow;\n\t\t\t}\n\t\t};\n\t}, [onClose, onNavigate]);\n\n\tif (!active) return null;\n\tif (typeof document === \"undefined\") return null;\n\n\tconst ytId = active.mediaType === \"video\" ? extractYouTubeId(active.url) : null;\n\tconst hasMany = items.length > 1;\n\n\tconst overlay = (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed inset-0 z-[9999] flex items-center justify-center\",\n\t\t\t\t\"bg-black/85 backdrop-blur-sm\",\n\t\t\t)}\n\t\t\trole=\"dialog\"\n\t\t\taria-modal=\"true\"\n\t\t\taria-label=\"Media viewer\"\n\t\t\tonClick={onClose}\n\t\t>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={(e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tonClose();\n\t\t\t\t}}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute right-4 top-4 z-10 flex h-10 w-10 items-center justify-center\",\n\t\t\t\t\t\"rounded-full bg-white/10 text-white hover:bg-white/20\",\n\t\t\t\t)}\n\t\t\t\taria-label=\"Close\"\n\t\t\t>\n\t\t\t\t<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n\t\t\t\t\t<path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\n\t\t\t{hasMany && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"absolute left-4 top-4 z-10 rounded-full bg-white/10 px-3 py-1 text-sm text-white\"\n\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t>\n\t\t\t\t\t{index + 1} / {items.length}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{hasMany && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tonNavigate(-1);\n\t\t\t\t\t}}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"absolute left-4 z-10 flex h-12 w-12 items-center justify-center\",\n\t\t\t\t\t\t\"rounded-full bg-white/10 text-white hover:bg-white/20\",\n\t\t\t\t\t)}\n\t\t\t\t\taria-label=\"Previous\"\n\t\t\t\t>\n\t\t\t\t\t<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n\t\t\t\t\t\t<path d=\"M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t)}\n\n\t\t\t{hasMany && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tonNavigate(1);\n\t\t\t\t\t}}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"absolute right-4 z-10 flex h-12 w-12 items-center justify-center\",\n\t\t\t\t\t\t\"rounded-full bg-white/10 text-white hover:bg-white/20\",\n\t\t\t\t\t)}\n\t\t\t\t\taria-label=\"Next\"\n\t\t\t\t>\n\t\t\t\t\t<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n\t\t\t\t\t\t<path d=\"M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t)}\n\n\t\t\t<div\n\t\t\t\tclassName=\"flex max-h-[90vh] max-w-[90vw] flex-col items-center\"\n\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t>\n\t\t\t\t{active.mediaType === \"video\" && ytId ? (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"relative overflow-hidden rounded-lg bg-black\"\n\t\t\t\t\t\tstyle={{ width: \"min(90vw, 1024px)\", aspectRatio: \"16 / 9\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<iframe\n\t\t\t\t\t\t\tsrc={`https://www.youtube.com/embed/${ytId}?autoplay=1`}\n\t\t\t\t\t\t\ttitle={active.altText || \"Video\"}\n\t\t\t\t\t\t\tallow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n\t\t\t\t\t\t\tallowFullScreen\n\t\t\t\t\t\t\tclassName=\"absolute inset-0 h-full w-full border-0\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t) : active.mediaType === \"video\" ? (\n\t\t\t\t\t<video\n\t\t\t\t\t\tcontrols\n\t\t\t\t\t\tautoPlay\n\t\t\t\t\t\tpreload=\"metadata\"\n\t\t\t\t\t\tclassName=\"block max-h-[85vh] max-w-[90vw] rounded-lg\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<source src={active.url} />\n\t\t\t\t\t\tYour browser does not support the video tag.\n\t\t\t\t\t</video>\n\t\t\t\t) : (\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc={active.url}\n\t\t\t\t\t\talt={active.altText || \"Image\"}\n\t\t\t\t\t\tclassName=\"block max-h-[85vh] max-w-[90vw] rounded-lg object-contain\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{active.altText && (\n\t\t\t\t\t<div className=\"mt-2 max-w-[90vw] text-center text-sm text-white/80\">\n\t\t\t\t\t\t{active.altText}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n\n\treturn createPortal(overlay, document.body);\n}\n\n// ── Hook: shared lightbox state ──────────────────────────────────────\n\n/**\n * Convenience hook for any component that wants a lightbox over a list of\n * media items. Handles index state, navigation, and close.\n */\nexport function useMediaLightbox(items: MediaItem[]) {\n\tconst [index, setIndex] = useState<number | null>(null);\n\n\tconst open = useCallback((i: number) => setIndex(i), []);\n\tconst close = useCallback(() => setIndex(null), []);\n\tconst navigate = useCallback(\n\t\t(direction: -1 | 1) => {\n\t\t\tsetIndex((current) => {\n\t\t\t\tif (current === null || items.length === 0) return current;\n\t\t\t\treturn (current + direction + items.length) % items.length;\n\t\t\t});\n\t\t},\n\t\t[items.length],\n\t);\n\n\treturn { index, open, close, navigate };\n}\n","import { useState, useEffect } from \"react\";\nimport { ExternalLink, X } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { cn } from \"../utils/cn\";\nimport type { SourceReference, SourceTypeConfig } from \"../types\";\n\nfunction getSourceTypeDisplay(sourceType: string): SourceTypeConfig {\n switch (sourceType) {\n case \"knowledge_base\":\n return { label: \"Knowledge Base\", color: \"#4caf50\" };\n case \"api\":\n return { label: \"API\", color: \"#2196f3\" };\n case \"system_tool\":\n return { label: \"Tool\", color: \"#ff9800\" };\n case \"mcp_tool\":\n return { label: \"MCP\", color: \"#9c27b0\" };\n case \"workflow\":\n return { label: \"Workflow\", color: \"#00bcd4\" };\n case \"memory\":\n return { label: \"Memory\", color: \"#e91e63\" };\n default:\n return { label: \"Source\", color: \"#757575\" };\n }\n}\n\nexport interface CitationSourcesProps {\n sources: SourceReference[];\n className?: string;\n}\n\n/**\n * Renders citation sources as a horizontal row of clickable chips.\n * Clicking a chip opens a modal showing full source content.\n */\nexport function CitationSources({\n sources,\n className,\n}: CitationSourcesProps) {\n const [selectedSource, setSelectedSource] = useState<SourceReference | null>(null);\n const [showAll, setShowAll] = useState(false);\n\n if (!sources || sources.length === 0) return null;\n\n // Determine if we need to show overflow\n const MAX_VISIBLE = 8;\n const visibleSources = showAll ? sources : sources.slice(0, MAX_VISIBLE);\n const hiddenCount = sources.length - MAX_VISIBLE;\n\n return (\n <>\n <div className={cn(\"flex flex-wrap gap-1.5 mt-2\", className)}>\n {visibleSources.map((source) => {\n const typeDisplay = getSourceTypeDisplay(source.source_type);\n\n return (\n <span key={source.index} className=\"inline-flex items-center gap-0.5\">\n <button\n onClick={() => setSelectedSource(source)}\n className=\"inline-flex items-center h-6 px-2 text-[0.75rem] font-medium rounded-full border cursor-pointer transition-colors max-w-[280px] truncate\"\n style={{\n backgroundColor: typeDisplay.color + \"1a\",\n color: typeDisplay.color,\n borderColor: typeDisplay.color + \"40\",\n }}\n >\n [{source.index}] {source.title}\n </button>\n </span>\n );\n })}\n {!showAll && hiddenCount > 0 && (\n <button\n onClick={() => setShowAll(true)}\n className=\"inline-flex items-center h-6 px-2 text-[0.75rem] font-medium rounded-full border cursor-pointer transition-colors text-gray-500 border-gray-300 hover:bg-gray-50 dark:border-gray-600 dark:hover:bg-gray-800\"\n >\n +{hiddenCount} more\n </button>\n )}\n </div>\n\n <SourceDetailModal\n source={selectedSource}\n onClose={() => setSelectedSource(null)}\n />\n </>\n );\n}\n\nexport interface SourceDetailModalProps {\n source: SourceReference | null;\n onClose: () => void;\n}\n\nexport function SourceDetailModal({\n source,\n onClose,\n}: SourceDetailModalProps) {\n // Close on Escape\n useEffect(() => {\n if (!source) return;\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", handleKey);\n return () => document.removeEventListener(\"keydown\", handleKey);\n }, [source, onClose]);\n\n if (!source) return null;\n\n const typeDisplay = getSourceTypeDisplay(source.source_type);\n\n return (\n <AnimatePresence>\n {source && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n {/* Backdrop */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"absolute inset-0 bg-black/50\"\n onClick={onClose}\n />\n {/* Panel */}\n <motion.div\n initial={{ opacity: 0, scale: 0.95, y: 10 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={{ opacity: 0, scale: 0.95, y: 10 }}\n transition={{ duration: 0.15 }}\n className=\"relative bg-white dark:bg-gray-900 rounded-xl shadow-xl border border-gray-200 dark:border-gray-700 w-full max-w-2xl max-h-[80vh] flex flex-col overflow-hidden\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700\">\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <h3 className=\"text-lg font-semibold truncate\">{source.title}</h3>\n <span\n className=\"text-[0.7rem] px-1.5 py-0.5 rounded font-medium shrink-0\"\n style={{\n backgroundColor: typeDisplay.color + \"1a\",\n color: typeDisplay.color,\n }}\n >\n {typeDisplay.label}\n </span>\n </div>\n <button onClick={onClose} className=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-800 ml-2\">\n <X size={16} />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-4\">\n {/* Metadata row */}\n <div className=\"flex flex-wrap gap-1.5 mb-4\">\n <span className=\"text-[0.7rem] px-1.5 py-0.5 rounded border border-gray-200 dark:border-gray-700\">\n {source.tool_name.replace(/_/g, \" \")}\n </span>\n {source.query && (\n <span\n className=\"text-[0.7rem] px-1.5 py-0.5 rounded border border-gray-200 dark:border-gray-700 max-w-[200px] truncate\"\n title={source.query}\n >\n Query: {source.query.slice(0, 40)}{source.query.length > 40 ? \"...\" : \"\"}\n </span>\n )}\n </div>\n\n {/* URL link */}\n {source.url && (\n <div className=\"mb-4\">\n <a\n href={source.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm text-blue-500 hover:underline inline-flex items-center gap-1\"\n >\n {source.url.length > 80 ? `${source.url.slice(0, 80)}...` : source.url}\n <ExternalLink size={12} />\n </a>\n </div>\n )}\n\n {/* Description */}\n {source.description && (\n <p className=\"text-sm text-gray-500 mb-4\">{source.description}</p>\n )}\n\n {/* Full content or snippet */}\n {source.full_content ? (\n <div className=\"whitespace-pre-wrap font-mono text-sm leading-relaxed p-4 rounded-lg bg-gray-50 dark:bg-gray-800/50 border border-gray-200 dark:border-gray-700 max-h-[400px] overflow-auto\">\n {source.full_content}\n </div>\n ) : source.snippet ? (\n <div className=\"whitespace-pre-wrap font-mono text-sm leading-relaxed p-4 rounded-lg bg-gray-50 dark:bg-gray-800/50 border border-gray-200 dark:border-gray-700\">\n {source.snippet}\n </div>\n ) : (\n <p className=\"text-sm text-gray-400 italic\">No content available for this source.</p>\n )}\n\n </div>\n\n {/* Footer */}\n <div className=\"flex justify-end p-3 border-t border-gray-200 dark:border-gray-700\">\n <button\n onClick={onClose}\n className=\"px-3 py-1.5 text-sm rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\n >\n Close\n </button>\n </div>\n </motion.div>\n </div>\n )}\n </AnimatePresence>\n );\n}\n\n/**\n * Inline citation badge - renders a small numbered badge like [1]\n * with optional tooltip on hover and click-to-open URL.\n */\nexport interface InlineCitationProps {\n index: number;\n source?: SourceReference;\n}\n\nexport function InlineCitation({ index, source }: InlineCitationProps) {\n return (\n <span\n className={cn(\n \"inline-flex items-center justify-center min-w-[16px] h-4 rounded-full\",\n \"bg-blue-500 text-white text-[0.6rem] font-semibold\",\n \"px-0.5 mx-0.5 align-super\",\n source?.url ? \"cursor-pointer hover:opacity-85\" : \"cursor-default\"\n )}\n title={source ? `${source.title}${source.description ? \": \" + source.description : \"\"}` : undefined}\n onClick={(e) => {\n if (source?.url) {\n e.stopPropagation();\n window.open(source.url, \"_blank\", \"noopener,noreferrer\");\n }\n }}\n >\n {index}\n </span>\n );\n}\n","import { useState, useCallback, useMemo, useRef, useEffect } from \"react\";\nimport {\n Check,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n HelpCircle,\n Send,\n} from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport { MarkdownContent } from \"./MarkdownContent\";\nimport type {\n ClarificationAnswer,\n ClarificationData,\n ClarificationQuestion,\n} from \"../types\";\n\nexport interface ClarificationPanelProps {\n clarification: ClarificationData;\n /**\n * Called on submit with both the human-readable text (for the transcript) AND\n * the structured per-question answers (for deterministic server-side capture —\n * no parsing of the text).\n */\n onSubmit?: (response: string, answers: ClarificationAnswer[]) => void;\n /** Best-effort callback fired when an option is selected (legacy hook). */\n onOptionSelect?: (option: string) => void;\n disabled?: boolean;\n loading?: boolean;\n className?: string;\n /**\n * When set, renders a read-only \"answered\" state showing the user's response\n * inline. Used in scrolled-back chat history so a past clarification still\n * shows what was answered.\n */\n answer?: string;\n}\n\n/**\n * Normalize whatever shape arrived into a list of multiple-choice questions.\n * Prefers the current `questions` array; falls back to the legacy single\n * `question`/`options` shape so old history still renders. Question dicts\n * arrive VERBATIM from the server (snake_case wire format), so both casings\n * are resolved here.\n */\nfunction resolveQuestions(c: ClarificationData): ClarificationQuestion[] {\n if (c.questions && c.questions.length > 0) {\n return c.questions.map((q) => ({\n question: q.question,\n options: q.options || [],\n multiSelect: q.multiSelect ?? q.multi_select,\n key: q.key,\n }));\n }\n if (c.question) {\n return [\n {\n question: c.question,\n options: c.options || [],\n multiSelect: false,\n },\n ];\n }\n return [];\n}\n\n/**\n * A question's effective answer: the picked options plus the typed free-text\n * value when present. Free text is ADDITIVE — the user can pick an option,\n * type their own, or both (\"Brand only\" + a couple of extra keywords).\n */\nfunction resolveSelected(\n picked: string[],\n typed: string | undefined,\n): string[] {\n const t = (typed || \"\").trim();\n return t ? [...picked, t] : picked;\n}\n\n/** Build the structured per-question answers for deterministic server capture. */\nfunction buildStructuredAnswers(\n questions: ClarificationQuestion[],\n selections: Record<number, string[]>,\n freeText: Record<number, string>,\n): ClarificationAnswer[] {\n return questions.map((q, i) => ({\n key: q.key,\n question: q.question,\n selected: resolveSelected(selections[i] || [], freeText[i]),\n }));\n}\n\n/** Build the answer text the model reads back as the tool result. */\nfunction formatAnswer(\n questions: ClarificationQuestion[],\n selections: Record<number, string[]>,\n freeText: Record<number, string>,\n): string {\n return questions\n .map((q, i) => {\n const picked = resolveSelected(selections[i] || [], freeText[i]);\n const ans = picked.length > 0 ? picked.join(\", \") : \"(no answer)\";\n const prefix = questions.length > 1 ? `${i + 1}. ` : \"\";\n return `${prefix}${q.question}\\n→ ${ans}`;\n })\n .join(\"\\n\\n\");\n}\n\n/**\n * Clarification panel — displays when the agent needs the user to pick from\n * one or more multiple-choice questions. Orange left-border panel.\n *\n * If `answer` is provided, switches to a read-only \"answered\" view.\n */\nexport function ClarificationPanel({\n clarification,\n onSubmit,\n onOptionSelect,\n disabled = false,\n loading = false,\n className,\n answer,\n}: ClarificationPanelProps) {\n const questions = useMemo(() => resolveQuestions(clarification), [clarification]);\n const [selections, setSelections] = useState<Record<number, string[]>>({});\n const [freeText, setFreeText] = useState<Record<number, string>>({});\n const [activeTab, setActiveTab] = useState(0);\n const isAnswered = typeof answer === \"string\" && answer.length > 0;\n const advanceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (advanceTimer.current) clearTimeout(advanceTimer.current);\n },\n [],\n );\n\n /**\n * Move to the first still-unanswered question after `from`, falling back to\n * the next question. Keeps the user moving forward without forcing them past\n * questions they've already handled out of order.\n */\n const advanceFrom = useCallback(\n (from: number, sel: Record<number, string[]>) => {\n for (let i = from + 1; i < questions.length; i++) {\n if ((sel[i] || []).length === 0) {\n setActiveTab(i);\n return;\n }\n }\n if (from + 1 < questions.length) setActiveTab(from + 1);\n },\n [questions.length],\n );\n\n const toggle = useCallback(\n (qIndex: number, option: string, multi: boolean) => {\n setSelections((prev) => {\n const current = prev[qIndex] || [];\n let next: string[];\n if (multi) {\n next = current.includes(option)\n ? current.filter((o) => o !== option)\n : [...current, option];\n } else {\n next = [option];\n }\n if (next.includes(option)) onOptionSelect?.(option);\n const updated = { ...prev, [qIndex]: next };\n // Single-select is a committed choice — auto-advance so the user flows\n // through the set without reaching for the tabs. Multi-select waits,\n // since they may still be picking more options.\n if (!multi) {\n if (advanceTimer.current) clearTimeout(advanceTimer.current);\n advanceTimer.current = setTimeout(() => advanceFrom(qIndex, updated), 250);\n }\n return updated;\n });\n },\n [onOptionSelect, advanceFrom],\n );\n\n // A question is answered by picking options, typing a custom value, or both.\n const allAnswered =\n questions.length > 0 &&\n questions.every(\n (_, i) =>\n (selections[i] || []).length > 0 || (freeText[i] || \"\").trim().length > 0,\n );\n\n const submit = useCallback(() => {\n if (!onSubmit || !allAnswered) return;\n const text = formatAnswer(questions, selections, freeText);\n const structured = buildStructuredAnswers(questions, selections, freeText);\n setSelections({});\n setFreeText({});\n setActiveTab(0);\n onSubmit(text, structured);\n }, [onSubmit, allAnswered, questions, selections, freeText]);\n\n if (isAnswered) {\n return (\n <div className={cn(\"mx-4 mb-3 flex justify-end font-sans\", className)}>\n <details className=\"group max-w-[85%]\">\n <summary\n className={cn(\n \"flex items-center justify-end gap-1.5 cursor-pointer select-none\",\n \"text-xs text-gray-600 dark:text-gray-300\",\n \"hover:text-gray-900 dark:hover:text-gray-100 transition-colors\",\n \"list-none [&::-webkit-details-marker]:hidden\",\n )}\n >\n <Check\n size={12}\n strokeWidth={2.75}\n className=\"text-emerald-600 dark:text-emerald-500\"\n />\n <span>Clarification answered</span>\n <ChevronDown\n size={12}\n className=\"text-gray-400 transition-transform group-open:rotate-180\"\n />\n </summary>\n <div className=\"mt-2 text-right\">\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400 whitespace-pre-wrap break-words text-left\">\n {answer}\n </p>\n </div>\n </details>\n </div>\n );\n }\n\n if (questions.length === 0) return null;\n\n const accent = \"var(--chat-clarification-accent,#f97316)\";\n const multiQuestion = questions.length > 1;\n const active = Math.min(activeTab, questions.length - 1);\n\n const renderQuestion = (qi: number) => {\n const q = questions[qi];\n const multi = !!q.multiSelect;\n const picked = selections[qi] || [];\n return (\n <div>\n <div className=\"flex items-start gap-2 mb-1.5\">\n {!clarification.context && !multiQuestion ? (\n <span className=\"text-[var(--chat-clarification-accent,#f97316)] mt-0.5 flex-shrink-0\">\n <HelpCircle size={14} />\n </span>\n ) : null}\n <div className=\"flex-1 min-w-0\">\n <MarkdownContent className=\"text-sm font-medium\">\n {q.question}\n </MarkdownContent>\n </div>\n </div>\n <div className=\"ml-5 space-y-1\">\n {q.options.map((option, oi) => {\n const selected = picked.includes(option);\n return (\n <label\n key={oi}\n className={cn(\n \"flex items-center gap-2 py-0.5 cursor-pointer text-sm rounded px-1 -mx-1\",\n \"hover:bg-[color-mix(in_oklab,var(--chat-clarification-accent,#f97316)_18%,transparent)]\",\n )}\n >\n <input\n type={multi ? \"checkbox\" : \"radio\"}\n name={`clarification-q${qi}`}\n value={option}\n checked={selected}\n onChange={() => toggle(qi, option, multi)}\n disabled={disabled || loading}\n className=\"w-3.5 h-3.5\"\n style={{ accentColor: accent }}\n />\n {option}\n </label>\n );\n })}\n {/* Always-present free-text channel, ADDITIVE to the options: the\n user can pick a choice, type their own value, or combine both\n (\"Brand only\" + two extra keywords). Empty = ignored. */}\n <div className=\"flex items-center gap-2 py-0.5 px-1 -mx-1 text-sm\">\n <span className=\"flex-shrink-0 text-gray-500 dark:text-gray-400\">\n Other:\n </span>\n <input\n type=\"text\"\n value={freeText[qi] || \"\"}\n placeholder={\n picked.length > 0\n ? \"Add anything else… (optional)\"\n : \"Or type your own answer…\"\n }\n onChange={(e) =>\n setFreeText((prev) => ({ ...prev, [qi]: e.target.value }))\n }\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (\n (freeText[qi] || \"\").trim() ||\n (selections[qi] || []).length > 0\n )\n advanceFrom(qi, selections);\n }\n }}\n disabled={disabled || loading}\n className={cn(\n \"flex-1 min-w-0 px-2 py-0.5 text-sm rounded border bg-transparent\",\n \"border-[color-mix(in_oklab,var(--chat-clarification-accent,#f97316)_40%,transparent)]\",\n \"focus:outline-none focus:border-[var(--chat-clarification-accent,#f97316)]\",\n \"placeholder:text-gray-400 dark:placeholder:text-gray-500\",\n )}\n />\n </div>\n </div>\n </div>\n );\n };\n\n return (\n <div\n className={cn(\n \"mx-4 mb-3 px-4 py-3 font-sans\",\n \"bg-[color-mix(in_oklab,var(--chat-clarification-accent,#f97316)_12%,transparent)]\",\n \"border-l-[3px] border-[var(--chat-clarification-accent,#f97316)]\",\n \"rounded-r-lg\",\n className,\n )}\n >\n {clarification.context ? (\n <div className=\"flex items-start gap-2 mb-2\">\n <span className=\"text-[var(--chat-clarification-accent,#f97316)] mt-0.5 flex-shrink-0\">\n <HelpCircle size={14} />\n </span>\n <div className=\"flex-1 min-w-0\">\n <MarkdownContent className=\"text-sm text-gray-600 dark:text-gray-300\">\n {clarification.context}\n </MarkdownContent>\n </div>\n </div>\n ) : null}\n\n {/* Multiple questions render as tabs — one question per tab — so a long\n set doesn't stack into a wall of radios. A single question renders\n inline with no tab strip. */}\n {multiQuestion ? (\n <div\n role=\"tablist\"\n aria-label=\"Clarification questions\"\n className=\"flex items-center gap-1 mb-2 border-b border-[color-mix(in_oklab,var(--chat-clarification-accent,#f97316)_30%,transparent)]\"\n >\n {questions.map((_, qi) => {\n const isActive = qi === active;\n const isDone = (selections[qi] || []).length > 0;\n return (\n <button\n key={qi}\n role=\"tab\"\n aria-selected={isActive}\n onClick={() => {\n if (advanceTimer.current) clearTimeout(advanceTimer.current);\n setActiveTab(qi);\n }}\n className={cn(\n \"flex items-center gap-1 px-2.5 py-1 text-xs rounded-t -mb-px border-b-2 transition-colors\",\n isActive\n ? \"border-[var(--chat-clarification-accent,#f97316)] text-[var(--chat-clarification-accent,#f97316)] font-medium\"\n : \"border-transparent text-gray-500 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200\",\n )}\n >\n {isDone ? (\n <Check\n size={11}\n strokeWidth={3}\n className=\"text-emerald-600 dark:text-emerald-500\"\n />\n ) : null}\n <span>{qi + 1}</span>\n </button>\n );\n })}\n </div>\n ) : null}\n\n <div className=\"max-h-[50vh] overflow-y-auto pr-1\">{renderQuestion(active)}</div>\n\n <div className=\"mt-2 flex items-center justify-between gap-2\">\n {multiQuestion ? (\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {(() => {\n const done = questions.filter((_, i) => (selections[i] || []).length > 0).length;\n return `${done} of ${questions.length} answered`;\n })()}\n </span>\n ) : (\n <span />\n )}\n <div className=\"flex items-center gap-1\">\n {multiQuestion ? (\n <>\n <button\n type=\"button\"\n aria-label=\"Previous question\"\n onClick={() => {\n if (advanceTimer.current) clearTimeout(advanceTimer.current);\n setActiveTab((t) => Math.max(0, t - 1));\n }}\n disabled={active === 0}\n className={cn(\n \"flex items-center justify-center w-6 h-6 rounded transition-colors\",\n active === 0\n ? \"text-gray-300 dark:text-gray-600 cursor-default\"\n : \"text-gray-500 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 hover:bg-[color-mix(in_oklab,var(--chat-clarification-accent,#f97316)_18%,transparent)]\",\n )}\n >\n <ChevronLeft size={16} />\n </button>\n <button\n type=\"button\"\n aria-label=\"Next question\"\n onClick={() => {\n if (advanceTimer.current) clearTimeout(advanceTimer.current);\n setActiveTab((t) => Math.min(questions.length - 1, t + 1));\n }}\n disabled={active === questions.length - 1}\n className={cn(\n \"flex items-center justify-center w-6 h-6 rounded transition-colors mr-1\",\n active === questions.length - 1\n ? \"text-gray-300 dark:text-gray-600 cursor-default\"\n : \"text-gray-500 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 hover:bg-[color-mix(in_oklab,var(--chat-clarification-accent,#f97316)_18%,transparent)]\",\n )}\n >\n <ChevronRight size={16} />\n </button>\n </>\n ) : null}\n <button\n onClick={submit}\n disabled={!allAnswered || disabled || loading}\n className={cn(\n \"flex items-center gap-1 px-2 py-1 rounded text-sm transition-colors\",\n allAnswered\n ? \"text-[var(--chat-clarification-accent,#f97316)] hover:text-[var(--chat-clarification-accent-soft,#fdba74)]\"\n : \"text-gray-300 dark:text-gray-600\",\n )}\n >\n <span className=\"text-xs\">Submit</span>\n <Send size={14} />\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import {\n\tuseCallback,\n\tuseEffect,\n\tuseState,\n\ttype ComponentType,\n\ttype ReactNode,\n} from \"react\";\nimport type { ToolApprovalData } from \"../types\";\nimport { cn } from \"../utils/cn\";\n\nexport interface ApprovalButtonSlotProps {\n\tonClick: () => void;\n\tdisabled?: boolean;\n\tchildren: ReactNode;\n}\n\nexport interface ApprovalChatInputSlotProps {\n\tvalue: string;\n\tonChange: (value: string) => void;\n\tonSubmit: () => void;\n\tonCancel: () => void;\n\tplaceholder: string;\n\tdisabled?: boolean;\n\tautoFocus?: boolean;\n}\n\nexport interface ToolApprovalSlots {\n\tAllowButton?: ComponentType<ApprovalButtonSlotProps>;\n\tRejectButton?: ComponentType<ApprovalButtonSlotProps>;\n\tChatButton?: ComponentType<ApprovalButtonSlotProps>;\n\tSendButton?: ComponentType<ApprovalButtonSlotProps>;\n\tCancelButton?: ComponentType<ApprovalButtonSlotProps>;\n\tChatInput?: ComponentType<ApprovalChatInputSlotProps>;\n}\n\nexport interface ToolApprovalPanelProps {\n\tapproval: ToolApprovalData;\n\tonApprove: (modifiedInputs: Record<string, unknown>) => void;\n\tonReject: (reason?: string) => void;\n\tdisabled?: boolean;\n\tclassName?: string;\n\t/**\n\t * Per-action component overrides. Pass any subset; unspecified slots fall\n\t * back to the library's default Tailwind-styled renderings. Use this to\n\t * align buttons and input with a host app's brand system.\n\t */\n\tslots?: ToolApprovalSlots;\n}\n\ntype Mode = \"idle\" | \"chat\";\n\nconst INLINE_STRING_LIMIT = 140;\n\nfunction formatPrimitive(value: unknown): string {\n\tif (value === null || value === undefined) return \"—\";\n\tif (typeof value === \"boolean\") return value ? \"yes\" : \"no\";\n\tif (typeof value === \"number\") return String(value);\n\treturn String(value);\n}\n\nfunction isPrimitive(value: unknown): value is string | number | boolean | null | undefined {\n\treturn (\n\t\tvalue === null ||\n\t\tvalue === undefined ||\n\t\ttypeof value === \"string\" ||\n\t\ttypeof value === \"number\" ||\n\t\ttypeof value === \"boolean\"\n\t);\n}\n\nfunction ValueCell({ value }: { value: unknown }) {\n\tconst [expanded, setExpanded] = useState(false);\n\n\tif (isPrimitive(value)) {\n\t\tconst text = formatPrimitive(value);\n\t\tconst isLong = text.length > INLINE_STRING_LIMIT || text.includes(\"\\n\");\n\t\tif (!isLong) {\n\t\t\treturn <span className=\"break-words\">{text}</span>;\n\t\t}\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-1 min-w-0\">\n\t\t\t\t{expanded ? (\n\t\t\t\t\t<pre className=\"whitespace-pre-wrap break-words text-xs font-mono bg-black/5 dark:bg-white/5 rounded px-2 py-1.5 max-h-60 overflow-auto\">\n\t\t\t\t\t\t{text}\n\t\t\t\t\t</pre>\n\t\t\t\t) : (\n\t\t\t\t\t<span className=\"break-words text-current/80\">{text.slice(0, INLINE_STRING_LIMIT)}…</span>\n\t\t\t\t)}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => setExpanded((e) => !e)}\n\t\t\t\t\tclassName=\"self-start text-[11px] underline-offset-2 hover:underline opacity-70 hover:opacity-100\">\n\t\t\t\t\t{expanded ? \"Show less\" : \"Show more\"}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (Array.isArray(value) && value.every(isPrimitive)) {\n\t\tconst text = value.map(formatPrimitive).join(\", \") || \"(empty)\";\n\t\treturn <span className=\"break-words\">{text}</span>;\n\t}\n\n\tlet pretty = \"\";\n\ttry {\n\t\tpretty = JSON.stringify(value, null, 2);\n\t} catch {\n\t\tpretty = String(value);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-1 min-w-0\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setExpanded((e) => !e)}\n\t\t\t\tclassName=\"self-start text-[11px] underline-offset-2 hover:underline opacity-70 hover:opacity-100\">\n\t\t\t\t{expanded ? \"Hide\" : \"Show\"} {Array.isArray(value) ? \"items\" : \"details\"}\n\t\t\t</button>\n\t\t\t{expanded && (\n\t\t\t\t<pre className=\"whitespace-pre-wrap break-words text-xs font-mono bg-black/5 dark:bg-white/5 rounded px-2 py-1.5 max-h-60 overflow-auto\">\n\t\t\t\t\t{pretty}\n\t\t\t\t</pre>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nconst DefaultAllowButton: ComponentType<ApprovalButtonSlotProps> = ({ onClick, disabled, children }) => (\n\t<button\n\t\ttype=\"button\"\n\t\tonClick={onClick}\n\t\tdisabled={disabled}\n\t\tclassName={cn(\n\t\t\t\"px-4 py-1.5 rounded-full text-sm font-medium transition-colors\",\n\t\t\t\"bg-[var(--chat-approve-bg,#1c1917)] hover:bg-[var(--chat-approve-bg-hover,#292524)] text-[var(--chat-approve-text,white)]\",\n\t\t\t\"disabled:opacity-50 disabled:cursor-not-allowed\",\n\t\t)}>\n\t\t{children}\n\t</button>\n);\n\nconst DefaultRejectButton: ComponentType<ApprovalButtonSlotProps> = ({ onClick, disabled, children }) => (\n\t<button\n\t\ttype=\"button\"\n\t\tonClick={onClick}\n\t\tdisabled={disabled}\n\t\tclassName={cn(\n\t\t\t\"px-4 py-1.5 rounded-full text-sm font-medium transition-colors\",\n\t\t\t\"bg-[var(--chat-reject-bg,#f5f5f4)] text-[var(--chat-reject-text,#44403c)] hover:bg-[var(--chat-reject-bg-hover,#e7e5e4)] dark:bg-[var(--chat-reject-bg-dark,rgba(255,255,255,0.06))] dark:text-[var(--chat-reject-text-dark,#e7e5e4)] dark:hover:bg-[var(--chat-reject-bg-hover-dark,rgba(255,255,255,0.1))]\",\n\t\t\t\"disabled:opacity-50 disabled:cursor-not-allowed\",\n\t\t)}>\n\t\t{children}\n\t</button>\n);\n\nconst DefaultGhostButton: ComponentType<ApprovalButtonSlotProps> = ({ onClick, disabled, children }) => (\n\t<button\n\t\ttype=\"button\"\n\t\tonClick={onClick}\n\t\tdisabled={disabled}\n\t\tclassName={cn(\n\t\t\t\"text-sm underline-offset-4 transition-colors\",\n\t\t\t\"text-[var(--chat-text-subtle,rgba(0,0,0,0.55))] hover:text-[var(--chat-text,#1c1917)] hover:underline\",\n\t\t\t\"dark:text-[var(--chat-text-subtle-dark,rgba(255,255,255,0.55))] dark:hover:text-[var(--chat-text-dark,#fafaf9)]\",\n\t\t\t\"disabled:opacity-50 disabled:cursor-not-allowed\",\n\t\t)}>\n\t\t{children}\n\t</button>\n);\n\nconst DefaultSendButton: ComponentType<ApprovalButtonSlotProps> = DefaultAllowButton;\n\nconst DefaultChatInput: ComponentType<ApprovalChatInputSlotProps> = ({\n\tvalue,\n\tonChange,\n\tonSubmit,\n\tonCancel,\n\tplaceholder,\n\tdisabled,\n\tautoFocus,\n}) => (\n\t<textarea\n\t\tvalue={value}\n\t\tonChange={(e) => onChange(e.target.value)}\n\t\tonKeyDown={(e) => {\n\t\t\tif (e.key === \"Enter\" && !e.shiftKey) {\n\t\t\t\te.preventDefault();\n\t\t\t\tonSubmit();\n\t\t\t} else if (e.key === \"Escape\") {\n\t\t\t\te.preventDefault();\n\t\t\t\tonCancel();\n\t\t\t}\n\t\t}}\n\t\tplaceholder={placeholder}\n\t\tdisabled={disabled}\n\t\tautoFocus={autoFocus}\n\t\trows={2}\n\t\tclassName=\"w-full text-sm bg-transparent border-b border-[var(--chat-border,rgba(0,0,0,0.12))] dark:border-[var(--chat-border-dark,rgba(255,255,255,0.15))] focus:border-[var(--chat-text,#1c1917)] dark:focus:border-[var(--chat-text-dark,#fafaf9)] py-1.5 resize-y disabled:opacity-50 placeholder:text-[var(--chat-text-subtle,rgba(0,0,0,0.4))] outline-none transition-colors\"\n\t/>\n);\n\nconst INLINE_CHIP_LIMIT = 3;\nconst INLINE_CHIP_VALUE_MAX = 32;\n\nfunction formatChipValue(value: unknown): string {\n\tconst text = formatPrimitive(value);\n\tif (text.length <= INLINE_CHIP_VALUE_MAX) return text;\n\treturn `${text.slice(0, INLINE_CHIP_VALUE_MAX - 1)}…`;\n}\n\n/**\n * Tool approval — rendered as a raised CTA above the composer to communicate\n * that the agent is paused on a decision. Anatomy:\n *\n * ┌─ Approve action ─ <tool identity> ─────────────────────┐\n * │ <agent's prompt sentence> │\n * │ [param: value] [param: value] │\n * │ [ Approve ] [ Decline ] ⏎ approve · Esc decline │\n * │ Show all details │\n * └─────────────────────────────────────────────────────────┘\n *\n * Buttons and the chat input are slottable via the `slots` prop so host apps\n * can swap in their own brand-aligned components.\n */\nexport function ToolApprovalPanel({\n\tapproval,\n\tonApprove,\n\tonReject,\n\tdisabled = false,\n\tclassName,\n\tslots,\n}: ToolApprovalPanelProps) {\n\tconst [mode, setMode] = useState<Mode>(\"idle\");\n\tconst [chatInput, setChatInput] = useState(\"\");\n\tconst [detailsOpen, setDetailsOpen] = useState(false);\n\n\tconst handleAllow = useCallback(() => {\n\t\tonApprove(approval.toolInputs);\n\t}, [onApprove, approval.toolInputs]);\n\n\tconst handleReject = useCallback(() => {\n\t\tonReject(\"User declined this action\");\n\t}, [onReject]);\n\n\tconst handleChatSubmit = useCallback(() => {\n\t\tconst text = chatInput.trim();\n\t\tif (!text) return;\n\t\tonReject(text);\n\t}, [chatInput, onReject]);\n\n\tconst handleChatCancel = useCallback(() => {\n\t\tsetMode(\"idle\");\n\t\tsetChatInput(\"\");\n\t}, []);\n\n\t// Keyboard shortcuts: ⏎ approves, Esc declines. Skip while focus is in\n\t// an editable element so the host composer/details inputs aren't hijacked.\n\tuseEffect(() => {\n\t\tif (mode !== \"idle\" || disabled) return;\n\t\tconst onKeyDown = (e: KeyboardEvent) => {\n\t\t\tconst target = e.target as HTMLElement | null;\n\t\t\tconst tag = target?.tagName;\n\t\t\tconst editable =\n\t\t\t\ttag === \"INPUT\" ||\n\t\t\t\ttag === \"TEXTAREA\" ||\n\t\t\t\ttag === \"SELECT\" ||\n\t\t\t\t(target?.isContentEditable ?? false);\n\t\t\tif (editable) return;\n\t\t\tif (e.key === \"Enter\" && !e.shiftKey && !e.metaKey && !e.ctrlKey && !e.altKey) {\n\t\t\t\te.preventDefault();\n\t\t\t\thandleAllow();\n\t\t\t} else if (e.key === \"Escape\") {\n\t\t\t\te.preventDefault();\n\t\t\t\thandleReject();\n\t\t\t}\n\t\t};\n\t\twindow.addEventListener(\"keydown\", onKeyDown);\n\t\treturn () => window.removeEventListener(\"keydown\", onKeyDown);\n\t}, [mode, disabled, handleAllow, handleReject]);\n\n\tconst summary = approval.toolDescription?.trim() || `Run ${approval.toolName}`;\n\tconst toolIdentity = approval.toolLabel?.trim() || approval.toolName;\n\n\tconst inputEntries = Object.entries(approval.toolInputs).filter(\n\t\t([key]) => key !== \"__description\",\n\t);\n\tconst inlineChips = inputEntries.filter(([, v]) => isPrimitive(v)).slice(0, INLINE_CHIP_LIMIT);\n\n\tconst AllowButton = slots?.AllowButton ?? DefaultAllowButton;\n\tconst RejectButton = slots?.RejectButton ?? DefaultRejectButton;\n\tconst SendButton = slots?.SendButton ?? DefaultSendButton;\n\tconst CancelButton = slots?.CancelButton ?? DefaultGhostButton;\n\tconst ChatInput = slots?.ChatInput ?? DefaultChatInput;\n\n\treturn (\n\t\t<div\n\t\t\trole=\"group\"\n\t\t\taria-label=\"Tool approval\"\n\t\t\tclassName={cn(\n\t\t\t\t\"mx-4 mb-4 font-sans\",\n\t\t\t\t\"px-4 py-3.5 rounded-2xl\",\n\t\t\t\t\"bg-[var(--chat-approval-panel-bg,oklch(0.995_0.003_70))]\",\n\t\t\t\t\"border-[1.5px] border-[var(--chat-approval-panel-border,oklch(0.86_0.005_70))]\",\n\t\t\t\t\"shadow-[var(--chat-approval-panel-shadow,0_1px_0_rgba(0,0,0,0.04),0_8px_24px_-12px_rgba(0,0,0,0.10))]\",\n\t\t\t\t\"text-[var(--chat-text,#1c1917)] dark:text-[var(--chat-text-dark,#fafaf9)]\",\n\t\t\t\tclassName,\n\t\t\t)}>\n\t\t\t{mode === \"idle\" && (\n\t\t\t\t<div className=\"flex items-center gap-2 mb-2 min-w-0\">\n\t\t\t\t\t<span\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\tclassName=\"inline-block w-1.5 h-1.5 rounded-full bg-[var(--chat-activity,var(--chat-primary,#106997))] animate-pulse-subtle shrink-0\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"uppercase tracking-[0.08em] text-[11px] font-semibold opacity-70 shrink-0\">\n\t\t\t\t\t\tApprove action\n\t\t\t\t\t</span>\n\t\t\t\t\t{toolIdentity && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<span aria-hidden className=\"opacity-30 shrink-0\">\n\t\t\t\t\t\t\t\t·\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span className=\"text-[11px] opacity-60 truncate\" title={toolIdentity}>\n\t\t\t\t\t\t\t\t{toolIdentity}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Tool description can be long when the LLM emits a verbose\n\t\t\t summary; cap with internal scroll so the action buttons below\n\t\t\t stay reachable. */}\n\t\t\t<div className=\"max-h-[40vh] overflow-y-auto pr-1\">\n\t\t\t\t<p className=\"text-base leading-relaxed\">{summary}</p>\n\t\t\t</div>\n\n\t\t\t{mode === \"idle\" ? (\n\t\t\t\t<>\n\t\t\t\t\t{inlineChips.length > 0 && (\n\t\t\t\t\t\t<div className=\"mt-2.5 flex flex-wrap gap-1.5\">\n\t\t\t\t\t\t\t{inlineChips.map(([key, value]) => (\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\tclassName=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-md text-[11px] font-mono bg-black/[0.04] dark:bg-white/[0.06]\">\n\t\t\t\t\t\t\t\t\t<span className=\"opacity-60\">{key}:</span>\n\t\t\t\t\t\t\t\t\t<span>{formatChipValue(value)}</span>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<div className=\"mt-3 flex flex-wrap items-center gap-x-3 gap-y-2\">\n\t\t\t\t\t\t<AllowButton onClick={handleAllow} disabled={disabled}>\n\t\t\t\t\t\t\tApprove\n\t\t\t\t\t\t</AllowButton>\n\t\t\t\t\t\t<RejectButton onClick={handleReject} disabled={disabled}>\n\t\t\t\t\t\t\tDecline\n\t\t\t\t\t\t</RejectButton>\n\t\t\t\t\t\t{!disabled && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t\t\tclassName=\"ml-auto text-[11px] opacity-50 select-none hidden sm:inline\">\n\t\t\t\t\t\t\t\t<kbd className=\"font-sans\">⏎</kbd> approve ·{\" \"}\n\t\t\t\t\t\t\t\t<kbd className=\"font-sans\">Esc</kbd> decline\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{inputEntries.length > 0 && (\n\t\t\t\t\t\t<div className=\"mt-3\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => setDetailsOpen((o) => !o)}\n\t\t\t\t\t\t\t\tclassName=\"text-xs underline-offset-4 hover:underline opacity-60 hover:opacity-100 transition-opacity\">\n\t\t\t\t\t\t\t\t{detailsOpen ? \"Hide all details\" : \"Show all details\"}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t{detailsOpen && (\n\t\t\t\t\t\t\t\t<dl className=\"mt-2 grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-xs opacity-70 max-h-[40vh] overflow-y-auto pr-1\">\n\t\t\t\t\t\t\t\t\t{inputEntries.map(([key, value]) => (\n\t\t\t\t\t\t\t\t\t\t<div key={key} className=\"contents\">\n\t\t\t\t\t\t\t\t\t\t\t<dt className=\"font-mono text-[11px] pt-0.5 self-start\">{key}</dt>\n\t\t\t\t\t\t\t\t\t\t\t<dd className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t<ValueCell value={value} />\n\t\t\t\t\t\t\t\t\t\t\t</dd>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</dl>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<div className=\"mt-3 flex flex-col gap-3\">\n\t\t\t\t\t<ChatInput\n\t\t\t\t\t\tvalue={chatInput}\n\t\t\t\t\t\tonChange={setChatInput}\n\t\t\t\t\t\tonSubmit={handleChatSubmit}\n\t\t\t\t\t\tonCancel={handleChatCancel}\n\t\t\t\t\t\tplaceholder=\"Tell me what you want instead…\"\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tautoFocus\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"flex items-center gap-x-3\">\n\t\t\t\t\t\t<SendButton onClick={handleChatSubmit} disabled={disabled || !chatInput.trim()}>\n\t\t\t\t\t\t\tSend\n\t\t\t\t\t\t</SendButton>\n\t\t\t\t\t\t<CancelButton onClick={handleChatCancel} disabled={disabled}>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</CancelButton>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useState, useCallback, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../utils/cn\";\n\nconst FEEDBACK_CATEGORIES = [\n \"Incorrect or incomplete\",\n \"Not what I asked for\",\n \"Wrong data\",\n \"Bad recommendation\",\n \"Tone or style\",\n \"Other\",\n] as const;\n\nexport interface MessageActionBarProps {\n /** The text content to copy */\n textContent: string;\n /** Optional callback when regenerate is requested */\n onRegenerate?: () => void;\n /** Optional callback when edit is requested */\n onEdit?: () => void;\n /** Report this response as incorrect (fires mistake-recording pipeline). Reason\n * combines an optional category chip + free-text details, formatted as\n * \"{category}: {details}\" | \"{category}\" | \"{details}\" | \"\". */\n onReportIncorrect?: (reason?: string) => void;\n /** Confirm this response was helpful / correct */\n onConfirmCorrect?: () => void;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Action bar that appears on hover below assistant message bubbles.\n * Currently implements Copy; onRegenerate and onEdit are reserved for future use.\n */\nexport function MessageActionBar({\n textContent,\n onRegenerate,\n onEdit,\n onReportIncorrect,\n onConfirmCorrect,\n className,\n}: MessageActionBarProps) {\n const [copied, setCopied] = useState(false);\n const [feedbackState, setFeedbackState] = useState<\"none\" | \"correct\" | \"incorrect\">(\"none\");\n const [feedbackOpen, setFeedbackOpen] = useState(false);\n const [selectedCategory, setSelectedCategory] = useState<string | null>(null);\n const [details, setDetails] = useState(\"\");\n\n const handleDismissFeedback = useCallback(() => {\n // Dismissing closes the modal without recording anything.\n setFeedbackOpen(false);\n setSelectedCategory(null);\n setDetails(\"\");\n }, []);\n\n const handleSubmitFeedback = useCallback(() => {\n if (feedbackState !== \"none\") return;\n const trimmed = details.trim();\n const reason = selectedCategory && trimmed\n ? `${selectedCategory}: ${trimmed}`\n : selectedCategory || trimmed;\n setFeedbackState(\"incorrect\");\n setFeedbackOpen(false);\n setSelectedCategory(null);\n setDetails(\"\");\n onReportIncorrect?.(reason || undefined);\n }, [feedbackState, selectedCategory, details, onReportIncorrect]);\n\n // Escape closes the modal (backdrop click handles mouse dismissal).\n useEffect(() => {\n if (!feedbackOpen) return;\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") handleDismissFeedback();\n };\n document.addEventListener(\"keydown\", handleKey);\n return () => document.removeEventListener(\"keydown\", handleKey);\n }, [feedbackOpen, handleDismissFeedback]);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(textContent);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback for older browsers / non-secure contexts\n const textarea = document.createElement(\"textarea\");\n textarea.value = textContent;\n textarea.style.position = \"fixed\";\n textarea.style.opacity = \"0\";\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textarea);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n }, [textContent]);\n\n return (\n <div\n className={cn(\n \"relative flex items-center gap-1\",\n feedbackOpen\n ? \"opacity-100\"\n : \"opacity-0 group-hover:opacity-100 transition-opacity duration-150\",\n className,\n )}\n >\n {/* Copy button */}\n <button\n type=\"button\"\n onClick={handleCopy}\n aria-label={copied ? \"Copied\" : \"Copy message\"}\n className={cn(\n \"flex items-center justify-center\",\n \"w-7 h-7 rounded-md\",\n \"text-[var(--chat-text-subtle)] hover:text-[var(--chat-text)]\",\n \"hover:bg-[var(--chat-panel-bg)]\",\n \"transition-colors duration-150\",\n )}\n >\n {copied ? (\n // Check icon\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n ) : (\n // Copy icon\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </svg>\n )}\n </button>\n\n {/* Regenerate button — only shown if callback provided */}\n {onRegenerate && (\n <button\n type=\"button\"\n onClick={onRegenerate}\n aria-label=\"Regenerate response\"\n className={cn(\n \"flex items-center justify-center\",\n \"w-7 h-7 rounded-md\",\n \"text-[var(--chat-text-subtle)] hover:text-[var(--chat-text)]\",\n \"hover:bg-[var(--chat-panel-bg)]\",\n \"transition-colors duration-150\",\n )}\n >\n {/* RefreshCw icon */}\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M8 16H3v5\" />\n </svg>\n </button>\n )}\n\n {/* Edit button — only shown if callback provided */}\n {onEdit && (\n <button\n type=\"button\"\n onClick={onEdit}\n aria-label=\"Edit message\"\n className={cn(\n \"flex items-center justify-center\",\n \"w-7 h-7 rounded-md\",\n \"text-[var(--chat-text-subtle)] hover:text-[var(--chat-text)]\",\n \"hover:bg-[var(--chat-panel-bg)]\",\n \"transition-colors duration-150\",\n )}\n >\n {/* Pencil icon */}\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z\" />\n <path d=\"m15 5 4 4\" />\n </svg>\n </button>\n )}\n\n {/* Divider before feedback buttons */}\n {(onConfirmCorrect || onReportIncorrect) && feedbackState === \"none\" && (\n <div className=\"w-px h-4 bg-[var(--chat-text-subtle)] opacity-20 mx-0.5\" />\n )}\n\n {/* Thumbs up — confirm correct */}\n {onConfirmCorrect && feedbackState === \"none\" && (\n <button\n type=\"button\"\n onClick={() => {\n setFeedbackState(\"correct\");\n onConfirmCorrect();\n }}\n aria-label=\"This response was helpful\"\n className={cn(\n \"flex items-center justify-center\",\n \"w-7 h-7 rounded-md\",\n \"text-[var(--chat-text-subtle)] hover:text-[var(--chat-text)]\",\n \"hover:bg-[var(--chat-panel-bg)]\",\n \"transition-colors duration-150\",\n )}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M7 10v12\" /><path d=\"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2h0a3.13 3.13 0 0 1 3 3.88Z\" />\n </svg>\n </button>\n )}\n\n {/* Thumbs down — report incorrect (opens feedback modal) */}\n {onReportIncorrect && feedbackState === \"none\" && (\n <button\n type=\"button\"\n onClick={() => setFeedbackOpen(true)}\n aria-label=\"This response was incorrect\"\n aria-haspopup=\"dialog\"\n aria-expanded={feedbackOpen}\n className={cn(\n \"flex items-center justify-center\",\n \"w-7 h-7 rounded-md\",\n \"text-[var(--chat-text-subtle)] hover:text-[var(--chat-text)]\",\n \"hover:bg-[var(--chat-panel-bg)]\",\n feedbackOpen && \"bg-[var(--chat-panel-bg)] text-[var(--chat-text)]\",\n \"transition-colors duration-150\",\n )}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17 14V2\" /><path d=\"M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22h0a3.13 3.13 0 0 1-3-3.88Z\" />\n </svg>\n </button>\n )}\n\n {/* Feedback submitted indicator */}\n {feedbackState !== \"none\" && (\n <span className=\"text-xs text-[var(--chat-text-subtle)] px-1\">\n {feedbackState === \"correct\" ? \"Thanks!\" : \"Reported\"}\n </span>\n )}\n\n {/* Feedback modal — portaled to document.body with inline styles so it\n * escapes the widget's shadow DOM / transformed containing block and\n * renders as a true full-viewport overlay. */}\n {feedbackOpen && typeof document !== \"undefined\" &&\n createPortal(\n <div\n role=\"presentation\"\n onClick={handleDismissFeedback}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 2147483600,\n background: \"rgba(0,0,0,0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 16,\n fontFamily: \"Inter, system-ui, -apple-system, sans-serif\",\n }}\n >\n <style>{FEEDBACK_MODAL_CSS}</style>\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Share feedback\"\n onClick={(e) => e.stopPropagation()}\n className=\"mf-fbm-card\"\n >\n <div className=\"mf-fbm-header\">\n <span className=\"mf-fbm-title\">Share feedback</span>\n <button\n type=\"button\"\n onClick={handleDismissFeedback}\n aria-label=\"Close feedback\"\n className=\"mf-fbm-close\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" />\n </svg>\n </button>\n </div>\n\n <div className=\"mf-fbm-chips\">\n {FEEDBACK_CATEGORIES.map((cat) => {\n const active = selectedCategory === cat;\n return (\n <button\n key={cat}\n type=\"button\"\n onClick={() => setSelectedCategory(active ? null : cat)}\n className={cn(\"mf-fbm-chip\", active && \"mf-fbm-chip--active\")}\n >\n {cat}\n </button>\n );\n })}\n </div>\n\n <textarea\n value={details}\n onChange={(e) => setDetails(e.target.value)}\n placeholder=\"What went wrong? (optional)\"\n rows={3}\n className=\"mf-fbm-textarea\"\n />\n\n <div className=\"mf-fbm-actions\">\n <button\n type=\"button\"\n onClick={handleSubmitFeedback}\n disabled={!selectedCategory && !details.trim()}\n className=\"mf-fbm-submit\"\n >\n Submit\n </button>\n </div>\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n\nconst FEEDBACK_MODAL_CSS = `\n.mf-fbm-card {\n width: 420px;\n max-width: 100%;\n background: #ffffff;\n color: #111827;\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.25);\n padding: 20px;\n box-sizing: border-box;\n}\n.mf-fbm-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n.mf-fbm-title {\n font-size: 15px;\n font-weight: 600;\n color: #111827;\n}\n.mf-fbm-close {\n width: 28px;\n height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: #6b7280;\n cursor: pointer;\n padding: 0;\n}\n.mf-fbm-close:hover {\n background: rgba(0, 0, 0, 0.05);\n color: #111827;\n}\n.mf-fbm-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-bottom: 14px;\n}\n.mf-fbm-chip {\n font-size: 12px;\n line-height: 1;\n padding: 6px 10px;\n border-radius: 9999px;\n border: 1px solid rgba(0, 0, 0, 0.18);\n background: #ffffff;\n color: #111827;\n cursor: pointer;\n transition: background 120ms, color 120ms, border-color 120ms;\n}\n.mf-fbm-chip:hover {\n background: rgba(0, 0, 0, 0.04);\n}\n.mf-fbm-chip--active,\n.mf-fbm-chip--active:hover {\n background: #111827;\n color: #ffffff;\n border-color: #111827;\n}\n.mf-fbm-textarea {\n width: 100%;\n box-sizing: border-box;\n font-family: inherit;\n font-size: 13px;\n line-height: 1.5;\n color: #111827;\n background: #f9fafb;\n border: 1px solid rgba(0, 0, 0, 0.18);\n border-radius: 8px;\n padding: 10px 12px;\n resize: none;\n outline: none;\n}\n.mf-fbm-textarea:focus {\n border-color: #111827;\n}\n.mf-fbm-textarea::placeholder {\n color: rgba(0, 0, 0, 0.45);\n}\n.mf-fbm-actions {\n display: flex;\n justify-content: flex-end;\n margin-top: 14px;\n}\n.mf-fbm-submit {\n font-size: 13px;\n font-weight: 500;\n padding: 7px 14px;\n border-radius: 8px;\n border: none;\n background: #111827;\n color: #ffffff;\n cursor: pointer;\n transition: opacity 120ms;\n}\n.mf-fbm-submit:hover {\n opacity: 0.9;\n}\n.mf-fbm-submit:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n`;\n","import { useState } from \"react\";\nimport { Download, FileIcon, FileText, Image as ImageIcon, Video, X } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport type { Attachment } from \"../types\";\n\nexport interface MessageAttachmentsProps {\n /** List of attachments to display */\n attachments: Attachment[];\n /** Custom download handler */\n onDownload?: (attachment: Attachment) => void;\n /** Custom preview handler */\n onPreview?: (attachment: Attachment) => void;\n /** Additional class names */\n className?: string;\n}\n\n/**\n * Display attachments (images, videos, documents) in messages\n */\nexport function MessageAttachments({\n attachments,\n onDownload,\n onPreview,\n className,\n}: MessageAttachmentsProps) {\n const [lightboxUrl, setLightboxUrl] = useState<string | null>(null);\n\n if (!attachments || attachments.length === 0) {\n return null;\n }\n\n const handleDownload = (attachment: Attachment) => {\n if (onDownload) {\n onDownload(attachment);\n return;\n }\n\n // Default download behavior\n if (attachment.url) {\n const link = document.createElement(\"a\");\n link.href = attachment.url;\n link.download = attachment.filename;\n link.target = \"_blank\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n };\n\n const handlePreview = (attachment: Attachment) => {\n if (onPreview) {\n onPreview(attachment);\n return;\n }\n\n // Default preview for images\n if (attachment.isImage && attachment.url) {\n setLightboxUrl(attachment.url);\n }\n };\n\n return (\n <div className={cn(\"flex flex-wrap gap-1.5\", className)}>\n {attachments.map((attachment) => (\n <AttachmentCard\n key={attachment.id}\n attachment={attachment}\n onDownload={() => handleDownload(attachment)}\n onPreview={() => handlePreview(attachment)}\n />\n ))}\n\n {/* Image lightbox */}\n {lightboxUrl && (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/80\"\n onClick={() => setLightboxUrl(null)}\n >\n <button\n className=\"absolute top-4 right-4 p-2 text-white hover:bg-white/20 rounded-full transition-colors\"\n onClick={() => setLightboxUrl(null)}\n aria-label=\"Close\"\n >\n <X size={24} />\n </button>\n <img\n src={lightboxUrl}\n alt=\"Preview\"\n className=\"max-w-[90vw] max-h-[90vh] object-contain\"\n onClick={(e) => e.stopPropagation()}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction AttachmentCard({\n attachment,\n onDownload,\n onPreview,\n}: {\n attachment: Attachment;\n onDownload: () => void;\n onPreview: () => void;\n}) {\n // Compact inline card for all attachment types\n const sizeLabel = attachment.humanReadableSize || formatFileSize(attachment.size);\n\n return (\n <div\n className={cn(\n \"inline-flex items-center gap-2 px-2.5 py-1.5 rounded-lg max-w-full\",\n \"border border-[var(--chat-border)] bg-[var(--chat-panel-bg)]\",\n attachment.isImage && attachment.url && \"cursor-pointer hover:bg-[var(--chat-border)]/30\",\n )}\n onClick={attachment.isImage && attachment.url ? onPreview : undefined}\n >\n <FileTypeIcon mimeType={attachment.mimeType} size={14} />\n <span className=\"text-xs text-[var(--chat-text)] truncate min-w-0\">\n {attachment.filename}\n </span>\n {sizeLabel && sizeLabel !== \"0 Bytes\" && (\n <span className=\"text-[10px] text-[var(--chat-text-subtle)] flex-shrink-0\">\n {sizeLabel}\n </span>\n )}\n {attachment.url && (\n <button\n onClick={(e) => { e.stopPropagation(); onDownload(); }}\n className=\"p-0.5 hover:bg-[var(--chat-border)] rounded transition-colors flex-shrink-0\"\n aria-label=\"Download\"\n >\n <Download size={12} className=\"text-[var(--chat-text-subtle)]\" />\n </button>\n )}\n </div>\n );\n}\n\nfunction FileTypeIcon({ mimeType, size = 14 }: { mimeType: string; size?: number }) {\n if (mimeType.startsWith(\"image/\")) {\n return <ImageIcon size={size} className=\"text-[var(--chat-primary)] flex-shrink-0\" />;\n }\n if (mimeType.startsWith(\"video/\")) {\n return <Video size={size} className=\"text-[var(--chat-primary)] flex-shrink-0\" />;\n }\n if (mimeType === \"application/pdf\") {\n return <FileText size={size} className=\"text-red-500 flex-shrink-0\" />;\n }\n return <FileIcon size={size} className=\"text-gray-500 flex-shrink-0\" />;\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n}\n","import type { CSSProperties } from \"react\";\n\nconst KEYFRAME_STYLE_ID = \"miiflow-reasoning-keyframes\";\n\nconst KEYFRAME_CONTENT = `\n@keyframes beamer{0%{left:-30%}100%{left:100%}}\n@keyframes mf-halo{0%,100%{opacity:0;transform:translate(-50%,-50%) scale(.65)}50%{opacity:.5;transform:translate(-50%,-50%) scale(1)}}\n@keyframes mf-wave{0%,80%,100%{opacity:.25;transform:translateY(0)}40%{opacity:1;transform:translateY(-1.5px)}}\n@keyframes mf-caret{0%,100%{opacity:.95}50%{opacity:.15}}\n@keyframes mf-rail-flow{0%{transform:translateY(-110%)}100%{transform:translateY(220%)}}\n@keyframes mf-text-shimmer{0%{background-position:100% 0}100%{background-position:-100% 0}}\n@keyframes mf-bars{0%,100%{transform:scaleY(.28)}50%{transform:scaleY(1)}}\n@keyframes mf-led{0%,100%{opacity:.5}50%{opacity:1}}\n@keyframes mf-scanline{0%{transform:translateX(-110%)}100%{transform:translateX(220%)}}\n@keyframes mf-mono-blink{0%,49%{opacity:1}50%,100%{opacity:.45}}\n@keyframes mf-row-enter{0%{opacity:0;transform:translateY(3px)}100%{opacity:1;transform:translateY(0)}}\n@keyframes mf-halo-once{0%{opacity:0;transform:scale(.4)}38%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(1.55)}}\n.mf-row-enter{animation:mf-row-enter 360ms cubic-bezier(.16,1,.3,1) both}\n.mf-tool-mark{transition:transform 220ms cubic-bezier(.16,1,.3,1);transform-origin:50% 62%;will-change:transform}\n.mf-tool-row:hover .mf-tool-mark{transform:rotate(-9deg) scale(1.08)}\n@media (prefers-reduced-motion:reduce){.mf-row-enter{animation:none}.mf-tool-mark{transition:none}.mf-tool-row:hover .mf-tool-mark{transform:none}}\n`;\n\n/**\n * Injects keyframes used by the reasoning panel into the appropriate root.\n * When called inside a Shadow DOM, injects into the shadow root so the\n * animations resolve in that scope (embedded widget). Otherwise falls back\n * to document.head.\n *\n * Re-runs every mount: if a style tag with our id already exists but its\n * content is stale (e.g. a previous build wrote an older set of keyframes\n * and the tag survived across navigations), update its text in place\n * rather than returning early. This avoids the \"new keyframe missing\n * until full refresh\" pitfall during development and live deploys.\n */\nexport function injectBeamerKeyframes(el?: HTMLElement | null): void {\n if (typeof document === \"undefined\") return;\n\n const root = el?.getRootNode?.();\n const container = root instanceof ShadowRoot ? root : document.head;\n\n const existing = (container as Document | ShadowRoot).querySelector(\n `#${KEYFRAME_STYLE_ID}`,\n );\n if (existing) {\n if (existing.textContent !== KEYFRAME_CONTENT) {\n existing.textContent = KEYFRAME_CONTENT;\n }\n return;\n }\n\n const style = document.createElement(\"style\");\n style.id = KEYFRAME_STYLE_ID;\n style.textContent = KEYFRAME_CONTENT;\n container.appendChild(style);\n}\n\n/**\n * Inline style for the row-level beamer overlay.\n *\n * Originally rendered as a pure white 70% sweep, which required a tinted\n * background underneath for visibility. The new design has no row tint,\n * so the shimmer uses an ink-tinted color-mix that adapts to the theme:\n * a soft dark sweep on light backgrounds, a soft light sweep on dark.\n * Drives the running-state motion on Timeline rows.\n */\nexport const beamerBarStyle: CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: \"-30%\",\n width: \"30%\",\n height: \"100%\",\n background:\n \"linear-gradient(90deg, transparent 0%, color-mix(in srgb, var(--chat-text) 11%, transparent) 50%, transparent 100%)\",\n animation: \"beamer 2s linear infinite\",\n zIndex: 1,\n pointerEvents: \"none\",\n};\n","import { useEffect, useRef } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { injectBeamerKeyframes } from \"../utils/beamer\";\nimport type { EventStatus } from \"../types\";\nimport type { TimelineItemKind } from \"./Timeline\";\n\ninterface StatusBadgeProps {\n status: EventStatus;\n size?: number;\n className?: string;\n /**\n * Semantic kind of the row this badge marks. Each kind has a distinct\n * marker geometry so the rail itself encodes event type at a glance —\n * dot for thoughts (soft/prose), diamond for tool calls (geometric/\n * action), ring for subagents (a dispatched thread). Shape, not just\n * color, carries the categorical distinction.\n */\n kind?: TimelineItemKind;\n}\n\n/**\n * Rail-anchored state marker.\n *\n * Shape carries state alongside color: running markers are visibly larger\n * with a strong breathing halo, so a neutral activity color still reads\n * as \"in progress.\" Color comes from `--chat-activity` with a fallback to\n * `--chat-primary`; callers whose primary is neutral can override the\n * activity accent independently via `BrandingData.activityAccentColor`.\n */\nexport function StatusBadge({ status, size = 20, className, kind }: StatusBadgeProps) {\n const ref = useRef<HTMLDivElement>(null);\n useEffect(() => {\n injectBeamerKeyframes(ref.current);\n }, []);\n\n const haloSize = Math.max(size, 16);\n const isSubagent = kind === \"subagent\";\n const isTool = kind === \"tool\";\n\n return (\n <div\n ref={ref}\n className={cn(\"relative flex-shrink-0 flex items-center justify-center\", className)}\n style={{ width: size, height: size }}\n >\n {status === \"pending\" && (\n <span\n aria-hidden\n style={{\n width: 7,\n height: 7,\n borderRadius: \"50%\",\n border: \"1.25px solid var(--chat-text-subtle)\",\n opacity: 0.35,\n background: \"transparent\",\n }}\n />\n )}\n\n {status === \"running\" && (\n <>\n <span\n aria-hidden\n style={{\n position: \"absolute\",\n left: \"50%\",\n top: \"50%\",\n width: haloSize,\n height: haloSize,\n borderRadius: \"50%\",\n background:\n \"radial-gradient(closest-side, color-mix(in srgb, var(--chat-activity, var(--chat-primary)) 55%, transparent), transparent 70%)\",\n transform: \"translate(-50%, -50%) scale(.55)\",\n animation: \"mf-halo 1.5s cubic-bezier(.16,1,.3,1) infinite\",\n pointerEvents: \"none\",\n }}\n />\n {isTool ? (\n <span\n aria-hidden\n style={{\n position: \"relative\",\n width: 5,\n height: 5,\n background: \"var(--chat-activity, var(--chat-primary))\",\n boxShadow:\n \"0 0 0 1.5px color-mix(in srgb, var(--chat-activity, var(--chat-primary)) 26%, transparent), 0 0 0 2.5px color-mix(in srgb, var(--chat-text) 6%, transparent)\",\n }}\n />\n ) : isSubagent ? (\n <span\n aria-hidden\n style={{\n position: \"relative\",\n width: 8,\n height: 8,\n borderRadius: 1.5,\n background: \"var(--chat-activity, var(--chat-primary))\",\n boxShadow:\n \"0 0 0 1.5px color-mix(in srgb, var(--chat-activity, var(--chat-primary)) 26%, transparent), 0 0 0 2.5px color-mix(in srgb, var(--chat-text) 6%, transparent)\",\n }}\n />\n ) : (\n <span\n aria-hidden\n style={{\n position: \"relative\",\n width: 7,\n height: 7,\n borderRadius: \"50%\",\n background: \"var(--chat-activity, var(--chat-primary))\",\n boxShadow:\n \"0 0 0 1.5px color-mix(in srgb, var(--chat-activity, var(--chat-primary)) 24%, transparent), 0 0 0 2.5px color-mix(in srgb, var(--chat-text) 6%, transparent)\",\n }}\n />\n )}\n </>\n )}\n\n {status === \"completed\" &&\n (isSubagent ? (\n // Encapsulated-node mark: a quiet outer frame with a centered\n // filled core. Reads as \"thread containing work\" — distinct\n // from a hollow checkbox and from the tool's solid pixel.\n <span\n aria-hidden\n style={{\n position: \"relative\",\n display: \"inline-block\",\n width: 7,\n height: 7,\n }}\n >\n <span\n style={{\n position: \"absolute\",\n inset: 0,\n border: \"1.25px solid color-mix(in srgb, var(--chat-text) 32%, transparent)\",\n boxSizing: \"border-box\",\n }}\n />\n <span\n style={{\n position: \"absolute\",\n left: \"50%\",\n top: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: 2,\n height: 2,\n background: \"color-mix(in srgb, var(--chat-text) 60%, transparent)\",\n }}\n />\n </span>\n ) : isTool ? (\n <span\n aria-hidden\n style={{\n width: 4,\n height: 4,\n background: \"color-mix(in srgb, var(--chat-text) 38%, transparent)\",\n boxShadow:\n \"inset 0 0 0 0.5px color-mix(in srgb, var(--chat-text) 65%, transparent)\",\n }}\n />\n ) : (\n <span\n aria-hidden\n style={{\n width: 4,\n height: 4,\n borderRadius: \"50%\",\n background: \"color-mix(in srgb, var(--chat-text) 55%, transparent)\",\n }}\n />\n ))}\n\n {status === \"failed\" && (\n <span\n aria-hidden\n style={{\n position: \"relative\",\n width: 12,\n height: 12,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"var(--chat-error)\",\n fontSize: 12,\n lineHeight: 1,\n fontWeight: 600,\n transform: \"translateY(-0.5px)\",\n }}\n >\n ×\n </span>\n )}\n </div>\n );\n}\n","import { ReactNode, useEffect, useRef } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { StatusBadge } from \"./StatusBadge\";\nimport type { EventStatus } from \"../types\";\nimport { injectBeamerKeyframes } from \"../utils/beamer\";\n\nexport type TimelineItemKind =\n | \"thinking\"\n | \"planning\"\n | \"tool\"\n | \"observation\"\n | \"subagent\";\n\nexport interface TimelineItemData {\n id: string;\n status: EventStatus;\n content: ReactNode;\n /**\n * When true, the parent Timeline does not apply the running-state\n * gradient wash to this row's content cell. Use for rows that own a\n * nested timeline (e.g. subagents) — the wash bleeds behind the entire\n * expanded body and reads as a card around the group.\n */\n bare?: boolean;\n /**\n * Semantic kind of this row. Drives adjacency-aware vertical spacing\n * (consecutive thoughts pack tighter; tool/subagent boundaries breathe\n * wider) and the StatusBadge marker variant (subagent gets a ring).\n */\n kind?: TimelineItemKind;\n}\n\nexport interface TimelineProps {\n items: TimelineItemData[];\n badgeSize?: number;\n className?: string;\n}\n\n/**\n * Adjacency-aware bottom padding between rows. Mirrors the rhythm of a\n * research notebook: same-kind consecutive rows pack as a tight cluster\n * (a paragraph of thought, a burst of tool calls); mode transitions get\n * breathing room; dispatched threads and result panels stand on their own\n * with a strong section break.\n */\nfunction spacingFor(current?: TimelineItemKind, next?: TimelineItemKind): number {\n if (!next) return 0;\n // Subagent rows used to claim 14px of air on each side so their (then-\n // always-expanded) nested body felt like its own section. With the\n // refreshed chip-style header that's usually collapsed, that gap reads\n // as inconsistent vertical rhythm against the tight tool cluster\n // around it. Match the cross-kind transition baseline instead — the\n // subagent's own expanded body provides separation when needed.\n if (current === \"subagent\" || next === \"subagent\") return 6;\n if (current === \"observation\" || next === \"observation\") return 12;\n // Same kind in a row: hug close so the cluster reads as one unit.\n if (current === next) return 4;\n // Mode transition (e.g. thinking → tool, tool → thinking): give air.\n return 9;\n}\n\n/**\n * Vertical timeline — refreshed look.\n *\n * One unbroken hairline rail down the badge column with rail-anchored ink\n * markers. The active segment carries a soft downward-flowing gradient\n * slice; running rows get a left-anchored gradient wash on the content\n * side. Spacing varies by adjacency so the panel reads like prose, not a\n * uniform list.\n */\nexport function Timeline({ items, badgeSize = 20, className }: TimelineProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n injectBeamerKeyframes(containerRef.current);\n }, []);\n\n if (items.length === 0) {\n return null;\n }\n\n const railCenter = badgeSize / 2;\n\n return (\n <div ref={containerRef} className={cn(\"max-w-full\", className)}>\n <div style={{ position: \"relative\" }}>\n {/* Continuous hairline rail running the full height of the timeline. */}\n {items.length > 1 && (\n <div\n aria-hidden\n style={{\n position: \"absolute\",\n left: railCenter - 0.5,\n top: 6,\n bottom: 6,\n width: 1,\n background: \"color-mix(in srgb, var(--chat-text) 10%, transparent)\",\n pointerEvents: \"none\",\n }}\n />\n )}\n\n <div className=\"flex flex-col\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const isRunning = item.status === \"running\";\n const showFlow = isRunning && !isLast;\n const bottomPad = isLast\n ? 0\n : spacingFor(item.kind, items[index + 1]?.kind);\n\n return (\n <div\n key={item.id}\n className=\"mf-row-enter\"\n style={{\n display: \"grid\",\n gridTemplateColumns: `${badgeSize}px 1fr`,\n columnGap: \"0.625rem\",\n paddingBottom: bottomPad,\n position: \"relative\",\n }}\n >\n {/* Status marker column */}\n <div\n className=\"relative flex flex-col items-center flex-shrink-0\"\n style={{ paddingTop: 4 }}\n >\n <StatusBadge status={item.status} size={badgeSize} kind={item.kind} />\n\n {/* Flowing gradient slice on the active rail segment. */}\n {showFlow && (\n <div\n aria-hidden\n style={{\n position: \"absolute\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n top: badgeSize + 4,\n width: 1,\n height: `calc(100% - ${badgeSize}px + 4px)`,\n overflow: \"hidden\",\n pointerEvents: \"none\",\n }}\n >\n <div\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n width: \"100%\",\n height: \"55%\",\n background:\n \"linear-gradient(180deg, transparent 0%, color-mix(in srgb, var(--chat-activity, var(--chat-primary)) 70%, transparent) 50%, transparent 100%)\",\n animation: \"mf-rail-flow 1.6s cubic-bezier(.16,1,.3,1) infinite\",\n willChange: \"transform\",\n }}\n />\n </div>\n )}\n </div>\n\n {/* Content column — shimmer now lives on the text itself\n (see EventContent's running-state styles), not on the\n row, so we no longer need a positioned overlay here. */}\n <div\n style={{\n minWidth: 0,\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n position: \"relative\",\n overflow: \"hidden\",\n paddingTop: 2,\n paddingBottom: 2,\n }}\n >\n {item.content}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n\nexport interface TimelineItemProps {\n status: EventStatus;\n isLast?: boolean;\n badgeSize?: number;\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Single timeline item (alternative API). Matches the refreshed look of\n * the parent `Timeline`: hairline rail, ink-dot markers, no card chrome.\n */\nexport function TimelineItem({\n status,\n isLast = false,\n badgeSize = 20,\n children,\n className,\n}: TimelineItemProps) {\n const itemRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n injectBeamerKeyframes(itemRef.current);\n }, []);\n const isRunning = status === \"running\";\n const showFlow = isRunning && !isLast;\n\n return (\n <div\n ref={itemRef}\n className={cn(\"relative flex items-start gap-2.5 animate-fade-in\", !isLast && \"pb-3\", className)}\n >\n <div className=\"relative flex-shrink-0\" style={{ paddingTop: 4 }}>\n {!isLast && (\n <div\n aria-hidden\n style={{\n position: \"absolute\",\n left: badgeSize / 2 - 0.5,\n top: badgeSize + 4,\n width: 1,\n height: \"calc(100% + 8px)\",\n background: \"color-mix(in srgb, var(--chat-text) 10%, transparent)\",\n pointerEvents: \"none\",\n }}\n />\n )}\n\n <StatusBadge status={status} size={badgeSize} />\n\n {showFlow && (\n <div\n aria-hidden\n style={{\n position: \"absolute\",\n left: badgeSize / 2 - 0.5,\n top: badgeSize + 4,\n width: 1,\n height: \"calc(100% + 8px)\",\n overflow: \"hidden\",\n pointerEvents: \"none\",\n }}\n >\n <div\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n width: \"100%\",\n height: \"55%\",\n background:\n \"linear-gradient(180deg, transparent 0%, color-mix(in srgb, var(--chat-activity, var(--chat-primary)) 70%, transparent) 50%, transparent 100%)\",\n animation: \"mf-rail-flow 1.6s cubic-bezier(.16,1,.3,1) infinite\",\n willChange: \"transform\",\n }}\n />\n </div>\n )}\n </div>\n\n <div\n style={{\n minWidth: 0,\n flex: 1,\n position: \"relative\",\n overflow: \"hidden\",\n borderRadius: 4,\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { injectBeamerKeyframes } from \"../utils/beamer\";\nimport { convertChunkToEvent, EventTimeline } from \"./EventTimeline\";\nimport { MarkdownContent } from \"./MarkdownContent\";\nimport type { Event } from \"../types\";\n\ninterface EventContentProps {\n event: Event;\n className?: string;\n /** Active state — drives the trailing caret on tool calls. */\n isRunning?: boolean;\n /**\n * Slowest duration in the surrounding timeline. Used to scale this row's\n * trailing micro-bar so the panel reads as a proportional trace.\n */\n maxDurationSeconds?: number;\n}\n\n/**\n * Compact \"tool call\" mark — Lucide-style 3/4-view open-end wrench.\n *\n * Universal symbol for \"tool / fix / configure\" so it reads instantly\n * as a tool call. Stamps every tool row so the eye groups them as a\n * distinct event class, separate from prose thoughts (no mark) and\n * subagent dispatches (`@handle`).\n *\n * Color inherits from the surrounding span via `currentColor`, allowing\n * theme-aware tinting at the call site.\n */\nfunction ToolCallMark() {\n return (\n <svg\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n style={{ flexShrink: 0, display: \"block\" }}\n >\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\" />\n </svg>\n );\n}\n\nconst MONO_STACK =\n \"ui-monospace, 'SFMono-Regular', 'JetBrains Mono', 'Fira Code', Menlo, Consolas, monospace\";\n\n/**\n * Theme-adaptive text-shimmer styles applied to the live, in-progress\n * row. A gradient masked by the text shape sweeps across the characters\n * so the *text itself* shimmers, not the background.\n *\n * The gradient is symmetrical with dim 25% shoulders and a full-strength\n * peak; with `background-size: 200% 100%` and the `mf-text-shimmer`\n * keyframe moving `background-position` from 100% to -100%, the bright\n * peak traverses the visible area exactly once per cycle. Basis color is\n * `--chat-text`, so the effect adapts to light and dark themes.\n */\nconst TEXT_SHIMMER_STYLE: React.CSSProperties = {\n // Dark base text with a lighter \"highlight\" peak that travels through\n // the characters. Shoulders sit at full `--chat-text`; the peak fades\n // to ~35% so each character momentarily reads as a highlight wash as\n // the beam passes. Inverts the more common \"shimmer-draws-the-text\"\n // pattern in favor of a \"scan-lightens-the-text\" feel.\n backgroundImage:\n \"linear-gradient(90deg, var(--chat-text) 0%, var(--chat-text) 40%, color-mix(in srgb, var(--chat-text) 35%, transparent) 50%, var(--chat-text) 60%, var(--chat-text) 100%)\",\n backgroundSize: \"200% 100%\",\n // Tile horizontally so the next peak enters from the left as the\n // previous one exits right; gradient endpoints both match the base\n // ink, so the tile seam is invisible.\n backgroundRepeat: \"repeat-x\",\n backgroundClip: \"text\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n color: \"transparent\",\n animation: \"mf-text-shimmer 2.4s linear infinite\",\n};\n\n/**\n * Inline duration affordance. Renders a tabular-num seconds figure with a\n * proportional 24px micro-bar underneath — sized relative to the slowest\n * event in the timeline. Turns the reasoning panel into a tiny APM trace\n * where the bottleneck step is instantly scannable.\n */\nfunction DurationTrail({\n seconds,\n maxSeconds,\n}: {\n seconds: number;\n maxSeconds: number;\n}) {\n const fraction = maxSeconds > 0 ? Math.min(1, Math.max(0.08, seconds / maxSeconds)) : 0.2;\n return (\n <span\n aria-label={`${seconds.toFixed(1)} seconds`}\n style={{\n display: \"inline-flex\",\n flexDirection: \"column\",\n alignItems: \"flex-end\",\n gap: 2,\n marginLeft: 8,\n flexShrink: 0,\n paddingTop: 2,\n }}\n >\n <span\n className=\"tabular-nums\"\n style={{\n fontSize: 11,\n color: \"color-mix(in srgb, var(--chat-text) 45%, transparent)\",\n fontVariantNumeric: \"tabular-nums\",\n letterSpacing: \"0.01em\",\n lineHeight: 1,\n }}\n >\n {seconds.toFixed(1)}s\n </span>\n <span\n aria-hidden\n style={{\n width: 24,\n height: 1.5,\n background: \"color-mix(in srgb, var(--chat-text) 8%, transparent)\",\n borderRadius: 1,\n position: \"relative\",\n overflow: \"hidden\",\n }}\n >\n <span\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n height: \"100%\",\n width: `${fraction * 100}%`,\n background: \"color-mix(in srgb, var(--chat-activity, var(--chat-primary)) 60%, transparent)\",\n borderRadius: 1,\n }}\n />\n </span>\n </span>\n );\n}\n\n/**\n * Refreshed event content.\n *\n * - Thinking / planning render as prose at 78% ink with relaxed leading;\n * active rows bump to weight 500 so the eye lands on live content.\n * - Tool calls render as an inline monospace tag. The redundant inner dot\n * is gone (the rail badge already conveys state at the same y); a soft\n * caret blinks at the trailing edge while running.\n * - Completed rows get a right-aligned duration with a proportional micro-\n * bar — the panel reads as a tiny trace.\n * - Observations use a quiet tinted background, no side-stripe.\n */\nexport function EventContent({\n event,\n className,\n isRunning,\n maxDurationSeconds,\n}: EventContentProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n injectBeamerKeyframes(containerRef.current);\n }, []);\n\n const hasDuration =\n event.durationSeconds != null && event.durationSeconds > 0.05;\n\n if (event.type === \"thinking\" || event.type === \"planning\") {\n return (\n <div\n ref={containerRef}\n className={cn(\"min-w-0 max-w-full\", className)}\n style={{\n // No horizontal padding so the text starts at the same x as the\n // tool-row's mono text (which is inline-flex with no padding).\n // Otherwise sans-thinking sits 2px right of mono-tool and the\n // labels read as misaligned down the rail.\n paddingTop: 1,\n paddingBottom: 1,\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n }}\n >\n <div\n style={{\n lineHeight: 1.6,\n letterSpacing: \"-0.005em\",\n fontWeight: isRunning ? 480 : 400,\n flex: 1,\n minWidth: 0,\n ...(isRunning\n ? TEXT_SHIMMER_STYLE\n : {\n color: \"color-mix(in srgb, var(--chat-text) 78%, transparent)\",\n }),\n }}\n >\n <MarkdownContent className=\"text-[14px]\">{event.content}</MarkdownContent>\n </div>\n {hasDuration && (\n <DurationTrail\n seconds={event.durationSeconds!}\n maxSeconds={maxDurationSeconds ?? event.durationSeconds!}\n />\n )}\n </div>\n );\n }\n\n if (event.type === \"tool\") {\n // Prefer the LLM-provided description (user-facing prose); when\n // absent, fall back to the raw tool name. The previous \"Working…\"\n // placeholder looked weird in completed states — a slug, even if\n // implementation-y, reads as a real event. The chip-style display\n // that exposed the slug ALONGSIDE the description is what got\n // dropped; this single-label fallback is fine.\n const description = event.toolDescription?.trim();\n const hasDescription = !!description && description.length > 0;\n const label = hasDescription ? description! : event.toolName || \"Tool call\";\n\n return (\n <div\n ref={containerRef}\n className={cn(\"mf-tool-row inline-flex items-center gap-2.5 min-w-0 max-w-full\", className)}\n style={{ position: \"relative\" }}\n title={event.toolName}\n >\n <span\n aria-hidden\n className=\"mf-tool-mark\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n width: 14,\n height: 14,\n color:\n \"color-mix(in srgb, var(--chat-activity, var(--chat-primary)) 70%, var(--chat-text))\",\n opacity: 0.82,\n }}\n >\n <ToolCallMark />\n </span>\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n // Slug fallbacks render in mono so a raw `render_table` reads\n // as a code identifier rather than malformed prose. Real\n // descriptions stay in sans body text.\n fontFamily: hasDescription ? undefined : MONO_STACK,\n fontVariantLigatures: hasDescription ? undefined : \"none\",\n fontSize: hasDescription ? 14 : 12.5,\n lineHeight: 1.5,\n letterSpacing: \"-0.005em\",\n fontWeight: hasDescription ? 450 : 500,\n fontVariantNumeric: \"tabular-nums\",\n flex: 1,\n minWidth: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n ...(isRunning\n ? TEXT_SHIMMER_STYLE\n : {\n color: \"color-mix(in srgb, var(--chat-text) 86%, transparent)\",\n }),\n }}\n >\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n minWidth: 0,\n }}\n >\n {label}\n </span>\n {isRunning && (\n <span\n aria-hidden\n style={{\n display: \"inline-block\",\n width: 2,\n height: \"0.95em\",\n background: \"var(--chat-activity, var(--chat-primary))\",\n marginLeft: 4,\n animation: \"mf-caret 1.05s cubic-bezier(.4,0,.6,1) infinite\",\n borderRadius: 1,\n flexShrink: 0,\n // Caret must stay solid; the shimmer-styled parent uses\n // background-clip:text and would otherwise erase it.\n WebkitTextFillColor: \"currentColor\",\n color: \"var(--chat-activity, var(--chat-primary))\",\n backgroundImage: \"none\",\n backgroundClip: \"border-box\",\n WebkitBackgroundClip: \"border-box\",\n }}\n />\n )}\n </span>\n\n {hasDuration && (\n <DurationTrail\n seconds={event.durationSeconds!}\n maxSeconds={maxDurationSeconds ?? event.durationSeconds!}\n />\n )}\n </div>\n );\n }\n\n if (event.type === \"observation\") {\n const success = event.success !== false;\n const accentVar = success ? \"--chat-secondary\" : \"--chat-warning\";\n\n return (\n <div\n ref={containerRef}\n className={cn(\"max-w-full overflow-auto\", className)}\n style={{\n padding: \"8px 12px\",\n borderRadius: 3,\n background: `color-mix(in srgb, var(${accentVar}) 4%, transparent)`,\n boxShadow: `inset 0 0 0 0.5px color-mix(in srgb, var(${accentVar}) 22%, transparent)`,\n }}\n >\n <div\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n marginBottom: 4,\n }}\n >\n <span\n aria-hidden\n style={{\n width: 3,\n height: 3,\n background: `var(${accentVar})`,\n }}\n />\n <span\n style={{\n fontFamily: MONO_STACK,\n fontSize: 9.5,\n fontWeight: 700,\n letterSpacing: \"0.16em\",\n textTransform: \"uppercase\",\n color: `var(${accentVar})`,\n fontVariantLigatures: \"none\",\n }}\n >\n response\n </span>\n </div>\n <div className=\"text-[var(--chat-text)]\">\n <MarkdownContent className=\"text-[14px]\">{event.content}</MarkdownContent>\n </div>\n </div>\n );\n }\n\n if (event.type === \"subagent\") {\n const data = event.subagentData;\n const nestedEvents: Event[] = (data.nestedChunks ?? [])\n .map((c, i) => convertChunkToEvent(c, i))\n .filter((e): e is Event => e !== null);\n if (data.result && data.result.trim().length > 0) {\n nestedEvents.push({\n id: `result-${data.subagentId}`,\n type: \"thinking\",\n status: data.status === \"failed\" ? \"failed\" : \"completed\",\n content: data.result,\n });\n }\n return (\n <SubagentChip\n slug={data.subagentType || \"sub-assistant\"}\n durationSeconds={data.durationMs != null ? data.durationMs / 1000 : undefined}\n isRunning={data.status === \"running\"}\n isFailed={data.status === \"failed\"}\n defaultExpanded={false}\n nestedEvents={nestedEvents}\n />\n );\n }\n\n return null;\n}\n\ninterface SubagentChipProps {\n slug: string;\n durationSeconds?: number;\n isRunning: boolean;\n isFailed: boolean;\n defaultExpanded: boolean;\n nestedEvents: Event[];\n}\n\n/**\n * Identity-chip rendering for dispatched subagents.\n *\n * Reads as a Slack/GitHub @mention — a monospace handle, quiet tabular\n * duration, and a soft rotating caret. The status badge in the parent\n * timeline rail conveys activity; this row stays chrome-free so the\n * expanded body of nested events doesn't read as a card.\n */\nfunction SubagentChip({\n slug,\n durationSeconds,\n isRunning,\n isFailed,\n defaultExpanded,\n nestedEvents,\n}: SubagentChipProps) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n const hasNested = nestedEvents.length > 0;\n const showCaret = hasNested;\n\n const handleColor = isFailed\n ? \"var(--chat-error)\"\n : isRunning\n ? \"color-mix(in srgb, var(--chat-text) 92%, transparent)\"\n : \"color-mix(in srgb, var(--chat-text) 78%, transparent)\";\n\n return (\n <div className=\"flex-1 min-w-0\">\n <div\n onClick={hasNested ? () => setIsExpanded((v) => !v) : undefined}\n className={cn(\n \"inline-flex items-center gap-2 min-w-0 max-w-full\",\n hasNested && \"cursor-pointer\",\n )}\n style={{ paddingTop: 1, paddingBottom: 1 }}\n >\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"baseline\",\n fontFamily: MONO_STACK,\n fontSize: 13,\n lineHeight: 1.35,\n fontWeight: 500,\n letterSpacing: 0,\n color: handleColor,\n fontVariantLigatures: \"none\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n minWidth: 0,\n }}\n >\n <span\n aria-hidden\n style={{\n opacity: 0.55,\n marginRight: 1,\n fontWeight: 400,\n }}\n >\n @\n </span>\n {slug}\n </span>\n\n {durationSeconds != null && durationSeconds > 0 ? (\n <span\n className=\"shrink-0 tabular-nums\"\n style={{\n fontSize: 11,\n color: \"color-mix(in srgb, var(--chat-text) 50%, transparent)\",\n fontVariantNumeric: \"tabular-nums\",\n letterSpacing: \"0.01em\",\n }}\n >\n {durationSeconds.toFixed(1)}s\n </span>\n ) : isRunning ? (\n <span\n className=\"shrink-0\"\n style={{\n fontSize: 11,\n color: \"color-mix(in srgb, var(--chat-activity, var(--chat-primary)) 85%, transparent)\",\n fontStyle: \"italic\",\n letterSpacing: \"0.01em\",\n }}\n >\n running…\n </span>\n ) : null}\n\n {showCaret && (\n <span\n aria-hidden\n className=\"shrink-0 inline-flex items-center justify-center\"\n style={{\n width: 14,\n height: 14,\n color: \"color-mix(in srgb, var(--chat-text) 40%, transparent)\",\n fontSize: 11,\n lineHeight: 1,\n transform: isExpanded ? \"rotate(90deg)\" : \"rotate(0deg)\",\n transition: \"transform 220ms cubic-bezier(.16,1,.3,1)\",\n }}\n >\n ›\n </span>\n )}\n </div>\n\n {hasNested && isExpanded && (\n <div\n className=\"animate-fade-in\"\n style={{ marginTop: 6, paddingLeft: 14 }}\n >\n <EventTimeline events={nestedEvents} />\n </div>\n )}\n </div>\n );\n}\n","import { Timeline, type TimelineItemData } from \"./Timeline\";\nimport { EventContent } from \"./EventContent\";\nimport type { Event, EventStatus, StreamingChunk } from \"../types\";\n\n/**\n * Internal tools that should be hidden from users.\n *\n * `dispatch_assistant` is special: the call IS user-relevant, but it's\n * rendered as a nested SubagentPanel via the dedicated \"subagent\" event\n * type below. Hiding the raw tool-call chip avoids duplicate rendering of\n * the same dispatch in two visual styles.\n */\nconst INTERNAL_TOOLS = [\"create_plan\", \"tool_search\", \"unknown\", \"dispatch_assistant\"];\n\nfunction isInternalTool(toolName?: string): boolean {\n if (!toolName) return false;\n return INTERNAL_TOOLS.includes(toolName.toLowerCase().trim());\n}\n\n/**\n * Convert StreamingChunk to Event format\n */\nexport function convertChunkToEvent(chunk: StreamingChunk, index: number): Event | null {\n // Filter out internal tools\n if (chunk.toolName && isInternalTool(chunk.toolName)) {\n return null;\n }\n\n if (chunk.type === \"thinking\") {\n // Skip empty thinking chunks\n if (!chunk.content || chunk.content.trim().length === 0) {\n return null;\n }\n\n return {\n id: `thinking-${index}`,\n type: \"thinking\",\n status: \"completed\",\n content: chunk.content,\n };\n }\n\n if (chunk.type === \"planning\") {\n // Skip empty planning chunks\n if (!chunk.content || chunk.content.trim().length === 0) {\n return null;\n }\n\n const isComplete = chunk.planData !== undefined || chunk.content.includes(\"✓ Created plan\");\n\n return {\n id: `planning-${index}`,\n type: \"planning\",\n status: isComplete ? \"completed\" : \"running\",\n content: chunk.content,\n isComplete,\n };\n }\n\n if (chunk.type === \"tool\") {\n const status: EventStatus =\n chunk.status === \"executing\"\n ? \"running\"\n : chunk.status === \"completed\"\n ? \"completed\"\n : \"pending\";\n\n return {\n id: `tool-${index}`,\n type: \"tool\",\n status,\n toolName: chunk.toolName || \"Unknown Tool\",\n toolDescription: chunk.toolDescription,\n };\n }\n\n // Sub-assistant dispatch — render the SubagentPanel inline in the\n // timeline at the position the dispatch was issued. Skip if subagentData\n // is missing (defensive: should never happen for well-formed chunks).\n if (chunk.type === \"subagent\" && chunk.subagentData) {\n const status: EventStatus =\n chunk.subagentData.status === \"running\"\n ? \"running\"\n : chunk.subagentData.status === \"completed\"\n ? \"completed\"\n : chunk.subagentData.status === \"failed\"\n ? \"failed\"\n : \"pending\";\n\n return {\n id: `subagent-${chunk.subagentData.subagentId}-${index}`,\n type: \"subagent\",\n status,\n subagentData: chunk.subagentData,\n };\n }\n\n // Don't render observation chunks separately\n return null;\n}\n\n/**\n * Convert timeline items (from metadata) to Events.\n *\n * Computes pairwise `durationSeconds` from `item.timestamp` so completed\n * timelines can show per-step trace bars. Falls back to undefined when\n * timestamps are missing (e.g. tail events without a successor).\n */\nexport function convertTimelineToEvents(timeline: Array<Record<string, unknown>>): Event[] {\n const events: Event[] = [];\n const eventTimestamps: number[] = [];\n\n timeline.forEach((item, index) => {\n const ts = typeof item.timestamp === \"number\" ? item.timestamp : undefined;\n\n if (item.type === \"thought\") {\n const thought = item.thought as string | undefined;\n if (!thought || thought.trim().length === 0) {\n return;\n }\n\n events.push({\n id: `thought-${index}`,\n type: \"thinking\",\n status: \"completed\",\n content: thought,\n timestamp: ts,\n });\n eventTimestamps.push(ts ?? NaN);\n } else if (item.type === \"tool\") {\n const tool = (item.tool as string) || \"Unknown Tool\";\n if (isInternalTool(tool)) {\n return;\n }\n\n events.push({\n id: `tool-${index}`,\n type: \"tool\",\n status: \"completed\",\n toolName: tool,\n toolDescription: item.tool_description as string | undefined,\n timestamp: ts,\n });\n eventTimestamps.push(ts ?? NaN);\n }\n });\n\n // Pairwise duration: each event's duration = next event's timestamp - this one's.\n // The last event has no successor, so its duration is left undefined.\n for (let i = 0; i < events.length - 1; i++) {\n const cur = eventTimestamps[i];\n const next = eventTimestamps[i + 1];\n if (Number.isFinite(cur) && Number.isFinite(next) && next > cur) {\n const diff = next - cur;\n // Timestamps may be epoch ms or seconds; normalize to seconds.\n const seconds = diff > 1000 ? diff / 1000 : diff;\n if (seconds > 0 && seconds < 3600) {\n events[i].durationSeconds = seconds;\n }\n }\n }\n\n return events;\n}\n\nexport interface EventTimelineProps {\n events: Event[];\n isStreaming?: boolean;\n className?: string;\n}\n\nfunction eventKind(event: Event): TimelineItemData[\"kind\"] {\n switch (event.type) {\n case \"thinking\":\n return \"thinking\";\n case \"planning\":\n return \"planning\";\n case \"tool\":\n return \"tool\";\n case \"observation\":\n return \"observation\";\n case \"subagent\":\n return \"subagent\";\n default:\n return undefined;\n }\n}\n\n/**\n * Unified event timeline component\n * Displays thinking, tool execution, and observation events\n */\nexport function EventTimeline({ events, className }: EventTimelineProps) {\n if (events.length === 0) {\n return null;\n }\n\n // Max duration across this timeline drives the proportional micro-bar.\n const maxDurationSeconds = events.reduce(\n (max, e) => (e.durationSeconds && e.durationSeconds > max ? e.durationSeconds : max),\n 0,\n );\n\n // Convert events to timeline items. Subagent rows own a nested timeline,\n // so the parent's running-state wash would read as a card around the\n // entire group — mark them `bare` to suppress it.\n const timelineItems: TimelineItemData[] = events.map((event) => ({\n id: event.id,\n status: event.status,\n kind: eventKind(event),\n content: (\n <EventContent\n event={event}\n isRunning={event.status === \"running\"}\n maxDurationSeconds={maxDurationSeconds}\n />\n ),\n bare: event.type === \"subagent\",\n }));\n\n return <Timeline items={timelineItems} badgeSize={20} className={className} />;\n}\n","import { useState } from \"react\";\nimport type { Event } from \"../types\";\nimport { cn } from \"../utils/cn\";\nimport { EventTimeline } from \"./EventTimeline\";\n\nexport interface TimelineRowProps {\n\t/** Primary label — subtask description, agent name, or humanized handle. */\n\tlabel: string;\n\t/** Secondary text — task summary, self-description, or error message. */\n\tdescription?: string;\n\t/** Duration in seconds. Rendered right-aligned with tabular numerals. */\n\tdurationSeconds?: number;\n\t/** Apply failed-state coloring to label/description. */\n\tisFailed?: boolean;\n\t/** Auto-expand the row when first rendered (e.g. when running). */\n\tdefaultExpanded?: boolean;\n\t/** Nested events rendered in an indented body when expanded. */\n\tnestedEvents?: Event[];\n\t/** When true, the chevron is suppressed (used for non-expandable rows). */\n\thideChevron?: boolean;\n}\n\n/**\n * Shared row content used by every reasoning-panel timeline:\n * plan subtasks, multi-agent subagents, and sub-assistant dispatches.\n *\n * The leading status marker and rail are provided by the parent\n * `Timeline`; this component only owns the label/description/duration row\n * and the nested timeline that expands beneath it.\n *\n * Refreshed look: the lucide chevron is replaced by a typographic caret\n * that rotates on expand; the duration is rendered as a tabular-num pill\n * with quiet weight so it reads as data, not chrome.\n */\nexport function TimelineRow({\n\tlabel,\n\tdescription,\n\tdurationSeconds,\n\tisFailed = false,\n\tdefaultExpanded = false,\n\tnestedEvents,\n\thideChevron = false,\n}: TimelineRowProps) {\n\tconst [isExpanded, setIsExpanded] = useState(defaultExpanded);\n\tconst hasNested = !!(nestedEvents && nestedEvents.length > 0);\n\tconst showChevron = hasNested && !hideChevron;\n\n\treturn (\n\t\t<div className=\"flex-1 min-w-0\">\n\t\t\t<div\n\t\t\t\tonClick={showChevron ? () => setIsExpanded(!isExpanded) : undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex items-center gap-2 min-w-0\",\n\t\t\t\t\tshowChevron && \"cursor-pointer\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"text-sm truncate\",\n\t\t\t\t\t\tisFailed ? \"text-[var(--chat-error)]\" : \"text-[var(--chat-text)]\",\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ fontWeight: 500, letterSpacing: \"-0.005em\" }}\n\t\t\t\t>\n\t\t\t\t\t{label}\n\t\t\t\t</span>\n\n\t\t\t\t{description && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"text-sm truncate flex-1\",\n\t\t\t\t\t\t\tisFailed\n\t\t\t\t\t\t\t\t? \"text-[var(--chat-error)]\"\n\t\t\t\t\t\t\t\t: \"text-[var(--chat-text-subtle)]\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\n\t\t\t\t{durationSeconds != null && durationSeconds > 0 && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName=\"shrink-0 tabular-nums\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\tcolor: \"color-mix(in srgb, var(--chat-text) 50%, transparent)\",\n\t\t\t\t\t\t\tfontVariantNumeric: \"tabular-nums\",\n\t\t\t\t\t\t\tletterSpacing: \"0.01em\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{durationSeconds.toFixed(1)}s\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\n\t\t\t\t{showChevron && (\n\t\t\t\t\t<span\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\tclassName=\"shrink-0 inline-flex items-center justify-center\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: 14,\n\t\t\t\t\t\t\theight: 14,\n\t\t\t\t\t\t\tcolor: \"color-mix(in srgb, var(--chat-text) 40%, transparent)\",\n\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t\t\ttransform: isExpanded ? \"rotate(90deg)\" : \"rotate(0deg)\",\n\t\t\t\t\t\t\ttransition: \"transform 220ms cubic-bezier(.16,1,.3,1)\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t›\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{hasNested && isExpanded && (\n\t\t\t\t<div className=\"mt-2 pl-2 animate-fade-in\">\n\t\t\t\t\t<EventTimeline events={nestedEvents!} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { cn } from \"../utils/cn\";\nimport { Timeline, type TimelineItemData } from \"./Timeline\";\nimport { TimelineRow } from \"./TimelineRow\";\nimport type { PlanData, StreamingChunk, Event, EventStatus, SubTaskData } from \"../types\";\n\n/**\n * Internal tools that should be hidden from users — kept in sync with\n * EventTimeline.INTERNAL_TOOLS. `tool_search` is the deferred-tool\n * discovery meta-tool, an implementation detail users shouldn't see.\n */\nconst INTERNAL_TOOLS = [\"create_plan\", \"tool_search\", \"unknown\"];\n\nfunction isInternalTool(toolName?: string): boolean {\n if (!toolName) return false;\n return INTERNAL_TOOLS.includes(toolName.toLowerCase().trim());\n}\n\n/**\n * Convert streaming chunks to Events for a specific subtask\n */\nfunction convertChunksToEvents(chunks: StreamingChunk[]): Event[] {\n const events: Event[] = [];\n\n chunks.forEach((chunk, index) => {\n if (chunk.type === \"thinking\") {\n if (!chunk.content || chunk.content.trim().length === 0) return;\n\n events.push({\n id: `thinking-${index}`,\n type: \"thinking\",\n status: \"completed\",\n content: chunk.content,\n });\n } else if (chunk.type === \"tool\") {\n if (isInternalTool(chunk.toolName)) return;\n\n const status: EventStatus =\n chunk.status === \"executing\"\n ? \"running\"\n : chunk.status === \"completed\"\n ? \"completed\"\n : \"pending\";\n\n events.push({\n id: `tool-${index}`,\n type: \"tool\",\n status,\n toolName: chunk.toolName || \"Unknown Tool\",\n toolDescription: chunk.toolDescription,\n });\n }\n });\n\n return events;\n}\n\ninterface SubtaskContentProps {\n subtask: SubTaskData;\n executionChunks?: StreamingChunk[];\n}\n\nfunction SubtaskContent({ subtask, executionChunks = [] }: SubtaskContentProps) {\n const isFailed = subtask.status === \"failed\";\n const isCompleted = subtask.status === \"completed\";\n const events = convertChunksToEvents(executionChunks);\n\n return (\n <TimelineRow\n label={subtask.description}\n description={isFailed ? subtask.error : undefined}\n durationSeconds={isCompleted ? subtask.execution_time : undefined}\n isFailed={isFailed}\n defaultExpanded={subtask.status === \"running\"}\n nestedEvents={events}\n />\n );\n}\n\nexport interface PlanTimelineProps {\n plan: PlanData;\n streamingChunks?: StreamingChunk[];\n className?: string;\n}\n\n/**\n * Minimal timeline for Plan & Execute mode.\n * Matches in-house style: simple \"Plan:\" header + inline text rows.\n */\nexport function PlanTimeline({\n plan,\n streamingChunks = [],\n className,\n}: PlanTimelineProps) {\n // Convert subtasks to timeline items\n const timelineItems: TimelineItemData[] = plan.subtasks.map((subtask) => {\n const subtaskChunks = streamingChunks.filter(\n (chunk) => chunk.subtaskId === subtask.id\n );\n\n const status: EventStatus =\n subtask.status === \"running\"\n ? \"running\"\n : subtask.status === \"completed\"\n ? \"completed\"\n : subtask.status === \"failed\"\n ? \"failed\"\n : \"pending\";\n\n return {\n id: String(subtask.id),\n status,\n content: <SubtaskContent subtask={subtask} executionChunks={subtaskChunks} />,\n };\n });\n\n return (\n <div className={cn(\"space-y-2\", className)}>\n {/* Simple header */}\n <span className=\"text-sm text-[var(--chat-text-subtle)]\">Plan:</span>\n\n {/* Subtask timeline */}\n <Timeline items={timelineItems} badgeSize={20} />\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useScrollLock } from \"../hooks/use-scroll-lock\";\nimport type { Event, PlanData, StreamingChunk } from \"../types\";\nimport { injectBeamerKeyframes } from \"../utils/beamer\";\nimport { cn } from \"../utils/cn\";\nimport { EventTimeline, convertChunkToEvent } from \"./EventTimeline\";\nimport { PlanTimeline } from \"./PlanTimeline\";\n\n/**\n * Hook for live duration counter\n */\nfunction useLiveStreamDuration(isStreaming: boolean): { display: string; finalSeconds: number } {\n\tconst startTimeRef = useRef<number | null>(null);\n\tconst [elapsed, setElapsed] = useState(0);\n\tconst finalSecondsRef = useRef(0);\n\n\tuseEffect(() => {\n\t\tif (isStreaming) {\n\t\t\tif (startTimeRef.current === null) startTimeRef.current = Date.now();\n\t\t\tconst interval = setInterval(() => {\n\t\t\t\tif (startTimeRef.current !== null) {\n\t\t\t\t\tconst secs = Math.floor((Date.now() - startTimeRef.current) / 1000);\n\t\t\t\t\tsetElapsed(secs);\n\t\t\t\t\tfinalSecondsRef.current = secs;\n\t\t\t\t}\n\t\t\t}, 1000);\n\t\t\treturn () => clearInterval(interval);\n\t\t} else if (startTimeRef.current !== null) {\n\t\t\t// Streaming just ended — capture final elapsed time\n\t\t\tfinalSecondsRef.current = Math.floor((Date.now() - startTimeRef.current) / 1000);\n\t\t\tsetElapsed(finalSecondsRef.current);\n\t\t\tstartTimeRef.current = null;\n\t\t}\n\t}, [isStreaming]);\n\n\treturn { display: `${elapsed}`, finalSeconds: finalSecondsRef.current };\n}\n\nfunction hasSubagentChunks(chunks: StreamingChunk[]): boolean {\n\treturn chunks.some((c) => c.type === \"subagent\");\n}\n\n// Internal tools hidden from users — kept in sync with EventTimeline /\n// PlanTimeline. tool_search is the deferred-tool discovery meta-tool.\n// `dispatch_assistant` is rendered as a SubagentPanel event inline (see\n// EventTimeline.convertChunkToEvent), so the raw tool call should not also\n// appear as a \"dispatch_assistant: …\" label.\nconst INTERNAL_TOOLS = new Set([\n\t\"create_plan\",\n\t\"tool_search\",\n\t\"unknown\",\n\t\"dispatch_assistant\",\n]);\n\nfunction convertTimelineToChunks(timeline: any[]): StreamingChunk[] {\n\tconst chunks: StreamingChunk[] = [];\n\ttimeline.forEach((item) => {\n\t\tif (item.type === \"thought\" && item.thought) {\n\t\t\tchunks.push({ type: \"thinking\", content: item.thought, subtaskId: item.subtask_id });\n\t\t} else if (item.type === \"tool\") {\n\t\t\tconst toolName = (item.tool || \"\").toLowerCase().trim();\n\t\t\tif (INTERNAL_TOOLS.has(toolName)) return;\n\n\t\t\tchunks.push({\n\t\t\t\ttype: \"tool\",\n\t\t\t\tcontent: \"\",\n\t\t\t\ttoolName: item.tool || \"Unknown Tool\",\n\t\t\t\ttoolDescription: item.tool_description,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\tsubtaskId: item.subtask_id,\n\t\t\t});\n\t\t\tif (item.observation) {\n\t\t\t\tchunks.push({\n\t\t\t\t\ttype: \"observation\",\n\t\t\t\t\tcontent: item.observation,\n\t\t\t\t\ttoolName: item.tool || \"Unknown Tool\",\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tsubtaskId: item.subtask_id,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n\treturn chunks;\n}\n\nexport interface ReasoningPanelProps {\n\t/** Whether currently streaming */\n\tisStreaming?: boolean;\n\t/** Streaming chunks */\n\tchunks?: StreamingChunk[];\n\t/** Execution plan persisted on completed messages (historical messages only —\n\t * new streams persist the plan as plain text without subtasks). */\n\tplan?: PlanData;\n\t/** Execution timeline (completed messages) */\n\texecutionTimeline?: any[];\n\t/** User message timestamp for duration calculation */\n\tuserMessageTimestamp?: number;\n\t/** Total execution time in seconds */\n\texecutionTime?: number;\n\t/** Whether expanded by default */\n\tdefaultExpanded?: boolean;\n\t/** Controlled expanded state */\n\texpanded?: boolean;\n\t/** Callback when expanded state changes */\n\tonExpandedChange?: (expanded: boolean) => void;\n\t/** Additional class names */\n\tclassName?: string;\n}\n\nfunction formatDuration(seconds: number): string {\n\tif (seconds < 1) return `${Math.round(seconds * 1000)}ms`;\n\treturn `${seconds.toFixed(1)}s`;\n}\n\nconst MONO_STACK =\n\t\"ui-monospace, 'SFMono-Regular', 'JetBrains Mono', 'Fira Code', Menlo, Consolas, monospace\";\n\n/**\n * Header indicator — bare, no surrounding tag.\n *\n * Streaming: three vertical bars (`mf-bars`) reading as an audio-meter\n * for live activity. Completed: a small ink square anchoring the row.\n * On the stream→complete transition (justCompleted) the dot briefly\n * flashes activity color and emits a single sonar halo, then settles\n * to muted. The halo + flash are one-time — once the parent flips\n * justCompleted back to false they don't replay on re-renders.\n *\n * Both states are wrapped in a fixed 14×14 slot so the visible center\n * lands on x=10, matching the body rail's center and the connector.\n */\nfunction HeaderIndicator({\n\tisStreaming,\n\tjustCompleted,\n}: {\n\tisStreaming: boolean;\n\tjustCompleted: boolean;\n}) {\n\treturn (\n\t\t<span\n\t\t\taria-hidden\n\t\t\tstyle={{\n\t\t\t\tposition: \"relative\",\n\t\t\t\tdisplay: \"inline-flex\",\n\t\t\t\talignItems: \"center\",\n\t\t\t\tjustifyContent: \"center\",\n\t\t\t\twidth: 14,\n\t\t\t\theight: 14,\n\t\t\t\tflexShrink: 0,\n\t\t\t}}\n\t\t>\n\t\t\t{isStreaming ? (\n\t\t\t\t<span\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: \"inline-flex\",\n\t\t\t\t\t\talignItems: \"flex-end\",\n\t\t\t\t\t\tgap: 1.5,\n\t\t\t\t\t\theight: 10,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{[0, 1, 2].map((i) => (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: 1.5,\n\t\t\t\t\t\t\t\theight: 10,\n\t\t\t\t\t\t\t\tbackground: \"var(--chat-activity, var(--chat-primary))\",\n\t\t\t\t\t\t\t\ttransformOrigin: \"bottom\",\n\t\t\t\t\t\t\t\tanimation: \"mf-bars 0.95s cubic-bezier(.16,1,.3,1) infinite\",\n\t\t\t\t\t\t\t\tanimationDelay: `${i * 0.13}s`,\n\t\t\t\t\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</span>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: 5,\n\t\t\t\t\t\t\theight: 5,\n\t\t\t\t\t\t\tbackground: justCompleted\n\t\t\t\t\t\t\t\t? \"var(--chat-activity, var(--chat-primary))\"\n\t\t\t\t\t\t\t\t: \"color-mix(in srgb, var(--chat-text) 42%, transparent)\",\n\t\t\t\t\t\t\tboxShadow:\n\t\t\t\t\t\t\t\t\"inset 0 0 0 0.5px color-mix(in srgb, var(--chat-text) 70%, transparent)\",\n\t\t\t\t\t\t\ttransform: justCompleted ? \"scale(1.18)\" : \"scale(1)\",\n\t\t\t\t\t\t\ttransition:\n\t\t\t\t\t\t\t\t\"background 820ms cubic-bezier(.16,1,.3,1), transform 540ms cubic-bezier(.16,1,.3,1)\",\n\t\t\t\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t{justCompleted && (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\tleft: \"50%\",\n\t\t\t\t\t\t\t\ttop: \"50%\",\n\t\t\t\t\t\t\t\twidth: 14,\n\t\t\t\t\t\t\t\theight: 14,\n\t\t\t\t\t\t\t\tmarginLeft: -7,\n\t\t\t\t\t\t\t\tmarginTop: -7,\n\t\t\t\t\t\t\t\tborderRadius: \"50%\",\n\t\t\t\t\t\t\t\tbackground:\n\t\t\t\t\t\t\t\t\t\"radial-gradient(closest-side, color-mix(in srgb, var(--chat-activity, var(--chat-primary)) 38%, transparent), transparent 70%)\",\n\t\t\t\t\t\t\t\tanimation: \"mf-halo-once 720ms cubic-bezier(.16,1,.3,1) forwards\",\n\t\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</span>\n\t);\n}\n\nexport function ReasoningPanel({\n\tisStreaming = false,\n\tchunks = [],\n\tplan,\n\texecutionTimeline = [],\n\tuserMessageTimestamp,\n\texecutionTime,\n\tdefaultExpanded = false,\n\texpanded: controlledExpanded,\n\tonExpandedChange,\n\tclassName,\n}: ReasoningPanelProps) {\n\tconst [localExpanded, setLocalExpanded] = useState(defaultExpanded);\n\tconst { display: liveElapsed, finalSeconds: wallClockSeconds } = useLiveStreamDuration(isStreaming);\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\n\tuseEffect(() => {\n\t\tinjectBeamerKeyframes(containerRef.current);\n\t}, []);\n\n\t// One-shot completion delight. Fires only on the streaming→complete\n\t// transition; cold loads (existing messages) skip the animation\n\t// because prevStreaming was never `true` for this mount.\n\tconst prevStreamingRef = useRef<boolean | null>(null);\n\tconst [justCompleted, setJustCompleted] = useState(false);\n\tuseEffect(() => {\n\t\tconst justFinished = prevStreamingRef.current === true && isStreaming === false;\n\t\tprevStreamingRef.current = isStreaming;\n\t\tif (justFinished) {\n\t\t\tsetJustCompleted(true);\n\t\t\tconst t = setTimeout(() => setJustCompleted(false), 820);\n\t\t\treturn () => clearTimeout(t);\n\t\t}\n\t}, [isStreaming]);\n\n\t// Scroll lock: prevent viewport jump when expanding/collapsing\n\tconst lockScroll = useScrollLock(containerRef, 300);\n\n\tconst isExpanded = controlledExpanded ?? localExpanded;\n\tconst setExpanded = useCallback(\n\t\t(value: boolean) => {\n\t\t\tlockScroll();\n\t\t\tsetLocalExpanded(value);\n\t\t\tonExpandedChange?.(value);\n\t\t},\n\t\t[lockScroll, onExpandedChange],\n\t);\n\n\t// Convert streaming chunks to Events\n\tconst streamingEvents = useMemo(() => {\n\t\tif (isStreaming) {\n\t\t\treturn chunks\n\t\t\t\t.map((chunk, index) => convertChunkToEvent(chunk, index))\n\t\t\t\t.filter((event): event is Event => event !== null);\n\t\t}\n\t\treturn [];\n\t}, [isStreaming, chunks]);\n\n\t// Convert timeline to Events for completed messages\n\tconst completedEvents = useMemo(() => {\n\t\tif (!isStreaming && (executionTimeline.length > 0 || chunks.length > 0)) {\n\t\t\treturn chunks\n\t\t\t\t.map((chunk, index) => convertChunkToEvent(chunk, index))\n\t\t\t\t.filter((event): event is Event => event !== null);\n\t\t}\n\t\treturn [];\n\t}, [isStreaming, executionTimeline, chunks]);\n\n\t// Convert timeline to chunks for PlanTimeline\n\tconst completedChunks = useMemo((): StreamingChunk[] => {\n\t\tif (!isStreaming && executionTimeline.length > 0) return convertTimelineToChunks(executionTimeline);\n\t\treturn [];\n\t}, [isStreaming, executionTimeline]);\n\n\t// Calculate total execution time\n\tconst totalExecutionTime = useMemo(() => {\n\t\t// Explicit prop takes highest priority (persisted wall-clock from streaming)\n\t\tif (executionTime && executionTime > 0) return executionTime;\n\n\t\tif (!isStreaming) {\n\t\t\tif (plan?.subtasks) return plan.subtasks.reduce((sum, st) => sum + (st.execution_time || 0), 0);\n\t\t\tif (executionTimeline.length > 0) {\n\t\t\t\tconst lastEvent = executionTimeline[executionTimeline.length - 1];\n\t\t\t\tif (userMessageTimestamp && lastEvent.timestamp) {\n\t\t\t\t\tconst diff = lastEvent.timestamp - userMessageTimestamp;\n\t\t\t\t\tif (diff > 0) return diff;\n\t\t\t\t}\n\t\t\t\tif (executionTimeline.length > 1) {\n\t\t\t\t\tconst firstEvent = executionTimeline[0];\n\t\t\t\t\tif (firstEvent.timestamp && lastEvent.timestamp) {\n\t\t\t\t\t\tconst diff = lastEvent.timestamp - firstEvent.timestamp;\n\t\t\t\t\t\tif (diff > 0) return diff;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn 0;\n\t}, [isStreaming, plan, executionTimeline, userMessageTimestamp, executionTime]);\n\n\t// Aggregate a quiet summary preview for the collapsed completed-state\n\t// header. Counts user-visible tools only — subagent handles are omitted\n\t// since the list can grow long and crowd the row.\n\tconst summaryPreview = useMemo(() => {\n\t\tif (isStreaming) return null;\n\t\tlet toolCount = 0;\n\n\t\tconst visit = (name?: string) => {\n\t\t\tif (!name) return;\n\t\t\tconst lower = name.toLowerCase().trim();\n\t\t\tif (INTERNAL_TOOLS.has(lower)) return;\n\t\t\ttoolCount += 1;\n\t\t};\n\n\t\t// Count from chunks when available — chunks is what the timeline\n\t\t// renders, and the message adapter populates it either from live\n\t\t// in-memory chunks or by reconstructing from executionTimeline. Falling\n\t\t// back to executionTimeline only when chunks is empty avoids the\n\t\t// double-counting that produced e.g. \"6 tools\" above 3 rendered rows.\n\t\tif (chunks.length > 0) {\n\t\t\tfor (const c of chunks) {\n\t\t\t\tif (c.type === \"tool\") visit(c.toolName);\n\t\t\t}\n\t\t} else if (executionTimeline.length > 0) {\n\t\t\tfor (const item of executionTimeline) {\n\t\t\t\tif (item.type === \"tool\") visit(item.tool as string | undefined);\n\t\t\t}\n\t\t}\n\n\t\tif (toolCount === 0) return null;\n\t\treturn `${toolCount} ${toolCount === 1 ? \"source\" : \"sources\"}`;\n\t}, [isStreaming, chunks, executionTimeline]);\n\n\t// Don't render if no content\n\tif (!isStreaming) {\n\t\tconst hasContent = plan || executionTimeline.length > 0 || chunks.length > 0;\n\t\tif (!hasContent) return null;\n\t\tif (hasContent && completedEvents.length === 0 && !plan && executionTimeline.length === 0) return null;\n\t}\n\n\t// Detect modes (used by getLabel; mode-specific iconography retired in\n\t// favor of a category-neutral wave indicator).\n\tconst lastChunk = chunks.length > 0 ? chunks[chunks.length - 1] : null;\n\tconst hasSubagent = hasSubagentChunks(chunks);\n\n\t// Live operation label — only shown while streaming. Prefers the\n\t// LLM-provided description; falls back to the raw tool name when\n\t// absent, mirroring the body-row fallback.\n\tconst getLiveLabel = () => {\n\t\t// Sub-assistant mode — subagent type slugs are presentation-grade\n\t\t// handles (configured by the team), so they're safe to render.\n\t\tif (hasSubagent && lastChunk?.type === \"subagent\" && lastChunk?.subagentData)\n\t\t\treturn lastChunk.subagentData.subagentType;\n\n\t\tconst lastToolName = lastChunk?.toolName?.toLowerCase().trim();\n\t\tconst lastIsInternal = !!lastToolName && INTERNAL_TOOLS.has(lastToolName);\n\t\tif (!lastIsInternal && lastChunk?.toolDescription) return lastChunk.toolDescription;\n\t\tif (!lastIsInternal && lastChunk?.toolName) return lastChunk.toolName;\n\t\tswitch (lastChunk?.type) {\n\t\t\tcase \"planning\":\n\t\t\t\treturn \"Planning…\";\n\t\t\tcase \"thinking\":\n\t\t\t\treturn \"Thinking…\";\n\t\t\tcase \"tool\":\n\t\t\t\treturn \"Thinking…\";\n\t\t\tcase \"observation\":\n\t\t\t\treturn \"Analyzing results…\";\n\t\t\tcase \"progress\":\n\t\t\t\treturn \"Working…\";\n\t\t\tdefault:\n\t\t\t\treturn \"Thinking…\";\n\t\t}\n\t};\n\n\t// Effective completed duration — favors the explicit prop, then the\n\t// computed total, then wall-clock fallback so the header always renders\n\t// some time figure when the panel has finished.\n\tconst completedDuration =\n\t\ttotalExecutionTime > 0 ? totalExecutionTime : wallClockSeconds > 0 ? wallClockSeconds : 0;\n\n\tconst showPlanTimeline = plan?.subtasks && plan.subtasks.length >= 2;\n\n\treturn (\n\t\t<div ref={containerRef} className={cn(\"max-w-full\", className)}>\n\t\t\t{/* Clickable header: indicator + (live op | trace summary) + caret. */}\n\t\t\t<div\n\t\t\t\tonClick={() => setExpanded(!isExpanded)}\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\tdisplay: \"inline-flex\",\n\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\tgap: 8,\n\t\t\t\t\tpadding: \"3px 8px 3px 3px\",\n\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\ttransition: \"background-color 220ms cubic-bezier(.16,1,.3,1)\",\n\t\t\t\t\tbackground: isStreaming\n\t\t\t\t\t\t? \"color-mix(in srgb, var(--chat-activity, var(--chat-primary)) 6%, transparent)\"\n\t\t\t\t\t\t: \"transparent\",\n\t\t\t\t}}>\n\t\t\t\t<HeaderIndicator isStreaming={isStreaming} justCompleted={justCompleted} />\n\n\t\t\t\t{/* Streaming: current operation in prose + tabular timer. */}\n\t\t\t\t{isStreaming && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontSize: 13.5,\n\t\t\t\t\t\t\t\tlineHeight: 1.35,\n\t\t\t\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\t\t\t\tletterSpacing: \"-0.005em\",\n\t\t\t\t\t\t\t\tcolor: \"color-mix(in srgb, var(--chat-text) 86%, transparent)\",\n\t\t\t\t\t\t\t\tmaxWidth: 520,\n\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\ttextOverflow: \"ellipsis\",\n\t\t\t\t\t\t\t\twhiteSpace: \"nowrap\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{getLiveLabel()}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{parseInt(liveElapsed) > 0 && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName=\"tabular-nums\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tfontFamily: MONO_STACK,\n\t\t\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\t\t\tcolor:\n\t\t\t\t\t\t\t\t\t\t\"color-mix(in srgb, var(--chat-activity, var(--chat-primary)) 75%, var(--chat-text))\",\n\t\t\t\t\t\t\t\t\tfontVariantNumeric: \"tabular-nums\",\n\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\n\t\t\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{liveElapsed}s\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\n\t\t\t\t{/* Completed: clean ops · duration in mono. */}\n\t\t\t\t{!isStreaming && (summaryPreview || completedDuration > 0) && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"inline-flex\",\n\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\tgap: 6,\n\t\t\t\t\t\t\tfontFamily: MONO_STACK,\n\t\t\t\t\t\t\tfontSize: 11.5,\n\t\t\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\t\t\tletterSpacing: \"0.005em\",\n\t\t\t\t\t\t\tcolor: \"color-mix(in srgb, var(--chat-text) 55%, transparent)\",\n\t\t\t\t\t\t\tfontVariantNumeric: \"tabular-nums\",\n\t\t\t\t\t\t\tfontVariantLigatures: \"none\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{completedDuration > 0 && (\n\t\t\t\t\t\t\t<span>Thought for {formatDuration(completedDuration)}</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{completedDuration > 0 && summaryPreview && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\twidth: 2,\n\t\t\t\t\t\t\t\t\theight: 2,\n\t\t\t\t\t\t\t\t\tborderRadius: \"50%\",\n\t\t\t\t\t\t\t\t\tbackground: \"color-mix(in srgb, var(--chat-text) 28%, transparent)\",\n\t\t\t\t\t\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{summaryPreview && <span>{summaryPreview}</span>}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\n\t\t\t\t{/* Sharp expand caret — silent affordance, rotates on toggle. */}\n\t\t\t\t<span\n\t\t\t\t\taria-hidden\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: \"inline-flex\",\n\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\twidth: 12,\n\t\t\t\t\t\theight: 12,\n\t\t\t\t\t\tmarginLeft: 1,\n\t\t\t\t\t\tcolor: \"color-mix(in srgb, var(--chat-text) 38%, transparent)\",\n\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t\ttransform: isExpanded ? \"rotate(90deg)\" : \"rotate(0deg)\",\n\t\t\t\t\t\ttransition: \"transform 240ms cubic-bezier(.16,1,.3,1)\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t›\n\t\t\t\t</span>\n\n\t\t\t</div>\n\n\t\t\t{isExpanded && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"animate-fade-in\"\n\t\t\t\t\tstyle={{ position: \"relative\", marginTop: 6 }}\n\t\t\t\t>\n\t\t\t\t\t{/* Continuous hairline connector: rail extends from the header\n\t\t\t\t\t pill down to the first body row's badge center. left=9.5\n\t\t\t\t\t puts the 1px line's center at x=10, matching both the\n\t\t\t\t\t header dot center and the body rail center. */}\n\t\t\t\t\t<div\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\tleft: 9.5,\n\t\t\t\t\t\t\ttop: -6,\n\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\theight: 10,\n\t\t\t\t\t\t\tbackground: \"color-mix(in srgb, var(--chat-text) 10%, transparent)\",\n\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t{isStreaming ? (\n\t\t\t\t\t\t<EventTimeline events={streamingEvents} />\n\t\t\t\t\t) : // Completed mode\n\t\t\t\t\tplan ? (\n\t\t\t\t\t\tplan.subtasks?.length === 0 ? null : showPlanTimeline ? (\n\t\t\t\t\t\t\t<PlanTimeline plan={plan} streamingChunks={completedChunks} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<EventTimeline events={completedEvents} />\n\t\t\t\t\t\t)\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<EventTimeline events={completedEvents} />\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { forwardRef } from \"react\";\nimport { StreamingText as StreamingTextPrimitive } from \"../primitives\";\nimport { MarkdownContent, type MarkdownContentProps } from \"./MarkdownContent\";\nimport { cn } from \"../utils/cn\";\n\nexport interface StreamingTextProps {\n /** The content to display */\n content: string;\n /** Whether the text is currently streaming */\n isStreaming?: boolean;\n /** Whether to render as markdown */\n renderMarkdown?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Base font size multiplier (passed to MarkdownContent) */\n baselineFontSize?: number;\n /** Props forwarded to MarkdownContent */\n markdownProps?: Partial<MarkdownContentProps>;\n}\n\n/**\n * Styled StreamingText that renders content directly as tokens arrive.\n *\n * Text appears instantly (no artificial typewriter delay), matching\n * platform-standard behavior. A blinking cursor is shown during streaming.\n */\nexport const StreamingText = forwardRef<HTMLDivElement, StreamingTextProps>(\n (\n {\n content,\n isStreaming = false,\n renderMarkdown = true,\n className,\n baselineFontSize,\n markdownProps,\n },\n ref,\n ) => {\n return (\n <StreamingTextPrimitive\n ref={ref}\n content={content}\n isStreaming={isStreaming}\n showCursor={false}\n className={cn(\"relative\", className)}\n >\n {renderMarkdown ? (\n <MarkdownContent\n baselineFontSize={baselineFontSize}\n {...markdownProps}\n >\n {content}\n </MarkdownContent>\n ) : (\n <span className=\"whitespace-pre-wrap\">{content}</span>\n )}\n </StreamingTextPrimitive>\n );\n },\n);\n\nStreamingText.displayName = \"StreamingText\";\n","import { forwardRef, useState, type ReactNode } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport {\n Send,\n Navigation,\n Copy,\n Mail,\n Search,\n ExternalLink,\n Zap,\n ArrowRight,\n Loader2,\n} from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport type { SuggestedAction, SuggestedActionType } from \"../types\";\n\nexport interface SuggestedActionsProps {\n /** List of suggested actions */\n actions: SuggestedAction[];\n /** Callback when an action is selected */\n onSelect?: (action: SuggestedAction) => void | Promise<void>;\n /** Additional CSS classes */\n className?: string;\n /** Whether to show type-specific icons */\n showIcons?: boolean;\n /** Disable all action buttons */\n disabled?: boolean;\n}\n\nconst ACTION_ICONS: Record<SuggestedActionType, ReactNode> = {\n send_message: <Send size={14} />,\n navigate: <Navigation size={14} />,\n copy_text: <Copy size={14} />,\n compose_email: <Mail size={14} />,\n search_emails: <Search size={14} />,\n open_modal: <ExternalLink size={14} />,\n api_call: <Zap size={14} />,\n};\n\nfunction getActionIcon(type?: SuggestedActionType): ReactNode {\n if (!type) return <ArrowRight size={14} />;\n return ACTION_ICONS[type] || <ArrowRight size={14} />;\n}\n\n/**\n * Styled SuggestedActions with type-specific icons, loading states, and staggered animation.\n */\nexport const SuggestedActions = forwardRef<HTMLDivElement, SuggestedActionsProps>(\n ({ actions, onSelect, className, showIcons = true, disabled = false }, ref) => {\n const [loadingIndex, setLoadingIndex] = useState<number | null>(null);\n\n if (actions.length === 0) return null;\n\n const handleAction = async (action: SuggestedAction, index: number) => {\n if (!onSelect || loadingIndex !== null) return;\n setLoadingIndex(index);\n try {\n await onSelect(action);\n } finally {\n setLoadingIndex(null);\n }\n };\n\n return (\n <div ref={ref} role=\"group\" aria-label=\"Suggested actions\" className={cn(\"flex flex-wrap gap-2\", className)}>\n <AnimatePresence>\n {actions.map((action, i) => {\n const isLoading = loadingIndex === i;\n const isDisabled = disabled || loadingIndex !== null;\n return (\n <motion.button\n key={action.id}\n type=\"button\"\n initial={{ opacity: 0, y: 4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n transition={{ duration: 0.2, delay: i * 0.05 }}\n disabled={isDisabled}\n onClick={() => handleAction(action, i)}\n className={cn(\n \"inline-flex items-center gap-1.5\",\n \"px-3 py-1.5 rounded-lg\",\n \"text-sm font-medium\",\n \"border border-gray-200 dark:border-gray-700\",\n \"bg-white dark:bg-gray-800\",\n \"text-gray-700 dark:text-gray-300\",\n \"opacity-80 hover:opacity-100\",\n \"hover:border-gray-300 dark:hover:border-gray-600\",\n \"hover:bg-gray-50 dark:hover:bg-gray-750\",\n \"hover:-translate-y-px\",\n \"active:translate-y-0\",\n \"transition-all duration-200\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500/20\",\n \"disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:translate-y-0\"\n )}\n >\n {isLoading ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : (\n showIcons && <span className=\"text-gray-400 dark:text-gray-500\">{getActionIcon(action.type)}</span>\n )}\n {action.label}\n </motion.button>\n );\n })}\n </AnimatePresence>\n </div>\n );\n }\n);\n\nSuggestedActions.displayName = \"SuggestedActions\";\n","import {\n LineChart, Line, BarChart, Bar, PieChart, Pie, AreaChart, Area,\n ScatterChart, Scatter, XAxis, YAxis, CartesianGrid, Tooltip, Legend,\n ResponsiveContainer, Cell,\n} from \"recharts\";\nimport type { ChartVisualizationData, ChartDataType, VisualizationConfig } from \"../../types\";\n\nexport interface ChartVisualizationProps {\n data: ChartVisualizationData;\n config?: VisualizationConfig;\n isStreaming?: boolean;\n}\n\nconst DEFAULT_COLORS = [\n \"#3B82F6\", \"#10B981\", \"#F59E0B\", \"#EF4444\",\n \"#8B5CF6\", \"#EC4899\", \"#06B6D4\", \"#F97316\",\n];\n\nexport function ChartVisualization({ data, config, isStreaming = false }: ChartVisualizationProps) {\n const { chartType, series, xAxis, yAxis } = data;\n const colors = config?.colors || DEFAULT_COLORS;\n const height = config?.height || 300;\n const showLegend = config?.legend !== false;\n const showGrid = config?.grid !== false;\n const showTooltip = config?.tooltip !== false;\n const animate = config?.animate !== false && !isStreaming;\n const stacked = config?.stacked || false;\n\n const transformDataForRecharts = () => {\n if (chartType === \"pie\") {\n const pieData = series[0]?.data || [];\n return pieData.map((item: any, idx: number) => ({\n name: item.name || item.x || `Item ${idx + 1}`,\n value: item.value ?? item.y ?? 0,\n }));\n }\n const dataMap = new Map<string | number, Record<string, any>>();\n series.forEach((s) => {\n s.data.forEach((point: any) => {\n const xVal = point.x ?? point.name;\n if (!dataMap.has(xVal)) dataMap.set(xVal, { x: xVal });\n dataMap.get(xVal)![s.name] = point.y ?? point.value ?? 0;\n });\n });\n return Array.from(dataMap.values());\n };\n\n const chartData = transformDataForRecharts();\n const commonProps = { data: chartData, margin: { top: 10, right: 30, left: 0, bottom: 0 } };\n\n const axisStyle = { fontSize: 12 };\n const tooltipStyle = {\n backgroundColor: \"#fff\",\n border: \"1px solid #e5e7eb\",\n borderRadius: 8,\n };\n\n const renderChart = () => {\n switch (chartType as ChartDataType) {\n case \"line\":\n return (\n <LineChart {...commonProps}>\n {showGrid && <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#e5e7eb\" />}\n <XAxis dataKey=\"x\" {...axisStyle} tickLine={false} padding={{ left: 10, right: 10 }} />\n <YAxis {...axisStyle} tickLine={false} width={40} />\n {showTooltip && <Tooltip contentStyle={tooltipStyle} />}\n {showLegend && <Legend />}\n {series.map((s, idx) => (\n <Line key={s.name} type=\"monotone\" dataKey={s.name} stroke={s.color || colors[idx % colors.length]} strokeWidth={2} dot={false} activeDot={{ r: 4 }} isAnimationActive={animate} />\n ))}\n </LineChart>\n );\n case \"bar\":\n return (\n <BarChart {...commonProps}>\n {showGrid && <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#e5e7eb\" />}\n <XAxis dataKey=\"x\" {...axisStyle} tickLine={false} padding={{ left: 10, right: 10 }} />\n <YAxis {...axisStyle} tickLine={false} width={40} />\n {showTooltip && <Tooltip contentStyle={tooltipStyle} />}\n {showLegend && <Legend />}\n {series.map((s, idx) => (\n <Bar key={s.name} dataKey={s.name} fill={s.color || colors[idx % colors.length]} stackId={stacked ? \"stack\" : undefined} isAnimationActive={animate} radius={[4, 4, 0, 0]} />\n ))}\n </BarChart>\n );\n case \"area\":\n return (\n <AreaChart {...commonProps}>\n {showGrid && <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#e5e7eb\" />}\n <XAxis dataKey=\"x\" {...axisStyle} tickLine={false} padding={{ left: 10, right: 10 }} />\n <YAxis {...axisStyle} tickLine={false} width={40} />\n {showTooltip && <Tooltip contentStyle={tooltipStyle} />}\n {showLegend && <Legend />}\n {series.map((s, idx) => (\n <Area key={s.name} type=\"monotone\" dataKey={s.name} stroke={s.color || colors[idx % colors.length]} fill={s.color || colors[idx % colors.length]} fillOpacity={0.3} stackId={stacked ? \"stack\" : undefined} isAnimationActive={animate} />\n ))}\n </AreaChart>\n );\n case \"pie\":\n return (\n <PieChart>\n {showTooltip && <Tooltip contentStyle={tooltipStyle} />}\n {showLegend && <Legend />}\n <Pie data={chartData} dataKey=\"value\" nameKey=\"name\" cx=\"50%\" cy=\"50%\" outerRadius={Math.min(height, 300) / 3} isAnimationActive={animate} label={({ name, percent }) => `${name}: ${((percent ?? 0) * 100).toFixed(0)}%`} labelLine={false}>\n {chartData.map((_, idx) => <Cell key={`cell-${idx}`} fill={colors[idx % colors.length]} />)}\n </Pie>\n </PieChart>\n );\n case \"scatter\":\n return (\n <ScatterChart {...commonProps}>\n {showGrid && <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#e5e7eb\" />}\n <XAxis dataKey=\"x\" type=\"number\" {...axisStyle} tickLine={false} name={xAxis?.label} padding={{ left: 10, right: 10 }} />\n <YAxis {...axisStyle} tickLine={false} name={yAxis?.label} width={40} />\n {showTooltip && <Tooltip contentStyle={tooltipStyle} />}\n {showLegend && <Legend />}\n {series.map((s, idx) => (\n <Scatter key={s.name} name={s.name} data={s.data.map((p: any) => ({ x: p.x, y: p.y }))} fill={s.color || colors[idx % colors.length]} isAnimationActive={animate} />\n ))}\n </ScatterChart>\n );\n default:\n return null;\n }\n };\n\n return (\n <div className=\"w-full\" style={{ height }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n {renderChart() || <></>}\n </ResponsiveContainer>\n </div>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Check, X, ChevronUp, ChevronDown, Copy as CopyIcon } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport type { MediaChunkData, TableVisualizationData, TableColumn, TableColumnType, VisualizationConfig } from \"../../types\";\nimport {\n MediaLightbox,\n PlayOverlay,\n YOUTUBE_ID_RE,\n parseMediaValue,\n useMediaLightbox,\n type MediaItem,\n} from \"../MediaLightbox\";\n\nexport interface TableVisualizationProps {\n data: TableVisualizationData;\n config?: VisualizationConfig;\n isStreaming?: boolean;\n /** Message-level media bag used to resolve `media_ref:<id>` cell values. */\n medias?: MediaChunkData[];\n}\n\ntype Order = \"asc\" | \"desc\";\n\n// Column types that render as short, fixed-width atoms — keep nowrap so the\n// column width stays visually tight. Everything else wraps by default so\n// long strings are readable without truncation.\nconst _NOWRAP_TYPES = new Set<TableColumnType>([\n \"number\",\n \"currency\",\n \"date\",\n \"badge\",\n \"boolean\",\n \"progress\",\n]);\n\n/** Stringify any value for title attributes + hover card. */\nfunction _cellToText(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/** Per-cell hover popover: selectable, copyable, portal-rendered.\n *\n * Two UX requirements drive the implementation:\n * - text must be selectable so users can copy it → pointer-events: auto\n * - cursor must be able to travel from cell → popover without the popover\n * closing (otherwise users can never reach the content). onEnter/onLeave\n * callbacks hand off hover tracking to the parent, which debounces the\n * close so crossing the gap doesn't dismiss.\n *\n * Visual: no header — just the content and a small copy icon pinned to\n * the bottom-right corner. Keeps focus on the data.\n */\nfunction CellHoverPopover({\n text,\n anchorRect,\n onEnter,\n onLeave,\n}: {\n text: string;\n anchorRect: DOMRect;\n onEnter: () => void;\n onLeave: () => void;\n}) {\n const [copied, setCopied] = useState(false);\n\n if (typeof document === \"undefined\") return null;\n\n // Position below the cell by default; flip above if we'd clip the viewport.\n // Width is max-content so short values produce compact cards (hover-card\n // feel) — long values grow up to POPOVER_MAX_WIDTH before wrapping.\n const VIEWPORT_MARGIN = 16;\n const POPOVER_MAX_WIDTH = Math.min(\n 360,\n window.innerWidth - 2 * VIEWPORT_MARGIN,\n );\n const spaceBelow = window.innerHeight - anchorRect.bottom - VIEWPORT_MARGIN;\n const placeBelow = spaceBelow >= 120 || spaceBelow >= anchorRect.top;\n\n // Clamp `left` using the max width as a pessimistic estimate. When the\n // actual card is narrower this just leaves more room on the right —\n // visually fine, and avoids a second measure/layout pass.\n let left = anchorRect.left;\n if (left + POPOVER_MAX_WIDTH > window.innerWidth - VIEWPORT_MARGIN) {\n left = Math.max(\n VIEWPORT_MARGIN,\n window.innerWidth - POPOVER_MAX_WIDTH - VIEWPORT_MARGIN,\n );\n }\n\n const style: React.CSSProperties = {\n position: \"fixed\",\n left,\n width: \"max-content\",\n maxWidth: POPOVER_MAX_WIDTH,\n maxHeight: \"50vh\",\n zIndex: 9998,\n ...(placeBelow\n ? { top: anchorRect.bottom + 4 }\n : { bottom: window.innerHeight - anchorRect.top + 4 }),\n };\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1200);\n } catch {\n // Clipboard blocked (insecure context, permission denied). Users can\n // still select the text manually.\n }\n };\n\n return createPortal(\n <div\n style={style}\n className={cn(\n \"relative overflow-hidden rounded-md border border-gray-200 bg-white shadow-lg\",\n \"dark:border-gray-700 dark:bg-gray-900\",\n )}\n role=\"tooltip\"\n onMouseEnter={onEnter}\n onMouseLeave={onLeave}\n >\n <div\n className={cn(\n \"select-text overflow-auto px-2.5 py-1.5 pr-8 text-sm text-gray-900 dark:text-gray-100\",\n \"whitespace-pre-wrap break-words\",\n )}\n style={{ maxHeight: \"50vh\" }}\n >\n {text || <span className=\"text-gray-400\">—</span>}\n </div>\n <button\n type=\"button\"\n onClick={handleCopy}\n aria-label={copied ? \"Copied\" : \"Copy\"}\n title={copied ? \"Copied\" : \"Copy\"}\n className={cn(\n \"absolute bottom-1 right-1 flex h-6 w-6 items-center justify-center\",\n \"rounded text-gray-500 transition-colors\",\n \"hover:bg-gray-100 hover:text-gray-800\",\n \"dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-gray-100\",\n )}\n >\n {copied ? <Check size={12} /> : <CopyIcon size={12} />}\n </button>\n </div>,\n document.body,\n );\n}\n\n/** Inline media cell: clickable thumbnail that opens the table-wide lightbox. */\nfunction MediaCell({\n item,\n onOpen,\n}: {\n item: MediaItem;\n onOpen: () => void;\n}) {\n if (item.mediaType === \"video\") {\n const ytMatch = item.url.match(YOUTUBE_ID_RE);\n const ytId = ytMatch ? ytMatch[1] : null;\n const posterSrc = ytId\n ? `https://i.ytimg.com/vi/${ytId}/hqdefault.jpg`\n : undefined;\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className=\"relative block overflow-hidden rounded-md border-0 bg-black/5 p-0\"\n style={{ width: 72, height: 72 }}\n aria-label={item.altText || \"Open video\"}\n >\n {posterSrc ? (\n <img\n src={posterSrc}\n alt={item.altText || \"Video preview\"}\n className=\"h-full w-full object-cover\"\n loading=\"lazy\"\n />\n ) : (\n <div className=\"flex h-full w-full items-center justify-center bg-gray-900 text-[10px] text-gray-400\">\n Video\n </div>\n )}\n <PlayOverlay label={item.altText || \"Open video\"} />\n </button>\n );\n }\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className=\"block overflow-hidden rounded-md border-0 bg-transparent p-0 transition-opacity hover:opacity-80\"\n style={{ width: 72, height: 72 }}\n aria-label={item.altText || \"Open image\"}\n >\n <img\n src={item.url}\n alt={item.altText || \"Image\"}\n className=\"h-full w-full object-cover\"\n loading=\"lazy\"\n />\n </button>\n );\n}\n\nconst badgeColors: Record<string, string> = {\n active: \"bg-green-100 text-green-700\",\n completed: \"bg-green-100 text-green-700\",\n success: \"bg-green-100 text-green-700\",\n enabled: \"bg-green-100 text-green-700\",\n pending: \"bg-yellow-100 text-yellow-700\",\n processing: \"bg-yellow-100 text-yellow-700\",\n in_progress: \"bg-yellow-100 text-yellow-700\",\n failed: \"bg-red-100 text-red-700\",\n error: \"bg-red-100 text-red-700\",\n disabled: \"bg-red-100 text-red-700\",\n inactive: \"bg-gray-100 text-gray-700\",\n draft: \"bg-gray-100 text-gray-700\",\n};\n\nfunction formatCellValue(value: unknown, column: TableColumn): React.ReactNode {\n if (value === null || value === undefined) return <span className=\"text-gray-400\">-</span>;\n\n const type = column.type || \"string\";\n\n switch (type as TableColumnType) {\n case \"number\":\n return typeof value === \"number\" ? value.toLocaleString() : String(value);\n case \"currency\":\n return typeof value === \"number\"\n ? new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency: \"USD\" }).format(value)\n : String(value);\n case \"date\":\n try { return new Date(value as string | number).toLocaleDateString(); }\n catch { return String(value); }\n case \"badge\": {\n const strValue = String(value).toLowerCase().replace(/\\s+/g, \"_\");\n const colorClass = badgeColors[strValue] || \"bg-gray-100 text-gray-700\";\n return <span className={cn(\"inline-block px-2 py-0.5 rounded-full text-xs font-medium\", colorClass)}>{String(value)}</span>;\n }\n case \"link\":\n return <a href={String(value)} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-blue-500 hover:underline\">{String(value)}</a>;\n case \"boolean\":\n return value ? <Check size={18} className=\"text-green-500\" /> : <X size={18} className=\"text-gray-400\" />;\n case \"progress\": {\n const numValue = typeof value === \"number\" ? value : parseFloat(String(value));\n return (\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1 h-2 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden\">\n <div className=\"h-full bg-blue-500 rounded-full\" style={{ width: `${Math.min(100, Math.max(0, numValue))}%` }} />\n </div>\n <span className=\"text-xs text-gray-500\">{numValue.toFixed(0)}%</span>\n </div>\n );\n }\n default:\n return String(value);\n }\n}\n\nfunction descendingComparator(a: Record<string, unknown>, b: Record<string, unknown>, orderBy: string): number {\n const aValue = a[orderBy];\n const bValue = b[orderBy];\n if (aValue == null) return 1;\n if (bValue == null) return -1;\n if (typeof aValue === \"number\" && typeof bValue === \"number\") return bValue - aValue;\n return String(bValue).localeCompare(String(aValue));\n}\n\nexport function TableVisualization({ data, config, medias }: TableVisualizationProps) {\n const { columns, rows } = data;\n const sortable = config?.sortable !== false;\n const paginated = config?.paginated || false;\n const pageSize = config?.pageSize || 10;\n\n const [order, setOrder] = useState<Order>(\"asc\");\n const [orderBy, setOrderBy] = useState<string>(columns[0]?.key || \"\");\n const [page, setPage] = useState(0);\n\n const handleRequestSort = (key: string) => {\n setOrder(orderBy === key && order === \"asc\" ? \"desc\" : \"asc\");\n setOrderBy(key);\n };\n\n const processedRows = useMemo(() => {\n let sorted = [...rows];\n if (sortable && orderBy) {\n sorted.sort((a, b) => order === \"desc\" ? descendingComparator(a, b, orderBy) : -descendingComparator(a, b, orderBy));\n }\n if (paginated) sorted = sorted.slice(page * pageSize, (page + 1) * pageSize);\n return sorted;\n }, [rows, order, orderBy, page, pageSize, sortable, paginated]);\n\n const totalPages = Math.ceil(rows.length / pageSize);\n\n // Collect every media cell on the currently-visible page into a flat list\n // so the lightbox can navigate across rows (and columns, if multiple media\n // columns exist). Each entry carries its (rowIdx, colKey) so a click on a\n // specific cell jumps to the right index.\n const mediaIndex = useMemo(() => {\n const items: MediaItem[] = [];\n const lookup: Record<string, number> = {}; // `${rowIdx}::${colKey}` → items idx\n const mediaColumns = columns.filter((c) => c.type === \"media\");\n if (mediaColumns.length === 0) return { items, lookup };\n processedRows.forEach((row, rowIdx) => {\n mediaColumns.forEach((col) => {\n const cell = row[col.key];\n const parsed = parseMediaValue(cell, `${col.key}-${rowIdx}`, medias);\n if (parsed) {\n lookup[`${rowIdx}::${col.key}`] = items.length;\n items.push(parsed);\n }\n });\n });\n return { items, lookup };\n }, [processedRows, columns, medias]);\n\n const {\n index: lightboxIndex,\n open: openLightbox,\n close: closeLightbox,\n navigate: navigateLightbox,\n } = useMediaLightbox(mediaIndex.items);\n\n // Per-cell hover popover. The popover is interactive (selectable text +\n // Copy button), so we debounce both show and hide so that:\n // - fast pointer movements don't flash a popover\n // - moving cursor from cell to popover doesn't dismiss before arrival\n // Timers are cleared when the cursor enters the popover (keep open) and\n // rescheduled when the cursor leaves either the cell or the popover.\n const [hoveredCell, setHoveredCell] = useState<{\n rowIdx: number;\n colKey: string;\n rect: DOMRect;\n } | null>(null);\n\n const showTimerRef = useRef<number | null>(null);\n const hideTimerRef = useRef<number | null>(null);\n\n const cancelShowTimer = () => {\n if (showTimerRef.current !== null) {\n window.clearTimeout(showTimerRef.current);\n showTimerRef.current = null;\n }\n };\n const cancelHideTimer = () => {\n if (hideTimerRef.current !== null) {\n window.clearTimeout(hideTimerRef.current);\n hideTimerRef.current = null;\n }\n };\n\n const scheduleShow = (rowIdx: number, colKey: string, rect: DOMRect) => {\n cancelShowTimer();\n cancelHideTimer();\n showTimerRef.current = window.setTimeout(() => {\n setHoveredCell({ rowIdx, colKey, rect });\n showTimerRef.current = null;\n }, 250);\n };\n const scheduleHide = () => {\n cancelShowTimer();\n cancelHideTimer();\n hideTimerRef.current = window.setTimeout(() => {\n setHoveredCell(null);\n hideTimerRef.current = null;\n }, 150);\n };\n const keepOpen = () => {\n cancelHideTimer();\n };\n\n // Clean up timers on unmount and when lightbox opens (avoid stale popover\n // on top of a modal).\n useEffect(() => {\n return () => {\n cancelShowTimer();\n cancelHideTimer();\n };\n }, []);\n useEffect(() => {\n if (lightboxIndex !== null) {\n cancelShowTimer();\n cancelHideTimer();\n setHoveredCell(null);\n }\n }, [lightboxIndex]);\n\n const hoveredCol =\n hoveredCell && columns.find((c) => c.key === hoveredCell.colKey);\n const hoveredText =\n hoveredCell && hoveredCol\n ? _cellToText(processedRows[hoveredCell.rowIdx]?.[hoveredCell.colKey])\n : \"\";\n\n return (\n <div className=\"w-full overflow-x-auto\">\n <table className=\"min-w-full text-sm\">\n <thead>\n <tr>\n {columns.map((col) => (\n <th\n key={col.key}\n className={cn(\n \"px-3 py-2 font-semibold bg-gray-50 dark:bg-gray-800 whitespace-nowrap text-left\",\n // Media columns aren't sortable in a meaningful way.\n sortable && col.type !== \"media\" &&\n \"cursor-pointer select-none hover:bg-gray-100 dark:hover:bg-gray-700\",\n )}\n style={{ width: col.width, textAlign: col.align || \"left\" }}\n onClick={() =>\n sortable && col.type !== \"media\" && handleRequestSort(col.key)\n }\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.label}\n {sortable && col.type !== \"media\" && orderBy === col.key && (\n order === \"asc\" ? <ChevronUp size={14} /> : <ChevronDown size={14} />\n )}\n </span>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {processedRows.map((row, rowIdx) => (\n <tr\n key={rowIdx}\n className=\"border-t border-gray-100 dark:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-800/50\"\n >\n {columns.map((col) => {\n if (col.type === \"media\") {\n const parsed = parseMediaValue(\n row[col.key],\n `${col.key}-${rowIdx}`,\n medias,\n );\n return (\n <td\n key={col.key}\n className=\"px-3 py-2 align-middle\"\n style={{ textAlign: col.align || \"left\" }}\n >\n {parsed ? (\n <MediaCell\n item={parsed}\n onOpen={() => {\n const idx = mediaIndex.lookup[`${rowIdx}::${col.key}`];\n if (typeof idx === \"number\") openLightbox(idx);\n }}\n />\n ) : (\n <span className=\"text-gray-400\">-</span>\n )}\n </td>\n );\n }\n const nowrap = _NOWRAP_TYPES.has(\n (col.type || \"string\") as TableColumnType,\n );\n const cellText = _cellToText(row[col.key]);\n return (\n <td\n key={col.key}\n // max-w caps the column width but stays on the td so table\n // layout is preserved. Critically, do NOT put\n // `display: -webkit-box` on the td itself — that kills\n // `display: table-cell` and breaks all columns to the\n // right. The wrap/line-clamp treatment lives on an inner\n // div instead.\n className={cn(\n \"px-3 py-2 align-top\",\n nowrap ? \"max-w-[300px]\" : \"max-w-[320px]\",\n )}\n style={{ textAlign: col.align || \"left\" }}\n onMouseEnter={(e) => {\n if (!cellText) return;\n const rect = e.currentTarget.getBoundingClientRect();\n scheduleShow(rowIdx, col.key, rect);\n }}\n onMouseLeave={() => {\n scheduleHide();\n }}\n >\n {nowrap ? (\n <div className=\"overflow-hidden whitespace-nowrap text-ellipsis\">\n {formatCellValue(row[col.key], col)}\n </div>\n ) : (\n <div className=\"whitespace-normal break-words [display:-webkit-box] [-webkit-line-clamp:2] [-webkit-box-orient:vertical] overflow-hidden\">\n {formatCellValue(row[col.key], col)}\n </div>\n )}\n </td>\n );\n })}\n </tr>\n ))}\n {processedRows.length === 0 && (\n <tr>\n <td colSpan={columns.length} className=\"px-3 py-8 text-center text-gray-400\">\n No data available\n </td>\n </tr>\n )}\n </tbody>\n </table>\n\n {hoveredCell && hoveredCol && lightboxIndex === null && (\n <CellHoverPopover\n text={hoveredText}\n anchorRect={hoveredCell.rect}\n onEnter={keepOpen}\n onLeave={scheduleHide}\n />\n )}\n\n {lightboxIndex !== null && (\n <MediaLightbox\n items={mediaIndex.items}\n index={lightboxIndex}\n onClose={closeLightbox}\n onNavigate={navigateLightbox}\n />\n )}\n\n {paginated && rows.length > pageSize && (\n <div className=\"flex items-center justify-between px-3 py-2 border-t border-gray-200 dark:border-gray-700 text-sm\">\n <span className=\"text-gray-500\">\n {page * pageSize + 1}-{Math.min((page + 1) * pageSize, rows.length)} of {rows.length}\n </span>\n <div className=\"flex gap-1\">\n <button\n onClick={() => setPage(Math.max(0, page - 1))}\n disabled={page === 0}\n className=\"px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-800 disabled:opacity-30\"\n >\n Prev\n </button>\n <button\n onClick={() => setPage(Math.min(totalPages - 1, page + 1))}\n disabled={page >= totalPages - 1}\n className=\"px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-800 disabled:opacity-30\"\n >\n Next\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { ChevronDown, ChevronUp, ExternalLink } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { MarkdownContent } from \"../MarkdownContent\";\nimport type { CardVisualizationData, CardSection, VisualizationConfig, VisualizationActionEvent } from \"../../types\";\n\nexport interface CardVisualizationProps {\n data: CardVisualizationData;\n config?: VisualizationConfig;\n isStreaming?: boolean;\n onAction?: (event: VisualizationActionEvent) => void;\n}\n\nexport function CardVisualization({ data, config, onAction }: CardVisualizationProps) {\n const { subtitle, imageUrl, sections, actions } = data;\n const collapsible = config?.collapsible || false;\n const initiallyCollapsed = config?.initiallyCollapsed || false;\n const [expanded, setExpanded] = useState(!initiallyCollapsed);\n\n const handleActionClick = (action: string) => {\n if (action.startsWith(\"http://\") || action.startsWith(\"https://\") || action.startsWith(\"/\")) {\n window.open(action, \"_blank\", \"noopener,noreferrer\");\n } else if (onAction) {\n onAction({ type: \"card_action\", action });\n } else {\n window.dispatchEvent(new CustomEvent(\"visualization-action\", { detail: { action } }));\n }\n };\n\n const renderSection = (section: CardSection, idx: number) => (\n <div key={idx} className={cn(idx < sections.length - 1 && \"mb-4\")}>\n {section.title && (\n <h4 className=\"font-semibold text-sm mb-2\">{section.title}</h4>\n )}\n {section.items && section.items.length > 0 && (\n <div className=\"space-y-1\">\n {section.items.map((item, itemIdx) => (\n <div key={itemIdx} className=\"flex justify-between items-start gap-4\">\n <span className=\"text-sm text-gray-500 shrink-0\">{item.label}</span>\n <span className=\"text-sm font-medium text-right\">{item.value}</span>\n </div>\n ))}\n </div>\n )}\n {section.content && <MarkdownContent>{section.content}</MarkdownContent>}\n </div>\n );\n\n const mainContent = (\n <>\n {imageUrl && (\n <img src={imageUrl} alt=\"\" className=\"w-full h-[140px] object-cover border-b border-gray-200 dark:border-gray-700\" />\n )}\n {subtitle && (\n <p className=\"text-sm text-gray-500 italic mb-4\">{subtitle}</p>\n )}\n {sections.map((section, idx) => (\n <div key={idx}>\n {renderSection(section, idx)}\n {idx < sections.length - 1 && <hr className=\"my-4 border-gray-200 dark:border-gray-700\" />}\n </div>\n ))}\n </>\n );\n\n return (\n <div className=\"w-full\">\n {collapsible && (\n <div\n className=\"flex items-center justify-between mb-2 cursor-pointer\"\n onClick={() => setExpanded(!expanded)}\n >\n <span className=\"text-sm text-gray-500\">{expanded ? \"Click to collapse\" : \"Click to expand\"}</span>\n <button className=\"p-1\">{expanded ? <ChevronUp size={18} /> : <ChevronDown size={18} />}</button>\n </div>\n )}\n {(!collapsible || expanded) && mainContent}\n {actions && actions.length > 0 && (\n <div className=\"flex gap-2 mt-4 pt-4 border-t border-gray-200 dark:border-gray-700\">\n {actions.map((action, idx) => (\n <button\n key={idx}\n onClick={() => handleActionClick(action.action)}\n className={cn(\n \"px-3 py-1.5 text-sm rounded-lg transition-colors\",\n action.variant === \"primary\" ? \"bg-blue-500 text-white hover:bg-blue-600\" :\n action.variant === \"text\" ? \"text-blue-500 hover:bg-blue-50\" :\n \"border border-gray-300 hover:bg-gray-50\"\n )}\n >\n {action.label}\n {action.action.startsWith(\"http\") && <ExternalLink size={14} className=\"inline ml-1\" />}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { ArrowDown, ArrowUp, Minus } from \"lucide-react\";\nimport { Area, AreaChart, ResponsiveContainer } from \"recharts\";\nimport { cn } from \"../../utils/cn\";\nimport type { KpiVisualizationData, KpiMetric, VisualizationConfig } from \"../../types\";\n\nexport interface KpiVisualizationProps {\n data: KpiVisualizationData;\n config?: VisualizationConfig;\n isStreaming?: boolean;\n}\n\nconst DEFAULT_COLORS = [\"#3B82F6\", \"#10B981\", \"#F59E0B\", \"#8B5CF6\"];\n\n// Per-family palette for the bento layout. Each entry covers the surfaces a\n// bento card needs: a tinted gradient background, an accent stripe, and the\n// label/sparkline color.\nconst BENTO_PALETTE = [\n { label: \"text-blue-700 dark:text-blue-300\", stripeFrom: \"#3b82f6\", stripeTo: \"#2563eb\", tintFrom: \"rgba(59,130,246,0.10)\", tintMid: \"rgba(59,130,246,0.025)\", border: \"border-blue-200 dark:border-blue-900\", borderHover: \"hover:border-blue-400 dark:hover:border-blue-700\", spark: \"#3b82f6\", glow: \"0 8px 24px rgba(59,130,246,0.18)\" },\n { label: \"text-emerald-700 dark:text-emerald-300\", stripeFrom: \"#10b981\", stripeTo: \"#059669\", tintFrom: \"rgba(16,185,129,0.10)\", tintMid: \"rgba(16,185,129,0.025)\", border: \"border-emerald-200 dark:border-emerald-900\", borderHover: \"hover:border-emerald-400 dark:hover:border-emerald-700\", spark: \"#10b981\", glow: \"0 8px 24px rgba(16,185,129,0.18)\" },\n { label: \"text-purple-700 dark:text-purple-300\", stripeFrom: \"#a855f7\", stripeTo: \"#9333ea\", tintFrom: \"rgba(168,85,247,0.10)\", tintMid: \"rgba(168,85,247,0.025)\", border: \"border-purple-200 dark:border-purple-900\", borderHover: \"hover:border-purple-400 dark:hover:border-purple-700\", spark: \"#a855f7\", glow: \"0 8px 24px rgba(168,85,247,0.18)\" },\n { label: \"text-orange-700 dark:text-orange-300\", stripeFrom: \"#f97316\", stripeTo: \"#ea580c\", tintFrom: \"rgba(249,115,22,0.10)\", tintMid: \"rgba(249,115,22,0.025)\", border: \"border-orange-200 dark:border-orange-900\", borderHover: \"hover:border-orange-400 dark:hover:border-orange-700\", spark: \"#f97316\", glow: \"0 8px 24px rgba(249,115,22,0.18)\" },\n { label: \"text-pink-700 dark:text-pink-300\", stripeFrom: \"#ec4899\", stripeTo: \"#db2777\", tintFrom: \"rgba(236,72,153,0.10)\", tintMid: \"rgba(236,72,153,0.025)\", border: \"border-pink-200 dark:border-pink-900\", borderHover: \"hover:border-pink-400 dark:hover:border-pink-700\", spark: \"#ec4899\", glow: \"0 8px 24px rgba(236,72,153,0.18)\" },\n { label: \"text-teal-700 dark:text-teal-300\", stripeFrom: \"#14b8a6\", stripeTo: \"#0d9488\", tintFrom: \"rgba(20,184,166,0.10)\", tintMid: \"rgba(20,184,166,0.025)\", border: \"border-teal-200 dark:border-teal-900\", borderHover: \"hover:border-teal-400 dark:hover:border-teal-700\", spark: \"#14b8a6\", glow: \"0 8px 24px rgba(20,184,166,0.18)\" },\n];\n\nfunction paletteForIndex(idx: number) {\n return BENTO_PALETTE[idx % BENTO_PALETTE.length];\n}\n\n// Original row/grid card — kept identical so existing threads render unchanged.\nfunction KpiMetricCard({ metric, color, animate }: { metric: KpiMetric; color: string; animate: boolean }) {\n const trendIcon = metric.trend === \"up\" ? <ArrowUp size={16} className=\"text-green-500\" /> :\n metric.trend === \"down\" ? <ArrowDown size={16} className=\"text-red-500\" /> :\n metric.trend === \"neutral\" ? <Minus size={14} className=\"text-gray-400\" /> : null;\n\n const trendColor = metric.trend === \"up\" ? \"text-green-500\" :\n metric.trend === \"down\" ? \"text-red-500\" : \"text-gray-500\";\n\n const sparklineData = metric.sparkline?.map((value, idx) => ({ value, idx }));\n\n return (\n <div className=\"p-4 rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 relative overflow-hidden\">\n {sparklineData && sparklineData.length > 0 && (\n <div className=\"absolute bottom-0 left-0 right-0 h-10 opacity-30\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={sparklineData} margin={{ top: 0, right: 0, left: 0, bottom: 0 }}>\n <Area type=\"monotone\" dataKey=\"value\" stroke={metric.color || color} fill={metric.color || color} strokeWidth={1} isAnimationActive={animate} />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n )}\n <div className=\"relative z-10\">\n <span className=\"text-xs text-gray-500 font-medium uppercase tracking-wider\">{metric.label}</span>\n <div className=\"flex items-baseline gap-1 mt-1\">\n <span className=\"text-2xl font-bold\">{metric.value}</span>\n {metric.unit && <span className=\"text-sm text-gray-500\">{metric.unit}</span>}\n </div>\n {(metric.trend || metric.change !== undefined && metric.change !== null) && (\n <div className=\"flex items-center gap-1 mt-2\">\n {trendIcon}\n {metric.change !== undefined && metric.change !== null && (\n <span className={cn(\"text-sm font-medium\", trendColor)}>\n {typeof metric.change === \"number\"\n ? `${metric.change > 0 ? \"+\" : \"\"}${metric.change}`\n : metric.change}\n </span>\n )}\n {metric.changeLabel && <span className=\"text-xs text-gray-500\">{metric.changeLabel}</span>}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction KpiBentoCard({\n metric,\n index,\n isHero,\n animate,\n}: {\n metric: KpiMetric;\n index: number;\n isHero: boolean;\n animate: boolean;\n}) {\n const palette = paletteForIndex(index);\n const sparklineData = metric.sparkline?.map((value, idx) => ({ value, idx }));\n const showSparkline = isHero && sparklineData && sparklineData.length > 1;\n\n const TrendIcon = metric.trend === \"up\" ? ArrowUp : metric.trend === \"down\" ? ArrowDown : Minus;\n const trendPillColor =\n metric.trend === \"up\"\n ? \"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/40 dark:text-emerald-300\"\n : metric.trend === \"down\"\n ? \"bg-red-100 text-red-700 dark:bg-red-900/40 dark:text-red-300\"\n : \"bg-gray-100 text-gray-600 dark:bg-gray-800 dark:text-gray-300\";\n const showTrend = metric.change !== undefined && metric.change !== null;\n\n return (\n <div\n className={cn(\n \"relative h-full rounded-xl border bg-white dark:bg-gray-900 overflow-hidden transition-all\",\n palette.border,\n palette.borderHover,\n \"hover:-translate-y-0.5\",\n isHero ? \"p-5\" : \"p-4\",\n )}\n style={{\n background: isHero\n ? `linear-gradient(135deg, ${palette.tintFrom} 0%, ${palette.tintMid} 60%, transparent 100%), var(--kpi-bg, white)`\n : undefined,\n }}\n >\n {/* Left accent stripe */}\n <div\n aria-hidden\n className=\"absolute left-0 top-0 bottom-0\"\n style={{\n width: isHero ? 4 : 3,\n background: `linear-gradient(180deg, ${palette.stripeFrom}, ${palette.stripeTo})`,\n }}\n />\n\n {showSparkline && (\n <div\n aria-hidden\n className=\"absolute left-0 right-0 bottom-0 pointer-events-none\"\n style={{ height: 56, opacity: 0.35 }}\n >\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={sparklineData} margin={{ top: 0, right: 0, left: 0, bottom: 0 }}>\n <defs>\n <linearGradient id={`spark-${index}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={palette.spark} stopOpacity={0.6} />\n <stop offset=\"100%\" stopColor={palette.spark} stopOpacity={0} />\n </linearGradient>\n </defs>\n <Area\n type=\"monotone\"\n dataKey=\"value\"\n stroke={palette.spark}\n fill={`url(#spark-${index})`}\n strokeWidth={1.5}\n isAnimationActive={animate}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n )}\n\n <div className={cn(\"relative z-10\", isHero ? \"pl-1\" : \"pl-0.5\")}>\n <span\n className={cn(\n \"block font-semibold uppercase tracking-wider\",\n palette.label,\n isHero ? \"text-xs\" : \"text-[0.7rem]\",\n )}\n >\n {metric.label}\n </span>\n <div className={cn(\"flex items-baseline gap-1\", isHero ? \"mt-2\" : \"mt-1\")}>\n <span\n className={cn(\n \"font-extrabold tabular-nums text-gray-900 dark:text-gray-100 leading-tight tracking-tight\",\n isHero ? \"text-4xl sm:text-5xl\" : \"text-2xl\",\n )}\n >\n {metric.value}\n </span>\n {metric.unit && (\n <span className=\"text-sm text-gray-500 dark:text-gray-400 font-medium\">\n {metric.unit}\n </span>\n )}\n </div>\n\n {(showTrend || metric.changeLabel) && (\n <div className={cn(\"flex items-center gap-1.5 flex-wrap\", isHero ? \"mt-3\" : \"mt-2\")}>\n {showTrend && (\n <span\n className={cn(\n \"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-bold tabular-nums\",\n trendPillColor,\n )}\n >\n <TrendIcon size={isHero ? 14 : 12} strokeWidth={2.5} />\n {typeof metric.change === \"number\"\n ? `${metric.change > 0 ? \"+\" : \"\"}${metric.change}`\n : metric.change}\n </span>\n )}\n {metric.changeLabel && (\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {metric.changeLabel}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction pickHeroIndex(metrics: KpiMetric[]): number {\n const explicit = metrics.findIndex((m) => m.prominence === \"primary\");\n return explicit >= 0 ? explicit : 0;\n}\n\nfunction KpiBentoLayout({ metrics, animate }: { metrics: KpiMetric[]; animate: boolean }) {\n if (metrics.length === 0) return null;\n if (metrics.length === 1) {\n return (\n <div className=\"w-full\">\n <KpiBentoCard metric={metrics[0]} index={0} isHero animate={animate} />\n </div>\n );\n }\n\n const heroIdx = pickHeroIndex(metrics);\n const hero = metrics[heroIdx];\n const satellites = metrics\n .map((m, i) => ({ m, i }))\n .filter(({ i }) => i !== heroIdx);\n\n const satCount = satellites.length;\n const satCols = satCount <= 3 ? Math.max(2, satCount) : satCount >= 7 ? 3 : 2;\n const satGridClass =\n satCols === 2 ? \"sm:grid-cols-2\" : satCols === 3 ? \"sm:grid-cols-3\" : \"sm:grid-cols-2\";\n\n return (\n <div className=\"w-full grid gap-4 md:[grid-template-columns:minmax(0,5fr)_minmax(0,7fr)] items-stretch\">\n <div className=\"md:min-h-[220px]\">\n <KpiBentoCard metric={hero} index={heroIdx} isHero animate={animate} />\n </div>\n <div className={cn(\"grid gap-4 grid-cols-2\", satGridClass)}>\n {satellites.map(({ m, i }) => (\n <KpiBentoCard key={i} metric={m} index={i} isHero={false} animate={animate} />\n ))}\n </div>\n </div>\n );\n}\n\nexport function KpiVisualization({ data, config, isStreaming = false }: KpiVisualizationProps) {\n const { metrics, layout = \"row\" } = data;\n const colors = config?.colors || DEFAULT_COLORS;\n const animate = config?.animate !== false && !isStreaming;\n\n if (layout === \"bento\") {\n return (\n <div className=\"w-full\">\n <KpiBentoLayout metrics={metrics} animate={animate} />\n </div>\n );\n }\n\n const isGrid = layout === \"grid\";\n\n return (\n <div className={cn(\"w-full\", isGrid ? \"grid grid-cols-1 sm:grid-cols-2 gap-4\" : \"flex gap-4 flex-wrap\")}>\n {metrics.map((metric, idx) => (\n <div key={idx} className={cn(!isGrid && \"flex-1 min-w-[200px]\")}>\n <KpiMetricCard metric={metric} color={metric.color || colors[idx % colors.length]} animate={animate} />\n </div>\n ))}\n </div>\n );\n}\n","import { useState, useEffect } from \"react\";\nimport { Check, Copy, FileText } from \"lucide-react\";\nimport { Prism as SyntaxHighlighter } from \"react-syntax-highlighter\";\nimport { oneDark } from \"react-syntax-highlighter/dist/esm/styles/prism\";\nimport type { CodePreviewVisualizationData, VisualizationConfig } from \"../../types\";\n\nexport interface CodePreviewVisualizationProps {\n data: CodePreviewVisualizationData;\n config?: VisualizationConfig;\n isStreaming?: boolean;\n}\n\nconst LANGUAGE_MAP: Record<string, string> = {\n js: \"javascript\", ts: \"typescript\", jsx: \"jsx\", tsx: \"tsx\",\n py: \"python\", rb: \"ruby\", rs: \"rust\", go: \"go\",\n java: \"java\", cpp: \"cpp\", c: \"c\", cs: \"csharp\",\n sh: \"bash\", bash: \"bash\", sql: \"sql\", html: \"html\",\n css: \"css\", json: \"json\", yaml: \"yaml\", yml: \"yaml\",\n xml: \"xml\", md: \"markdown\", graphql: \"graphql\",\n};\n\nexport function CodePreviewVisualization({ data }: CodePreviewVisualizationProps) {\n const { code, language, lineNumbers = true, highlightLines = [], startLine = 1 } = data;\n const [copied, setCopied] = useState(false);\n\n const normalizedLanguage = LANGUAGE_MAP[language.toLowerCase()] || language.toLowerCase();\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n } catch { /* noop */ }\n };\n\n useEffect(() => {\n if (copied) {\n const timer = setTimeout(() => setCopied(false), 2000);\n return () => clearTimeout(timer);\n }\n }, [copied]);\n\n const lineProps = (lineNumber: number) => {\n const style: React.CSSProperties = {};\n if (highlightLines.includes(lineNumber)) {\n style.backgroundColor = \"rgba(59, 130, 246, 0.1)\";\n style.display = \"block\";\n style.borderLeft = \"3px solid #3B82F6\";\n style.paddingLeft = \"8px\";\n style.marginLeft = \"-11px\";\n }\n return { style };\n };\n\n return (\n <div className=\"relative rounded-lg overflow-hidden border border-gray-200 dark:border-gray-700\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-3 py-1.5 bg-gray-800 dark:bg-gray-900 border-b border-gray-700\">\n <div className=\"flex items-center gap-2\">\n <FileText size={16} className=\"text-gray-400\" />\n <span className=\"text-xs font-mono text-gray-400 lowercase\">{normalizedLanguage}</span>\n </div>\n <button\n onClick={handleCopy}\n className=\"flex items-center gap-1 px-2 py-1 text-xs rounded hover:bg-white/10 transition-colors text-gray-400 hover:text-gray-200\"\n title={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? <Check size={14} className=\"text-green-400\" /> : <Copy size={14} />}\n </button>\n </div>\n\n {/* Code */}\n <SyntaxHighlighter\n language={normalizedLanguage}\n style={oneDark}\n showLineNumbers={lineNumbers}\n startingLineNumber={startLine}\n wrapLines={true}\n lineProps={lineProps}\n customStyle={{\n margin: 0,\n borderRadius: 0,\n fontSize: \"0.8125rem\",\n lineHeight: \"1.6\",\n background: \"#1e1e1e\",\n }}\n codeTagProps={{\n style: { fontFamily: \"'Fira Code', 'JetBrains Mono', monospace\" },\n }}\n >\n {code.trim()}\n </SyntaxHighlighter>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { FormVisualizationData, FormField, VisualizationConfig, VisualizationActionEvent } from \"../../types\";\n\nexport interface FormVisualizationProps {\n data: FormVisualizationData;\n config?: VisualizationConfig;\n isStreaming?: boolean;\n onAction?: (event: VisualizationActionEvent) => void;\n}\n\nexport function FormVisualization({ data, config, isStreaming = false, onAction }: FormVisualizationProps) {\n const { fields, submitAction } = data;\n const submitButtonText = config?.submitButtonText || \"Submit\";\n const cancelButtonText = config?.cancelButtonText || \"Cancel\";\n\n const [formData, setFormData] = useState<Record<string, unknown>>(() => {\n const initial: Record<string, unknown> = {};\n fields.forEach((field) => {\n if (field.defaultValue !== undefined) initial[field.name] = field.defaultValue;\n else if (field.type === \"multiselect\") initial[field.name] = [];\n else if (field.type === \"checkbox\") initial[field.name] = false;\n else initial[field.name] = \"\";\n });\n return initial;\n });\n\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [submitted, setSubmitted] = useState(false);\n\n const handleChange = (name: string, value: unknown) => {\n setFormData((prev) => ({ ...prev, [name]: value }));\n if (errors[name]) setErrors((prev) => { const next = { ...prev }; delete next[name]; return next; });\n };\n\n const validate = (): boolean => {\n const newErrors: Record<string, string> = {};\n fields.forEach((field) => {\n const value = formData[field.name];\n if (field.required && (value === undefined || value === null || value === \"\" || (Array.isArray(value) && value.length === 0))) {\n newErrors[field.name] = `${field.label} is required`;\n return;\n }\n if (!value && !field.required) return;\n if (field.validation) {\n const { min, max, pattern, message } = field.validation;\n if (min !== undefined && typeof value === \"number\" && value < min) newErrors[field.name] = message || `Minimum value is ${min}`;\n if (max !== undefined && typeof value === \"number\" && value > max) newErrors[field.name] = message || `Maximum value is ${max}`;\n if (pattern && typeof value === \"string\" && !new RegExp(pattern).test(value)) newErrors[field.name] = message || \"Invalid format\";\n }\n if (field.type === \"email\" && typeof value === \"string\" && value && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n newErrors[field.name] = \"Invalid email address\";\n }\n });\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!validate()) return;\n if (onAction) {\n onAction({ type: \"form_submit\", action: submitAction || \"\", data: formData });\n } else {\n window.dispatchEvent(new CustomEvent(\"visualization-form-submit\", { detail: { action: submitAction, data: formData } }));\n }\n setSubmitted(true);\n };\n\n const handleCancel = () => {\n if (onAction) {\n onAction({ type: \"form_cancel\", action: submitAction || \"\" });\n } else {\n window.dispatchEvent(new CustomEvent(\"visualization-form-cancel\", { detail: { action: submitAction } }));\n }\n };\n\n if (submitted) {\n return (\n <div className=\"text-center py-8\">\n <p className=\"text-lg font-semibold text-green-500 mb-1\">Form Submitted</p>\n <p className=\"text-sm text-gray-500\">Your response has been recorded.</p>\n </div>\n );\n }\n\n const inputClass = \"w-full px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-900 focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 outline-none transition-colors\";\n const errorClass = \"border-red-500 focus:ring-red-500/20 focus:border-red-500\";\n\n const renderField = (field: FormField) => {\n const value = formData[field.name];\n const error = errors[field.name];\n const hasError = !!error;\n\n switch (field.type) {\n case \"text\":\n case \"email\":\n case \"number\":\n return (\n <input\n type={field.type}\n placeholder={field.placeholder}\n required={field.required}\n value={String(value || \"\")}\n onChange={(e) => handleChange(field.name, field.type === \"number\" ? parseFloat(e.target.value) || \"\" : e.target.value)}\n className={cn(inputClass, hasError && errorClass)}\n min={field.validation?.min}\n max={field.validation?.max}\n />\n );\n case \"textarea\":\n return (\n <textarea\n placeholder={field.placeholder}\n required={field.required}\n value={String(value || \"\")}\n onChange={(e) => handleChange(field.name, e.target.value)}\n className={cn(inputClass, \"min-h-[100px] resize-y\", hasError && errorClass)}\n rows={4}\n />\n );\n case \"select\":\n return (\n <select\n value={String(value || \"\")}\n onChange={(e) => handleChange(field.name, e.target.value)}\n className={cn(inputClass, hasError && errorClass)}\n >\n <option value=\"\" disabled>{field.placeholder || \"Select an option\"}</option>\n {field.options?.map((opt) => <option key={opt.value} value={opt.value}>{opt.label}</option>)}\n </select>\n );\n case \"multiselect\":\n return (\n <select\n multiple\n value={(value as string[]) || []}\n onChange={(e) => handleChange(field.name, Array.from(e.target.selectedOptions, (o) => o.value))}\n className={cn(inputClass, \"min-h-[80px]\", hasError && errorClass)}\n >\n {field.options?.map((opt) => <option key={opt.value} value={opt.value}>{opt.label}</option>)}\n </select>\n );\n case \"checkbox\":\n return (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input type=\"checkbox\" checked={!!value} onChange={(e) => handleChange(field.name, e.target.checked)} className=\"w-4 h-4 accent-blue-500 rounded\" />\n <span className=\"text-sm\">{field.label}</span>\n </label>\n );\n case \"radio\":\n return (\n <div className=\"space-y-1\">\n {field.options?.map((opt) => (\n <label key={opt.value} className=\"flex items-center gap-2 cursor-pointer text-sm\">\n <input type=\"radio\" name={field.name} value={opt.value} checked={value === opt.value} onChange={(e) => handleChange(field.name, e.target.value)} className=\"w-3.5 h-3.5 accent-blue-500\" />\n {opt.label}\n </label>\n ))}\n </div>\n );\n case \"date\":\n return <input type=\"date\" value={String(value || \"\")} onChange={(e) => handleChange(field.name, e.target.value)} className={cn(inputClass, hasError && errorClass)} />;\n case \"datetime\":\n return <input type=\"datetime-local\" value={String(value || \"\")} onChange={(e) => handleChange(field.name, e.target.value)} className={cn(inputClass, hasError && errorClass)} />;\n default:\n return null;\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {fields.map((field) => (\n <div key={field.name}>\n {field.type !== \"checkbox\" && (\n <label className=\"block text-sm font-medium mb-1\">\n {field.label}{field.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </label>\n )}\n {renderField(field)}\n {errors[field.name] && <p className=\"text-xs text-red-500 mt-1\">{errors[field.name]}</p>}\n </div>\n ))}\n <div className=\"flex gap-2 pt-2\">\n <button type=\"submit\" disabled={isStreaming} className=\"px-4 py-2 text-sm rounded-lg bg-blue-500 text-white hover:bg-blue-600 disabled:opacity-50 transition-colors\">\n {submitButtonText}\n </button>\n <button type=\"button\" onClick={handleCancel} className=\"px-4 py-2 text-sm rounded-lg border border-gray-300 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors\">\n {cancelButtonText}\n </button>\n </div>\n </form>\n );\n}\n","import type { VisualizationConfig } from \"../../types\";\nimport type { ZodSchema } from \"zod\";\n\nexport interface VisualizationEntry {\n component: React.ComponentType<{\n data: any;\n config?: VisualizationConfig;\n isStreaming?: boolean;\n onAction?: (event: import(\"../../types\").VisualizationActionEvent) => void;\n medias?: import(\"../../types\").MediaChunkData[];\n }>;\n schema?: ZodSchema;\n}\n\n// Use globalThis to ensure a single registry instance even when the module\n// is evaluated multiple times (e.g., Next.js transpilePackages re-bundling).\nconst REGISTRY_KEY = \"__miiflow_visualization_registry__\";\nconst registry: Map<string, VisualizationEntry> =\n (globalThis as any)[REGISTRY_KEY] ??\n ((globalThis as any)[REGISTRY_KEY] = new Map<string, VisualizationEntry>());\n\n/**\n * Register a visualization type. Built-in types are registered at module load.\n * Consumers can call this to add custom visualization types.\n */\nexport function registerVisualization(\n type: string,\n entry: VisualizationEntry,\n): void {\n registry.set(type, entry);\n}\n\n/**\n * Look up a registered visualization by type string.\n */\nexport function getVisualization(type: string): VisualizationEntry | undefined {\n return registry.get(type);\n}\n\n/**\n * Return all registered visualization type strings.\n */\nexport function getRegisteredTypes(): string[] {\n return Array.from(registry.keys());\n}\n\n// ---------------------------------------------------------------------------\n// Register built-in visualization types\n// ---------------------------------------------------------------------------\n\nimport { ChartVisualization } from \"./ChartVisualization\";\nimport { TableVisualization } from \"./TableVisualization\";\nimport { CardVisualization } from \"./CardVisualization\";\nimport { KpiVisualization } from \"./KpiVisualization\";\nimport { CodePreviewVisualization } from \"./CodePreviewVisualization\";\nimport { FormVisualization } from \"./FormVisualization\";\n\n// Schemas are registered lazily after the schemas module is loaded to avoid\n// circular-dependency issues. The `registerBuiltinSchemas` helper is called\n// from schemas.ts at module-load time.\nregisterVisualization(\"chart\", { component: ChartVisualization });\nregisterVisualization(\"table\", { component: TableVisualization });\nregisterVisualization(\"card\", { component: CardVisualization });\nregisterVisualization(\"kpi\", { component: KpiVisualization });\nregisterVisualization(\"code_preview\", { component: CodePreviewVisualization });\nregisterVisualization(\"form\", { component: FormVisualization });\n\n\n/**\n * Attach schemas to already-registered built-in types.\n * Called from schemas.ts at module-load time.\n */\nexport function registerBuiltinSchemas(\n schemas: Record<string, ZodSchema>,\n): void {\n for (const [type, schema] of Object.entries(schemas)) {\n const entry = registry.get(type);\n if (entry) {\n entry.schema = schema;\n }\n }\n}\n","import { z } from \"zod\";\nimport { registerBuiltinSchemas } from \"./registry\";\n\n// ---------------------------------------------------------------------------\n// Chart\n// ---------------------------------------------------------------------------\n\nconst chartSeriesSchema = z.object({\n\tname: z.string(),\n\tdata: z.array(\n\t\tz.union([\n\t\t\tz.object({ x: z.union([z.string(), z.number()]), y: z.number() }),\n\t\t\tz.object({ name: z.string(), value: z.number() }),\n\t\t]),\n\t),\n\tcolor: z.string().nullish(),\n});\n\nconst chartAxisSchema = z.object({\n\tlabel: z.string().nullish(),\n\ttype: z.enum([\"category\", \"number\", \"time\"]).nullish(),\n\tmin: z.number().nullish(),\n\tmax: z.number().nullish(),\n});\n\nexport const chartVisualizationSchema = z.object({\n\tchartType: z.enum([\"line\", \"bar\", \"pie\", \"area\", \"scatter\", \"composed\"]),\n\tseries: z.array(chartSeriesSchema),\n\txAxis: chartAxisSchema.nullish(),\n\tyAxis: chartAxisSchema.nullish(),\n});\n\n// ---------------------------------------------------------------------------\n// Table\n// ---------------------------------------------------------------------------\n\nconst tableColumnSchema = z.object({\n\tkey: z.string(),\n\tlabel: z.string(),\n\ttype: z.enum([\"string\", \"number\", \"currency\", \"date\", \"badge\", \"link\", \"boolean\", \"progress\", \"media\"]).nullish(),\n\talign: z.enum([\"left\", \"center\", \"right\"]).nullish(),\n\twidth: z.string().nullish(),\n});\n\nexport const tableVisualizationSchema = z.object({\n\tcolumns: z.array(tableColumnSchema),\n\trows: z.array(z.record(z.string(), z.unknown())),\n});\n\n// ---------------------------------------------------------------------------\n// Card\n// ---------------------------------------------------------------------------\n\nconst cardSectionSchema = z.object({\n\ttitle: z.string().nullish(),\n\titems: z.array(z.object({ label: z.string(), value: z.union([z.string(), z.number()]) })).nullish(),\n\tcontent: z.string().nullish(),\n});\n\nconst cardActionSchema = z.object({\n\tlabel: z.string(),\n\taction: z.string(),\n\tvariant: z.enum([\"primary\", \"secondary\", \"text\"]).nullish(),\n});\n\nexport const cardVisualizationSchema = z.object({\n\tsubtitle: z.string().nullish(),\n\timageUrl: z.string().nullish(),\n\tsections: z.array(cardSectionSchema),\n\tactions: z.array(cardActionSchema).nullish(),\n});\n\n// ---------------------------------------------------------------------------\n// KPI\n// ---------------------------------------------------------------------------\n\nconst kpiMetricSchema = z.object({\n\tlabel: z.string(),\n\tvalue: z.union([z.string(), z.number()]),\n\tunit: z.string().nullish(),\n\ttrend: z.enum([\"up\", \"down\", \"neutral\"]).nullish(),\n\tchange: z.union([z.string(), z.number()]).nullish(),\n\tchangeLabel: z.string().nullish(),\n\tsparkline: z.array(z.number()).nullish(),\n\tcolor: z.string().nullish(),\n});\n\nexport const kpiVisualizationSchema = z.object({\n\tmetrics: z.array(kpiMetricSchema),\n\t// Must stay in sync with the backend tool schema (server/assistant/\n\t// visualization/tools.py render_kpi.layout enum) and the KpiVisualization\n\t// renderer's branch for \"bento\". Validator-side drift here silently\n\t// flags valid backend payloads as \"Invalid kpi visualization data\".\n\tlayout: z.enum([\"row\", \"grid\", \"bento\"]).nullish(),\n});\n\n// ---------------------------------------------------------------------------\n// Code Preview\n// ---------------------------------------------------------------------------\n\nexport const codePreviewVisualizationSchema = z.object({\n\tcode: z.string(),\n\tlanguage: z.string(),\n\tlineNumbers: z.boolean().nullish(),\n\thighlightLines: z.array(z.number()).nullish(),\n\tstartLine: z.number().nullish(),\n});\n\n// ---------------------------------------------------------------------------\n// Form\n// ---------------------------------------------------------------------------\n\nconst formFieldSchema = z.object({\n\tname: z.string(),\n\ttype: z.enum([\n\t\t\"text\",\n\t\t\"number\",\n\t\t\"email\",\n\t\t\"select\",\n\t\t\"multiselect\",\n\t\t\"checkbox\",\n\t\t\"radio\",\n\t\t\"textarea\",\n\t\t\"date\",\n\t\t\"datetime\",\n\t]),\n\tlabel: z.string(),\n\trequired: z.boolean().nullish(),\n\tplaceholder: z.string().nullish(),\n\toptions: z.array(z.object({ value: z.string(), label: z.string() })).nullish(),\n\tdefaultValue: z.unknown().nullish(),\n\tvalidation: z\n\t\t.object({\n\t\t\tmin: z.number().nullish(),\n\t\t\tmax: z.number().nullish(),\n\t\t\tpattern: z.string().nullish(),\n\t\t\tmessage: z.string().nullish(),\n\t\t})\n\t\t.nullish(),\n});\n\nexport const formVisualizationSchema = z.object({\n\tfields: z.array(formFieldSchema),\n\tsubmitAction: z.string().nullish(),\n});\n\n// ---------------------------------------------------------------------------\n// Auto-register schemas with the registry\n// ---------------------------------------------------------------------------\n\nregisterBuiltinSchemas({\n\tchart: chartVisualizationSchema,\n\ttable: tableVisualizationSchema,\n\tcard: cardVisualizationSchema,\n\tkpi: kpiVisualizationSchema,\n\tcode_preview: codePreviewVisualizationSchema,\n\tform: formVisualizationSchema,\n});\n","import { AlertCircle } from \"lucide-react\";\nimport type { MediaChunkData, VisualizationActionEvent, VisualizationChunkData } from \"../../types\";\nimport { getVisualization } from \"./registry\";\n// Side-effect import: ensures schemas are registered alongside components\nimport \"./schemas\";\n\nexport interface VisualizationRendererProps {\n data: VisualizationChunkData;\n isStreaming?: boolean;\n onAction?: (event: VisualizationActionEvent) => void;\n /** Message-level media bag used to resolve `media_ref:<id>` cell values. */\n medias?: MediaChunkData[];\n}\n\nexport function VisualizationRenderer({\n data,\n isStreaming = false,\n onAction,\n medias,\n}: VisualizationRendererProps) {\n const { type, title, description, data: vizData, config } = data;\n\n const renderVisualization = () => {\n const entry = getVisualization(type);\n if (!entry) {\n return (\n <div className=\"flex items-center gap-2 p-4 text-yellow-500\">\n <AlertCircle size={20} />\n <span className=\"text-sm\">Unknown visualization type: {type}</span>\n </div>\n );\n }\n\n // Schema validation (if a schema is registered for this type)\n if (entry.schema) {\n const result = entry.schema.safeParse(vizData);\n if (!result.success) {\n const issues = result.error.issues.slice(0, 3);\n return (\n <div className=\"p-4 rounded-lg border border-red-200 dark:border-red-800 bg-red-50 dark:bg-red-950/30\">\n <div className=\"flex items-center gap-2 text-red-600 dark:text-red-400 mb-2\">\n <AlertCircle size={18} />\n <span className=\"text-sm font-medium\">\n Invalid {type} visualization data\n </span>\n </div>\n <ul className=\"text-xs text-red-500 dark:text-red-400 space-y-1 list-disc list-inside\">\n {issues.map((issue, i) => (\n <li key={i}>\n {issue.path.join(\".\")}: {issue.message}\n </li>\n ))}\n {result.error.issues.length > 3 && (\n <li>...and {result.error.issues.length - 3} more</li>\n )}\n </ul>\n </div>\n );\n }\n }\n\n const Component = entry.component;\n return (\n <Component\n data={vizData}\n config={config}\n isStreaming={isStreaming}\n onAction={onAction}\n medias={medias}\n />\n );\n };\n\n return (\n <div className=\"my-3 overflow-hidden\">\n {(title || description) && (\n <div className=\"mb-2\">\n {title && <p className=\"text-sm font-semibold\">{title}</p>}\n {description && (\n <p className=\"text-xs text-gray-500 mt-0.5\">{description}</p>\n )}\n </div>\n )}\n <div>{renderVisualization()}</div>\n </div>\n );\n}\n","import type { ArtifactChunkData } from \"../../types/streaming\";\n\nexport interface ArtifactInlineCardProps {\n artifact: ArtifactChunkData;\n isStreaming?: boolean;\n onOpen?: (artifact: ArtifactChunkData) => void;\n}\n\n/**\n * Unstyled primitive inline card. The app layer (`web/`) registers a\n * MUI-skinned version via `registerArtifact`; this primitive is the fallback\n * shipped with the chat-ui package so headless / embedded consumers still\n * render something when a tool emits an artifact.\n */\nexport function ArtifactInlineCard({\n artifact,\n isStreaming,\n onOpen,\n}: ArtifactInlineCardProps) {\n const status = artifact.status ?? \"ready\";\n const isPending = status === \"pending\" || (isStreaming && status !== \"failed\");\n const isFailed = status === \"failed\";\n const isDisabled = isPending || isFailed;\n\n const handleClick = () => {\n if (!isDisabled) onOpen?.(artifact);\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isDisabled}\n aria-label={\n isFailed\n ? `Artifact failed: ${artifact.title}`\n : `Open ${artifact.kind.toUpperCase()} artifact: ${artifact.title}`\n }\n data-artifact-id={artifact.id}\n data-artifact-status={status}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n padding: \"10px 14px\",\n marginTop: \"8px\",\n background: isFailed\n ? \"var(--miiflow-artifact-error-bg, #fdecea)\"\n : \"var(--miiflow-artifact-bg, #f6f8fa)\",\n border: \"1px solid\",\n borderColor: isFailed\n ? \"var(--miiflow-artifact-error-border, #f1aeb5)\"\n : \"var(--miiflow-artifact-border, #d0d7de)\",\n borderRadius: \"8px\",\n font: \"inherit\",\n color: \"inherit\",\n textAlign: \"left\",\n cursor: isDisabled ? (isFailed ? \"default\" : \"progress\") : \"pointer\",\n width: \"100%\",\n maxWidth: \"420px\",\n opacity: isPending ? 0.7 : 1,\n }}\n >\n <span aria-hidden style={{ fontSize: \"22px\", lineHeight: 1, flex: \"0 0 auto\" }}>\n {isFailed ? \"⚠️\" : \"📄\"}\n </span>\n <span style={{ flex: 1, minWidth: 0 }}>\n <span\n style={{\n display: \"block\",\n fontWeight: 600,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {artifact.title}\n </span>\n <span\n style={{\n display: \"block\",\n fontSize: \"12px\",\n color: isFailed\n ? \"var(--miiflow-artifact-error-text, #b42318)\"\n : \"var(--miiflow-artifact-meta, #57606a)\",\n }}\n >\n {isFailed\n ? artifact.errorMessage || \"Generation failed\"\n : [\n artifact.kind.toUpperCase(),\n artifact.pageCount ? `${artifact.pageCount} pages` : null,\n isPending ? \"generating…\" : null,\n ]\n .filter(Boolean)\n .join(\" · \")}\n </span>\n </span>\n </button>\n );\n}\n","import type { ComponentType, ReactNode } from \"react\";\nimport type { ArtifactChunkData } from \"../../types/streaming\";\n\n/**\n * Shape of a registered artifact type.\n *\n * Artifacts have a dual UI:\n * - `InlineCard` is rendered inside the message body (compact, clickable).\n * - `Viewer` is rendered inside the side-panel drawer (full preview).\n *\n * The app layer (`web/`) supplies MUI-skinned implementations; the unstyled\n * primitive `ArtifactInlineCard` is used as a fallback for headless consumers\n * (e.g. the embedded widget) that do not register MUI artifacts.\n */\nexport interface ArtifactEntry {\n type: string;\n label: string;\n icon?: ComponentType<{ className?: string }>;\n InlineCard: ComponentType<{\n artifact: ArtifactChunkData;\n isStreaming?: boolean;\n onOpen?: (artifact: ArtifactChunkData) => void;\n }>;\n Viewer?: ComponentType<{ artifact: ArtifactChunkData }>;\n /** Optional description shown when no entry is registered for this type. */\n fallback?: ReactNode;\n}\n\n// Use globalThis to ensure a single registry instance even when the module\n// is evaluated multiple times (e.g., Next.js transpilePackages re-bundling).\nconst REGISTRY_KEY = \"__miiflow_artifact_registry__\";\nconst registry: Map<string, ArtifactEntry> =\n (globalThis as any)[REGISTRY_KEY] ??\n ((globalThis as any)[REGISTRY_KEY] = new Map<string, ArtifactEntry>());\n\nexport function registerArtifact(type: string, entry: ArtifactEntry): void {\n registry.set(type, entry);\n}\n\nexport function getArtifact(type: string): ArtifactEntry | undefined {\n return registry.get(type);\n}\n\nexport function getRegisteredArtifactTypes(): string[] {\n return Array.from(registry.keys());\n}\n","import type { ArtifactChunkData } from \"../../types/streaming\";\nimport { ArtifactInlineCard } from \"./ArtifactInlineCard\";\nimport { getArtifact } from \"./registry\";\n\nexport interface ArtifactListProps {\n artifacts: ArtifactChunkData[];\n isStreaming?: boolean;\n onOpen?: (artifact: ArtifactChunkData) => void;\n}\n\n/**\n * Renders one inline card per artifact using the registered renderer when\n * available; falls back to the unstyled `ArtifactInlineCard` otherwise.\n */\nexport function ArtifactList({\n artifacts,\n isStreaming,\n onOpen,\n}: ArtifactListProps) {\n if (!artifacts?.length) return null;\n\n return (\n <div data-artifact-list style={{ display: \"flex\", flexDirection: \"column\", gap: \"4px\" }}>\n {artifacts.map((artifact) => {\n const entry = getArtifact(artifact.kind);\n const Card = entry?.InlineCard ?? ArtifactInlineCard;\n return (\n <Card\n key={artifact.id}\n artifact={artifact}\n isStreaming={isStreaming}\n onOpen={onOpen}\n />\n );\n })}\n </div>\n );\n}\n","// Regex to match inline markers: [VIZ:uuid], [MEDIA:uuid], and [SA:id]\n// VIZ/MEDIA use hex UUIDs; SA uses TokenField IDs (alphanumeric + underscore, e.g. saction_AbC123xYz)\nconst INLINE_MARKER_REGEX = /\\[(VIZ|MEDIA|SA):([\\w-]+)\\]/gi;\n\nexport type ContentPart =\n | { type: \"text\"; content: string }\n | { type: \"viz\"; id: string }\n | { type: \"media\"; id: string }\n | { type: \"sa\"; id: string };\n\n/**\n * Parse content and split it by inline markers ([VIZ:id], [MEDIA:id], and [SA:id]).\n */\nexport function parseContentWithInlineMarkers(content: string): ContentPart[] {\n const parts: ContentPart[] = [];\n let lastIndex = 0;\n let match;\n\n INLINE_MARKER_REGEX.lastIndex = 0;\n\n while ((match = INLINE_MARKER_REGEX.exec(content)) !== null) {\n if (match.index > lastIndex) {\n const text = content.slice(lastIndex, match.index);\n if (text.trim()) {\n parts.push({ type: \"text\", content: text });\n }\n }\n\n const markerType = match[1].toUpperCase();\n if (markerType === \"VIZ\") {\n parts.push({ type: \"viz\", id: match[2] });\n } else if (markerType === \"SA\") {\n parts.push({ type: \"sa\", id: match[2] });\n } else {\n parts.push({ type: \"media\", id: match[2] });\n }\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < content.length) {\n const text = content.slice(lastIndex);\n if (text.trim()) {\n parts.push({ type: \"text\", content: text });\n }\n }\n\n return parts;\n}\n","/**\n * Reserves vertical space for a streaming assistant message body so the\n * scroll position doesn't jitter as tokens arrive. Measures the accumulated\n * text off-DOM via `@chenglou/pretext` and returns a `minHeight` value to\n * apply to the bubble container.\n *\n * Bails out (returns `undefined`) for content we can't measure cheaply:\n * code blocks, inline markers ([VIZ:], [SA:], [MEDIA:]), and images.\n */\n\nimport { useEffect, useState, type RefObject } from \"react\";\nimport { measureMessageHeight } from \"../utils/measureMessage\";\n\nconst UNMEASURABLE_PATTERNS = [\n\t/```/, // fenced code blocks\n\t/\\[VIZ:/,\n\t/\\[SA:/,\n\t/\\[MEDIA:/,\n\t/!\\[/, // markdown images\n\t/<img\\b/i,\n];\n\nfunction isMeasurable(text: string): boolean {\n\tfor (const re of UNMEASURABLE_PATTERNS) {\n\t\tif (re.test(text)) return false;\n\t}\n\treturn true;\n}\n\nexport function useStreamingMinHeight(\n\tcontainerRef: RefObject<HTMLElement | null>,\n\ttext: string | undefined,\n\tisStreaming: boolean,\n): number | undefined {\n\tconst [minHeight, setMinHeight] = useState<number | undefined>(undefined);\n\n\tuseEffect(() => {\n\t\tif (!isStreaming) {\n\t\t\tsetMinHeight(undefined);\n\t\t\treturn;\n\t\t}\n\t\tconst el = containerRef.current;\n\t\tif (!el || !text || !isMeasurable(text)) return;\n\n\t\tlet cancelled = false;\n\t\tconst measure = () => {\n\t\t\tif (cancelled) return;\n\t\t\tconst width = el.clientWidth;\n\t\t\tif (width <= 0) return;\n\t\t\tconst result = measureMessageHeight(text, width);\n\t\t\tif (!result) return;\n\t\t\t// Monotonic: never shrink while streaming.\n\t\t\tsetMinHeight((prev) =>\n\t\t\t\tprev === undefined || result.height > prev ? result.height : prev,\n\t\t\t);\n\t\t};\n\n\t\tmeasure();\n\n\t\tconst ro =\n\t\t\ttypeof ResizeObserver !== \"undefined\" ? new ResizeObserver(measure) : null;\n\t\tro?.observe(el);\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t\tro?.disconnect();\n\t\t};\n\t}, [containerRef, text, isStreaming]);\n\n\treturn minHeight;\n}\n","import {\n\tforwardRef,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport {\n\tMediaLightbox,\n\tPlayOverlay,\n\tYOUTUBE_ID_RE,\n\tuseMediaLightbox,\n\ttype MediaItem,\n} from \"./MediaLightbox\";\nimport { MessageContent as MessageContentPrimitive, Message as MessagePrimitive } from \"../primitives\";\nimport type {\n\tClarificationData,\n\tMediaChunkData,\n\tMessageData,\n\tParticipantRole,\n\tSourceReference,\n\tStreamingChunk,\n\tSuggestedAction,\n\tVisualizationChunkData,\n} from \"../types\";\nimport { cn } from \"../utils/cn\";\nimport { ChatContext } from \"../context/ChatProvider\";\nimport { Avatar } from \"./Avatar\";\nimport { CitationSources } from \"./CitationSources\";\nimport { ClarificationPanel } from \"./ClarificationPanel\";\nimport { ToolApprovalPanel } from \"./ToolApprovalPanel\";\nimport { LoadingDots } from \"./LoadingDots\";\nimport { MarkdownContent } from \"./MarkdownContent\";\nimport { MessageActionBar } from \"./MessageActionBar\";\nimport { MessageAttachments } from \"./MessageAttachments\";\nimport { ReasoningPanel } from \"./ReasoningPanel\";\nimport { StreamingText } from \"./StreamingText\";\nimport { SuggestedActions } from \"./SuggestedActions\";\nimport { VisualizationRenderer } from \"./visualizations\";\nimport { ArtifactList } from \"./artifacts\";\nimport { parseContentWithInlineMarkers } from \"../utils/inline-markers\";\nimport { useStreamingMinHeight } from \"../hooks/use-streaming-min-height\";\n\n// ── Lazy media helpers ───────────────────────────────────────────────\n// Videos are mounted only after the user clicks the poster. This keeps\n// long audit lists (top 5 + bottom 5, possibly dozens of videos) from\n// instantiating every <video>/<iframe> on initial render.\n// MediaItem / YOUTUBE_ID_RE / PlayOverlay / MediaLightbox are imported\n// from ./MediaLightbox so TableVisualization can reuse them.\n\ninterface LazyVideoProps {\n\turl: string;\n\tposterUrl?: string;\n\taltText?: string;\n}\n\nconst LazyYouTubeEmbed = ({ ytId, altText }: { ytId: string; altText?: string }) => {\n\tconst [loaded, setLoaded] = useState(false);\n\tconst posterUrl = `https://i.ytimg.com/vi/${ytId}/hqdefault.jpg`;\n\treturn (\n\t\t<div className=\"my-3\">\n\t\t\t<div\n\t\t\t\tclassName=\"relative w-full overflow-hidden rounded-lg\"\n\t\t\t\tstyle={{ maxWidth: 640, aspectRatio: \"16 / 9\" }}\n\t\t\t>\n\t\t\t\t{loaded ? (\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tsrc={`https://www.youtube.com/embed/${ytId}?autoplay=1`}\n\t\t\t\t\t\ttitle={altText || \"Video\"}\n\t\t\t\t\t\tallow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n\t\t\t\t\t\tallowFullScreen\n\t\t\t\t\t\tclassName=\"absolute inset-0 h-full w-full border-0\"\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => setLoaded(true)}\n\t\t\t\t\t\tclassName=\"absolute inset-0 block border-0 bg-transparent p-0\"\n\t\t\t\t\t\taria-label={altText || \"Play video\"}\n\t\t\t\t\t>\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={posterUrl}\n\t\t\t\t\t\t\talt={altText || \"Video preview\"}\n\t\t\t\t\t\t\tclassName=\"h-full w-full object-cover\"\n\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<PlayOverlay label={altText || \"Play video\"} />\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{altText && <div className=\"mt-1 text-xs text-gray-500\">{altText}</div>}\n\t\t</div>\n\t);\n};\n\nconst LazyHtmlVideo = ({ url, posterUrl, altText }: LazyVideoProps) => {\n\tconst [loaded, setLoaded] = useState(false);\n\treturn (\n\t\t<div className=\"my-3\">\n\t\t\t<div\n\t\t\t\tclassName=\"relative overflow-hidden rounded-lg\"\n\t\t\t\tstyle={{ maxWidth: 640, maxHeight: 512 }}\n\t\t\t>\n\t\t\t\t{loaded ? (\n\t\t\t\t\t<video\n\t\t\t\t\t\tcontrols\n\t\t\t\t\t\tautoPlay\n\t\t\t\t\t\tpreload=\"metadata\"\n\t\t\t\t\t\tclassName=\"block max-h-[512px] w-full rounded-lg\"\n\t\t\t\t\t\tposter={posterUrl}\n\t\t\t\t\t>\n\t\t\t\t\t\t<source src={url} />\n\t\t\t\t\t\tYour browser does not support the video tag.\n\t\t\t\t\t</video>\n\t\t\t\t) : (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => setLoaded(true)}\n\t\t\t\t\t\tclassName=\"block w-full border-0 bg-transparent p-0\"\n\t\t\t\t\t\taria-label={altText || \"Play video\"}\n\t\t\t\t\t>\n\t\t\t\t\t\t{posterUrl ? (\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={posterUrl}\n\t\t\t\t\t\t\t\talt={altText || \"Video preview\"}\n\t\t\t\t\t\t\t\tclassName=\"block max-h-[512px] w-full object-cover\"\n\t\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"flex w-full items-center justify-center bg-gray-900 text-gray-400\"\n\t\t\t\t\t\t\t\tstyle={{ aspectRatio: \"16 / 9\" }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"text-sm\">Click to load video</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<PlayOverlay label={altText || \"Play video\"} />\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{altText && <div className=\"mt-1 text-xs text-gray-500\">{altText}</div>}\n\t\t</div>\n\t);\n};\n\n// ── Media grid ────────────────────────────────────────────────────────\n// When a tool returns multiple media items (creative audits return 5-10+),\n// a vertical stack wastes screen real estate. The grid tiles the items\n// responsively; click opens a full-size lightbox with keyboard navigation.\n// MediaLightbox itself lives in ./MediaLightbox so TableVisualization can\n// reuse it.\n\nconst MediaGridTile = ({\n\tmedia,\n\tonOpen,\n}: {\n\tmedia: MediaItem;\n\tonOpen: () => void;\n}) => {\n\t// Video (YouTube or direct): show thumbnail with play overlay; click opens lightbox.\n\tif (media.mediaType === \"video\") {\n\t\tconst ytMatch = media.url.match(YOUTUBE_ID_RE);\n\t\tconst ytId = ytMatch ? ytMatch[1] : null;\n\t\tconst posterSrc = ytId ? `https://i.ytimg.com/vi/${ytId}/hqdefault.jpg` : undefined;\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={onOpen}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative block w-full overflow-hidden rounded-lg border-0 bg-black/5 p-0\",\n\t\t\t\t\t\"aspect-square cursor-pointer transition-opacity hover:opacity-90\",\n\t\t\t\t)}\n\t\t\t\tstyle={{ aspectRatio: \"1 / 1\" }}\n\t\t\t\taria-label={media.altText || \"Open video\"}\n\t\t\t>\n\t\t\t\t{posterSrc ? (\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc={posterSrc}\n\t\t\t\t\t\talt={media.altText || \"Video preview\"}\n\t\t\t\t\t\tclassName=\"h-full w-full object-cover\"\n\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"flex h-full w-full items-center justify-center bg-gray-900 text-xs text-gray-400\">\n\t\t\t\t\t\tVideo\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t<PlayOverlay label={media.altText || \"Open video\"} />\n\t\t\t</button>\n\t\t);\n\t}\n\n\t// Image: click opens lightbox at full size.\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={onOpen}\n\t\t\tclassName={cn(\n\t\t\t\t\"block w-full overflow-hidden rounded-lg border-0 bg-transparent p-0\",\n\t\t\t\t\"aspect-square cursor-pointer transition-opacity hover:opacity-90\",\n\t\t\t)}\n\t\t\tstyle={{ aspectRatio: \"1 / 1\" }}\n\t\t\taria-label={media.altText || \"Open image\"}\n\t\t>\n\t\t\t<img\n\t\t\t\tsrc={media.url}\n\t\t\t\talt={media.altText || \"Image\"}\n\t\t\t\tclassName=\"h-full w-full object-cover\"\n\t\t\t\tloading=\"lazy\"\n\t\t\t/>\n\t\t</button>\n\t);\n};\n\nexport interface MessageProps {\n\t/** The message data */\n\tmessage: MessageData;\n\t/** The viewer's role (determines alignment) */\n\tviewerRole?: ParticipantRole;\n\t/** Additional CSS classes */\n\tclassName?: string;\n\t/** Whether to show avatar */\n\tshowAvatar?: boolean;\n\t/** Whether to show timestamp */\n\tshowTimestamp?: boolean;\n\t/** Whether to render content as markdown */\n\trenderMarkdown?: boolean;\n\t/** Streaming chunks for reasoning panel */\n\treasoning?: StreamingChunk[];\n\t/** Execution plan for completed Plan & Execute messages */\n\texecutionPlan?: unknown;\n\t/** Execution timeline for completed messages (all orchestrator modes) */\n\texecutionTimeline?: unknown[];\n\t/** Suggested actions */\n\tsuggestedActions?: SuggestedAction[];\n\t/** Callback when suggested action is selected */\n\tonSuggestedAction?: (action: SuggestedAction) => void;\n\t/** Whether reasoning panel is expanded */\n\treasoningExpanded?: boolean;\n\t/** Callback when reasoning panel expansion changes */\n\tonReasoningExpandedChange?: (expanded: boolean) => void;\n\t/** Citation sources to display after message content */\n\tcitations?: SourceReference[];\n\t/** Inline visualizations to render within message content */\n\tvisualizations?: VisualizationChunkData[];\n\t/** Inline media (images/videos) to render within message content */\n\tmedias?: MediaChunkData[];\n\t/** Inline downloadable artifacts (PDFs, HTMLs, ...) */\n\tartifacts?: import(\"../types\").ArtifactChunkData[];\n\t/** Callback when a user clicks an artifact inline card */\n\tonArtifactOpen?: (artifact: import(\"../types\").ArtifactChunkData) => void;\n\t/** Base font size multiplier for markdown rendering */\n\tbaselineFontSize?: number;\n\t/** Total execution time in seconds (persisted from streaming wall-clock) */\n\texecutionTime?: number;\n\t/** Pending clarification data (agent needs user input) */\n\tpendingClarification?: ClarificationData;\n\t/** Callback when user responds to a clarification */\n\tonClarificationSubmit?: (response: string) => void;\n\t/** Pending tool approval data (tool requires user approval) */\n\tpendingToolApproval?: import(\"../types\").ToolApprovalData;\n\t/** Callback when user approves a tool execution */\n\tonToolApprove?: (modifiedInputs: Record<string, unknown>) => void;\n\t/** Callback when user rejects a tool execution */\n\tonToolReject?: (reason?: string) => void;\n\t/** Render function for inline suggested action cards (from [SA:id] markers) */\n\trenderInlineSuggestedAction?: (id: string) => React.ReactNode;\n\t/** Report this assistant response as incorrect. Receives an optional reason\n\t * string (category + free-text details) for the learner pipeline. */\n\tonReportIncorrect?: (reason?: string) => void;\n\t/** Confirm this assistant response was correct/helpful */\n\tonConfirmCorrect?: () => void;\n\t/** Edit-and-resubmit for the viewer's own messages (ChatGPT-style). When\n\t * provided, a pencil appears in the hover action bar; submitting replaces\n\t * this message and everything after it with a fresh agent turn. */\n\tonEditSubmit?: (newText: string) => void;\n}\n\n/**\n * Styled Message component with grid layout matching the main app.\n * Uses grid to align avatar and content, with reasoning above content.\n * Supports attachments, citations, inline visualizations, and streaming text.\n */\nexport const Message = forwardRef<HTMLDivElement, MessageProps>(\n\t(\n\t\t{\n\t\t\tmessage,\n\t\t\tviewerRole = \"user\",\n\t\t\tclassName,\n\t\t\tshowAvatar = true,\n\t\t\tshowTimestamp = true,\n\t\t\trenderMarkdown = true,\n\t\t\treasoning,\n\t\t\texecutionPlan,\n\t\t\texecutionTimeline,\n\t\t\tsuggestedActions,\n\t\t\tonSuggestedAction,\n\t\t\treasoningExpanded,\n\t\t\tonReasoningExpandedChange,\n\t\t\tcitations,\n\t\t\tvisualizations,\n\t\t\tmedias,\n\t\t\tartifacts,\n\t\t\tonArtifactOpen,\n\t\t\tbaselineFontSize,\n\t\t\texecutionTime,\n\t\t\tpendingClarification,\n\t\t\tonClarificationSubmit,\n\t\t\tpendingToolApproval,\n\t\t\tonToolApprove,\n\t\t\tonToolReject,\n\t\t\trenderInlineSuggestedAction,\n\t\t\tonReportIncorrect,\n\t\t\tonConfirmCorrect,\n\t\t\tonEditSubmit,\n\t\t},\n\t\tref,\n\t) => {\n\t\t// Get visualization action callback from context (null-safe for standalone usage)\n\t\tconst chatContext = useContext(ChatContext);\n\t\tconst onVisualizationAction = chatContext?.onVisualizationAction;\n\n\t\t// Edit-and-resubmit state for the viewer's own messages\n\t\tconst [isEditing, setIsEditing] = useState(false);\n\n\t\t// Case-insensitive comparison for role matching\n\t\tconst participantRole = (message.participant?.role || \"\").toLowerCase();\n\t\tconst viewerRoleLower = (viewerRole || \"\").toLowerCase();\n\t\tconst isViewer = participantRole === viewerRoleLower;\n\t\tconst isAssistant = participantRole === \"assistant\";\n\t\tconst isStreaming = message.isStreaming;\n\n\t\t// Filter reasoning chunks for display.\n\t\t// `subtask` is kept to replay historical (pre-unified-ReAct) messages.\n\t\tconst reasoningChunks = reasoning?.filter(\n\t\t\t(c) =>\n\t\t\t\tc.type === \"thinking\" ||\n\t\t\t\tc.type === \"tool\" ||\n\t\t\t\tc.type === \"observation\" ||\n\t\t\t\tc.type === \"planning\" ||\n\t\t\t\tc.type === \"subtask\" ||\n\t\t\t\t// Sub-assistant dispatch (dispatch_assistant)\n\t\t\t\tc.type === \"subagent\",\n\t\t);\n\t\tconst hasReasoningChunks = reasoningChunks && reasoningChunks.length > 0;\n\t\tconst hasCompletedReasoning =\n\t\t\t!isStreaming && (executionPlan || (executionTimeline && executionTimeline.length > 0));\n\t\tconst hasReasoning = hasReasoningChunks || hasCompletedReasoning;\n\n\t\t// Check if waiting for content\n\t\tconst isWaitingForContent = isStreaming && !message.textContent && !hasReasoning;\n\n\t\t// Attachments from message data\n\t\tconst attachments = message.attachments;\n\t\tconst hasAttachments = attachments && attachments.length > 0;\n\n\t\t// Visualization map for inline rendering\n\t\tconst vizMap = useMemo(() => {\n\t\t\tif (!visualizations || visualizations.length === 0) return null;\n\t\t\tconst map = new Map<string, VisualizationChunkData>();\n\t\t\tvisualizations.forEach((viz) => map.set(viz.id, viz));\n\t\t\treturn map;\n\t\t}, [visualizations]);\n\n\t\t// Parse content for inline viz/SA markers\n\t\tconst hasVizInlineContent = vizMap && vizMap.size > 0;\n\t\tconst hasInlineMarkers = hasVizInlineContent || (message.textContent && /\\[SA:[\\w-]+\\]/i.test(message.textContent));\n\t\tconst contentParts = useMemo(() => {\n\t\t\tif (!hasInlineMarkers || !message.textContent) return null;\n\t\t\treturn parseContentWithInlineMarkers(message.textContent);\n\t\t}, [hasInlineMarkers, message.textContent]);\n\n\t\t// Strip [MEDIA:...] markers from text content (media rendered separately)\n\t\tconst cleanTextContent = useMemo(() => {\n\t\t\tif (!medias || medias.length === 0 || !message.textContent) return message.textContent;\n\t\t\treturn message.textContent.replace(/\\[MEDIA:[a-f0-9-]+\\]/gi, \"\").trim();\n\t\t}, [message.textContent, medias]);\n\n\t\tconst renderContent = () => {\n\t\t\tif (!message.textContent) return null;\n\n\t\t\t// Content with inline visualization/suggested action markers\n\t\t\tif (contentParts && contentParts.length > 0 && hasInlineMarkers) {\n\t\t\t\tconst renderedVizIds = new Set<string>();\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{contentParts.map((part, idx) => {\n\t\t\t\t\t\t\tif (part.type === \"text\") {\n\t\t\t\t\t\t\t\treturn isStreaming ? (\n\t\t\t\t\t\t\t\t\t<StreamingText key={idx} content={part.content} isStreaming baselineFontSize={baselineFontSize} />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<MarkdownContent\n\t\t\t\t\t\t\t\t\t\tkey={idx}\n\t\t\t\t\t\t\t\t\t\tbaselineFontSize={baselineFontSize}\n\t\t\t\t\t\t\t\t\t\tclassName={isViewer ? \"prose-invert\" : \"\"}>\n\t\t\t\t\t\t\t\t\t\t{part.content}\n\t\t\t\t\t\t\t\t\t</MarkdownContent>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (part.type === \"viz\") {\n\t\t\t\t\t\t\t\tif (renderedVizIds.has(part.id)) return null;\n\t\t\t\t\t\t\t\tconst viz = vizMap?.get(part.id);\n\t\t\t\t\t\t\t\tif (viz) {\n\t\t\t\t\t\t\t\t\trenderedVizIds.add(part.id);\n\t\t\t\t\t\t\t\t\treturn <VisualizationRenderer key={`viz-${part.id}`} data={viz} isStreaming={isStreaming} onAction={onVisualizationAction} medias={medias} />;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (part.type === \"sa\") {\n\t\t\t\t\t\t\t\tif (renderInlineSuggestedAction) {\n\t\t\t\t\t\t\t\t\treturn <div key={`sa-${part.id}`}>{renderInlineSuggestedAction(part.id)}</div>;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Media markers stripped — rendered below\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t})}\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Streaming text with typewriter\n\t\t\tif (isStreaming && renderMarkdown) {\n\t\t\t\treturn (\n\t\t\t\t\t<StreamingText\n\t\t\t\t\t\tcontent={cleanTextContent || \"\"}\n\t\t\t\t\t\tisStreaming\n\t\t\t\t\t\tbaselineFontSize={baselineFontSize}\n\t\t\t\t\t\tclassName={isViewer ? \"prose-invert\" : \"\"}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Static markdown\n\t\t\tif (renderMarkdown) {\n\t\t\t\treturn (\n\t\t\t\t\t<MarkdownContent baselineFontSize={baselineFontSize} className={isViewer ? \"prose-invert\" : \"\"}>\n\t\t\t\t\t\t{cleanTextContent || \"\"}\n\t\t\t\t\t</MarkdownContent>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn <p className=\"whitespace-pre-wrap\">{cleanTextContent}</p>;\n\t\t};\n\n\t\tconst filteredMedias: MediaItem[] = useMemo(() => {\n\t\t\tif (!medias || medias.length === 0) return [];\n\t\t\tconst textContent = cleanTextContent || \"\";\n\t\t\treturn medias\n\t\t\t\t.filter((media) => {\n\t\t\t\t\tif (media.mediaType !== \"image\") return true;\n\t\t\t\t\t// Skip media items already rendered inline as markdown images\n\t\t\t\t\treturn !textContent.includes(media.url);\n\t\t\t\t})\n\t\t\t\t.map((m) => ({\n\t\t\t\t\tid: m.id,\n\t\t\t\t\turl: m.url,\n\t\t\t\t\tmediaType: m.mediaType,\n\t\t\t\t\taltText: m.altText,\n\t\t\t\t}));\n\t\t}, [medias, cleanTextContent]);\n\n\t\tconst {\n\t\t\tindex: lightboxIndex,\n\t\t\topen: openLightbox,\n\t\t\tclose: closeLightbox,\n\t\t\tnavigate: navigateLightbox,\n\t\t} = useMediaLightbox(filteredMedias);\n\n\t\tconst renderMediaItems = () => {\n\t\t\tif (filteredMedias.length === 0) return null;\n\n\t\t\t// Grid view for 2+ items — tiles click into the lightbox.\n\t\t\tif (filteredMedias.length >= 2) {\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"my-3 grid gap-2\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tgridTemplateColumns: \"repeat(auto-fill, minmax(140px, 1fr))\",\n\t\t\t\t\t\t\tmaxWidth: 640,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{filteredMedias.map((media, idx) => (\n\t\t\t\t\t\t\t<MediaGridTile\n\t\t\t\t\t\t\t\tkey={`media-${media.id}`}\n\t\t\t\t\t\t\t\tmedia={media}\n\t\t\t\t\t\t\t\tonOpen={() => openLightbox(idx)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Single-item rendering keeps the existing larger layout but adds\n\t\t\t// click-to-open-lightbox so users can still get a full-size view.\n\t\t\tconst media = filteredMedias[0];\n\t\t\tif (media.mediaType === \"image\") {\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"my-3\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => openLightbox(0)}\n\t\t\t\t\t\t\tclassName=\"block cursor-zoom-in border-0 bg-transparent p-0\"\n\t\t\t\t\t\t\taria-label={media.altText || \"Open image\"}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={media.url}\n\t\t\t\t\t\t\t\talt={media.altText || \"Generated image\"}\n\t\t\t\t\t\t\t\tclassName=\"max-w-full rounded-lg\"\n\t\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t\t\tstyle={{ maxHeight: 512, display: \"block\" }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (media.mediaType === \"video\") {\n\t\t\t\tconst ytMatch = media.url.match(YOUTUBE_ID_RE);\n\t\t\t\tif (ytMatch) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<LazyYouTubeEmbed\n\t\t\t\t\t\t\tkey={`media-${media.id}`}\n\t\t\t\t\t\t\tytId={ytMatch[1]}\n\t\t\t\t\t\t\taltText={media.altText}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn (\n\t\t\t\t\t<LazyHtmlVideo\n\t\t\t\t\t\tkey={`media-${media.id}`}\n\t\t\t\t\t\turl={media.url}\n\t\t\t\t\t\tposterUrl={(media as { posterUrl?: string }).posterUrl}\n\t\t\t\t\t\taltText={media.altText}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn null;\n\t\t};\n\n\t\t// Track if this message was ever in streaming state.\n\t\t// Streamed messages are already visible — re-animating them on completion causes a flash.\n\t\tconst wasStreamingRef = useRef(isStreaming);\n\t\tif (isStreaming) wasStreamingRef.current = true;\n\t\tconst showFadeIn = !isStreaming && !wasStreamingRef.current;\n\n\t\t// Reserve vertical space for streaming text bodies (off-DOM measurement\n\t\t// via @chenglou/pretext) so the scroll anchor doesn't jitter per token.\n\t\tconst bubbleRef = useRef<HTMLDivElement>(null);\n\t\tconst streamingMinHeight = useStreamingMinHeight(\n\t\t\tbubbleRef,\n\t\t\tmessage.textContent,\n\t\t\t!!isStreaming,\n\t\t);\n\n\t\treturn (\n\t\t\t<MessagePrimitive\n\t\t\t\tref={ref}\n\t\t\t\tmessage={message}\n\t\t\t\tviewerRole={viewerRole}\n\t\t\t\tclassName={cn(\"w-full\", showFadeIn && \"animate-message-in\", className)}>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\"flex flex-col gap-1 w-full\")}\n\t\t\t\t\tdata-is-viewer={isViewer}>\n\t\t\t\t\t{/* Loading indicator: avatar + dots in same row */}\n\t\t\t\t\t{isWaitingForContent && (\n\t\t\t\t\t\t<div className={cn(\"flex items-start gap-2 w-full\")}>\n\t\t\t\t\t\t\t{showAvatar && !isViewer && (\n\t\t\t\t\t\t\t\t<div className=\"flex-shrink-0\">\n\t\t\t\t\t\t\t\t\t<Avatar\n\t\t\t\t\t\t\t\t\t\tname={message.participant?.name}\n\t\t\t\t\t\t\t\t\t\tsrc={message.participant?.avatarUrl}\n\t\t\t\t\t\t\t\t\t\trole={message.participant?.role}\n\t\t\t\t\t\t\t\t\t\tclassName=\"w-10 h-10 flex-shrink-0\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<div className=\"px-4 py-3\">\n\t\t\t\t\t\t\t\t<LoadingDots size=\"small\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Reasoning Panel - before content for assistant */}\n\t\t\t\t\t{hasReasoning && isAssistant && (\n\t\t\t\t\t\t<div className=\"w-full\">\n\t\t\t\t\t\t\t\t\t<ReasoningPanel\n\t\t\t\t\t\t\t\tisStreaming={isStreaming}\n\t\t\t\t\t\t\t\tchunks={reasoningChunks}\n\t\t\t\t\t\t\t\tplan={executionPlan as any}\n\t\t\t\t\t\t\t\texecutionTimeline={executionTimeline as any[]}\n\t\t\t\t\t\t\t\tuserMessageTimestamp={message.createdAt ? new Date(typeof message.createdAt === \"string\" ? message.createdAt : message.createdAt).getTime() / 1000 : undefined}\n\t\t\t\t\t\t\t\texecutionTime={executionTime}\n\t\t\t\t\t\t\t\texpanded={reasoningExpanded}\n\t\t\t\t\t\t\t\tonExpandedChange={onReasoningExpandedChange}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Content row: avatar + message bubble */}\n\t\t\t\t\t{message.textContent && (\n\t\t\t\t\t\t<div className={cn(\n\t\t\t\t\t\t\t\"group flex items-start gap-2 w-full\",\n\t\t\t\t\t\t\tisViewer ? \"flex-row-reverse\" : \"flex-row\"\n\t\t\t\t\t\t)}>\n\t\t\t\t\t\t\t{/* Avatar - shown for non-viewer messages */}\n\t\t\t\t\t\t\t{showAvatar && !isViewer && (\n\t\t\t\t\t\t\t\t<div className=\"flex-shrink-0\">\n\t\t\t\t\t\t\t\t\t<Avatar\n\t\t\t\t\t\t\t\t\t\tname={message.participant?.name}\n\t\t\t\t\t\t\t\t\t\tsrc={message.participant?.avatarUrl}\n\t\t\t\t\t\t\t\t\t\trole={message.participant?.role}\n\t\t\t\t\t\t\t\t\t\tclassName=\"w-10 h-10 flex-shrink-0\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{/* Message bubble */}\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tref={bubbleRef}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\tisViewer ? (isEditing ? \"w-full\" : \"max-w-[85%]\") : \"min-w-0 flex-1\",\n\t\t\t\t\t\t\t\t\t\"flex flex-col\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tdata-message-role={isViewer ? \"viewer\" : \"other\"}\n\t\t\t\t\t\t\t\tstyle={streamingMinHeight ? { minHeight: streamingMinHeight } : undefined}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isViewer && isEditing && onEditSubmit ? (\n\t\t\t\t\t\t\t\t\t<UserMessageEditor\n\t\t\t\t\t\t\t\t\t\tinitialText={message.textContent || \"\"}\n\t\t\t\t\t\t\t\t\t\tonCancel={() => setIsEditing(false)}\n\t\t\t\t\t\t\t\t\t\tonSubmit={(newText) => {\n\t\t\t\t\t\t\t\t\t\t\tsetIsEditing(false);\n\t\t\t\t\t\t\t\t\t\t\tonEditSubmit(newText);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"rounded-2xl\",\n\t\t\t\t\t\t\t\t\tisViewer || showAvatar ? \"px-4 py-3\" : \"\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tbackgroundColor: isViewer ? \"var(--chat-user-message-bg)\" : \"transparent\",\n\t\t\t\t\t\t\t\t\t\tcolor: isViewer ? \"var(--chat-user-message-text, #ffffff)\" : \"var(--chat-text)\",\n\t\t\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t\t\t<MessageContentPrimitive>{renderContent()}</MessageContentPrimitive>\n\t\t\t\t\t\t\t\t\t{renderMediaItems()}\n\t\t\t\t\t\t\t\t\t{lightboxIndex !== null && (\n\t\t\t\t\t\t\t\t\t\t<MediaLightbox\n\t\t\t\t\t\t\t\t\t\t\titems={filteredMedias}\n\t\t\t\t\t\t\t\t\t\t\tindex={lightboxIndex}\n\t\t\t\t\t\t\t\t\t\t\tonClose={closeLightbox}\n\t\t\t\t\t\t\t\t\t\t\tonNavigate={navigateLightbox}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t{/* Unreferenced visualizations (not embedded inline via [VIZ:id] markers) */}\n\t\t\t\t\t\t\t\t\t{visualizations && visualizations.length > 0 && (() => {\n\t\t\t\t\t\t\t\t\t\tconst textContent = message.textContent || \"\";\n\t\t\t\t\t\t\t\t\t\tconst unreferenced = visualizations.filter(\n\t\t\t\t\t\t\t\t\t\t\t(viz) => !textContent.includes(`[VIZ:${viz.id}]`)\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tif (unreferenced.length === 0) return null;\n\t\t\t\t\t\t\t\t\t\treturn unreferenced.map((viz) => (\n\t\t\t\t\t\t\t\t\t\t\t<div key={`viz-unreferenced-${viz.id}`} className=\"my-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t<VisualizationRenderer\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata={viz}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisStreaming={isStreaming}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonAction={onVisualizationAction}\n\t\t\t\t\t\t\t\t\t\t\t\t\tmedias={medias}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t));\n\t\t\t\t\t\t\t\t\t})()}\n\n\t\t\t\t\t\t\t\t\t{/* Downloadable artifacts (PDFs, HTMLs) */}\n\t\t\t\t\t\t\t\t\t{artifacts && artifacts.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"mt-2\">\n\t\t\t\t\t\t\t\t\t\t\t<ArtifactList\n\t\t\t\t\t\t\t\t\t\t\t\tartifacts={artifacts}\n\t\t\t\t\t\t\t\t\t\t\t\tisStreaming={isStreaming}\n\t\t\t\t\t\t\t\t\t\t\t\tonOpen={onArtifactOpen}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t{/* Citations */}\n\t\t\t\t\t\t\t\t\t{citations && citations.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"mt-2 pt-2 border-t border-[var(--chat-border)]\">\n\t\t\t\t\t\t\t\t\t\t\t<CitationSources sources={citations} />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{/* Attachments — outside bubble */}\n\t\t\t\t\t\t\t\t{hasAttachments && (\n\t\t\t\t\t\t\t\t\t<div className=\"mt-2\">\n\t\t\t\t\t\t\t\t\t\t<MessageAttachments attachments={attachments} />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{/* Timestamp + action bar row */}\n\t\t\t\t\t\t\t\t{!isStreaming && !isEditing && (showTimestamp && message.createdAt || message.textContent) && (\n\t\t\t\t\t\t\t\t\t<div className={cn(\"flex items-center gap-2 mt-1\", isViewer && \"flex-row-reverse\")}>\n\t\t\t\t\t\t\t\t\t\t{showTimestamp && message.createdAt && (\n\t\t\t\t\t\t\t\t\t\t\t<MessageTimestamp\n\t\t\t\t\t\t\t\t\t\t\t\tcreatedAt={\n\t\t\t\t\t\t\t\t\t\t\t\t\ttypeof message.createdAt === \"string\" ? message.createdAt : message.createdAt.toISOString()\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tisViewer={isViewer}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{isAssistant && message.textContent && (\n\t\t\t\t\t\t\t\t\t\t\t<MessageActionBar\n\t\t\t\t\t\t\t\t\t\t\t\ttextContent={message.textContent}\n\t\t\t\t\t\t\t\t\t\t\t\tonReportIncorrect={onReportIncorrect}\n\t\t\t\t\t\t\t\t\t\t\t\tonConfirmCorrect={onConfirmCorrect}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{isViewer && message.textContent && (\n\t\t\t\t\t\t\t\t\t\t\t<MessageActionBar\n\t\t\t\t\t\t\t\t\t\t\t\ttextContent={message.textContent}\n\t\t\t\t\t\t\t\t\t\t\t\tonEdit={onEditSubmit ? () => setIsEditing(true) : undefined}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Message error display */}\n\t\t\t\t\t{message.error && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex items-start gap-2 w-full max-w-[85%]\",\n\t\t\t\t\t\t\t\t\"rounded-lg border px-3 py-2 mt-1\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tborderColor: \"var(--chat-error, #B1001B)\",\n\t\t\t\t\t\t\t\tbackgroundColor: \"color-mix(in srgb, var(--chat-error, #B1001B) 6%, transparent)\",\n\t\t\t\t\t\t\t\tcolor: \"var(--chat-error, #B1001B)\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/* Alert triangle icon */}\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\twidth=\"16\"\n\t\t\t\t\t\t\t\theight=\"16\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\tclassName=\"flex-shrink-0 mt-0.5\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\" />\n\t\t\t\t\t\t\t\t<line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n\t\t\t\t\t\t\t\t<line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t<span className=\"text-sm\">{message.error.message}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Standalone avatar: only for reasoning, NOT loading (loading has its own avatar row above) */}\n\t\t\t\t\t{!message.textContent && showAvatar && !isViewer && hasReasoning && !isWaitingForContent && (\n\t\t\t\t\t\t<div className=\"flex items-start gap-2 w-full\">\n\t\t\t\t\t\t\t<div className=\"flex-shrink-0\">\n\t\t\t\t\t\t\t\t<Avatar\n\t\t\t\t\t\t\t\t\tname={message.participant?.name}\n\t\t\t\t\t\t\t\t\tsrc={message.participant?.avatarUrl}\n\t\t\t\t\t\t\t\t\trole={message.participant?.role}\n\t\t\t\t\t\t\t\t\tclassName=\"w-10 h-10 flex-shrink-0\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Clarification panel - when agent needs user input */}\n\t\t\t\t\t{pendingClarification && !isStreaming && onClarificationSubmit && (\n\t\t\t\t\t\t<div className=\"w-full max-w-[80%]\">\n\t\t\t\t\t\t\t<ClarificationPanel\n\t\t\t\t\t\t\t\tclarification={pendingClarification}\n\t\t\t\t\t\t\t\tonSubmit={onClarificationSubmit}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Tool approval panel - when tool requires user approval. The\n\t\t\t\t\t gate is not a chat bubble; render it full-width within the\n\t\t\t\t\t message column so it reads as a decision moment rather than\n\t\t\t\t\t a stray suggestion. */}\n\t\t\t\t\t{pendingToolApproval && !isStreaming && onToolApprove && onToolReject && (\n\t\t\t\t\t\t<div className=\"w-full\">\n\t\t\t\t\t\t\t<ToolApprovalPanel\n\t\t\t\t\t\t\t\tapproval={pendingToolApproval}\n\t\t\t\t\t\t\t\tonApprove={onToolApprove}\n\t\t\t\t\t\t\t\tonReject={onToolReject}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Suggested actions */}\n\t\t\t\t\t{suggestedActions && suggestedActions.length > 0 && !isStreaming && (\n\t\t\t\t\t\t<div className=\"w-full max-w-[80%]\">\n\t\t\t\t\t\t\t<SuggestedActions actions={suggestedActions} onSelect={onSuggestedAction} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</MessagePrimitive>\n\t\t);\n\t},\n);\n\nMessage.displayName = \"Message\";\n\n/**\n * Inline editor shown when the viewer edits one of their own messages\n * (ChatGPT-style). Renders in place of the bubble: an auto-growing textarea\n * with Cancel / Send. Esc cancels, Cmd/Ctrl+Enter sends.\n */\nfunction UserMessageEditor({\n\tinitialText,\n\tonCancel,\n\tonSubmit,\n}: {\n\tinitialText: string;\n\tonCancel: () => void;\n\tonSubmit: (newText: string) => void;\n}) {\n\tconst [draft, setDraft] = useState(initialText);\n\tconst textareaRef = useRef<HTMLTextAreaElement>(null);\n\tconst canSubmit = draft.trim().length > 0;\n\n\t// Auto-grow the textarea to fit content\n\tconst resize = () => {\n\t\tconst el = textareaRef.current;\n\t\tif (!el) return;\n\t\tel.style.height = \"auto\";\n\t\tel.style.height = `${Math.min(el.scrollHeight, 320)}px`;\n\t};\n\n\t// On mount: focus with the caret at the end, sized to content\n\tuseEffect(() => {\n\t\tconst el = textareaRef.current;\n\t\tif (!el) return;\n\t\tel.focus();\n\t\tel.setSelectionRange(el.value.length, el.value.length);\n\t\tresize();\n\t}, []);\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"w-full rounded-2xl px-4 py-3\"\n\t\t\tstyle={{\n\t\t\t\tbackgroundColor: \"var(--chat-panel-bg)\",\n\t\t\t\tborder: \"1px solid var(--chat-border)\",\n\t\t\t}}\n\t\t>\n\t\t\t<textarea\n\t\t\t\tref={textareaRef}\n\t\t\t\tvalue={draft}\n\t\t\t\tonChange={(e) => {\n\t\t\t\t\tsetDraft(e.target.value);\n\t\t\t\t\tresize();\n\t\t\t\t}}\n\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\tif (e.key === \"Escape\") {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tonCancel();\n\t\t\t\t\t} else if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tif (canSubmit) onSubmit(draft.trim());\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\trows={1}\n\t\t\t\taria-label=\"Edit message\"\n\t\t\t\tclassName=\"w-full resize-none border-0 bg-transparent p-0 outline-none text-[var(--chat-text)]\"\n\t\t\t\tstyle={{ font: \"inherit\", lineHeight: \"inherit\", overflowY: \"auto\" }}\n\t\t\t/>\n\t\t\t<div className=\"mt-2 flex items-center justify-end gap-2\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={onCancel}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"rounded-full px-3.5 py-1.5 text-sm font-medium\",\n\t\t\t\t\t\t\"text-[var(--chat-text)] hover:opacity-80 transition-opacity\",\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ border: \"1px solid var(--chat-border)\", backgroundColor: \"transparent\" }}\n\t\t\t\t>\n\t\t\t\t\tCancel\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => canSubmit && onSubmit(draft.trim())}\n\t\t\t\t\tdisabled={!canSubmit}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"rounded-full px-3.5 py-1.5 text-sm font-medium\",\n\t\t\t\t\t\t\"transition-opacity\",\n\t\t\t\t\t\tcanSubmit ? \"hover:opacity-90\" : \"opacity-40 cursor-not-allowed\",\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackgroundColor: \"var(--chat-user-message-bg)\",\n\t\t\t\t\t\tcolor: \"var(--chat-user-message-text, #ffffff)\",\n\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\tSend\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction MessageTimestamp({ createdAt }: { createdAt: string; isViewer?: boolean }) {\n\tconst formatTime = (dateString: string) => {\n\t\ttry {\n\t\t\tconst date = new Date(dateString);\n\t\t\treturn date.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n\t\t} catch {\n\t\t\treturn \"\";\n\t\t}\n\t};\n\n\treturn (\n\t\t<span className=\"text-xs text-[var(--chat-text-subtle)]\">\n\t\t\t{formatTime(createdAt)}\n\t\t</span>\n\t);\n}\n\nexport { useMessage } from \"../primitives\";\n","import { forwardRef, useCallback, useRef, useState, useEffect } from \"react\";\nimport { ArrowUp, X, FileText, Image, Loader2, AlertCircle, Square } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport {\n LexicalChatInput,\n type CommandProvider,\n type LexicalChatInputHandle,\n} from \"../composer\";\nimport { ComposerToolbar } from \"./ComposerToolbar\";\n\n// ============================================================================\n// File upload constants (matching in-house backend)\n// ============================================================================\n\nconst MAX_FILE_SIZE = 100 * 1024 * 1024; // 100MB\n\nconst ALLOWED_IMAGE_TYPES = [\n \"image/jpeg\",\n \"image/jpg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n \"image/svg+xml\",\n \"image/bmp\",\n];\nconst ALLOWED_DOCUMENT_TYPES = [\n \"application/pdf\",\n \"text/plain\",\n \"text/csv\",\n \"text/markdown\",\n \"application/json\",\n \"text/json\",\n \"application/msword\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/vnd.ms-excel\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n];\nconst ALLOWED_VIDEO_TYPES = [\n \"video/mp4\",\n \"video/webm\",\n \"video/ogg\",\n \"video/avi\",\n \"video/mov\",\n \"video/wmv\",\n \"video/flv\",\n \"video/mkv\",\n];\n\nconst DEFAULT_ALLOWED_TYPES = [\n ...ALLOWED_IMAGE_TYPES,\n ...ALLOWED_DOCUMENT_TYPES,\n ...ALLOWED_VIDEO_TYPES,\n];\n\n// ============================================================================\n// Attachment types\n// ============================================================================\n\ntype AttachmentStatus = \"pending\" | \"uploading\" | \"uploaded\" | \"error\";\n\ninterface AttachmentFile {\n id: string;\n file: File;\n previewUrl?: string;\n status: AttachmentStatus;\n attachmentId?: string;\n error?: string;\n}\n\n// ============================================================================\n// Utility\n// ============================================================================\n\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n}\n\nfunction validateFile(\n file: File,\n allowedTypes: string[],\n maxSize: number,\n): string | null {\n if (file.size > maxSize) {\n return `File size (${formatFileSize(file.size)}) exceeds max (${formatFileSize(maxSize)})`;\n }\n if (!allowedTypes.includes(file.type)) {\n return `File type ${file.type || \"unknown\"} is not allowed`;\n }\n return null;\n}\n\n// ============================================================================\n// Sub-components\n// ============================================================================\n\nfunction AttachmentBar({\n attachments,\n onRemove,\n disabled,\n}: {\n attachments: AttachmentFile[];\n onRemove: (id: string) => void;\n disabled: boolean;\n}) {\n if (attachments.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap gap-2 px-3 pt-3 pb-0\">\n {attachments.map((att) => {\n const isImage = att.file.type.startsWith(\"image/\");\n const isError = att.status === \"error\";\n const isUploading = att.status === \"uploading\";\n\n return (\n <div\n key={att.id}\n className={cn(\n \"relative flex items-center gap-1.5 px-2 py-1.5 rounded-lg text-xs max-w-[200px]\",\n isError\n ? \"bg-red-50 dark:bg-red-900/30 text-red-600 dark:text-red-400\"\n : \"bg-gray-100 dark:bg-zinc-700 text-gray-600 dark:text-zinc-300\",\n )}\n >\n {isUploading ? (\n <Loader2 size={14} className=\"flex-shrink-0 animate-spin\" />\n ) : isError ? (\n <AlertCircle size={14} className=\"flex-shrink-0\" />\n ) : isImage && att.previewUrl ? (\n <img src={att.previewUrl} alt={att.file.name} className=\"w-5 h-5 rounded object-cover\" />\n ) : isImage ? (\n <Image size={14} className=\"flex-shrink-0\" />\n ) : (\n <FileText size={14} className=\"flex-shrink-0\" />\n )}\n <span className=\"truncate\" title={isError ? att.error : att.file.name}>\n {isError ? att.error : att.file.name}\n </span>\n {!disabled && (\n <button\n type=\"button\"\n onClick={() => onRemove(att.id)}\n className=\"flex-shrink-0 ml-0.5 p-0.5 rounded-full hover:bg-gray-200 dark:hover:bg-zinc-600 transition-colors\"\n >\n <X size={12} />\n </button>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\n// ============================================================================\n// Main component\n// ============================================================================\n\nexport interface MessageComposerProps {\n /** Callback when message is submitted */\n onSubmit: (content: string, attachments?: File[], attachmentIds?: string[]) => Promise<void>;\n /** Callback when files are attached (for upload handling) */\n onAttach?: (files: File[]) => void;\n /** Upload a file to backend, returning an attachment ID. When provided, enables server-side upload flow. */\n onUploadFile?: (file: File) => Promise<string>;\n /** Notify backend/hook that an uploaded attachment was removed before sending. */\n onRemoveUploadedAttachment?: (attachmentId: string) => void;\n /** Whether the composer is disabled */\n disabled?: boolean;\n /** Whether attachments are supported */\n supportsAttachments?: boolean;\n /** Allowed MIME types for attachments (default: images + docs + videos) */\n allowedFileTypes?: string[];\n /** Maximum file size in bytes (default: 100MB) */\n maxFileSize?: number;\n /** Placeholder text */\n placeholder?: string;\n /** Additional CSS classes */\n className?: string;\n /** Whether a message is currently being submitted */\n isSubmitting?: boolean;\n /** Centered/welcome mode: bigger radius, more padding, nicer shadow (used inside WelcomeScreen) */\n centered?: boolean;\n /** Whether assistant is currently streaming a response */\n isStreaming?: boolean;\n /** Callback to stop the current streaming response */\n onStopStreaming?: () => void;\n /** Optional slash-command typeahead provider (e.g. for skill picker). */\n commandProvider?: CommandProvider | null;\n /** Multiple typeahead providers for distinct triggers (e.g. `/` skills +\n * modes plus `@` ad accounts). Takes precedence over `commandProvider`. */\n commandProviders?: CommandProvider[];\n}\n\n/**\n * MessageComposer with textarea, attachment support,\n * file upload integration, drag & drop, and Enter-to-submit.\n */\nexport const MessageComposer = forwardRef<HTMLDivElement, MessageComposerProps>(\n (\n {\n onSubmit,\n onAttach,\n onUploadFile,\n onRemoveUploadedAttachment,\n disabled = false,\n supportsAttachments = true,\n allowedFileTypes = DEFAULT_ALLOWED_TYPES,\n maxFileSize = MAX_FILE_SIZE,\n placeholder = \"Type a message...\",\n className,\n isSubmitting = false,\n centered = false,\n isStreaming = false,\n onStopStreaming,\n commandProvider,\n commandProviders,\n },\n ref,\n ) => {\n const [hasText, setHasText] = useState(false);\n const [attachments, setAttachments] = useState<AttachmentFile[]>([]);\n const [isDragOver, setIsDragOver] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const inputRef = useRef<LexicalChatInputHandle>(null);\n const dragCounterRef = useRef(0);\n const isSubmittingRef = useRef(false);\n\n const isSubmitDisabled = disabled || isSubmitting;\n const isAnyUploading = attachments.some((a) => a.status === \"uploading\");\n const uploadedIds = attachments\n .filter((a) => a.status === \"uploaded\" && a.attachmentId)\n .map((a) => a.attachmentId!);\n const hasAttachments = uploadedIds.length > 0 || attachments.some((a) => a.status === \"pending\");\n const hasContent = hasText || hasAttachments;\n\n const processFiles = useCallback(\n async (files: File[]) => {\n const newAttachments: AttachmentFile[] = files.map((file) => {\n const error = validateFile(file, allowedFileTypes, maxFileSize);\n const att: AttachmentFile = {\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n file,\n status: error ? \"error\" : onUploadFile ? \"uploading\" : \"pending\",\n error: error || undefined,\n };\n if (!error && file.type.startsWith(\"image/\")) {\n att.previewUrl = URL.createObjectURL(file);\n }\n return att;\n });\n\n setAttachments((prev) => [...prev, ...newAttachments]);\n onAttach?.(files);\n\n // Upload files to backend if onUploadFile is provided\n if (onUploadFile) {\n for (const att of newAttachments) {\n if (att.status !== \"uploading\") continue;\n try {\n const attachmentId = await onUploadFile(att.file);\n setAttachments((prev) =>\n prev.map((a) =>\n a.id === att.id\n ? { ...a, status: \"uploaded\" as const, attachmentId }\n : a,\n ),\n );\n } catch (err) {\n setAttachments((prev) =>\n prev.map((a) =>\n a.id === att.id\n ? {\n ...a,\n status: \"error\" as const,\n error: err instanceof Error ? err.message : \"Upload failed\",\n }\n : a,\n ),\n );\n }\n }\n }\n },\n [allowedFileTypes, maxFileSize, onUploadFile, onAttach],\n );\n\n const submitWithText = useCallback(\n async (text: string) => {\n if (!hasContent && text.trim().length === 0) return;\n if (isSubmitDisabled || isAnyUploading || isSubmittingRef.current) return;\n isSubmittingRef.current = true;\n\n const rawFiles = attachments\n .filter((a) => a.status !== \"error\")\n .map((a) => a.file);\n const savedAttachments = attachments;\n\n inputRef.current?.clear();\n setHasText(false);\n setAttachments([]);\n\n try {\n if (onUploadFile && uploadedIds.length > 0) {\n await onSubmit(text, undefined, uploadedIds);\n } else {\n await onSubmit(text, rawFiles.length > 0 ? rawFiles : undefined);\n }\n } catch {\n setAttachments(savedAttachments);\n } finally {\n isSubmittingRef.current = false;\n }\n },\n [attachments, hasContent, isSubmitDisabled, isAnyUploading, onSubmit, onUploadFile, uploadedIds],\n );\n\n const handleSendButtonClick = useCallback(() => {\n inputRef.current?.submit();\n }, []);\n\n const handleFileSelect = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files || files.length === 0) return;\n processFiles(Array.from(files));\n // Reset so same file can be selected again\n e.target.value = \"\";\n },\n [processFiles],\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLDivElement>) => {\n if (!supportsAttachments || isSubmitting) return;\n const clipboardData = e.clipboardData;\n if (!clipboardData) return;\n\n // Collect files from clipboard\n const files: File[] = [];\n for (const file of clipboardData.files) {\n files.push(file);\n }\n // Fallback: check items for image data (e.g. screenshots, images from web pages)\n if (files.length === 0 && clipboardData.items) {\n for (const item of clipboardData.items) {\n if (item.kind === \"file\") {\n const file = item.getAsFile();\n if (file) files.push(file);\n }\n }\n }\n\n if (files.length > 0) {\n e.preventDefault();\n processFiles(files);\n }\n },\n [supportsAttachments, isSubmitting, processFiles],\n );\n\n const handleRemoveAttachment = useCallback((id: string) => {\n setAttachments((prev) => {\n const removed = prev.find((a) => a.id === id);\n if (removed?.previewUrl) URL.revokeObjectURL(removed.previewUrl);\n // Clean up backend-side metadata for uploaded attachments\n if (removed?.attachmentId && onRemoveUploadedAttachment) {\n onRemoveUploadedAttachment(removed.attachmentId);\n }\n return prev.filter((a) => a.id !== id);\n });\n }, [onRemoveUploadedAttachment]);\n\n // Drag & drop handlers\n const handleDragEnter = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!supportsAttachments || isSubmitting) return;\n dragCounterRef.current++;\n if (e.dataTransfer.types.includes(\"Files\")) {\n setIsDragOver(true);\n }\n },\n [supportsAttachments, isSubmitting],\n );\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current--;\n if (dragCounterRef.current === 0) {\n setIsDragOver(false);\n }\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current = 0;\n setIsDragOver(false);\n\n if (!supportsAttachments || isSubmitting) return;\n\n const files = Array.from(e.dataTransfer.files);\n if (files.length > 0) {\n processFiles(files);\n }\n },\n [supportsAttachments, isSubmitting, processFiles],\n );\n\n // Cleanup preview URLs on unmount\n useEffect(() => {\n return () => {\n attachments.forEach((a) => {\n if (a.previewUrl) URL.revokeObjectURL(a.previewUrl);\n });\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex-shrink-0\",\n centered\n ? \"p-0 bg-transparent\"\n : \"px-3 pb-3\",\n className,\n )}\n style={centered ? { padding: 0, background: \"transparent\", border: \"none\" } : undefined}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <div\n className={cn(\n \"mx-auto max-w-[900px]\",\n \"chat-composer-shell group\",\n centered ? \"overflow-hidden\" : \"rounded-xl\",\n isDragOver &&\n \"ring-2 ring-[var(--chat-primary,#106997)] border-[var(--chat-primary,#106997)]\",\n )}\n style={centered ? { borderRadius: \"1rem\", overflow: \"hidden\" } : undefined}\n >\n {/* Drag overlay */}\n {isDragOver && (\n <div className=\"px-3 pt-3 pb-0\">\n <div className=\"flex items-center justify-center py-4 rounded-lg border-2 border-dashed border-[var(--chat-composer-border-focus,rgba(16,105,151,0.35))] bg-[var(--chat-panel-bg,rgba(0,0,0,0.02))] text-[var(--chat-primary,#106997)] text-sm\">\n Drop files here\n </div>\n </div>\n )}\n\n {/* Attachment previews */}\n <AttachmentBar attachments={attachments} onRemove={handleRemoveAttachment} disabled={isSubmitting} />\n\n {/* Text row */}\n <div\n className={cn(\n centered ? \"px-4 pt-3.5\" : \"px-3 pt-2.5\",\n attachments.length > 0 && \"pt-1.5\",\n )}\n onPaste={handlePaste}\n >\n <LexicalChatInput\n ref={inputRef}\n placeholder={placeholder}\n disabled={isSubmitDisabled}\n commandProvider={commandProvider ?? null}\n commandProviders={commandProviders}\n inputClassName={cn(\n \"text-sm leading-relaxed\",\n \"text-gray-900 dark:text-zinc-100\",\n \"placeholder:text-gray-400 dark:placeholder:text-zinc-500\",\n )}\n onChange={({ text }) => setHasText(text.trim().length > 0)}\n onSubmit={({ text }) => submitWithText(text)}\n />\n </div>\n\n {/* Toolbar row */}\n <ComposerToolbar\n className={centered ? \"px-2.5 pb-2.5 pt-1\" : \"px-2 pb-2 pt-1\"}\n onAttachClick={supportsAttachments ? () => fileInputRef.current?.click() : undefined}\n disabled={isSubmitting}\n endSlot={\n isStreaming && onStopStreaming ? (\n <div className=\"relative flex-shrink-0 w-8 h-8\">\n {/* Pulsing background glow */}\n <span className=\"absolute inset-0 rounded-lg bg-gray-400 dark:bg-zinc-400\"\n style={{ animation: \"streaming-flash 3s ease-in-out infinite\" }}\n />\n <button\n type=\"button\"\n onClick={onStopStreaming}\n aria-label=\"Stop generating\"\n className={cn(\n \"relative w-full h-full rounded-lg\",\n \"flex items-center justify-center\",\n \"bg-gray-900 dark:bg-zinc-100 text-white dark:text-zinc-900\",\n \"hover:bg-gray-700 dark:hover:bg-zinc-300\",\n \"transition-colors duration-200\",\n )}\n >\n <Square size={14} fill=\"currentColor\" />\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={handleSendButtonClick}\n disabled={!hasContent || isSubmitDisabled || isAnyUploading}\n aria-label=\"Send message\"\n className={cn(\n \"flex-shrink-0\",\n \"w-8 h-8 rounded-lg\",\n \"flex items-center justify-center\",\n \"bg-gray-900 dark:bg-zinc-100 text-white dark:text-zinc-900\",\n \"shadow-sm\",\n \"hover:bg-gray-700 dark:hover:bg-zinc-300\",\n \"active:scale-95\",\n \"disabled:bg-gray-200 dark:disabled:bg-zinc-700 disabled:text-gray-400 dark:disabled:text-zinc-500 disabled:shadow-none disabled:cursor-not-allowed\",\n \"transition-[background-color,color,transform] duration-150\",\n )}\n >\n {isSubmitting || isAnyUploading ? <Loader2 size={16} className=\"animate-spin\" /> : <ArrowUp size={16} />}\n </button>\n )\n }\n />\n\n {/* Hidden file input */}\n {supportsAttachments && (\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={allowedFileTypes.join(\",\")}\n onChange={handleFileSelect}\n className=\"hidden\"\n />\n )}\n </div>\n </div>\n );\n },\n);\n\nMessageComposer.displayName = \"MessageComposer\";\n\n// Re-export useComposer from primitives for backwards compatibility\nexport { useComposer } from \"../primitives\";\n","import { cn } from \"../utils/cn\";\n\nexport interface ScrollToBottomButtonProps {\n /** Whether the viewport is at the bottom (hides button when true) */\n isAtBottom: boolean;\n /** Callback to scroll to bottom */\n onScrollToBottom: () => void;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * A floating button that appears when the user has scrolled up,\n * allowing them to quickly jump back to the latest messages.\n * Fades in/out based on scroll position.\n */\nexport function ScrollToBottomButton({\n isAtBottom,\n onScrollToBottom,\n className,\n}: ScrollToBottomButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onScrollToBottom}\n aria-label=\"Scroll to bottom\"\n className={cn(\n \"absolute bottom-4 left-1/2 -translate-x-1/2 z-10\",\n \"flex items-center justify-center\",\n \"w-8 h-8 rounded-full\",\n \"bg-[var(--chat-bg,#ffffff)] border border-[var(--chat-border)]\",\n \"shadow-subtle hover:shadow-button-hover\",\n \"text-[var(--chat-text-subtle)] hover:text-[var(--chat-text)]\",\n \"transition-all duration-200\",\n isAtBottom\n ? \"opacity-0 pointer-events-none translate-y-2\"\n : \"opacity-100 translate-y-0\",\n className,\n )}\n >\n {/* ArrowDown icon — inline SVG to avoid lucide-react dependency */}\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 5v14\" />\n <path d=\"m19 12-7 7-7-7\" />\n </svg>\n </button>\n );\n}\n","import { Children, forwardRef, isValidElement, type ReactNode } from \"react\";\nimport {\n\tMessageScroller,\n\tuseMessageScroller,\n\tuseMessageScrollerScrollable,\n} from \"@shadcn/react/message-scroller\";\nimport { cn } from \"../utils/cn\";\nimport { ScrollToBottomButton } from \"./ScrollToBottomButton\";\n\nexport interface MessageListProps {\n\t/** Messages to render */\n\tchildren: ReactNode;\n\t/** Whether to auto-scroll to bottom while streaming (follows only when at the live edge) */\n\tautoScroll?: boolean;\n\t/** Whether to show the scroll-to-bottom button */\n\tshowScrollToBottom?: boolean;\n\t/** Additional CSS classes applied to the transcript container (e.g. horizontal padding) */\n\tclassName?: string;\n}\n\nconst MASK = \"linear-gradient(to bottom, black 0%, black calc(100% - 20px), transparent 100%)\";\n\n/**\n * Reads the engine's scroll state and drives the existing ScrollToBottomButton.\n * Must render inside <MessageScroller.Provider>. `scrollable.end === true` means\n * there is content below the viewport (i.e. not at the bottom).\n */\nfunction ScrollToEndControl() {\n\tconst { end } = useMessageScrollerScrollable();\n\tconst { scrollToEnd } = useMessageScroller();\n\treturn (\n\t\t<ScrollToBottomButton\n\t\t\tisAtBottom={!end}\n\t\t\tonScrollToBottom={() => scrollToEnd({ behavior: \"smooth\" })}\n\t\t/>\n\t);\n}\n\n/**\n * Styled MessageList — scroll container for a chat transcript.\n *\n * Scroll behavior is provided by shadcn's `@shadcn/react` message-scroller\n * engine (auto-follow while at the live edge, position preservation, scroll\n * anchoring) rather than the legacy `useAutoScroll` hook. The public API is\n * unchanged: pass message rows as `children`; each direct child is wrapped in a\n * `MessageScroller.Item` for measurement and anchoring.\n */\nexport const MessageList = forwardRef<HTMLDivElement, MessageListProps>(\n\t({ children, autoScroll = true, showScrollToBottom = true, className }, ref) => {\n\t\treturn (\n\t\t\t<MessageScroller.Provider autoScroll={autoScroll} defaultScrollPosition=\"end\">\n\t\t\t\t<MessageScroller.Root\n\t\t\t\t\tclassName=\"relative flex-1 overflow-hidden\"\n\t\t\t\t\tstyle={{ mask: MASK, WebkitMask: MASK }}\n\t\t\t\t>\n\t\t\t\t\t<MessageScroller.Viewport\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tclassName=\"h-full overflow-y-auto chat-scrollbar\"\n\t\t\t\t\t\tstyle={{ overscrollBehavior: \"contain\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<MessageScroller.Content className={cn(\"flex flex-col gap-4 p-4 pb-12\", className)}>\n\t\t\t\t\t\t\t{Children.map(children, (child) =>\n\t\t\t\t\t\t\t\tisValidElement(child) ? (\n\t\t\t\t\t\t\t\t\t<MessageScroller.Item>{child}</MessageScroller.Item>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tchild\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</MessageScroller.Content>\n\t\t\t\t\t</MessageScroller.Viewport>\n\t\t\t\t\t{showScrollToBottom && <ScrollToEndControl />}\n\t\t\t\t</MessageScroller.Root>\n\t\t\t</MessageScroller.Provider>\n\t\t);\n\t},\n);\n\nMessageList.displayName = \"MessageList\";\n","export interface TimeMarkerProps {\n /** The label to display (e.g. \"Today\", \"Yesterday\", \"Monday\") */\n label: string;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Centered time separator between message groups.\n * Displays a label like \"Today\" or \"Yesterday\" with horizontal rules.\n */\nexport function TimeMarker({ label, className }: TimeMarkerProps) {\n return (\n <div\n className={`flex items-center gap-3 py-6 select-none ${className ?? \"\"}`}\n role=\"separator\"\n >\n <div className=\"flex-1 h-px bg-[var(--chat-border)]\" />\n <span className=\"text-xs font-medium text-[var(--chat-text-subtle)] whitespace-nowrap\">\n {label}\n </span>\n <div className=\"flex-1 h-px bg-[var(--chat-border)]\" />\n </div>\n );\n}\n","import { forwardRef } from \"react\";\nimport { TypingIndicator as TypingIndicatorPrimitive } from \"../primitives\";\nimport { cn } from \"../utils/cn\";\nimport { LoadingDots } from \"./LoadingDots\";\n\nexport interface TypingIndicatorProps {\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Styled TypingIndicator with animated dots.\n */\nexport const TypingIndicator = forwardRef<HTMLDivElement, TypingIndicatorProps>(\n ({ className }, ref) => {\n return (\n <TypingIndicatorPrimitive\n ref={ref}\n className={cn(\n \"inline-flex items-center gap-1\",\n \"px-4 py-3\",\n className\n )}\n >\n <LoadingDots size=\"small\" />\n </TypingIndicatorPrimitive>\n );\n }\n);\n\nTypingIndicator.displayName = \"TypingIndicator\";\n","import React, { useState, useRef, useEffect } from \"react\";\nimport { MoreVertical, X } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface ChatHeaderAction {\n id: string;\n label: string;\n icon?: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n}\n\nexport interface ChatHeaderProps {\n /** Assistant/chat title */\n title: string;\n /** Optional subtitle/description */\n subtitle?: string;\n /** Logo URL or element */\n logo?: string | React.ReactNode;\n /** Menu actions */\n actions?: ChatHeaderAction[];\n /** Show close button */\n showClose?: boolean;\n /** Close button handler */\n onClose?: () => void;\n /** Loading state */\n loading?: boolean;\n /** Additional class names */\n className?: string;\n /** Custom styles via CSS variables */\n style?: React.CSSProperties;\n}\n\nexport function ChatHeader({\n title,\n subtitle,\n logo,\n actions,\n showClose,\n onClose,\n loading,\n className,\n style,\n}: ChatHeaderProps) {\n const [menuOpen, setMenuOpen] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n // Close menu when clicking outside\n // Uses composedPath() to work correctly inside Shadow DOM\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const path = event.composedPath();\n if (\n menuRef.current &&\n !path.includes(menuRef.current) &&\n buttonRef.current &&\n !path.includes(buttonRef.current)\n ) {\n setMenuOpen(false);\n }\n };\n\n if (menuOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }\n }, [menuOpen]);\n\n return (\n <header\n className={cn(\n \"flex items-center justify-between gap-3\",\n \"px-4 py-2.5\",\n \"border-b border-[var(--chat-border)]\",\n \"bg-[var(--chat-header-bg,#ffffff)]\",\n className\n )}\n style={style}\n >\n {/* Left section: Logo and title */}\n <div className=\"flex items-center gap-3 flex-1 min-w-0\">\n {/* Logo */}\n {logo && (\n <div className=\"flex-shrink-0\">\n {typeof logo === \"string\" ? (\n <img\n src={logo}\n alt=\"\"\n className=\"w-10 h-10 rounded-lg object-contain\"\n />\n ) : (\n logo\n )}\n </div>\n )}\n\n {/* Title and subtitle */}\n <div className=\"flex flex-col min-w-0\">\n {loading ? (\n <div className=\"h-5 w-24 bg-gray-200 rounded animate-pulse\" />\n ) : (\n <h1 className=\"text-base font-semibold text-[var(--chat-text)] truncate\">\n {title}\n </h1>\n )}\n {subtitle && (\n <p className=\"text-sm text-[var(--chat-text-subtle)] truncate\">\n {subtitle}\n </p>\n )}\n </div>\n </div>\n\n {/* Right section: Actions */}\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {/* Menu button */}\n {actions && actions.length > 0 && (\n <div className=\"relative\">\n <button\n ref={buttonRef}\n onClick={() => setMenuOpen(!menuOpen)}\n className={cn(\n \"p-2 rounded-lg\",\n \"text-[var(--chat-text-subtle)]\",\n \"hover:bg-[var(--chat-panel-bg)] hover:text-[var(--chat-text)]\",\n \"transition-colors duration-200\"\n )}\n aria-label=\"Menu\"\n aria-expanded={menuOpen}\n >\n <MoreVertical size={18} />\n </button>\n\n {/* Dropdown menu */}\n {menuOpen && (\n <div\n ref={menuRef}\n className={cn(\n \"absolute right-0 top-full mt-1 z-50\",\n \"min-w-[180px]\",\n \"bg-[var(--chat-composer-bg,#ffffff)] rounded-lg\",\n \"shadow-[0_1px_2px_rgba(29,32,51,0.04),0_8px_24px_-12px_rgba(29,32,51,0.24)]\",\n \"border border-[var(--chat-border)]\",\n \"py-1\",\n \"animate-fade-in\"\n )}\n >\n {actions.map((action) => (\n <button\n key={action.id}\n onClick={() => {\n action.onClick();\n setMenuOpen(false);\n }}\n disabled={action.disabled}\n className={cn(\n \"w-full flex items-center gap-2 px-3 py-2\",\n \"text-sm text-left\",\n \"text-[var(--chat-text)]\",\n \"hover:bg-[var(--chat-panel-bg)]\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n \"transition-colors duration-150\"\n )}\n >\n {action.icon && (\n <span className=\"flex-shrink-0 text-[var(--chat-text-subtle)]\">\n {action.icon}\n </span>\n )}\n {action.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* Close button */}\n {showClose && onClose && (\n <button\n onClick={onClose}\n className={cn(\n \"p-2 rounded-lg\",\n \"text-[var(--chat-text-subtle)]\",\n \"hover:bg-[var(--chat-panel-bg)] hover:text-[var(--chat-text)]\",\n \"transition-colors duration-200\"\n )}\n aria-label=\"Close\"\n >\n <X size={18} />\n </button>\n )}\n </div>\n </header>\n );\n}\n","import { cn } from \"../utils/cn\";\n\nexport type ToolStatus = \"running\" | \"complete\" | \"failed\" | \"pending\";\n\nexport interface ToolStatusIndicatorProps {\n /** Name of the tool */\n toolName: string;\n /** Current status */\n status: ToolStatus;\n /** Optional description of what the tool is doing */\n description?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Inline status indicator for individual tool executions.\n * Shows tool name + status icon (spinner/check/X/clock).\n * Running state includes a subtle shimmer animation.\n */\nexport function ToolStatusIndicator({\n toolName,\n status,\n description,\n className,\n}: ToolStatusIndicatorProps) {\n return (\n <div\n className={cn(\n \"relative flex items-center gap-2 py-1 px-2 rounded-md text-sm overflow-hidden\",\n status === \"running\" && \"animate-shimmer\",\n className,\n )}\n >\n <StatusIcon status={status} />\n <span className=\"font-medium text-[var(--chat-text)]\">{toolName}</span>\n {description && (\n <span className=\"text-[var(--chat-text-subtle)] truncate\">\n {description}\n </span>\n )}\n </div>\n );\n}\n\nfunction StatusIcon({ status }: { status: ToolStatus }) {\n switch (status) {\n case \"running\":\n return (\n // Spinner\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"animate-spin text-[var(--chat-primary)]\"\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n case \"complete\":\n return (\n // Check circle\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-[var(--chat-secondary,#56C18A)]\"\n >\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\n <polyline points=\"22 4 12 14.01 9 11.01\" />\n </svg>\n );\n case \"failed\":\n return (\n // X circle\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-[var(--chat-error,#B1001B)]\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n case \"pending\":\n return (\n // Clock\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-[var(--chat-text-subtle)]\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n );\n }\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport { forwardRef, ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface ChatLayoutProps {\n\t/** Whether the chat is in empty state (no messages) */\n\tisEmpty: boolean;\n\t/** Optional header rendered above the message area */\n\theader?: ReactNode;\n\t/** Content to display when isEmpty is true (typically a WelcomeScreen) */\n\twelcomeScreen?: ReactNode;\n\t/** The message list to display when not empty */\n\tmessageList?: ReactNode;\n\t/** The composer rendered at the bottom when not empty */\n\tcomposer?: ReactNode;\n\t/** Extra content between message list and composer (e.g. ClarificationPanel) */\n\tfooter?: ReactNode;\n\t/** Additional CSS classes */\n\tclassName?: string;\n}\n\n/**\n * Composable chat layout that handles the empty → active state transition\n * with a smooth crossfade animation.\n *\n * Replaces the repeated `AnimatePresence` + `motion.div` pattern found in\n * `centered-chat-layout.tsx` and `chat/[id]/page.tsx`.\n */\nexport const ChatLayout = forwardRef<HTMLDivElement, ChatLayoutProps>(\n\t({ isEmpty, header, welcomeScreen, messageList, composer, footer, className }, ref) => {\n\t\treturn (\n\t\t\t<div ref={ref} data-chat-ui className={cn(\"relative h-full overflow-hidden flex flex-col min-h-0\", className)}>\n\t\t\t\t<AnimatePresence mode=\"wait\">\n\t\t\t\t\t{isEmpty && welcomeScreen ? (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tkey=\"welcome\"\n\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\t\tclassName=\"flex-1 flex flex-col overflow-hidden min-h-0\">\n\t\t\t\t\t\t\t{header}\n\t\t\t\t\t\t\t{welcomeScreen}\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tkey=\"active\"\n\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\t\tclassName=\"flex-1 flex flex-col overflow-hidden min-h-0\">\n\t\t\t\t\t\t\t{header}\n\n\t\t\t\t\t\t\t{/* Message list */}\n\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\ttransition={{ duration: 0.2, delay: 0.05 }}\n\t\t\t\t\t\t\t\tclassName=\"flex-1 overflow-hidden flex flex-col min-h-0\">\n\t\t\t\t\t\t\t\t{messageList}\n\t\t\t\t\t\t\t</motion.div>\n\n\t\t\t\t\t\t\t{/* Footer + Composer: floating over messages */}\n\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\tinitial={{ opacity: 0, y: 8 }}\n\t\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\t\t\ttransition={{ duration: 0.2, delay: 0.1 }}\n\t\t\t\t\t\t\t\tclassName=\"relative z-10\">\n\t\t\t\t\t\t\t\t{footer}\n\t\t\t\t\t\t\t\t{composer}\n\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nChatLayout.displayName = \"ChatLayout\";\n","import { motion } from \"framer-motion\";\nimport { ArrowUp, X } from \"lucide-react\";\nimport { forwardRef, useCallback, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport {\n\tLexicalChatInput,\n\ttype CommandProvider,\n\ttype LexicalChatInputHandle,\n} from \"../composer\";\nimport { cn } from \"../utils/cn\";\nimport { Avatar } from \"./Avatar\";\nimport { ComposerToolbar } from \"./ComposerToolbar\";\n\nexport interface WelcomeScreenProps {\n\t/** Rotating placeholder strings displayed in the input */\n\tplaceholders?: string[];\n\t/** Preset suggestion cards shown below the input */\n\tsuggestions?: string[];\n\t/** Called when the user submits a message via the built-in input */\n\tonSubmit?: (message: string, files?: File[]) => void;\n\t/** Called when the user clicks a suggestion card */\n\tonSuggestionClick?: (suggestion: string) => void;\n\t/** Welcome heading text */\n\twelcomeText?: string;\n\t/** Whether to show the attachment (paperclip) button */\n\tsupportsAttachments?: boolean;\n\t/** Override the default plain-text input with a custom composer (e.g. chat-ui MessageComposer) */\n\tcomposerSlot?: ReactNode;\n\t/** Optional slash-command typeahead provider (e.g. for skill picker). */\n\tcommandProvider?: CommandProvider | null;\n\t/** Multiple typeahead providers for distinct triggers (e.g. `/` skills +\n\t * modes plus `@` ad accounts). Takes precedence over `commandProvider`. */\n\tcommandProviders?: CommandProvider[];\n\t/** Additional CSS classes for the outer wrapper */\n\tclassName?: string;\n\t/** Assistant avatar image URL — when provided, welcome text renders in message format */\n\tassistantAvatar?: string;\n\t/** Assistant display name (shown alongside avatar) */\n\tassistantName?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Rotating placeholder hook\n// ---------------------------------------------------------------------------\n\nfunction useRotatingPlaceholder(placeholders: string[], intervalMs = 3000) {\n\tconst [index, setIndex] = useState(0);\n\tconst intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n\tuseEffect(() => {\n\t\tif (placeholders.length <= 1) return;\n\n\t\tconst start = () => {\n\t\t\tintervalRef.current = setInterval(() => {\n\t\t\t\tsetIndex((prev) => (prev + 1) % placeholders.length);\n\t\t\t}, intervalMs);\n\t\t};\n\n\t\tconst handleVisibility = () => {\n\t\t\tif (document.visibilityState !== \"visible\") {\n\t\t\t\tif (intervalRef.current) {\n\t\t\t\t\tclearInterval(intervalRef.current);\n\t\t\t\t\tintervalRef.current = null;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tstart();\n\t\t\t}\n\t\t};\n\n\t\tstart();\n\t\tdocument.addEventListener(\"visibilitychange\", handleVisibility);\n\n\t\treturn () => {\n\t\t\tif (intervalRef.current) clearInterval(intervalRef.current);\n\t\t\tdocument.removeEventListener(\"visibilitychange\", handleVisibility);\n\t\t};\n\t}, [placeholders, intervalMs]);\n\n\treturn placeholders[index] ?? \"\";\n}\n\n// ---------------------------------------------------------------------------\n// Default inline input (simple textarea, no Lexical)\n// ---------------------------------------------------------------------------\n\nfunction DefaultInput({\n\tplaceholder,\n\tonSubmit,\n\tdisabled,\n\tsupportsAttachments,\n\tcommandProvider,\n\tcommandProviders,\n}: {\n\tplaceholder: string;\n\tonSubmit: (msg: string, files?: File[]) => void;\n\tdisabled?: boolean;\n\tsupportsAttachments?: boolean;\n\tcommandProvider?: CommandProvider | null;\n\tcommandProviders?: CommandProvider[];\n}) {\n\tconst [hasText, setHasText] = useState(false);\n\tconst [files, setFiles] = useState<File[]>([]);\n\tconst inputRef = useRef<LexicalChatInputHandle>(null);\n\tconst fileInputRef = useRef<HTMLInputElement>(null);\n\n\tconst handleSubmit = useCallback(\n\t\t(text: string) => {\n\t\t\tif ((!text.trim() && files.length === 0) || disabled) return;\n\t\t\tonSubmit(text.trim(), files.length > 0 ? files : undefined);\n\t\t\tinputRef.current?.clear();\n\t\t\tsetHasText(false);\n\t\t\tsetFiles([]);\n\t\t},\n\t\t[disabled, files, onSubmit],\n\t);\n\n\tconst handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tif (e.target.files) {\n\t\t\tsetFiles((prev) => [...prev, ...Array.from(e.target.files!)]);\n\t\t}\n\t\te.target.value = \"\";\n\t};\n\n\tconst removeFile = (index: number) => {\n\t\tsetFiles((prev) => prev.filter((_, i) => i !== index));\n\t};\n\n\tconst canSubmit = (hasText || files.length > 0) && !disabled;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"w-full relative mx-auto\", \"rounded-2xl overflow-hidden\", \"chat-composer-shell group\")}\n\t\t\tstyle={{ borderRadius: \"1rem\", overflow: \"hidden\" }}>\n\t\t\t{/* File previews */}\n\t\t\t{files.length > 0 && (\n\t\t\t\t<div className=\"flex flex-wrap gap-2 px-4 pt-3\">\n\t\t\t\t\t{files.map((file, i) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={`${file.name}-${i}`}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex items-center gap-1.5 px-2.5 py-1 rounded-lg text-xs\",\n\t\t\t\t\t\t\t\t\"bg-gray-100 dark:bg-zinc-700 text-gray-600 dark:text-zinc-300\",\n\t\t\t\t\t\t\t)}>\n\t\t\t\t\t\t\t<span className=\"max-w-[120px] truncate\">{file.name}</span>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => removeFile(i)}\n\t\t\t\t\t\t\t\tclassName=\"flex-shrink-0 text-gray-400 hover:text-gray-600 dark:hover:text-zinc-200\">\n\t\t\t\t\t\t\t\t<X size={12} />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Text row */}\n\t\t\t<LexicalChatInput\n\t\t\t\tref={inputRef}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tcommandProvider={commandProvider ?? null}\n\t\t\t\tcommandProviders={commandProviders}\n\t\t\t\tclassName=\"px-4 sm:px-5 pt-3.5 sm:pt-4 pb-1\"\n\t\t\t\tinputClassName=\"text-sm sm:text-base text-gray-900 dark:text-white placeholder:text-gray-400 dark:placeholder:text-zinc-500\"\n\t\t\t\tplaceholderClassName=\"text-sm sm:text-base\"\n\t\t\t\tonChange={({ text }) => setHasText(text.trim().length > 0)}\n\t\t\t\tonSubmit={({ text }) => handleSubmit(text)}\n\t\t\t/>\n\n\t\t\t{/* Toolbar row */}\n\t\t\t<ComposerToolbar\n\t\t\t\tclassName=\"px-2.5 pb-2.5 pt-1\"\n\t\t\t\tonAttachClick={supportsAttachments ? () => fileInputRef.current?.click() : undefined}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tendSlot={\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => inputRef.current?.submit()}\n\t\t\t\t\t\tdisabled={!canSubmit}\n\t\t\t\t\t\taria-label=\"Send message\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex-shrink-0\",\n\t\t\t\t\t\t\t\"w-8 h-8 rounded-lg\",\n\t\t\t\t\t\t\t\"flex items-center justify-center\",\n\t\t\t\t\t\t\t\"bg-gray-900 dark:bg-zinc-600 text-zinc-50\",\n\t\t\t\t\t\t\t\"shadow-sm\",\n\t\t\t\t\t\t\t\"hover:bg-gray-700 dark:hover:bg-zinc-500\",\n\t\t\t\t\t\t\t\"active:scale-95\",\n\t\t\t\t\t\t\t\"disabled:bg-gray-300 dark:disabled:bg-zinc-700\",\n\t\t\t\t\t\t\t\"disabled:text-gray-500 dark:disabled:text-zinc-400\",\n\t\t\t\t\t\t\t\"disabled:shadow-none disabled:cursor-not-allowed\",\n\t\t\t\t\t\t\t\"transition-[background-color,color,transform] duration-150\",\n\t\t\t\t\t\t)}>\n\t\t\t\t\t\t<ArrowUp size={16} strokeWidth={2} />\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t/>\n\n\t\t\t{/* Hidden file input */}\n\t\t\t{supportsAttachments && (\n\t\t\t\t<input ref={fileInputRef} type=\"file\" multiple onChange={handleFileSelect} className=\"hidden\" />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\n// ---------------------------------------------------------------------------\n// Suggestion pill\n// ---------------------------------------------------------------------------\n\nfunction SuggestionPill({ text, onClick, index }: { text: string; onClick: () => void; index: number }) {\n\treturn (\n\t\t<motion.button\n\t\t\ttype=\"button\"\n\t\t\tonClick={onClick}\n\t\t\tinitial={{ opacity: 0 }}\n\t\t\tanimate={{ opacity: 1 }}\n\t\t\ttransition={{ delay: 0.15 + index * 0.03, duration: 0.2 }}\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex items-center rounded-full\",\n\t\t\t\t\"border border-[var(--chat-border,rgba(29,32,51,0.08))]\",\n\t\t\t\t\"px-3.5 py-1.5\",\n\t\t\t\t\"text-sm leading-normal text-left\",\n\t\t\t\t\"text-[var(--chat-text-subtle,rgba(0,0,0,0.5))]\",\n\t\t\t\t\"cursor-pointer select-none\",\n\t\t\t\t\"transition-colors duration-150\",\n\t\t\t\t\"hover:bg-[var(--chat-panel-bg,rgba(0,0,0,0.02))]\",\n\t\t\t\t\"hover:border-[var(--chat-border-hover,rgba(0,0,0,0.12))]\",\n\t\t\t\t\"hover:text-[var(--chat-text,#1d2033)]\",\n\t\t\t\t\"active:bg-[var(--chat-message-bg,rgba(0,0,0,0.03))]\",\n\t\t\t)}\n\t\t\tstyle={{ borderRadius: \"9999px\" }}>\n\t\t\t{text}\n\t\t</motion.button>\n\t);\n}\n\n// ---------------------------------------------------------------------------\n// WelcomeScreen\n// ---------------------------------------------------------------------------\n\n/**\n * Full-screen empty state with rotating placeholder input and suggestion cards.\n * Used as the welcome screen when no messages exist.\n *\n * By default renders a simple textarea input. Pass `composerSlot` to override\n * with e.g. the Lexical-based `MessageComposer`.\n */\nexport const WelcomeScreen = forwardRef<HTMLDivElement, WelcomeScreenProps>(\n\t(\n\t\t{\n\t\t\tplaceholders = [],\n\t\t\tsuggestions = [],\n\t\t\tonSubmit,\n\t\t\tonSuggestionClick,\n\t\t\twelcomeText = \"How can I help you today?\",\n\t\t\tsupportsAttachments,\n\t\t\tcomposerSlot,\n\t\t\tcommandProvider,\n\t\t\tcommandProviders,\n\t\t\tclassName,\n\t\t\tassistantAvatar,\n\t\t\tassistantName,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst placeholder = useRotatingPlaceholder(placeholders);\n\n\t\tconst handleSuggestionClick = useCallback(\n\t\t\t(text: string) => {\n\t\t\t\tonSuggestionClick?.(text);\n\t\t\t},\n\t\t\t[onSuggestionClick],\n\t\t);\n\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"relative overflow-hidden\", \"flex-1 flex items-center justify-center\", \"px-4 sm:px-6\", className)}>\n\t\t\t\t{/* Ambient background halo */}\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"pointer-events-none absolute inset-0\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: `radial-gradient(ellipse 60% 50% at 50% 45%, var(--chat-halo-primary, rgba(16,105,151,0.06)), var(--chat-halo-secondary, rgba(86,193,138,0.03)) 60%, transparent 100%)`,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\n\t\t\t\t<motion.div\n\t\t\t\t\tlayout\n\t\t\t\t\tinitial={{ y: 8, opacity: 0 }}\n\t\t\t\t\tanimate={{ y: 0, opacity: 1 }}\n\t\t\t\t\ttransition={{ duration: 0.22, ease: [0.16, 1, 0.3, 1] }}\n\t\t\t\t\tclassName=\"relative w-full max-w-[800px] flex flex-col items-center gap-8\">\n\t\t\t\t\t{/* Welcome heading — message format when avatar is configured */}\n\t\t\t\t\t{welcomeText && assistantAvatar ? (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tinitial={{ opacity: 0, y: -8 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\t\ttransition={{ delay: 0.05, duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n\t\t\t\t\t\t\tclassName=\"flex items-start gap-2 w-full\">\n\t\t\t\t\t\t\t<div className=\"flex-shrink-0\">\n\t\t\t\t\t\t\t\t<Avatar\n\t\t\t\t\t\t\t\t\tname={assistantName}\n\t\t\t\t\t\t\t\t\tsrc={assistantAvatar}\n\t\t\t\t\t\t\t\t\trole=\"assistant\"\n\t\t\t\t\t\t\t\t\tclassName=\"w-10 h-10 flex-shrink-0\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"rounded-2xl px-4 py-3\">\n\t\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\t\tstyle={{ fontSize: \"1rem\", lineHeight: \"1.5rem\", color: \"var(--chat-text, #1d2033)\" }}\n\t\t\t\t\t\t\t\t\tclassName=\"text-base\">\n\t\t\t\t\t\t\t\t\t{welcomeText}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t) : welcomeText ? (\n\t\t\t\t\t\t<motion.h2\n\t\t\t\t\t\t\tinitial={{ opacity: 0, y: -8 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\t\ttransition={{ delay: 0.05, duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontSize: \"1.5rem\",\n\t\t\t\t\t\t\t\tlineHeight: \"2rem\",\n\t\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\t\tletterSpacing: \"-0.01em\",\n\t\t\t\t\t\t\t\tcolor: \"var(--chat-text, #1d2033)\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName=\"text-2xl font-semibold text-center\">\n\t\t\t\t\t\t\t{welcomeText}\n\t\t\t\t\t\t</motion.h2>\n\t\t\t\t\t) : null}\n\n\t\t\t\t\t{/* Composer */}\n\t\t\t\t\t<div className=\"w-full\">\n\t\t\t\t\t\t{composerSlot ?? (\n\t\t\t\t\t\t\t<DefaultInput\n\t\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\t\tonSubmit={(msg, files) => onSubmit?.(msg, files)}\n\t\t\t\t\t\t\t\tsupportsAttachments={supportsAttachments}\n\t\t\t\t\t\t\t\tcommandProvider={commandProvider ?? null}\n\t\t\t\t\t\t\t\tcommandProviders={commandProviders}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Suggestion pills */}\n\t\t\t\t\t{suggestions.length > 0 && (\n\t\t\t\t\t\t<div className=\"flex flex-wrap justify-center gap-2 w-full max-w-[640px]\">\n\t\t\t\t\t\t\t{suggestions.map((text, i) => (\n\t\t\t\t\t\t\t\t<SuggestionPill key={i} text={text} onClick={() => handleSuggestionClick(text)} index={i} />\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</motion.div>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nWelcomeScreen.displayName = \"WelcomeScreen\";\n","import type { Event, EventStatus, StreamingChunk } from \"../../types\";\nimport { convertChunkToEvent } from \"../EventTimeline\";\nimport { Timeline, type TimelineItemData } from \"../Timeline\";\nimport { TimelineRow } from \"../TimelineRow\";\n\nexport interface SubagentPanelProps {\n\tchunk: StreamingChunk;\n}\n\n/**\n * Convert an LLM-facing handle (\"verify_test_specialist\") into a human label\n * (\"Verify Test Specialist\"). Falls back to the raw handle if it doesn't\n * look like a slug.\n */\nfunction humanizeHandle(handle: string): string {\n\tif (!handle) return \"Sub-assistant\";\n\treturn handle\n\t\t.split(/[_-]+/)\n\t\t.filter(Boolean)\n\t\t.map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n\t\t.join(\" \");\n}\n\n/**\n * Renders a single sub-assistant dispatch as one row in a `Timeline` —\n * label + description + duration + chevron — matching plan subtasks and\n * multi-agent rows. Nested chunks (thinking/tool/observation/sub-assistant)\n * render as an indented `EventTimeline` underneath.\n */\nexport function SubagentPanel({ chunk }: SubagentPanelProps) {\n\tconst data = chunk.subagentData;\n\tif (!data) return null;\n\n\tconst status: EventStatus =\n\t\tdata.status === \"running\"\n\t\t\t? \"running\"\n\t\t\t: data.status === \"completed\"\n\t\t\t\t? \"completed\"\n\t\t\t\t: data.status === \"failed\"\n\t\t\t\t\t? \"failed\"\n\t\t\t\t\t: \"pending\";\n\n\tconst nestedEvents: Event[] = (data.nestedChunks ?? [])\n\t\t.map((c, i) => convertChunkToEvent(c, i))\n\t\t.filter((e): e is Event => e !== null);\n\n\t// Append the assistant's final answer as a thinking-style event so it\n\t// renders with the same content treatment as other reasoning output.\n\tif (data.result && data.result.trim().length > 0) {\n\t\tnestedEvents.push({\n\t\t\tid: `result-${data.subagentId}`,\n\t\t\ttype: \"thinking\",\n\t\t\tstatus: data.status === \"failed\" ? \"failed\" : \"completed\",\n\t\t\tcontent: data.result,\n\t\t});\n\t}\n\n\tconst items: TimelineItemData[] = [\n\t\t{\n\t\t\tid: data.subagentId,\n\t\t\tstatus,\n\t\t\tcontent: (\n\t\t\t\t<TimelineRow\n\t\t\t\t\tlabel={humanizeHandle(data.subagentType)}\n\t\t\t\t\tdurationSeconds={data.durationMs != null ? data.durationMs / 1000 : undefined}\n\t\t\t\t\tisFailed={data.status === \"failed\"}\n\t\t\t\t\tnestedEvents={nestedEvents}\n\t\t\t\t/>\n\t\t\t),\n\t\t},\n\t];\n\n\treturn <Timeline items={items} badgeSize={20} />;\n}\n"]}