@miiflow/assistant-ui 0.13.0 → 0.15.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.
- package/README.md +209 -46
- package/dist/{WelcomeScreen-EGO8Qt2y.d.ts → WelcomeScreen-CSzlU0Yx.d.ts} +41 -9
- package/dist/{avatar-CD685KQV.d.ts → avatar-B_AvYfE8.d.ts} +4 -1
- package/dist/chunk-7QNDCHY7.js +2 -0
- package/dist/chunk-7QNDCHY7.js.map +1 -0
- package/dist/chunk-BINTGT2Q.js +5 -0
- package/dist/chunk-BINTGT2Q.js.map +1 -0
- package/dist/chunk-HNHLLH6W.js +2 -0
- package/dist/chunk-HNHLLH6W.js.map +1 -0
- package/dist/{chunk-WG77GQR3.js → chunk-ISMTV5BU.js} +2 -2
- package/dist/{chunk-WG77GQR3.js.map → chunk-ISMTV5BU.js.map} +1 -1
- package/dist/chunk-LDTAZ4GT.js +2 -0
- package/dist/chunk-LDTAZ4GT.js.map +1 -0
- package/dist/chunk-OU5ITGKX.js +2 -0
- package/dist/chunk-OU5ITGKX.js.map +1 -0
- package/dist/chunk-W7HQXA2Z.js +146 -0
- package/dist/chunk-W7HQXA2Z.js.map +1 -0
- package/dist/client/index.d.ts +66 -5
- package/dist/client/index.js +6 -6
- package/dist/client/index.js.map +1 -1
- package/dist/composer/index.d.ts +37 -3
- package/dist/composer/index.js +1 -1
- package/dist/context/index.d.ts +10 -3
- package/dist/context/index.js +1 -1
- package/dist/hooks/index.d.ts +11 -141
- package/dist/hooks/index.js +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/{message-D0oMw3tR.d.ts → message-DTNTKSQr.d.ts} +1 -1
- package/dist/primitives/index.d.ts +3 -3
- package/dist/primitives/index.js +1 -1
- package/dist/{streaming-CmQo_OOA.d.ts → streaming-BfLEgW5u.d.ts} +81 -3
- package/dist/styled/index.d.ts +410 -11
- package/dist/styled/index.js +1 -1
- package/dist/styles-no-preflight.css +1 -1
- package/dist/styles.css +3 -1
- package/dist/use-branding-css-vars-CR2tjSV8.d.ts +155 -0
- package/package.json +2 -1
- package/dist/chunk-4WWJTYYA.js +0 -2
- package/dist/chunk-4WWJTYYA.js.map +0 -1
- package/dist/chunk-6RN7SUWT.js +0 -2
- package/dist/chunk-6RN7SUWT.js.map +0 -1
- package/dist/chunk-D2PFIJNZ.js +0 -2
- package/dist/chunk-D2PFIJNZ.js.map +0 -1
- package/dist/chunk-HYFMOOLH.js +0 -133
- package/dist/chunk-HYFMOOLH.js.map +0 -1
- package/dist/chunk-NKLA5PPB.js +0 -2
- package/dist/chunk-NKLA5PPB.js.map +0 -1
- package/dist/chunk-ZP4FGAAH.js +0 -2
- package/dist/chunk-ZP4FGAAH.js.map +0 -1
|
@@ -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/utils/beamer.ts","../src/styled/ThinkingIndicator.tsx","../src/styled/MessageActionBar.tsx","../src/styled/MessageAttachments.tsx","../src/styled/reasoning/atoms.tsx","../src/styled/reasoning/build-steps.ts","../src/styled/reasoning/icons.tsx","../src/styled/reasoning/ToolChip.tsx","../src/styled/reasoning/SubagentBlock.tsx","../src/styled/reasoning/SubagentGroup.tsx","../src/styled/reasoning/StepBlock.tsx","../src/styled/reasoning/ReasoningStream.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/AuthPromptVisualization.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/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/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","resolved","CommandTokenView","processInlineCommandTokens","Children","child","idx","Fragment","isValidElement","type","tagName","childChildren","cloneElement","LANGUAGE_MAP","normalizeLanguage","lang","slugify","HeadingAnchor","id","LinkIcon","CopyButton","copied","setCopied","useState","handleCopy","useCallback","Check","Copy","MarkdownContent","baselineFontSize","darkCodeTheme","chat","useContext","ChatContext","useDarkCode","rootStyle","resolveCommandToken","ReactMarkdown","remarkGfm","remarkBreaks","href","codeClassName","match","codeText","language","SyntaxHighlighter","oneDark","oneLight","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","i","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","KEYFRAME_STYLE_ID","KEYFRAME_CONTENT","injectBeamerKeyframes","el","root","container","existing","style","GLYPHS","ROLL_MS","PER_CHAR_MS","MAX_DECODE_MS","decodeFrame","progress","frame","clamped","settled","ch","DecodingText","reducedMotion","usePrefersReducedMotion","shown","setShown","total","start","ThinkingIndicator","mark","FallbackMark","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","align","lightboxIndex","setLightboxIndex","brokenIds","setBrokenIds","imageItems","a","handleDownload","link","handlePreview","item","AttachmentThumbnail","AttachmentCard","onError","Download","previewable","sizeLabel","FileTypeIcon","Video","k","sizes","MONO_STACK","EASE","TEXT_SHIMMER_STYLE","formatDuration","seconds","formatElapsed","ink","percent","INTERNAL_TOOLS","isInternalTool","toolName","OBSERVATION_EXCERPT_CHARS","toolStatus","chunk","toolKind","groupStatus","members","isProse","buildRunSteps","chunks","isStreaming","steps","push","step","startStep","kind","subtask","startedAt","data","previous","description","hasDescription","findTool","excerpt","finalizeStatuses","callId","tools","j","tool","isLast","failed","toolOpen","durationSeconds","endedAt","stepsWallClockSeconds","first","last","stamps","stamp","box","StepMark","WriteMark","AgentMark","DispatchMark","Chevron","ActivityMeter","still","ToolChip","hover","setHover","isRunning","isFailed","isWrite","committed","setCommitted","wasRunning","justLanded","tone","humanizeHandle","handle","w","initials","words","meaningful","SubagentBody","nested","PIP","SubagentGroup","setOpen","setActive","setDirection","selectTab","isGroup","running","slowestMs","max","calls","countCalls","openTo","Pip","Dot","TabRow","activeIndex","onSelect","tabRefs","bar","setBar","useLayoutEffect","member","stroke","PipCard","meta","GUTTER","StepBlock","dimmed","entering","enterDelayMs","isSubagent","hasText","shimmer","WINDOW_SIZE","WINDOW_OPACITY","STEP_GAP","REVEAL_STAGGER_MS","REVEAL_STAGGER_CAP_MS","COLLAPSE_MS","useElapsed","localStartRef","setSeconds","tick","ReasoningStream","executionTime","streamStartedAt","justCompleted","controlledExpanded","onExpandedChange","containerRef","elapsed","seenStepsRef","liveScrollRef","localExpanded","setLocalExpanded","lockScroll","useScrollLock","isExpanded","shouldAnimateClose","phase","setPhase","inner","outer","done","previouslySeen","totalSeconds","allTools","writeCount","agentCount","failedCount","windowed","opacityFor","fromEnd","LiveFooter","bodyOpen","revealing","SummaryLine","stepCount","onToggle","totalSteps","showingAll","canToggle","StreamingText","content","renderMarkdown","markdownProps","ACTION_ICONS","Navigation","Mail","Search","Zap","getActionIcon","ArrowRight","SuggestedActions","actions","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","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","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","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","GRID_GAP_PX","autoColumns","maxCols","minPx","gapPx","capped","CARD_CONTAINER","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","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","AuthPromptVisualization","canConnect","Lock","REGISTRY_KEY","registry","registerVisualization","entry","getVisualization","getRegisteredTypes","registerBuiltinSchemas","schemas","schema","chartSeriesSchema","z","chartAxisSchema","chartVisualizationSchema","tableColumnSchema","tableVisualizationSchema","cardSectionSchema","cardActionSchema","cardVisualizationSchema","kpiMetricSchema","kpiVisualizationSchema","codePreviewVisualizationSchema","formFieldSchema","formVisualizationSchema","authPromptVisualizationSchema","VisualizationRenderer","title","vizData","AlertCircle","result","issues","issue","Component","ArtifactInlineCard","artifact","status","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","suggestedActions","onSuggestedAction","reasoningExpanded","onReasoningExpandedChange","citations","visualizations","onArtifactOpen","pendingClarification","onClarificationSubmit","pendingToolApproval","onToolApprove","onToolReject","renderInlineSuggestedAction","onEditSubmit","onVisualizationAction","isEditing","setIsEditing","participantRole","viewerRoleLower","isViewer","isAssistant","reasoningChunks","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","setHasText","setAttachments","isDragOver","setIsDragOver","fileInputRef","inputRef","dragCounterRef","isSubmittingRef","isSubmitDisabled","isAnyUploading","uploadedIds","hasContent","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","event","path","MoreVertical","StatusBadge","haloSize","isTool","spacingFor","Timeline","badgeSize","railCenter","showFlow","bottomPad","TimelineItem","itemRef","ToolCallMark","DurationTrail","maxSeconds","fraction","EventContent","maxDurationSeconds","hasDuration","accentVar","nestedEvents","convertChunkToEvent","SubagentChip","slug","defaultExpanded","setIsExpanded","hasNested","showCaret","handleColor","EventTimeline","isComplete","convertTimelineToEvents","timeline","events","eventTimestamps","ts","thought","cur","diff","eventKind","timelineItems","TimelineRow","hideChevron","showChevron","convertChunksToEvents","SubtaskContent","executionChunks","isCompleted","PlanTimeline","plan","streamingChunks","subtaskChunks","useStreamDuration","durableStartRef","liveSeconds","setLiveSeconds","finalSeconds","setFinalSeconds","durableStart","startTime","interval","hasSubagentChunks","convertTimelineToChunks","HeaderIndicator","ReasoningPanel","executionTimeline","userMessageTimestamp","wallClockSeconds","prevStreamingRef","setJustCompleted","justFinished","streamingEvents","completedEvents","completedChunks","totalExecutionTime","sum","st","lastEvent","firstEvent","summaryPreview","toolCount","visit","lower","lastChunk","hasSubagent","getLiveLabel","lastToolName","lastIsInternal","completedDuration","showPlanTimeline","ToolStatusIndicator","StatusIcon","ChatLayout","isEmpty","header","welcomeScreen","messageList","composer","footer","useRotatingPlaceholder","placeholders","intervalMs","intervalRef","handleVisibility","DefaultInput","setFiles","removeFile","SuggestionPill","WelcomeScreen","suggestions","onSuggestionClick","welcomeText","composerSlot","assistantAvatar","assistantName","handleSuggestionClick","msg","SubagentPanel"],"mappings":"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","file":"chunk-W7HQXA2Z.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 remarkBreaks from \"remark-breaks\";\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\n/** Hover-revealed deep link rendered inside a heading. */\nfunction HeadingAnchor({ id, size }: { id: string; size: number }) {\n return (\n <a\n href={`#${id}`}\n className=\"chat-prose__anchor\"\n aria-label=\"Link to heading\"\n >\n <LinkIcon size={size} className=\"inline\" />\n </a>\n );\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=\"chat-code-block__copy\"\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. Falls back to the host surface's\n * `isDarkSurface` from ChatProvider. */\n darkCodeTheme?: boolean;\n}\n\n/**\n * Markdown renderer for chat messages.\n *\n * Appearance lives entirely in the `.chat-prose` rules in\n * `src/styles/prose.css`; the overrides below carry only behaviour (heading\n * anchors, the code-block copy button, inline command-token chips, and the\n * image-URL swap). Keep it that way — the two used to be duplicated, and\n * because react-markdown v9 dropped the `className` prop the CSS half was\n * silently dead for the entire time both existed.\n */\nexport function MarkdownContent({\n children,\n className,\n baselineFontSize,\n darkCodeTheme,\n}: MarkdownContentProps) {\n const chat = useContext(ChatContext);\n\n // The host app owns this: chat-ui is themed through `--chat-*` variables\n // and consumers do not reliably apply a `.dark` class, so neither can be\n // read from here. `prefers-color-scheme` used to be the fallback, which\n // rendered dark code blocks in a light app on a dark OS.\n const useDarkCode = darkCodeTheme ?? chat?.isDarkSurface ?? false;\n\n // One font-size declaration on the wrapper; everything inside is sized in\n // `em` so it scales with a branding override instead of needing the value\n // stamped onto every element.\n const rootStyle = 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 = chat?.resolveCommandToken;\n\n return (\n <div className={cn(\"chat-prose\", className)} style={rootStyle}>\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkBreaks]}\n components={{\n h1: ({ children }) => {\n const id = slugify(String(children));\n return (\n <h1 id={id} className=\"group\">\n {processInlineCommandTokens(children, resolveCommandToken)}\n <HeadingAnchor id={id} size={16} />\n </h1>\n );\n },\n h2: ({ children }) => {\n const id = slugify(String(children));\n return (\n <h2 id={id} className=\"group\">\n {processInlineCommandTokens(children, resolveCommandToken)}\n <HeadingAnchor id={id} size={14} />\n </h2>\n );\n },\n h3: ({ children }) => {\n const id = slugify(String(children));\n return (\n <h3 id={id} className=\"group\">\n {processInlineCommandTokens(children, resolveCommandToken)}\n <HeadingAnchor id={id} size={12} />\n </h3>\n );\n },\n h4: ({ children }) => (\n <h4>{processInlineCommandTokens(children, resolveCommandToken)}</h4>\n ),\n p: ({ children }) => (\n <p>{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 loading=\"lazy\"\n />\n );\n }\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {children}\n </a>\n );\n },\n ul: ({ children }) => <ul>{children}</ul>,\n ol: ({ children }) => <ol>{children}</ol>,\n li: ({ children }) => <li>{processInlineCommandTokens(children, resolveCommandToken)}</li>,\n blockquote: ({ children }) => (\n <blockquote>{processInlineCommandTokens(children, resolveCommandToken)}</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 <code>{children}</code>;\n }\n\n const language = match ? normalizeLanguage(match[1]) : \"text\";\n\n return (\n /* `data-dark` keeps the whole block on ONE signal: the Prism theme\n paints its own background, and the header tint below is keyed to\n the same flag. Deriving the background from --chat-text instead\n would let a light syntax theme land on a dark panel. */\n <div className=\"chat-code-block group\" data-dark={useDarkCode ? \"\" : undefined}>\n {/* Header with language badge and copy button */}\n <div className=\"chat-code-block__header\">\n <span className=\"chat-code-block__lang\">{language}</span>\n <CopyButton text={codeText} />\n </div>\n <SyntaxHighlighter\n language={language}\n style={useDarkCode ? oneDark : oneLight}\n customStyle={{\n margin: 0,\n borderRadius: 0,\n fontSize: \"0.8125em\",\n lineHeight: \"1.6\",\n }}\n codeTagProps={{ style: { fontFamily: \"var(--chat-font-mono)\" } }}\n >\n {codeText}\n </SyntaxHighlighter>\n </div>\n );\n },\n pre: ({ children }) => <>{children}</>,\n table: ({ children }) => (\n <div className=\"chat-table-wrap\">\n <table>{children}</table>\n </div>\n ),\n thead: ({ children }) => <thead>{children}</thead>,\n th: ({ children }) => (\n <th>{processInlineCommandTokens(children, resolveCommandToken)}</th>\n ),\n td: ({ children }) => (\n <td>{processInlineCommandTokens(children, resolveCommandToken)}</td>\n ),\n hr: () => <hr />,\n strong: ({ children }) => <strong>{children}</strong>,\n em: ({ children }) => <em>{children}</em>,\n img: ({ src, alt }) => <img src={src} alt={alt ?? \"\"} loading=\"lazy\" />,\n }}\n >\n {children}\n </ReactMarkdown>\n </div>\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 { createPortal } from \"react-dom\";\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 || typeof document === \"undefined\") return null;\n\n const typeDisplay = getSourceTypeDisplay(source.source_type);\n\n return createPortal(\n <AnimatePresence>\n {source && (\n <div\n data-chat-ui\n role=\"presentation\"\n className=\"fixed inset-0 z-[9999] flex items-center justify-center p-4\"\n >\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 role=\"dialog\"\n aria-modal=\"true\"\n aria-label={source.title}\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 document.body,\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 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@keyframes mf-chip-in{0%{opacity:0;transform:translateY(2px) scale(.97)}100%{opacity:1;transform:none}}\n@keyframes mf-figure-in{0%{opacity:0;transform:translateX(-2px)}100%{opacity:1;transform:none}}\n@keyframes mf-commit{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--chat-text) 34%,transparent);opacity:1}100%{box-shadow:0 0 0 7px color-mix(in srgb,var(--chat-text) 0%,transparent);opacity:0}}\n@keyframes mf-step-in{0%{opacity:0;transform:translateY(6px)}100%{opacity:1;transform:none}}\n@keyframes mf-agent-in{0%{opacity:0;transform:scale(.82)}100%{opacity:1;transform:none}}\n@keyframes mf-ring-travel{to{stroke-dashoffset:-71}}\n@keyframes mf-halo-breathe{0%,100%{opacity:.35;transform:scale(.86)}50%{opacity:.85;transform:scale(1.06)}}\n@keyframes mf-mark-breathe{0%,100%{transform:scale(.94)}50%{transform:scale(1.04)}}\n@keyframes mf-panel-in-right{0%{opacity:0;transform:translateX(6px)}100%{opacity:1;transform:none}}\n@keyframes mf-panel-in-left{0%{opacity:0;transform:translateX(-6px)}100%{opacity:1;transform:none}}\n@keyframes mf-card-in{0%{opacity:0;transform:translateY(-3px)}100%{opacity:1;transform:translateY(0)}}\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.mf-focus{outline:none}\n.mf-focus:focus-visible{outline:2px solid color-mix(in srgb,var(--chat-text) 45%,transparent);outline-offset:2px;border-radius:6px}\n@media (prefers-reduced-motion:reduce){.mf-row-enter{animation:none}.mf-chip{animation:none!important}.mf-step{animation:none!important}.mf-pip-ring{animation:none!important}.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 { type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { usePrefersReducedMotion } from \"../hooks/use-reduced-motion\";\nimport { injectBeamerKeyframes } from \"../utils/beamer\";\nimport { cn } from \"../utils/cn\";\n\n/** Hex, because a hash resolving is the thing this is meant to feel like. */\nconst GLYPHS = \"0123456789abcdef\";\n/** How often the unresolved tail re-rolls. Fast enough to churn, slow enough\n * to read as characters rather than as a blur. */\nconst ROLL_MS = 45;\n/** How long each character waits its turn. Capped so a long line still lands. */\nconst PER_CHAR_MS = 34;\nconst MAX_DECODE_MS = 900;\n\n/**\n * One frame of the decode: everything left of the wavefront is settled, the\n * rest is noise.\n *\n * Pure, and exported, because it is the only part of this component with logic\n * worth checking and the effect that drives it runs too fast to catch from the\n * outside — a screenshot or a MutationObserver both arrive after it has landed.\n *\n * @param progress 0 → all noise, 1 → the real text.\n * @param frame Increments per roll so the unresolved tail churns instead of\n * freezing on one arrangement between settles.\n */\nexport function decodeFrame(text: string, progress: number, frame: number): string {\n\tconst clamped = Math.min(1, Math.max(0, progress));\n\tconst settled = Math.floor(clamped * text.length);\n\treturn text\n\t\t.split(\"\")\n\t\t.map((ch, i) => {\n\t\t\t// Spaces are never scrambled, so word shapes surface before the\n\t\t\t// letters do and the eye can start reading early.\n\t\t\tif (i < settled || ch === \" \") return ch;\n\t\t\treturn GLYPHS[(i * 7 + frame * 3) % GLYPHS.length];\n\t\t})\n\t\t.join(\"\");\n}\n\n/**\n * Text that resolves out of noise, left to right.\n *\n * The pre-first-token window is dead air — the model is loading tools and\n * assembling a prompt, and there is genuinely nothing to report yet. Three\n * bouncing dots fill it by saying \"wait\"; this fills it by looking like\n * something is being computed, which is truer and buys the same second.\n *\n */\nfunction DecodingText({ text, className }: { text: string; className?: string }) {\n\tconst reducedMotion = usePrefersReducedMotion();\n\tconst [shown, setShown] = useState(reducedMotion ? text : \"\");\n\n\tuseEffect(() => {\n\t\tif (reducedMotion) {\n\t\t\tsetShown(text);\n\t\t\treturn;\n\t\t}\n\t\tconst total = Math.min(text.length * PER_CHAR_MS, MAX_DECODE_MS);\n\t\tconst start = performance.now();\n\t\tlet frame = 0;\n\n\t\tconst id = setInterval(() => {\n\t\t\tconst progress = Math.min(1, (performance.now() - start) / total);\n\t\t\tframe += 1;\n\t\t\tsetShown(decodeFrame(text, progress, frame));\n\t\t\tif (progress >= 1) clearInterval(id);\n\t\t}, ROLL_MS);\n\n\t\treturn () => clearInterval(id);\n\t}, [text, reducedMotion]);\n\n\treturn (\n\t\t<span\n\t\t\tclassName={className}\n\t\t\tdata-decoding={shown === text ? undefined : \"true\"}\n\t\t\tstyle={{\n\t\t\t\t// Tabular figures keep the line from reflowing as glyphs resolve:\n\t\t\t\t// a proportional `1` next to a proportional `m` would make the\n\t\t\t\t// whole label twitch on every roll.\n\t\t\t\tfontVariantNumeric: \"tabular-nums\",\n\t\t\t\tfontVariantLigatures: \"none\",\n\t\t\t}}\n\t\t>\n\t\t\t{shown}\n\t\t</span>\n\t);\n}\n\nexport interface ThinkingIndicatorProps {\n\t/**\n\t * Brand mark shown while the agent starts up. Supplied by the host, which\n\t * owns its own logo and its own image loader; this package renders the\n\t * motion around whatever it is given. Omit it for the plain form.\n\t */\n\tmark?: ReactNode;\n\t/** Status line, e.g. \"Getting started…\". Resolves out of noise. */\n\tlabel?: string | null;\n\tclassName?: string;\n}\n\n/**\n * The waiting state before the first token.\n *\n * A mark with a breathing halo, beside a line of text decoding itself. Both\n * halves are the same idea: something is being worked out, and it is nearly\n * here.\n */\nexport function ThinkingIndicator({ mark, label, className }: ThinkingIndicatorProps) {\n\tconst ref = useRef<HTMLDivElement>(null);\n\tconst reducedMotion = usePrefersReducedMotion();\n\tuseEffect(() => {\n\t\tinjectBeamerKeyframes(ref.current);\n\t}, []);\n\n\treturn (\n\t\t<div ref={ref} className={cn(\"inline-flex items-center gap-2.5 px-4 py-3\", className)}>\n\t\t\t<span\n\t\t\t\taria-hidden\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\tjustifyContent: \"center\",\n\t\t\t\t\twidth: 22,\n\t\t\t\t\theight: 22,\n\t\t\t\t\tflexShrink: 0,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{/* Halo. The one branded note: `--chat-primary` is set per-org by the\n\t\t\t\t host's theming, so this is the customer's own colour rather than a\n\t\t\t\t hue picked here. */}\n\t\t\t\t<span\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\tinset: -7,\n\t\t\t\t\t\tborderRadius: \"50%\",\n\t\t\t\t\t\tbackground:\n\t\t\t\t\t\t\t\"radial-gradient(closest-side, color-mix(in srgb, var(--chat-primary) 26%, transparent), transparent 72%)\",\n\t\t\t\t\t\tanimation: reducedMotion\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: \"mf-halo-breathe 2.6s cubic-bezier(.16,1,.3,1) infinite\",\n\t\t\t\t\t\topacity: reducedMotion ? 0.5 : undefined,\n\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t}}\n\t\t\t\t/>\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: \"center\",\n\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\tanimation: reducedMotion\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: \"mf-mark-breathe 2.6s cubic-bezier(.16,1,.3,1) infinite\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{mark ?? <FallbackMark />}\n\t\t\t\t</span>\n\t\t\t</span>\n\n\t\t\t{label ? (\n\t\t\t\t<DecodingText\n\t\t\t\t\ttext={label}\n\t\t\t\t\tclassName=\"text-sm text-[var(--chat-text-subtle)]\"\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n\n/** Used when the host supplies no mark: a filled dot, not a spinner. */\nfunction FallbackMark() {\n\treturn (\n\t\t<span\n\t\t\tstyle={{\n\t\t\t\twidth: 7,\n\t\t\t\theight: 7,\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\tbackground: \"color-mix(in srgb, var(--chat-text) 55%, transparent)\",\n\t\t\t}}\n\t\t/>\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 { useMemo, useState } from \"react\";\nimport { Download, FileIcon, FileText, Image as ImageIcon, Video } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport { MediaLightbox, type MediaItem } from \"./MediaLightbox\";\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 /** Which edge to align against — \"end\" for the viewer's own right-aligned\n * messages, so a thumbnail narrower than the bubble doesn't drift left. */\n align?: \"start\" | \"end\";\n /** Additional class names */\n className?: string;\n}\n\n/**\n * Display attachments in messages: images render as inline thumbnails that open\n * a lightbox; everything else renders as a compact file chip.\n */\nexport function MessageAttachments({\n attachments,\n onDownload,\n onPreview,\n align = \"start\",\n className,\n}: MessageAttachmentsProps) {\n const [lightboxIndex, setLightboxIndex] = useState<number | null>(null);\n // Images whose URL failed to load (expired signed URL, revoked object URL\n // from an optimistic message, dead link). They fall back to the file chip —\n // a broken-image icon tells the user nothing and loses the download action.\n const [brokenIds, setBrokenIds] = useState<Set<string>>(() => new Set());\n\n // The viewable images, in render order, so the lightbox can page between\n // several images attached to one message.\n const imageItems = useMemo<MediaItem[]>(\n () =>\n (attachments ?? [])\n .filter(\n (a) => a.isImage && !!(a.previewUrl || a.url) && !brokenIds.has(a.id),\n )\n .map((a) => ({\n id: a.id,\n url: (a.url || a.previewUrl)!,\n mediaType: \"image\",\n altText: a.filename,\n })),\n [attachments, brokenIds],\n );\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 const index = imageItems.findIndex((item) => item.id === attachment.id);\n if (index >= 0) {\n setLightboxIndex(index);\n }\n };\n\n return (\n <div\n className={cn(\n \"flex flex-wrap gap-1.5\",\n align === \"end\" ? \"justify-end\" : \"justify-start\",\n className,\n )}\n >\n {attachments.map((attachment) => {\n const showThumbnail =\n attachment.isImage &&\n !!(attachment.previewUrl || attachment.url) &&\n !brokenIds.has(attachment.id);\n\n return showThumbnail ? (\n <AttachmentThumbnail\n key={attachment.id}\n attachment={attachment}\n onDownload={() => handleDownload(attachment)}\n onPreview={() => handlePreview(attachment)}\n onError={() =>\n setBrokenIds((prev) => {\n if (prev.has(attachment.id)) return prev;\n const next = new Set(prev);\n next.add(attachment.id);\n return next;\n })\n }\n />\n ) : (\n <AttachmentCard\n key={attachment.id}\n attachment={attachment}\n // An image that failed to load is not previewable — offering the\n // click would open an empty lightbox.\n previewable={imageItems.some((item) => item.id === attachment.id)}\n onDownload={() => handleDownload(attachment)}\n onPreview={() => handlePreview(attachment)}\n />\n );\n })}\n\n {/* Image lightbox. Uses the shared MediaLightbox rather than a local\n overlay: it portals into document.body, so it escapes the transformed\n framer-motion ancestors in the chat scroll container (a plain\n `fixed inset-0` here anchors to the chat panel, not the viewport) and\n brings Esc-to-close, arrow navigation and body scroll-lock with it. */}\n {lightboxIndex !== null && imageItems.length > 0 && (\n <MediaLightbox\n items={imageItems}\n index={Math.min(lightboxIndex, imageItems.length - 1)}\n onClose={() => setLightboxIndex(null)}\n onNavigate={(direction) =>\n setLightboxIndex((current) =>\n current === null\n ? current\n : (current + direction + imageItems.length) % imageItems.length,\n )\n }\n />\n )}\n </div>\n );\n}\n\nfunction AttachmentThumbnail({\n attachment,\n onDownload,\n onPreview,\n onError,\n}: {\n attachment: Attachment;\n onDownload: () => void;\n onPreview: () => void;\n onError: () => void;\n}) {\n const source = attachment.previewUrl || attachment.url;\n\n return (\n <div\n className={cn(\n \"group/thumb relative inline-block overflow-hidden rounded-xl\",\n \"border border-[var(--chat-border)] bg-[var(--chat-panel-bg)]\",\n \"cursor-pointer transition-opacity hover:opacity-95\",\n )}\n onClick={onPreview}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onPreview();\n }\n }}\n aria-label={`Open ${attachment.filename}`}\n >\n {/* Intrinsic aspect ratio is preserved: the box only bounds the image, so\n tall screenshots and wide banners both render undistorted. */}\n <img\n src={source}\n alt={attachment.filename}\n title={attachment.filename}\n loading=\"lazy\"\n onError={onError}\n className=\"block max-h-[280px] max-w-[min(320px,100%)] object-contain\"\n />\n\n {/* Download sits on the image so the thumbnail stays uncluttered. */}\n {attachment.url && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDownload();\n }}\n className={cn(\n \"absolute top-1.5 right-1.5 rounded-md p-1\",\n \"bg-black/50 text-white backdrop-blur-sm\",\n \"opacity-0 transition-opacity group-hover/thumb:opacity-100 focus:opacity-100\",\n \"hover:bg-black/70\",\n )}\n aria-label={`Download ${attachment.filename}`}\n >\n <Download size={12} />\n </button>\n )}\n </div>\n );\n}\n\nfunction AttachmentCard({\n attachment,\n previewable = false,\n onDownload,\n onPreview,\n}: {\n attachment: Attachment;\n previewable?: boolean;\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 previewable && \"cursor-pointer hover:bg-[var(--chat-border)]/30\",\n )}\n onClick={previewable ? 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\n/** Themed through the chat token so every surface resolves the same stack. */\nexport const MONO_STACK = \"var(--chat-font-mono)\";\n\n/** The one easing this panel animates on. */\nexport const EASE = \"cubic-bezier(.16,1,.3,1)\";\n\n/**\n * Compact \"tool call\" mark — Lucide-style 3/4-view open-end wrench.\n *\n * Colour inherits via `currentColor` so the chip can tint it per state.\n */\nexport function ToolCallMark({ size = 12 }: { size?: number }) {\n\treturn (\n\t\t<svg\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"2.25\"\n\t\t\tstrokeLinecap=\"round\"\n\t\t\tstrokeLinejoin=\"round\"\n\t\t\taria-hidden\n\t\t\tstyle={{ flexShrink: 0, display: \"block\" }}\n\t\t>\n\t\t\t<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\t\t</svg>\n\t);\n}\n\n/**\n * Text-shimmer for live prose: a gradient masked by the glyph shapes sweeps\n * through the characters, so the *text itself* shimmers rather than a\n * background behind it. Basis colour is `--chat-text`, so it adapts to theme.\n */\nexport const TEXT_SHIMMER_STYLE: CSSProperties = {\n\tbackgroundImage:\n\t\t\"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\tbackgroundSize: \"200% 100%\",\n\tbackgroundRepeat: \"repeat-x\",\n\tbackgroundClip: \"text\",\n\tWebkitBackgroundClip: \"text\",\n\tWebkitTextFillColor: \"transparent\",\n\tcolor: \"transparent\",\n\tanimation: \"mf-text-shimmer 2.4s linear infinite\",\n};\n\n/** `4.2s` / `780ms` — a figure to read, not to compare. */\nexport function formatDuration(seconds: number): string {\n\tif (seconds < 1) return `${Math.round(seconds * 1000)}ms`;\n\tif (seconds < 60) return `${seconds.toFixed(1)}s`;\n\tconst total = Math.round(seconds);\n\treturn `${Math.floor(total / 60)}:${String(total % 60).padStart(2, \"0\")}`;\n}\n\n/**\n * Live counter: `42s` under a minute, `2:07` beyond it. Agent runs routinely\n * pass a minute, and `127s` reads worse than `2:07` at a glance.\n */\nexport function formatElapsed(seconds: number): string {\n\tconst total = Math.floor(seconds);\n\tif (total < 60) return `${total}s`;\n\treturn `${Math.floor(total / 60)}:${String(total % 60).padStart(2, \"0\")}`;\n}\n\n/** Ink opacity scale — the panel's whole palette is `--chat-text` at N%. */\nexport const ink = (percent: number) =>\n\t`color-mix(in srgb, var(--chat-text) ${percent}%, transparent)`;\n","import type { StreamingChunk, SubagentChunkData } from \"../../types\";\nimport type { RunStep, RunStepStatus, RunStepTool, RunStepToolKind } from \"./types\";\n\n/**\n * Tools that are machinery rather than work the user asked for.\n *\n * `dispatch_assistant` is the odd one: the call IS user-relevant, but it\n * arrives a second time as a `subagent` chunk carrying the child's whole\n * thread, and that is the rendering we want — so the bare tool row is dropped\n * to avoid showing one dispatch twice.\n *\n * This is the ONLY copy. `ReasoningPanel`, `EventTimeline` and `PlanTimeline`\n * each kept their own, which is how they drifted apart.\n */\nexport const INTERNAL_TOOLS = new Set([\n\t\"create_plan\",\n\t\"tool_search\",\n\t\"unknown\",\n\t\"dispatch_assistant\",\n]);\n\nexport function isInternalTool(toolName?: string): boolean {\n\tif (!toolName) return false;\n\treturn INTERNAL_TOOLS.has(toolName.toLowerCase().trim());\n}\n\n/** Longest failed-result excerpt worth carrying into a step. */\nconst OBSERVATION_EXCERPT_CHARS = 400;\n\nfunction toolStatus(chunk: StreamingChunk): RunStepStatus {\n\tif (chunk.success === false) return \"failed\";\n\tif (chunk.status === \"completed\") return \"completed\";\n\tif (chunk.status === \"executing\") return \"running\";\n\treturn \"pending\";\n}\n\n/**\n * Read, write, or undeclared — from the declaration only.\n *\n * There is deliberately no name-shape fallback here. `audit/checker.py` keeps\n * one for unannotated customer MCP tools and documents why its default is\n * \"assume write\": guessing read costs an unaudited change nobody hears about.\n * A second copy of that guess on the render side would drift from the\n * declarations and could label a live budget change as a harmless read.\n */\nfunction toolKind(chunk: StreamingChunk): RunStepToolKind {\n\tif (chunk.toolWrites === true) return \"write\";\n\tif (chunk.toolWrites === false) return \"read\";\n\treturn \"undeclared\";\n}\n\n/** A batch is running while any member is, and failed if any member failed. */\nfunction groupStatus(members: readonly SubagentChunkData[]): RunStepStatus {\n\tif (members.some((m) => m.status === \"running\")) return \"running\";\n\tif (members.some((m) => m.status === \"failed\")) return \"failed\";\n\treturn \"completed\";\n}\n\nfunction isProse(chunk: StreamingChunk): boolean {\n\treturn chunk.type === \"thinking\" || chunk.type === \"planning\";\n}\n\n/**\n * Group a flat chunk stream into the steps the transcript renders.\n *\n * The one grouping rule, applied to every source: a step opens on a thought (or\n * on a tool with no thought before it) and closes when the next thought or\n * sub-agent dispatch arrives. Both producers — the live SSE reducers and\n * `runTraceStepsToChunks` replaying a durable trace — hand over the same chunk\n * shape, so both get the same result and a reloaded thread looks like the run\n * the user watched.\n *\n * `isStreaming` decides only whether the trailing step may render as running:\n * on a finished run nothing is open, however the last chunk happened to look.\n */\nexport function buildRunSteps(\n\tchunks: readonly StreamingChunk[] | undefined,\n\tisStreaming = false,\n): RunStep[] {\n\tif (!chunks || chunks.length === 0) return [];\n\n\tconst steps: RunStep[] = [];\n\t// The step tool chips attach to. Null between a sub-agent dispatch and the\n\t// next thought, so a tool that follows a dispatch opens its own step rather\n\t// than being hung off prose it has nothing to do with.\n\tlet open: RunStep | null = null;\n\n\tconst push = (step: RunStep): RunStep => {\n\t\tsteps.push(step);\n\t\treturn step;\n\t};\n\n\tconst startStep = (\n\t\tkind: RunStep[\"kind\"],\n\t\tchunk: StreamingChunk,\n\t\tindex: number,\n\t): RunStep =>\n\t\tpush({\n\t\t\tid: `${kind}-${chunk.sequence ?? index}`,\n\t\t\tsequence: steps.length,\n\t\t\tkind,\n\t\t\tstatus: \"completed\",\n\t\t\ttext: isProse(chunk) ? chunk.content : undefined,\n\t\t\ttools: [],\n\t\t\tsubagents: [],\n\t\t\tstartedAt: chunk.startedAt,\n\t\t\tendedAt: chunk.endedAt,\n\t\t});\n\n\tchunks.forEach((chunk, index) => {\n\t\tif (isProse(chunk)) {\n\t\t\t// An empty thought is a chunk that was opened and never filled —\n\t\t\t// rendering it would be a blank paragraph.\n\t\t\tif (!chunk.content || chunk.content.trim().length === 0) return;\n\t\t\topen = startStep(chunk.type === \"planning\" ? \"planning\" : \"thinking\", chunk, index);\n\t\t\treturn;\n\t\t}\n\n\t\t// Historical Plan & Execute messages, persisted before the unified-ReAct\n\t\t// migration. Their work lives in `subtaskData` rather than in prose, so\n\t\t// it is downgraded into the same step vocabulary — otherwise those\n\t\t// threads would replay with their reasoning missing entirely.\n\t\tif (chunk.type === \"subtask\" && chunk.subtaskData) {\n\t\t\tconst subtask = chunk.subtaskData;\n\t\t\tconst startedAt = chunk.startedAt;\n\t\t\topen = push({\n\t\t\t\tid: `subtask-${subtask.id}-${index}`,\n\t\t\t\tsequence: steps.length,\n\t\t\t\tkind: \"thinking\",\n\t\t\t\tstatus: subtask.status === \"failed\" ? \"failed\" : \"completed\",\n\t\t\t\ttext: subtask.description,\n\t\t\t\ttools: [],\n\t\t\t\tsubagents: [],\n\t\t\t\tstartedAt,\n\t\t\t\tendedAt:\n\t\t\t\t\tchunk.endedAt ??\n\t\t\t\t\t(startedAt !== undefined && subtask.execution_time\n\t\t\t\t\t\t? startedAt + subtask.execution_time * 1000\n\t\t\t\t\t\t: undefined),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (chunk.type === \"subagent\" && chunk.subagentData) {\n\t\t\tconst data = chunk.subagentData;\n\t\t\t// Join the step immediately before if it gathered this child from the\n\t\t\t// SAME parent step. `dispatchStep` is the orchestrator's own fact, not\n\t\t\t// a guess from overlapping clocks — and an undefined one never joins,\n\t\t\t// so a run predating the field shows sequential rows rather than\n\t\t\t// claiming a concurrency the data cannot support.\n\t\t\tconst previous = steps[steps.length - 1];\n\t\t\tconst sameBatch =\n\t\t\t\tprevious !== undefined &&\n\t\t\t\tprevious.kind === \"subagent\" &&\n\t\t\t\tdata.dispatchStep !== undefined &&\n\t\t\t\tprevious.subagents[0]?.dispatchStep === data.dispatchStep;\n\n\t\t\tif (sameBatch) {\n\t\t\t\tprevious.subagents.push(data);\n\t\t\t\tprevious.status = groupStatus(previous.subagents);\n\t\t\t\tif (chunk.startedAt !== undefined) {\n\t\t\t\t\tprevious.startedAt =\n\t\t\t\t\t\tprevious.startedAt === undefined\n\t\t\t\t\t\t\t? chunk.startedAt\n\t\t\t\t\t\t\t: Math.min(previous.startedAt, chunk.startedAt);\n\t\t\t\t}\n\t\t\t\t// The group ends when its LAST member does; one child finishing\n\t\t\t\t// early must not report the batch as over.\n\t\t\t\tprevious.endedAt =\n\t\t\t\t\tprevious.endedAt === undefined || chunk.endedAt === undefined\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: Math.max(previous.endedAt, chunk.endedAt);\n\t\t\t} else {\n\t\t\t\tpush({\n\t\t\t\t\tid: `subagent-${data.subagentId}-${index}`,\n\t\t\t\t\tsequence: steps.length,\n\t\t\t\t\tkind: \"subagent\",\n\t\t\t\t\tstatus: groupStatus([data]),\n\t\t\t\t\ttools: [],\n\t\t\t\t\tsubagents: [data],\n\t\t\t\t\tstartedAt: chunk.startedAt,\n\t\t\t\t\tendedAt: chunk.endedAt,\n\t\t\t\t});\n\t\t\t}\n\t\t\t// A dispatch is its own section; the next tool starts fresh.\n\t\t\topen = null;\n\t\t\treturn;\n\t\t}\n\n\t\tif (chunk.type === \"tool\") {\n\t\t\tif (isInternalTool(chunk.toolName)) return;\n\n\t\t\t// No thought preceded this call — give it a text-less step rather\n\t\t\t// than attaching it to whatever came before.\n\t\t\tif (!open) {\n\t\t\t\topen = push({\n\t\t\t\t\tid: `tools-${chunk.sequence ?? index}`,\n\t\t\t\t\tsequence: steps.length,\n\t\t\t\t\tkind: \"thinking\",\n\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\ttools: [],\n\t\t\t\t\tsubagents: [],\n\t\t\t\t\tstartedAt: chunk.startedAt,\n\t\t\t\t\tendedAt: chunk.endedAt,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst description = chunk.toolDescription?.trim();\n\t\t\tconst hasDescription = !!description;\n\t\t\topen.tools.push({\n\t\t\t\tid: chunk.toolCallId || `${chunk.toolName ?? \"tool\"}-${index}`,\n\t\t\t\tname: chunk.toolName || \"Tool call\",\n\t\t\t\tlabel: hasDescription ? description! : chunk.toolName || \"Tool call\",\n\t\t\t\tisSlugOnly: !hasDescription,\n\t\t\t\tkind: toolKind(chunk),\n\t\t\t\tstatus: toolStatus(chunk),\n\t\t\t\tstartedAt: chunk.startedAt,\n\t\t\t\tendedAt: chunk.endedAt,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (chunk.type === \"observation\") {\n\t\t\tif (isInternalTool(chunk.toolName)) return;\n\t\t\t// An observation is not its own row; it is what closes the tool it\n\t\t\t// belongs to. Match by tool_call_id — the name alone is ambiguous\n\t\t\t// when a turn runs the same tool several times in parallel.\n\t\t\tconst target = findTool(steps, chunk);\n\t\t\tif (!target) return;\n\t\t\ttarget.endedAt ??= chunk.endedAt ?? chunk.startedAt;\n\t\t\tif (chunk.success === false) {\n\t\t\t\ttarget.status = \"failed\";\n\t\t\t\tconst excerpt = (chunk.content || \"\").trim();\n\t\t\t\tif (excerpt) target.observationExcerpt = excerpt.slice(0, OBSERVATION_EXCERPT_CHARS);\n\t\t\t} else if (target.status !== \"failed\") {\n\t\t\t\ttarget.status = \"completed\";\n\t\t\t}\n\t\t}\n\t});\n\n\treturn finalizeStatuses(steps, isStreaming);\n}\n\n/**\n * Locate the tool an observation closes. Searches from the end because a\n * repeated same-name call on an id-less legacy path should close the most\n * recent one, not the first.\n */\nfunction findTool(steps: RunStep[], chunk: StreamingChunk): RunStepTool | undefined {\n\tconst callId = chunk.toolCallId;\n\tconst name = chunk.toolName?.toLowerCase().trim();\n\n\tfor (let i = steps.length - 1; i >= 0; i--) {\n\t\tconst tools = steps[i].tools;\n\t\tfor (let j = tools.length - 1; j >= 0; j--) {\n\t\t\tconst tool = tools[j];\n\t\t\tif (callId) {\n\t\t\t\tif (tool.id === callId) return tool;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (name && tool.name.toLowerCase().trim() === name && tool.status !== \"completed\") {\n\t\t\t\treturn tool;\n\t\t\t}\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/**\n * Resolve each step's status from its own clock and its tools'.\n *\n * The trailing step is the only one that may be `running`, and only while the\n * run is live. This is where the old panel went wrong in the other direction:\n * it hard-coded every thought to `completed`, so the shimmer and the breathing\n * marker it had built for live reasoning never fired on a thought at all.\n */\nfunction finalizeStatuses(steps: RunStep[], isStreaming: boolean): RunStep[] {\n\tsteps.forEach((step, index) => {\n\t\tconst isLast = index === steps.length - 1;\n\n\t\tif (step.kind === \"subagent\") {\n\t\t\t// Nothing is open on a finished run; a specialist left mid-flight is a\n\t\t\t// run that was stopped, not one still working.\n\t\t\tif (!isStreaming && step.status === \"running\") step.status = \"completed\";\n\t\t\treturn;\n\t\t}\n\n\t\tconst failed = step.tools.some((t) => t.status === \"failed\");\n\t\tconst toolOpen = step.tools.some((t) => t.status === \"pending\" || t.status === \"running\");\n\n\t\tif (!isStreaming) {\n\t\t\t// Nothing is open on a finished run; a tool left mid-flight is a\n\t\t\t// run that was stopped, not a tool still working.\n\t\t\tstep.tools.forEach((t) => {\n\t\t\t\tif (t.status === \"pending\" || t.status === \"running\") t.status = \"completed\";\n\t\t\t});\n\t\t\tstep.status = failed ? \"failed\" : \"completed\";\n\t\t\treturn;\n\t\t}\n\n\t\tif (failed) {\n\t\t\tstep.status = \"failed\";\n\t\t\treturn;\n\t\t}\n\t\t// Prose is still arriving if this is the tail step and nothing closed it.\n\t\tstep.status = isLast && (toolOpen || step.endedAt === undefined) ? \"running\" : \"completed\";\n\t});\n\n\treturn steps;\n}\n\n/** Seconds between two epoch-ms stamps, or undefined when either is missing. */\nexport function durationSeconds(\n\tstartedAt?: number,\n\tendedAt?: number,\n): number | undefined {\n\tif (typeof startedAt !== \"number\" || typeof endedAt !== \"number\") return undefined;\n\tconst seconds = (endedAt - startedAt) / 1000;\n\t// A negative figure means the two stamps came from different clocks (a\n\t// rolling deploy mixing server `ts` with client arrival time). Drop it\n\t// rather than render a nonsense duration.\n\treturn seconds > 0 ? seconds : undefined;\n}\n\n/** Total wall clock the steps span, for the collapsed summary line. */\nexport function stepsWallClockSeconds(steps: readonly RunStep[]): number | undefined {\n\tlet first: number | undefined;\n\tlet last: number | undefined;\n\n\tfor (const step of steps) {\n\t\tconst stamps = [step.startedAt, step.endedAt, ...step.tools.flatMap((t) => [t.startedAt, t.endedAt])];\n\t\tfor (const stamp of stamps) {\n\t\t\tif (typeof stamp !== \"number\") continue;\n\t\t\tif (first === undefined || stamp < first) first = stamp;\n\t\t\tif (last === undefined || stamp > last) last = stamp;\n\t\t}\n\t}\n\n\treturn durationSeconds(first, last);\n}\n","/**\n * Marks for the reasoning stream.\n *\n * Two levels, and only two. STEPS carry a mark so the left edge reads as one\n * consistent column; CHIPS carry one only when the tool changed something. An\n * icon on every chip turned a row of three tool calls into a row of three\n * competing glyphs and said nothing, since almost every call is a read.\n *\n * Drawn at 12-13px, where stroke detail disappears, so the solid marks are\n * filled silhouettes rather than line art.\n */\n\ninterface MarkProps {\n\tsize?: number;\n}\n\nconst box = (size: number) => ({\n\twidth: size,\n\theight: size,\n\tviewBox: \"0 0 24 24\",\n\t\"aria-hidden\": true,\n\tstyle: { flexShrink: 0, display: \"block\" },\n});\n\n/**\n * A STEP the agent reasoned through. Three lines of decreasing width — a note,\n * not a bullet. Quiet enough to sit beside prose without competing with it, and\n * specific enough that the gutter reads as a deliberate column rather than an\n * indent.\n */\nexport function StepMark({ size = 13 }: MarkProps) {\n\treturn (\n\t\t<svg {...box(size)} fill=\"currentColor\">\n\t\t\t<rect x=\"3\" y=\"6\" width=\"18\" height=\"2.1\" rx=\"1.05\" />\n\t\t\t<rect x=\"3\" y=\"11\" width=\"13.5\" height=\"2.1\" rx=\"1.05\" />\n\t\t\t<rect x=\"3\" y=\"16\" width=\"8\" height=\"2.1\" rx=\"1.05\" />\n\t\t</svg>\n\t);\n}\n\n/**\n * A WRITE: the agent changed something on a live account.\n *\n * A pencil, because that is the mark Google Ads and Meta Ads Manager both use\n * for editing a campaign — this audience already reads it as \"this modified\n * something\", with no translation. It is the ONLY mark a chip ever carries, so\n * a single change stands out in a paragraph full of reads.\n */\nexport function WriteMark({ size = 12 }: MarkProps) {\n\treturn (\n\t\t<svg {...box(size)} fill=\"currentColor\">\n\t\t\t<path d=\"M3 17.4V21h3.6L17.2 10.4l-3.6-3.6L3 17.4Z\" />\n\t\t\t<path d=\"M20.7 7.0a.95.95 0 0 0 0-1.35l-2.35-2.35a.95.95 0 0 0-1.35 0l-1.75 1.75 3.7 3.7 1.75-1.75Z\" />\n\t\t</svg>\n\t);\n}\n\n/**\n * An AGENT: one specialist, as it appears in a dispatch's pip row.\n *\n * A robot head, drawn geometrically rather than cartoonishly — square-ish\n * proportions, tight eyes, no mouth. It stands for the colleague doing the\n * work, which is what a pip needs to say; the STEP that dispatched it keeps\n * `DispatchMark`, because a step is a delegation, not a robot.\n *\n * The eyes are knocked out of the head with `fill-rule=\"evenodd\"` rather than\n * painted in a background colour: this package has no surface token, so a\n * filled counter-shape would be wrong on any host that is not white.\n */\nexport function AgentMark({ size = 13 }: MarkProps) {\n\treturn (\n\t\t<svg {...box(size)} fill=\"currentColor\">\n\t\t\t{/* Antenna: stem plus a bead, drawn separately so the head's evenodd\n\t\t\t knockout cannot punch a hole in it. */}\n\t\t\t<path d=\"M11.2 4.4h1.6v3.1h-1.6z\" />\n\t\t\t<path d=\"M10.5 3.2a1.5 1.5 0 1 0 3 0 1.5 1.5 0 1 0-3 0z\" />\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\td=\"M7.5 7h9a4 4 0 0 1 4 4v4.5a4 4 0 0 1-4 4h-9a4 4 0 0 1-4-4V11a4 4 0 0 1 4-4zM7.25 13.2a1.65 1.65 0 1 0 3.3 0 1.65 1.65 0 1 0-3.3 0zM13.45 13.2a1.65 1.65 0 1 0 3.3 0 1.65 1.65 0 1 0-3.3 0z\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\n/**\n * A DISPATCH: the STEP in which the agent handed work to specialists.\n *\n * One node branching into two — the shape of the delegation itself, not of the\n * colleague doing it. This marks a sub-agent step in the same gutter a\n * thought's mark sits in, which is what makes the two read as members of one\n * sequence. Who is doing the work is said by the pips (`AgentMark`), a level\n * down; the two glyphs answer different questions and both are needed.\n */\nexport function DispatchMark({ size = 13 }: MarkProps) {\n\treturn (\n\t\t<svg {...box(size)} fill=\"none\">\n\t\t\t<path\n\t\t\t\td=\"M12 7.6v3.4M5.6 17V12.4h12.8V17\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth={2}\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t/>\n\t\t\t<circle cx=\"12\" cy=\"4.6\" r=\"3\" fill=\"currentColor\" />\n\t\t\t<circle cx=\"5.6\" cy=\"19.4\" r=\"3\" fill=\"currentColor\" />\n\t\t\t<circle cx=\"18.4\" cy=\"19.4\" r=\"3\" fill=\"currentColor\" />\n\t\t</svg>\n\t);\n}\n\n/** Disclosure chevron. Rotates 90° on open. */\nexport function Chevron({ size = 12 }: MarkProps) {\n\treturn (\n\t\t<svg\n\t\t\t{...box(size)}\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth={2.6}\n\t\t\tstrokeLinecap=\"round\"\n\t\t\tstrokeLinejoin=\"round\"\n\t\t>\n\t\t\t<path d=\"M9.5 5.5 16 12l-6.5 6.5\" />\n\t\t</svg>\n\t);\n}\n\n/**\n * Three bars reading as a level meter: \"this is working right now\".\n *\n * The one live affordance in the panel, shared by the run footer and by a\n * dispatched specialist so both say it the same way.\n *\n * Still, under reduced motion, it holds the stepped shape the animation passes\n * through, so the row keeps its in-progress reading without moving.\n */\nexport function ActivityMeter({\n\treducedMotion = false,\n\tsize = 10,\n}: {\n\treducedMotion?: boolean;\n\tsize?: number;\n}) {\n\tconst still = [0.4, 1, 0.6];\n\treturn (\n\t\t<span\n\t\t\taria-hidden\n\t\t\tstyle={{ display: \"inline-flex\", alignItems: \"flex-end\", gap: 1.5, height: size }}\n\t\t>\n\t\t\t{[0, 1, 2].map((i) => (\n\t\t\t\t<span\n\t\t\t\t\tkey={i}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: 1.5,\n\t\t\t\t\t\theight: reducedMotion ? size * still[i] : size,\n\t\t\t\t\t\tbackground: \"currentColor\",\n\t\t\t\t\t\ttransformOrigin: \"bottom\",\n\t\t\t\t\t\tanimation: reducedMotion\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: \"mf-bars 0.95s cubic-bezier(.16,1,.3,1) infinite\",\n\t\t\t\t\t\tanimationDelay: reducedMotion ? undefined : `${i * 0.13}s`,\n\t\t\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</span>\n\t);\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { usePrefersReducedMotion } from \"../../hooks/use-reduced-motion\";\nimport { injectBeamerKeyframes } from \"../../utils/beamer\";\nimport { EASE, MONO_STACK, formatDuration, ink } from \"./atoms\";\nimport { durationSeconds } from \"./build-steps\";\nimport { WriteMark } from \"./icons\";\nimport type { RunStepTool } from \"./types\";\n\n/**\n * One tool call, inline in the flow of the thought that justified it.\n *\n * ## Two states, not three\n *\n * Only a declared WRITE is marked. Reads and undeclared tools share one quiet\n * treatment, because both are honestly described by \"nothing notable happened\n * here\" — and because a mark per category produced a row of competing glyphs\n * that said nothing. Every run that predates the `writes` declaration reaching\n * the wire has no declaration at all, so a distinct \"unknown\" mark would have\n * stamped a loud diamond on the entire history for a signal with no content.\n *\n * ## Why there is no border\n *\n * A 1px outline plus an internal divider made these read as broken form\n * controls at 12px. A soft fill with no edge is one shape instead of three,\n * which is what lets a paragraph carry four of them without looking like a\n * toolbar. The duration recedes inside the same shape rather than sitting in a\n * compartment of its own.\n */\nexport function ToolChip({ tool }: { tool: RunStepTool }) {\n\tconst ref = useRef<HTMLSpanElement>(null);\n\tconst reducedMotion = usePrefersReducedMotion();\n\tconst [hover, setHover] = useState(false);\n\tuseEffect(() => {\n\t\tinjectBeamerKeyframes(ref.current);\n\t}, []);\n\n\tconst isRunning = tool.status === \"running\" || tool.status === \"pending\";\n\tconst isFailed = tool.status === \"failed\";\n\tconst isWrite = tool.kind === \"write\";\n\tconst seconds = durationSeconds(tool.startedAt, tool.endedAt);\n\n\t// One-shot acknowledgement the moment a WRITE lands. A change to a live\n\t// account is the one event in this panel worth a beat of its own; reads get\n\t// nothing, or the emphasis means nothing.\n\tconst [committed, setCommitted] = useState(false);\n\tconst wasRunning = useRef(isRunning);\n\tuseEffect(() => {\n\t\tconst justLanded = wasRunning.current && !isRunning;\n\t\twasRunning.current = isRunning;\n\t\tif (!justLanded || !isWrite || isFailed || reducedMotion) return;\n\t\tsetCommitted(true);\n\t\tconst id = setTimeout(() => setCommitted(false), 820);\n\t\treturn () => clearTimeout(id);\n\t}, [isRunning, isWrite, isFailed, reducedMotion]);\n\n\tconst tone = isFailed\n\t\t? {\n\t\t\t\tfill: \"color-mix(in srgb, var(--chat-error) 8%, transparent)\",\n\t\t\t\tlabel: \"color-mix(in srgb, var(--chat-error) 82%, var(--chat-text))\",\n\t\t\t\tfigure: \"color-mix(in srgb, var(--chat-error) 55%, transparent)\",\n\t\t\t\tweight: 500,\n\t\t\t}\n\t\t: isWrite\n\t\t\t? {\n\t\t\t\t\tfill: ink(hover ? 13 : 10),\n\t\t\t\t\tlabel: ink(94),\n\t\t\t\t\tfigure: ink(48),\n\t\t\t\t\tweight: 580,\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\tfill: ink(hover ? 8 : 5),\n\t\t\t\t\tlabel: ink(66),\n\t\t\t\t\tfigure: ink(34),\n\t\t\t\t\tweight: 450,\n\t\t\t\t};\n\n\treturn (\n\t\t<span\n\t\t\tref={ref}\n\t\t\ttitle={tool.name}\n\t\t\tclassName=\"mf-chip\"\n\t\t\tonMouseEnter={() => setHover(true)}\n\t\t\tonMouseLeave={() => setHover(false)}\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\tgap: isWrite ? 6 : 0,\n\t\t\t\t// `baseline` would hang the chip off the text baseline and leave a\n\t\t\t\t// line of prose with chips in it visibly ragged; a small negative\n\t\t\t\t// offset centres it on the x-height instead.\n\t\t\t\tverticalAlign: \"-0.22em\",\n\t\t\t\tmaxWidth: \"100%\",\n\t\t\t\tminWidth: 0,\n\t\t\t\tpadding: \"3px 9px\",\n\t\t\t\tborderRadius: 6,\n\t\t\t\tbackground: tone.fill,\n\t\t\t\t// A 1px rise on hover. Small enough that a paragraph of chips does\n\t\t\t\t// not ripple as the pointer crosses it, big enough that they read as\n\t\t\t\t// things you can point at rather than as printed labels.\n\t\t\t\ttransform: hover && !reducedMotion ? \"translateY(-1px)\" : undefined,\n\t\t\t\ttransition: reducedMotion\n\t\t\t\t\t? undefined\n\t\t\t\t\t: `background 180ms ${EASE}, transform 180ms ${EASE}`,\n\t\t\t\tanimation: reducedMotion ? undefined : `mf-chip-in 240ms ${EASE} both`,\n\t\t\t}}\n\t\t>\n\t\t\t{/* Commit pulse: one expanding ring that dissipates. Painted behind\n\t\t\t the chip and non-interactive, so it cannot shift layout. */}\n\t\t\t{committed && (\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\tposition: \"absolute\",\n\t\t\t\t\t\tinset: -2,\n\t\t\t\t\t\tborderRadius: 8,\n\t\t\t\t\t\tanimation: `mf-commit 820ms ${EASE} forwards`,\n\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{isWrite && (\n\t\t\t\t<span aria-hidden style={{ display: \"inline-flex\", color: ink(88) }}>\n\t\t\t\t\t<WriteMark size={12} />\n\t\t\t\t</span>\n\t\t\t)}\n\n\t\t\t<span\n\t\t\t\tstyle={{\n\t\t\t\t\t// A raw slug renders in mono so `render_table` reads as an\n\t\t\t\t\t// identifier rather than as malformed prose.\n\t\t\t\t\tfontFamily: tool.isSlugOnly ? MONO_STACK : undefined,\n\t\t\t\t\tfontVariantLigatures: tool.isSlugOnly ? \"none\" : undefined,\n\t\t\t\t\tfontSize: tool.isSlugOnly ? 11.5 : 12.5,\n\t\t\t\t\tlineHeight: 1.45,\n\t\t\t\t\tletterSpacing: \"-0.004em\",\n\t\t\t\t\tfontWeight: tone.weight,\n\t\t\t\t\tcolor: tone.label,\n\t\t\t\t\ttextDecoration: isFailed ? \"line-through\" : undefined,\n\t\t\t\t\ttextDecorationThickness: isFailed ? \"1px\" : undefined,\n\t\t\t\t\ttextDecorationColor: isFailed\n\t\t\t\t\t\t? \"color-mix(in srgb, var(--chat-error) 45%, transparent)\"\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\ttextOverflow: \"ellipsis\",\n\t\t\t\t\twhiteSpace: \"nowrap\",\n\t\t\t\t\t// Generous: these labels are whole sentences the model wrote, and\n\t\t\t\t\t// clipping them at 260px turned most of a row into ellipses.\n\t\t\t\t\tmaxWidth: 420,\n\t\t\t\t\ttransition: reducedMotion ? undefined : `color 180ms ${EASE}`,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{tool.label}\n\t\t\t</span>\n\n\t\t\t{isRunning ? (\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\tmarginLeft: 7,\n\t\t\t\t\t\twidth: 2,\n\t\t\t\t\t\theight: 10,\n\t\t\t\t\t\tborderRadius: 1,\n\t\t\t\t\t\tbackground: ink(52),\n\t\t\t\t\t\tanimation: reducedMotion ? undefined : `mf-caret 1.05s ${EASE} infinite`,\n\t\t\t\t\t\topacity: reducedMotion ? 0.6 : undefined,\n\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\tseconds !== undefined && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tmarginLeft: 8,\n\t\t\t\t\t\t\tfontFamily: MONO_STACK,\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\tfontSize: 10.5,\n\t\t\t\t\t\t\tletterSpacing: \"0.01em\",\n\t\t\t\t\t\t\tcolor: tone.figure,\n\t\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t\t\tanimation: reducedMotion ? undefined : `mf-figure-in 300ms ${EASE} both`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{formatDuration(seconds)}\n\t\t\t\t\t</span>\n\t\t\t\t)\n\t\t\t)}\n\t\t</span>\n\t);\n}\n","import type { SubagentChunkData } from \"../../types\";\nimport { MarkdownContent } from \"../MarkdownContent\";\nimport { ink } from \"./atoms\";\nimport { buildRunSteps } from \"./build-steps\";\nimport { ToolChip } from \"./ToolChip\";\n\n/**\n * Turn an LLM-facing handle (\"google_ads_specialist\") into a human label\n * (\"Google Ads Specialist\").\n */\nexport function humanizeHandle(handle: string): string {\n\tif (!handle) return \"Specialist\";\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 * Monogram for the avatar: \"Google Ads Specialist\" → \"GA\", \"Budget\n * Specialist\" → \"BU\".\n *\n * The role noun is dropped because the distinguishing part of a handle is what\n * comes BEFORE it — every specialist would otherwise collapse toward \"…S\". A\n * handle with only one meaningful word takes two letters of it rather than\n * standing as a lone initial, which reads as a stray character at 24px.\n */\nexport function initials(handle: string): string {\n\tconst words = handle.split(/[_\\-\\s]+/).filter(Boolean);\n\tconst meaningful = words.filter((w) => !/^(specialist|agent|assistant|bot)$/i.test(w));\n\tconst source = meaningful.length > 0 ? meaningful : words;\n\tif (source.length === 0) return \"\";\n\tif (source.length === 1) return source[0]!.slice(0, 2).toUpperCase();\n\treturn source\n\t\t.slice(0, 2)\n\t\t.map((w) => w[0]!.toUpperCase())\n\t\t.join(\"\");\n}\n\n/**\n * The nested work one specialist did: its steps, its tool chips, its answer.\n *\n * Body only — the header, the status and the disclosure belong to\n * `SubagentGroup`, which renders them the same way whether the parent step\n * dispatched one specialist or gathered five. Splitting them is what stops the\n * single-dispatch case being a second implementation of the group.\n */\nexport function SubagentBody({ data }: { data: SubagentChunkData }) {\n\tconst isRunning = data.status === \"running\";\n\tconst nested = buildRunSteps(data.nestedChunks, isRunning);\n\n\treturn (\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 9, minWidth: 0 }}>\n\t\t\t{nested.map((step) => (\n\t\t\t\t<div key={step.id} style={{ minWidth: 0 }}>\n\t\t\t\t\t{step.text && (\n\t\t\t\t\t\t<div\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.6,\n\t\t\t\t\t\t\t\tletterSpacing: \"-0.004em\",\n\t\t\t\t\t\t\t\tcolor: ink(70),\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<MarkdownContent className=\"text-[13.5px]\">{step.text}</MarkdownContent>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{step.tools.length > 0 && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tmarginTop: step.text ? 6 : 0,\n\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\tflexWrap: \"wrap\",\n\t\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\t\tgap: 7,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{step.tools.map((tool) => (\n\t\t\t\t\t\t\t\t<ToolChip key={tool.id} tool={tool} />\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</div>\n\t\t\t))}\n\n\t\t\t{/* A transferred sub-agent answered the user directly, so its reply is\n\t\t\t the message body — repeating it here would show the same text twice. */}\n\t\t\t{data.result && !data.transferred && (\n\t\t\t\t<div style={{ fontSize: 13.5, lineHeight: 1.6, color: ink(74) }}>\n\t\t\t\t\t<MarkdownContent className=\"text-[13.5px]\">{data.result}</MarkdownContent>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{nested.length === 0 && !data.result && (\n\t\t\t\t<span style={{ fontSize: 12.5, color: ink(38) }}>\n\t\t\t\t\t{isRunning ? \"Starting up\" : \"No steps recorded\"}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { usePrefersReducedMotion } from \"../../hooks/use-reduced-motion\";\nimport type { SubagentChunkData } from \"../../types\";\nimport { injectBeamerKeyframes } from \"../../utils/beamer\";\nimport { EASE, MONO_STACK, formatDuration, ink } from \"./atoms\";\nimport { humanizeHandle, SubagentBody } from \"./SubagentBlock\";\nimport { AgentMark, Chevron } from \"./icons\";\n\n/** Pip geometry. The ring is drawn in SVG so it needs the box in numbers. */\nconst PIP = 22;\n\nexport interface SubagentGroupProps {\n\t/** One dispatch, or several gathered from the same parent step. */\n\tmembers: SubagentChunkData[];\n}\n\n/**\n * A dispatch: one specialist, or several that ran at once.\n *\n * `dispatch_assistant` is parallelizable, so a parent step can gather three\n * specialists that work simultaneously. Rendered as three stacked rows that\n * reads as three things that happened in sequence, which is the one fact the\n * layout should not get wrong. A pip row says \"these ran together\" in the space\n * of one line, and the ring around each pip says which are still going.\n *\n * The pips are deliberately identical. Nothing in the data distinguishes one\n * specialist from another at a glance — the handle is a user-editable slug with\n * no platform link, and initials spell out letters nobody reads. So the group\n * carries COUNT and STATUS, and the tab row underneath carries identity.\n */\nexport function SubagentGroup({ members }: SubagentGroupProps) {\n\tconst ref = useRef<HTMLDivElement>(null);\n\tconst reducedMotion = usePrefersReducedMotion();\n\tconst [open, setOpen] = useState(false);\n\tconst [active, setActive] = useState(0);\n\t// Which way the reader moved. The incoming panel enters from the side they\n\t// came from, so a tab row reads as a strip that slides rather than as three\n\t// unrelated panels that blink.\n\tconst [direction, setDirection] = useState<1 | -1>(1);\n\tconst selectTab = (i: number) => {\n\t\tsetDirection(i >= active ? 1 : -1);\n\t\tsetActive(i);\n\t};\n\tuseEffect(() => {\n\t\tinjectBeamerKeyframes(ref.current);\n\t}, []);\n\n\t// A member can disappear mid-run (a trace revision that drops one), which\n\t// would otherwise leave `active` pointing past the end.\n\tconst index = Math.min(active, members.length - 1);\n\tconst selected = members[index];\n\tconst isGroup = members.length > 1;\n\n\tconst running = members.filter((m) => m.status === \"running\").length;\n\tconst failed = members.filter((m) => m.status === \"failed\").length;\n\n\t// The batch's wall clock is its slowest member, not the sum: they overlapped.\n\tconst slowestMs = members.reduce((max, m) => Math.max(max, m.durationMs ?? 0), 0);\n\n\tconst summary = (() => {\n\t\tif (running > 0) return running === members.length ? \"Working\" : `${running} still working`;\n\t\tif (failed > 0) return `${failed} failed`;\n\t\tif (!isGroup) {\n\t\t\tconst calls = countCalls(members[0]);\n\t\t\treturn calls > 0 ? `${calls} ${calls === 1 ? \"call\" : \"calls\"}` : \"Done\";\n\t\t}\n\t\treturn \"Done\";\n\t})();\n\n\tconst openTo = (i: number) => {\n\t\tselectTab(i);\n\t\tsetOpen(true);\n\t};\n\n\treturn (\n\t\t<div ref={ref} style={{ minWidth: 0, maxWidth: \"100%\" }}>\n\t\t\t<div style={{ display: \"flex\", alignItems: \"center\", gap: 9, flexWrap: \"wrap\" }}>\n\t\t\t\t{isGroup ? (\n\t\t\t\t\t<span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 5 }}>\n\t\t\t\t\t\t{members.map((m, i) => (\n\t\t\t\t\t\t\t<Pip\n\t\t\t\t\t\t\t\tkey={m.subagentId || i}\n\t\t\t\t\t\t\t\tmember={m}\n\t\t\t\t\t\t\t\tselected={open && i === index}\n\t\t\t\t\t\t\t\treducedMotion={reducedMotion}\n\t\t\t\t\t\t\t\tonClick={() => (open && i === index ? setOpen(false) : openTo(i))}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName=\"mf-focus\"\n\t\t\t\t\tonClick={() => (open ? setOpen(false) : openTo(index))}\n\t\t\t\t\taria-expanded={open}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: \"inline-flex\",\n\t\t\t\t\t\talignItems: \"baseline\",\n\t\t\t\t\t\tflexWrap: \"wrap\",\n\t\t\t\t\t\tgap: 7,\n\t\t\t\t\t\tminWidth: 0,\n\t\t\t\t\t\tpadding: \"1px 6px 1px 0\",\n\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\tfont: \"inherit\",\n\t\t\t\t\t\ttextAlign: \"left\",\n\t\t\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\tfontSize: 14,\n\t\t\t\t\t\t\tfontWeight: 550,\n\t\t\t\t\t\t\tletterSpacing: \"-0.006em\",\n\t\t\t\t\t\t\tcolor: failed > 0 ? \"var(--chat-error)\" : ink(86),\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\ttextOverflow: \"ellipsis\",\n\t\t\t\t\t\t\twhiteSpace: \"nowrap\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isGroup\n\t\t\t\t\t\t\t? `${members.length} specialists`\n\t\t\t\t\t\t\t: humanizeHandle(members[0].subagentType)}\n\t\t\t\t\t</span>\n\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: 5,\n\t\t\t\t\t\t\tfontSize: 11.5,\n\t\t\t\t\t\t\tletterSpacing: \"-0.002em\",\n\t\t\t\t\t\t\tcolor: ink(40),\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{summary}\n\t\t\t\t\t\t{slowestMs > 0 && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<Dot />\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tfontFamily: MONO_STACK,\n\t\t\t\t\t\t\t\t\t\tfontVariantNumeric: \"tabular-nums\",\n\t\t\t\t\t\t\t\t\t\tfontVariantLigatures: \"none\",\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\t{formatDuration(slowestMs / 1000)}\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)}\n\t\t\t\t\t</span>\n\n\t\t\t\t\t<span\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"inline-flex\",\n\t\t\t\t\t\t\talignSelf: \"center\",\n\t\t\t\t\t\t\tcolor: ink(34),\n\t\t\t\t\t\t\ttransform: open ? \"rotate(90deg)\" : \"none\",\n\t\t\t\t\t\t\ttransition: reducedMotion ? undefined : `transform 240ms ${EASE}`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Chevron size={12} />\n\t\t\t\t\t</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: \"grid\",\n\t\t\t\t\tgridTemplateRows: open ? \"1fr\" : \"0fr\",\n\t\t\t\t\topacity: open ? 1 : 0,\n\t\t\t\t\ttransition: reducedMotion\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: `grid-template-rows 260ms ${EASE}, opacity 260ms ${EASE}`,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div style={{ overflow: \"hidden\", minHeight: 0 }}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t// One hairline marks the nested work as the specialists'\n\t\t\t\t\t\t\t// rather than the parent's. A hairline and not a filled rule:\n\t\t\t\t\t\t\t// the transcript has no rails, and a heavy one here would\n\t\t\t\t\t\t\t// reintroduce them.\n\t\t\t\t\t\t\tmargin: \"7px 0 2px 0\",\n\t\t\t\t\t\t\tpaddingLeft: 13,\n\t\t\t\t\t\t\tborderLeft: `1px solid ${ink(9)}`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isGroup && (\n\t\t\t\t\t\t\t<TabRow\n\t\t\t\t\t\t\t\tmembers={members}\n\t\t\t\t\t\t\t\tactiveIndex={index}\n\t\t\t\t\t\t\t\treducedMotion={reducedMotion}\n\t\t\t\t\t\t\t\tonSelect={selectTab}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Keyed so switching tabs remounts the body: the outgoing\n\t\t\t\t\t\t specialist's expanded rows must not bleed into the incoming\n\t\t\t\t\t\t one, and the remount is what re-runs the entrance. */}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={selected.subagentId || index}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tanimation:\n\t\t\t\t\t\t\t\t\tisGroup && !reducedMotion\n\t\t\t\t\t\t\t\t\t\t? `${direction === 1 ? \"mf-panel-in-right\" : \"mf-panel-in-left\"} 240ms ${EASE} both`\n\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SubagentBody data={selected} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n/**\n * The tab strip, with an indicator that travels between tabs.\n *\n * The bar is one element that moves, not a border that appears under whichever\n * tab is active. That difference is the whole point: a bar sliding from\n * \"Google Ads\" to \"Microsoft Ads\" says the two are positions in one strip,\n * where an indicator that blinks out and in says they are separate things.\n *\n * It moves on `transform` alone — a 1px-wide bar scaled to the tab's measured\n * width — so nothing on the row reflows while it travels.\n */\nfunction TabRow({\n\tmembers,\n\tactiveIndex,\n\treducedMotion,\n\tonSelect,\n}: {\n\tmembers: SubagentChunkData[];\n\tactiveIndex: number;\n\treducedMotion: boolean;\n\tonSelect: (index: number) => void;\n}) {\n\tconst tabRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\tconst [bar, setBar] = useState<{ x: number; w: number } | null>(null);\n\n\t// Layout effect, not effect: the bar must be in place on the frame the tab\n\t// row first paints, or it visibly slides in from x=0 on mount.\n\tuseLayoutEffect(() => {\n\t\tconst el = tabRefs.current[activeIndex];\n\t\tif (!el) return;\n\t\tsetBar({ x: el.offsetLeft, w: el.offsetWidth });\n\t}, [activeIndex, members.length]);\n\n\treturn (\n\t\t<div\n\t\t\trole=\"tablist\"\n\t\t\tstyle={{\n\t\t\t\tposition: \"relative\",\n\t\t\t\tdisplay: \"flex\",\n\t\t\t\tflexWrap: \"wrap\",\n\t\t\t\tgap: 14,\n\t\t\t\tmarginBottom: 9,\n\t\t\t\tpaddingBottom: 6,\n\t\t\t}}\n\t\t>\n\t\t\t{members.map((m, i) => {\n\t\t\t\tconst isActive = i === activeIndex;\n\t\t\t\treturn (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={m.subagentId || i}\n\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\ttabRefs.current[i] = el;\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\taria-selected={isActive}\n\t\t\t\t\t\tclassName=\"mf-focus\"\n\t\t\t\t\t\tonClick={() => onSelect(i)}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\tfont: \"inherit\",\n\t\t\t\t\t\t\tfontSize: 12.5,\n\t\t\t\t\t\t\tletterSpacing: \"-0.004em\",\n\t\t\t\t\t\t\t// Weight is fixed across states: bolding the active tab\n\t\t\t\t\t\t\t// re-measures the row, and the indicator would then chase a\n\t\t\t\t\t\t\t// target that moved while it was travelling.\n\t\t\t\t\t\t\tfontWeight: 520,\n\t\t\t\t\t\t\tcolor:\n\t\t\t\t\t\t\t\tm.status === \"failed\"\n\t\t\t\t\t\t\t\t\t? \"var(--chat-error)\"\n\t\t\t\t\t\t\t\t\t: isActive\n\t\t\t\t\t\t\t\t\t\t? ink(88)\n\t\t\t\t\t\t\t\t\t\t: ink(44),\n\t\t\t\t\t\t\ttransition: reducedMotion ? undefined : `color 200ms ${EASE}`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{humanizeHandle(m.subagentType)}\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\n\t\t\t{bar && (\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\tposition: \"absolute\",\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\theight: 1.5,\n\t\t\t\t\t\tborderRadius: 1,\n\t\t\t\t\t\tbackground: ink(72),\n\t\t\t\t\t\ttransformOrigin: \"left center\",\n\t\t\t\t\t\ttransform: `translateX(${bar.x}px) scaleX(${bar.w})`,\n\t\t\t\t\t\ttransition: reducedMotion\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: `transform 300ms ${EASE}`,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\n/** Total tool calls a specialist made, for the single-dispatch summary. */\nfunction countCalls(data: SubagentChunkData): number {\n\treturn (data.nestedChunks ?? []).filter((c) => c.type === \"tool\").length;\n}\n\n/**\n * One specialist in the group.\n *\n * Status lives in the RING, not in a fill: a solid hairline once it is done, a\n * short arc travelling the perimeter while it works. The arc is an SVG dash\n * rather than a conic-gradient border because a gradient ring needs to know the\n * surface colour behind it to mask its centre, and this package has no surface\n * token — a dash composites correctly over anything the host renders.\n */\nfunction Pip({\n\tmember,\n\tselected,\n\treducedMotion,\n\tonClick,\n}: {\n\tmember: SubagentChunkData;\n\tselected: boolean;\n\treducedMotion: boolean;\n\tonClick: () => void;\n}) {\n\tconst [hover, setHover] = useState(false);\n\tconst label = humanizeHandle(member.subagentType);\n\tconst isRunning = member.status === \"running\";\n\tconst isFailed = member.status === \"failed\";\n\tconst stroke = isFailed\n\t\t? \"color-mix(in srgb, var(--chat-error) 70%, transparent)\"\n\t\t: isRunning\n\t\t\t? ink(58)\n\t\t\t: ink(30);\n\n\treturn (\n\t\t<span style={{ position: \"relative\", display: \"inline-flex\" }}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName=\"mf-focus\"\n\t\t\t\tonClick={onClick}\n\t\t\t\tonMouseEnter={() => setHover(true)}\n\t\t\t\tonMouseLeave={() => setHover(false)}\n\t\t\t\tonFocus={() => setHover(true)}\n\t\t\t\tonBlur={() => setHover(false)}\n\t\t\t\taria-label={label}\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\tjustifyContent: \"center\",\n\t\t\t\t\twidth: PIP,\n\t\t\t\t\theight: PIP,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tborder: \"none\",\n\t\t\t\t\tborderRadius: 7,\n\t\t\t\t\tbackground: selected ? ink(9) : hover ? ink(5) : \"transparent\",\n\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\tcolor: isFailed ? \"var(--chat-error)\" : ink(isRunning ? 62 : 44),\n\t\t\t\t\ttransition: reducedMotion ? undefined : `background 180ms ${EASE}`,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\taria-hidden\n\t\t\t\t\twidth={PIP}\n\t\t\t\t\theight={PIP}\n\t\t\t\t\tviewBox={`0 0 ${PIP} ${PIP}`}\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstyle={{ position: \"absolute\", inset: 0 }}\n\t\t\t\t>\n\t\t\t\t\t{/* Base ring, always drawn. Without it the running pip is only its\n\t\t\t\t\t travelling dash — about a fifth of the perimeter at any instant —\n\t\t\t\t\t so it read as a pip that had lost its border rather than one that\n\t\t\t\t\t was busy. The beam rides on top of this. */}\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx=\"0.75\"\n\t\t\t\t\t\ty=\"0.75\"\n\t\t\t\t\t\twidth={PIP - 1.5}\n\t\t\t\t\t\theight={PIP - 1.5}\n\t\t\t\t\t\trx=\"6.25\"\n\t\t\t\t\t\tstroke={isRunning ? ink(14) : stroke}\n\t\t\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\t\t/>\n\t\t\t\t\t{isRunning && (\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\tx=\"0.75\"\n\t\t\t\t\t\t\ty=\"0.75\"\n\t\t\t\t\t\t\twidth={PIP - 1.5}\n\t\t\t\t\t\t\theight={PIP - 1.5}\n\t\t\t\t\t\t\trx=\"6.25\"\n\t\t\t\t\t\t\tstroke={stroke}\n\t\t\t\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t// Perimeter ≈ 4·(22−1.5−2·6.25) + 2π·6.25 ≈ 71.\n\t\t\t\t\t\t\tstrokeDasharray=\"17 54\"\n\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\treducedMotion\n\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t: { animation: `mf-ring-travel 1.5s linear infinite` }\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</svg>\n\t\t\t\t<AgentMark size={12} />\n\t\t\t</button>\n\n\t\t\t{hover && <PipCard member={member} label={label} reducedMotion={reducedMotion} />}\n\t\t</span>\n\t);\n}\n\n/**\n * What a pip cannot say on its own: which specialist it is.\n *\n * The pips are identical by design — nothing in the data distinguishes one from\n * another at a glance — so the name has to be one hover away rather than one\n * click away. It replaced a native `title`, which takes about a second to\n * appear, renders unstyled, and cannot hold a second line.\n */\nfunction PipCard({\n\tmember,\n\tlabel,\n\treducedMotion,\n}: {\n\tmember: SubagentChunkData;\n\tlabel: string;\n\treducedMotion: boolean;\n}) {\n\tconst calls = countCalls(member);\n\tconst meta = [\n\t\tmember.status === \"running\" ? \"Working\" : member.status === \"failed\" ? \"Failed\" : \"Done\",\n\t\tcalls > 0 ? `${calls} ${calls === 1 ? \"call\" : \"calls\"}` : null,\n\t\tmember.durationMs && member.durationMs > 0 ? formatDuration(member.durationMs / 1000) : null,\n\t].filter(Boolean) as string[];\n\n\treturn (\n\t\t<span\n\t\t\trole=\"tooltip\"\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\ttop: \"calc(100% + 7px)\",\n\t\t\t\t// Anchored to the pip's LEFT edge, not centred on it. Pips sit at\n\t\t\t\t// the left of the content column, so a centred card on the first\n\t\t\t\t// one hangs into the gutter and gets clipped by the transcript's\n\t\t\t\t// horizontal bounds; growing rightwards there is always room for.\n\t\t\t\tleft: -3,\n\t\t\t\tzIndex: 20,\n\t\t\t\t// The card must not swallow the pointer: leaving the pip to reach the\n\t\t\t\t// card would close it, and the card has nothing to click anyway.\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t\tdisplay: \"flex\",\n\t\t\t\tflexDirection: \"column\",\n\t\t\t\tgap: 2,\n\t\t\t\t// `max-content` is load-bearing. The card is absolutely positioned\n\t\t\t\t// inside the pip's 22px relative wrapper, so its containing block is\n\t\t\t\t// 22px wide and shrink-to-fit wrapped \"Google Ads Specialist\" onto\n\t\t\t\t// two lines regardless of any max-width.\n\t\t\t\twidth: \"max-content\",\n\t\t\t\t// The transcript root is `overflow: hidden`, so anything that leaves\n\t\t\t\t// the message column is cut rather than layered over. The card grows\n\t\t\t\t// rightwards from the pip, and a very long handle wraps here rather\n\t\t\t\t// than running off the edge.\n\t\t\t\tmaxWidth: 272,\n\t\t\t\tpadding: \"7px 10px\",\n\t\t\t\tborderRadius: 7,\n\t\t\t\t// The fallback matters: a host that never sets this token would\n\t\t\t\t// otherwise resolve `var()` to nothing and render the card\n\t\t\t\t// transparent, with the transcript legible straight through it.\n\t\t\t\tbackground: \"var(--chat-surface-raised, #ffffff)\",\n\t\t\t\tboxShadow: `inset 0 0 0 1px ${ink(12)}, 0 6px 18px -8px color-mix(in srgb, var(--chat-text) 38%, transparent)`,\n\t\t\t\tanimation: reducedMotion ? undefined : `mf-card-in 140ms ${EASE} both`,\n\t\t\t}}\n\t\t>\n\t\t\t<span\n\t\t\t\tstyle={{\n\t\t\t\t\tfontSize: 12.5,\n\t\t\t\t\tfontWeight: 580,\n\t\t\t\t\tletterSpacing: \"-0.005em\",\n\t\t\t\t\tlineHeight: 1.35,\n\t\t\t\t\tcolor: member.status === \"failed\" ? \"var(--chat-error)\" : ink(90),\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{label}\n\t\t\t</span>\n\t\t\t<span\n\t\t\t\tstyle={{\n\t\t\t\t\tfontSize: 11,\n\t\t\t\t\tletterSpacing: \"-0.002em\",\n\t\t\t\t\tcolor: ink(48),\n\t\t\t\t\twhiteSpace: \"nowrap\",\n\t\t\t\t\tfontVariantNumeric: \"tabular-nums\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{meta.join(\" · \")}\n\t\t\t</span>\n\t\t</span>\n\t);\n}\n\nfunction Dot() {\n\treturn (\n\t\t<span\n\t\t\taria-hidden\n\t\t\tstyle={{\n\t\t\t\twidth: 2,\n\t\t\t\theight: 2,\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\tbackground: ink(26),\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t}}\n\t\t/>\n\t);\n}\n","import { useEffect, useRef } from \"react\";\nimport { usePrefersReducedMotion } from \"../../hooks/use-reduced-motion\";\nimport { injectBeamerKeyframes } from \"../../utils/beamer\";\nimport { MarkdownContent } from \"../MarkdownContent\";\nimport { EASE, TEXT_SHIMMER_STYLE, ink } from \"./atoms\";\nimport { DispatchMark, StepMark } from \"./icons\";\nimport { SubagentGroup } from \"./SubagentGroup\";\nimport { ToolChip } from \"./ToolChip\";\nimport type { RunStep } from \"./types\";\n\n/** Width of the mark column. Every step reserves it, so prose starts on one x. */\nconst GUTTER = 22;\n\nexport interface StepBlockProps {\n\tstep: RunStep;\n\t/** Older step in the live window: quieter, and never the shimmering one. */\n\tdimmed?: boolean;\n\t/** Animate an entrance. False for steps already on screen (a replayed\n\t * trace must not perform, and re-opening one must not re-animate). */\n\tentering?: boolean;\n\t/** Delay in ms, for staggering a revealed trace. */\n\tenterDelayMs?: number;\n}\n\n/**\n * One step of the transcript: a mark, then prose, with the tool calls it\n * justified flowing inline underneath.\n *\n * Every step type sits in the same two-column shape — mark gutter, content —\n * so a thought and a dispatched specialist read as members of one sequence.\n * The specialist used to wear a 24px initials badge instead, which made it a\n * different kind of object on the page and spelled out \"GA\" to no one's\n * benefit.\n *\n * There is deliberately no rule connecting the marks. A rail would turn this\n * back into the trace viewer the redesign replaced; the shared x-position is\n * enough to read as a column.\n */\nexport function StepBlock({\n\tstep,\n\tdimmed = false,\n\tentering = false,\n\tenterDelayMs = 0,\n}: StepBlockProps) {\n\tconst ref = useRef<HTMLDivElement>(null);\n\tconst reducedMotion = usePrefersReducedMotion();\n\tuseEffect(() => {\n\t\tinjectBeamerKeyframes(ref.current);\n\t}, []);\n\n\tconst isSubagent = step.kind === \"subagent\";\n\tconst isRunning = step.status === \"running\";\n\tconst hasText = !!step.text && step.text.trim().length > 0;\n\t// The shimmer is an inline `animation`, which a reduced-motion media query\n\t// cannot override — so it is simply not applied.\n\tconst shimmer = isRunning && !dimmed && !reducedMotion;\n\n\tif (isSubagent && step.subagents.length === 0) return null;\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName=\"mf-step\"\n\t\t\tstyle={{\n\t\t\t\tdisplay: \"grid\",\n\t\t\t\tgridTemplateColumns: `${GUTTER}px minmax(0, 1fr)`,\n\t\t\t\talignItems: \"start\",\n\t\t\t\tminWidth: 0,\n\t\t\t\tmaxWidth: \"100%\",\n\t\t\t\tanimation:\n\t\t\t\t\tentering && !reducedMotion\n\t\t\t\t\t\t? `mf-step-in 340ms ${EASE} ${enterDelayMs}ms both`\n\t\t\t\t\t\t: undefined,\n\t\t\t}}\n\t\t>\n\t\t\t<span\n\t\t\t\taria-hidden\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: \"inline-flex\",\n\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t// Optical centring on the first line of 14px/1.62 prose. A\n\t\t\t\t\t// flex-start icon sits visibly high against a cap-height.\n\t\t\t\t\theight: 22,\n\t\t\t\t\tcolor: ink(isSubagent ? 46 : dimmed ? 24 : 34),\n\t\t\t\t\ttransition: reducedMotion ? undefined : `color 260ms ${EASE}`,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{isSubagent ? <DispatchMark size={13} /> : <StepMark size={13} />}\n\t\t\t</span>\n\n\t\t\t<div style={{ minWidth: 0 }}>\n\t\t\t\t{isSubagent ? (\n\t\t\t\t\t<SubagentGroup members={step.subagents} />\n\t\t\t\t) : (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t// Metrics are FIXED across states on purpose. Making the\n\t\t\t\t\t\t\t\t// live step larger or heavier reads well in a screenshot\n\t\t\t\t\t\t\t\t// and badly in motion: every time a step stops being the\n\t\t\t\t\t\t\t\t// live one its text re-wraps and the window below jumps.\n\t\t\t\t\t\t\t\t// The hierarchy is carried by ink and by the shimmer.\n\t\t\t\t\t\t\t\tfontSize: 14,\n\t\t\t\t\t\t\t\tlineHeight: 1.62,\n\t\t\t\t\t\t\t\tletterSpacing: \"-0.005em\",\n\t\t\t\t\t\t\t\tfontWeight: 400,\n\t\t\t\t\t\t\t\ttransition: reducedMotion ? undefined : `color 260ms ${EASE}`,\n\t\t\t\t\t\t\t\t...(shimmer ? TEXT_SHIMMER_STYLE : { color: ink(dimmed ? 52 : 80) }),\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{hasText && <MarkdownContent className=\"text-[14px]\">{step.text!}</MarkdownContent>}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{step.tools.length > 0 && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tmarginTop: hasText ? 6 : 1,\n\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\t\tflexWrap: \"wrap\",\n\t\t\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\t\t\t// Chips are soft shapes with no edge, so they need real\n\t\t\t\t\t\t\t\t\t// air between them or two adjacent fills merge into one\n\t\t\t\t\t\t\t\t\t// blob. Row gap matches so a wrapped run breathes the\n\t\t\t\t\t\t\t\t\t// same amount in both directions.\n\t\t\t\t\t\t\t\t\tgap: 7,\n\t\t\t\t\t\t\t\t\t// Chips carry their own colour; the shimmer's transparent\n\t\t\t\t\t\t\t\t\t// text fill must not bleed into them.\n\t\t\t\t\t\t\t\t\tWebkitTextFillColor: \"initial\",\n\t\t\t\t\t\t\t\t\tcolor: \"initial\",\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{step.tools.map((tool) => (\n\t\t\t\t\t\t\t\t\t<ToolChip key={tool.id} tool={tool} />\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)}\n\n\t\t\t\t\t\t{step.tools\n\t\t\t\t\t\t\t.filter((tool) => tool.status === \"failed\" && tool.observationExcerpt)\n\t\t\t\t\t\t\t.map((tool) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={`${tool.id}-error`}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tmarginTop: 7,\n\t\t\t\t\t\t\t\t\t\tpadding: \"7px 10px\",\n\t\t\t\t\t\t\t\t\t\tborderRadius: 6,\n\t\t\t\t\t\t\t\t\t\tfontSize: 12.5,\n\t\t\t\t\t\t\t\t\t\tlineHeight: 1.5,\n\t\t\t\t\t\t\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\t\t\t\t\t\t\twordBreak: \"break-word\",\n\t\t\t\t\t\t\t\t\t\t// Red survives only as type and hairlines, never as a\n\t\t\t\t\t\t\t\t\t\t// fill. It is the one hue left in this panel, and\n\t\t\t\t\t\t\t\t\t\t// confining it to the words keeps it a signal rather\n\t\t\t\t\t\t\t\t\t\t// than a wash.\n\t\t\t\t\t\t\t\t\t\tcolor: \"color-mix(in srgb, var(--chat-error) 82%, var(--chat-text))\",\n\t\t\t\t\t\t\t\t\t\tbackground: ink(3),\n\t\t\t\t\t\t\t\t\t\tboxShadow: `inset 0 0 0 1px ${ink(10)}`,\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\t{tool.observationExcerpt}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { usePrefersReducedMotion } from \"../../hooks/use-reduced-motion\";\nimport { useScrollLock } from \"../../hooks/use-scroll-lock\";\nimport type { StreamingChunk } from \"../../types\";\nimport { injectBeamerKeyframes } from \"../../utils/beamer\";\nimport { cn } from \"../../utils/cn\";\nimport { EASE, MONO_STACK, formatDuration, formatElapsed, ink } from \"./atoms\";\nimport { buildRunSteps, stepsWallClockSeconds } from \"./build-steps\";\nimport { StepBlock } from \"./StepBlock\";\nimport { ActivityMeter, Chevron, DispatchMark, WriteMark } from \"./icons\";\n\n/** Steps kept on screen during a live run. Older ones fade out above. */\nconst WINDOW_SIZE = 3;\n/**\n * Opacity ramp for the window, oldest first; the last entry is the live step.\n *\n * The floor stays legible on purpose: when a run has exactly WINDOW_SIZE steps\n * nothing is hidden and no \"Show all\" toggle appears, so the faintest step is\n * still content the reader has to be able to read.\n */\nconst WINDOW_OPACITY = [0.45, 0.72, 1];\n/** Gap between steps. Each one now carries a mark in its own gutter, so the\n * column does the separating and the whitespace can come back down. */\nconst STEP_GAP = 9;\n/** Stagger between steps when a finished trace is opened. Small on purpose:\n * this is a disclosure the reader asked for, not a performance, and the whole\n * reveal has to land well inside the time it takes to look down the list. */\nconst REVEAL_STAGGER_MS = 26;\nconst REVEAL_STAGGER_CAP_MS = 220;\n/** How long the completion collapse runs. Also the scroll-lock duration. */\nconst COLLAPSE_MS = 280;\n\nexport interface ReasoningStreamProps {\n\t/** Whether the run is still producing steps. */\n\tisStreaming?: boolean;\n\t/** The turn's reasoning chunks, live or replayed from the durable trace. */\n\tchunks?: StreamingChunk[];\n\t/** Persisted wall clock for the whole run, in seconds. */\n\texecutionTime?: number;\n\t/**\n\t * Epoch ms the in-progress run started. Supply the run's durable start so the\n\t * live counter survives this component remounting — timing from mount\n\t * restarts at 0 on a run that is already minutes old.\n\t */\n\tstreamStartedAt?: number;\n\t/**\n\t * The run finished moments ago, in a DIFFERENT component instance.\n\t *\n\t * The streaming message and the completed message are separate elements, so\n\t * this component cannot observe the streaming→complete edge itself. The host\n\t * passes it instead, and it is what turns the collapse from a jump cut into\n\t * a transition.\n\t */\n\tjustCompleted?: boolean;\n\t/** Controlled disclosure of the finished turn's full trace. */\n\texpanded?: boolean;\n\tonExpandedChange?: (expanded: boolean) => void;\n\tclassName?: string;\n}\n\n/** Live elapsed seconds, counted from the run's durable start where available. */\nfunction useElapsed(isStreaming: boolean, startedAt?: number): number {\n\tconst localStartRef = useRef<number | null>(null);\n\tconst [seconds, setSeconds] = useState(0);\n\n\tif (isStreaming && localStartRef.current === null) localStartRef.current = Date.now();\n\tif (!isStreaming) localStartRef.current = null;\n\n\tconst start = startedAt && startedAt > 0 ? startedAt : localStartRef.current;\n\n\tuseEffect(() => {\n\t\tif (!isStreaming || start === null) return;\n\t\t// Clamp: a durable start comes from the server, so a client clock running\n\t\t// behind it must not render a negative figure.\n\t\tconst tick = () => setSeconds(Math.max(0, (Date.now() - start) / 1000));\n\t\ttick();\n\t\tconst id = setInterval(tick, 1000);\n\t\treturn () => clearInterval(id);\n\t}, [isStreaming, start]);\n\n\treturn seconds;\n}\n\n/**\n * The agent's work, rendered as steps in the transcript.\n *\n * Live, it is a rolling window of the last few steps — the newest at full\n * strength, older ones fading out above. A long run therefore costs a fixed\n * amount of vertical space instead of pushing the composer off the screen.\n *\n * Finished, it collapses to one line: `Thought for 2:14 · 6 steps`, which\n * re-opens to the full trace on click.\n */\nexport function ReasoningStream({\n\tisStreaming = false,\n\tchunks,\n\texecutionTime,\n\tstreamStartedAt,\n\tjustCompleted = false,\n\texpanded: controlledExpanded,\n\tonExpandedChange,\n\tclassName,\n}: ReasoningStreamProps) {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst reducedMotion = usePrefersReducedMotion();\n\tuseEffect(() => {\n\t\tinjectBeamerKeyframes(containerRef.current);\n\t}, []);\n\n\tconst steps = useMemo(() => buildRunSteps(chunks, isStreaming), [chunks, isStreaming]);\n\tconst elapsed = useElapsed(isStreaming, streamStartedAt);\n\n\t// Expanding a LIVE run turns the step list into its own scroll box, and new\n\t// steps land at the bottom of it — outside the visible area, where the outer\n\t// transcript's auto-scroll cannot reach them. Follow the newest step here,\n\t// but only while the reader is already at the bottom: someone who scrolled\n\t// up to re-read an earlier step must not be yanked back down.\n\t// Highest step count this instance has rendered. Steps at or below it were\n\t// already on screen, so only what arrives ABOVE it animates in — a replayed\n\t// trace, and a re-opened one, must not perform an entrance for work that\n\t// finished minutes ago.\n\tconst seenStepsRef = useRef(0);\n\tconst liveScrollRef = useRef<HTMLDivElement>(null);\n\tuseEffect(() => {\n\t\tconst el = liveScrollRef.current;\n\t\tif (!el) return;\n\t\tconst distanceFromBottom = el.scrollHeight - el.scrollTop - el.clientHeight;\n\t\tif (distanceFromBottom > 48) return;\n\t\tel.scrollTop = el.scrollHeight;\n\t}, [steps.length]);\n\n\t// One disclosure flag for both phases: \"show all steps\" during the run and\n\t// \"the trace is open\" after it. Sharing them is what lets a trace the user\n\t// deliberately opened mid-run stay open once the answer lands, instead of\n\t// slamming shut on them at the moment they were reading it.\n\tconst [localExpanded, setLocalExpanded] = useState(false);\n\tconst lockScroll = useScrollLock(containerRef, COLLAPSE_MS);\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// The collapse animation.\n\t//\n\t// `justCompleted` arrives true on a FRESH mount (the completed message is a\n\t// different element from the streaming one), so there is no open→closed\n\t// prop change for a transition to key off. Instead: paint once at full\n\t// height, then flip to zero on the next frame so the browser has two states\n\t// to interpolate between. Two rAFs because a single one can still run\n\t// before the first paint.\n\tconst shouldAnimateClose = justCompleted && !reducedMotion && !isExpanded;\n\tconst [phase, setPhase] = useState<\"idle\" | \"open\" | \"closing\">(\n\t\tshouldAnimateClose ? \"open\" : \"idle\",\n\t);\n\tuseEffect(() => {\n\t\t// Nothing to fold when the user has the trace open, and reduced motion\n\t\t// lands on the collapsed summary directly.\n\t\tif (!shouldAnimateClose) return;\n\t\tsetPhase(\"open\");\n\t\tlet inner = 0;\n\t\tconst outer = requestAnimationFrame(() => {\n\t\t\tinner = requestAnimationFrame(() => setPhase(\"closing\"));\n\t\t});\n\t\tconst done = setTimeout(() => setPhase(\"idle\"), COLLAPSE_MS + 48);\n\t\treturn () => {\n\t\t\tcancelAnimationFrame(outer);\n\t\t\tcancelAnimationFrame(inner);\n\t\t\tclearTimeout(done);\n\t\t};\n\t}, [shouldAnimateClose]);\n\n\t// Commit after the render that used it: the value read above must be the\n\t// count from the PREVIOUS pass, or every step would look already-seen.\n\tconst previouslySeen = seenStepsRef.current;\n\tseenStepsRef.current = Math.max(seenStepsRef.current, steps.length);\n\n\tif (steps.length === 0) return null;\n\n\tconst totalSeconds =\n\t\texecutionTime && executionTime > 0 ? executionTime : stepsWallClockSeconds(steps);\n\n\t// What the collapsed line reports. Changes and specialists are called out by\n\t// name because they are the two things worth re-opening a finished trace\n\t// for; a plain step count answers neither.\n\tconst allTools = steps.flatMap((step) => step.tools);\n\t// A write that FAILED changed nothing, so it is not counted as a change —\n\t// \"1 change · 1 failed\" on a single rejected budget update says two\n\t// contradictory things about the same event.\n\tconst writeCount = allTools.filter((t) => t.kind === \"write\" && t.status !== \"failed\").length;\n\tconst agentCount = steps.filter((step) => step.kind === \"subagent\").length;\n\tconst failedCount = allTools.filter((t) => t.status === \"failed\").length;\n\n\t// ---------------------------------------------------------------- streaming\n\tif (isStreaming) {\n\t\tconst windowed = isExpanded ? steps : steps.slice(-WINDOW_SIZE);\n\t\tconst hiddenCount = steps.length - windowed.length;\n\t\t// Fade only applies to the rolling window; the full list is a document.\n\t\tconst opacityFor = (index: number) => {\n\t\t\tif (isExpanded) return 1;\n\t\t\tconst fromEnd = windowed.length - 1 - index;\n\t\t\treturn WINDOW_OPACITY[Math.max(0, WINDOW_OPACITY.length - 1 - fromEnd)] ?? 1;\n\t\t};\n\n\t\treturn (\n\t\t\t<div ref={containerRef} className={cn(\"max-w-full\", className)}>\n\t\t\t\t<div\n\t\t\t\t\tref={liveScrollRef}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\tflexDirection: \"column\",\n\t\t\t\t\t\tgap: STEP_GAP,\n\t\t\t\t\t\t...(isExpanded\n\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t: hiddenCount > 0\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t// Dissolve the outgoing step into the top edge\n\t\t\t\t\t\t\t\t\t\t// rather than clipping it on a hard line.\n\t\t\t\t\t\t\t\t\t\tmaskImage: \"linear-gradient(to bottom, transparent 0%, black 26%)\",\n\t\t\t\t\t\t\t\t\t\tWebkitMaskImage: \"linear-gradient(to bottom, transparent 0%, black 26%)\",\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}}\n\t\t\t\t>\n\t\t\t\t\t{windowed.map((step, index) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={step.id}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\topacity: opacityFor(index),\n\t\t\t\t\t\t\t\ttransition: reducedMotion ? undefined : `opacity 520ms ${EASE}`,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<StepBlock\n\t\t\t\t\t\t\t\tstep={step}\n\t\t\t\t\t\t\t\tdimmed={!isExpanded && opacityFor(index) < 1}\n\t\t\t\t\t\t\t\tentering={isStreaming && step.sequence >= previouslySeen}\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</div>\n\n\t\t\t\t<LiveFooter\n\t\t\t\t\telapsed={elapsed}\n\t\t\t\t\ttotalSteps={steps.length}\n\t\t\t\t\tshowingAll={isExpanded}\n\t\t\t\t\tcanToggle={steps.length > WINDOW_SIZE}\n\t\t\t\t\treducedMotion={reducedMotion}\n\t\t\t\t\tonToggle={() => {\n\t\t\t\t\t\tsetExpanded(!isExpanded);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// ---------------------------------------------------------------- completed\n\tconst bodyOpen = isExpanded || phase === \"open\";\n\tconst revealing = isExpanded && phase === \"idle\";\n\n\treturn (\n\t\t<div ref={containerRef} className={cn(\"max-w-full\", className)}>\n\t\t\t<SummaryLine\n\t\t\t\tseconds={totalSeconds}\n\t\t\t\tstepCount={steps.length}\n\t\t\t\twriteCount={writeCount}\n\t\t\t\tagentCount={agentCount}\n\t\t\t\tfailedCount={failedCount}\n\t\t\t\topen={isExpanded}\n\t\t\t\treducedMotion={reducedMotion}\n\t\t\t\tonToggle={() => setExpanded(!isExpanded)}\n\t\t\t/>\n\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: \"grid\",\n\t\t\t\t\t// Animating grid-template-rows between 0fr and 1fr collapses\n\t\t\t\t\t// content of unknown height without measuring it — a fixed\n\t\t\t\t\t// max-height would either clip a long trace or animate through\n\t\t\t\t\t// empty space on a short one.\n\t\t\t\t\tgridTemplateRows: bodyOpen ? \"1fr\" : \"0fr\",\n\t\t\t\t\topacity: bodyOpen ? 1 : 0,\n\t\t\t\t\ttransition: reducedMotion\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: `grid-template-rows ${COLLAPSE_MS}ms ${EASE}, opacity ${COLLAPSE_MS}ms ${EASE}`,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div style={{ overflow: \"hidden\", minHeight: 0 }}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\tflexDirection: \"column\",\n\t\t\t\t\t\t\tgap: STEP_GAP,\n\t\t\t\t\t\t\tpaddingTop: 9,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{steps.map((step, i) => (\n\t\t\t\t\t\t\t<StepBlock\n\t\t\t\t\t\t\t\tkey={step.id}\n\t\t\t\t\t\t\t\tstep={step}\n\t\t\t\t\t\t\t\t// Stagger only when the READER opened this. During the\n\t\t\t\t\t\t\t\t// auto-collapse the body is mounted open purely so it has\n\t\t\t\t\t\t\t\t// somewhere to fold from, and steps animating in while it\n\t\t\t\t\t\t\t\t// folds away is two motions fighting.\n\t\t\t\t\t\t\t\tentering={revealing}\n\t\t\t\t\t\t\t\tenterDelayMs={Math.min(i * REVEAL_STAGGER_MS, REVEAL_STAGGER_CAP_MS)}\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</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n/**\n * The collapsed line for a finished turn.\n *\n * \"Thought for 2:14 · 6 steps\" is honest but tells a marketer nothing they act\n * on. What they want to know before deciding whether to open it is whether the\n * agent CHANGED anything, and whether it pulled in a specialist. So changes are\n * counted separately, in the same warning tint the chips use, and the plain\n * step count is demoted to the quiet half of the line.\n *\n * The duration is the only figure set in mono: it is the one value a reader\n * compares between turns, and tabular digits stop it jittering as it changes.\n */\nfunction SummaryLine({\n\tseconds,\n\tstepCount,\n\twriteCount,\n\tagentCount,\n\tfailedCount,\n\topen,\n\treducedMotion,\n\tonToggle,\n}: {\n\tseconds?: number;\n\tstepCount: number;\n\twriteCount: number;\n\tagentCount: number;\n\tfailedCount: number;\n\topen: boolean;\n\treducedMotion: boolean;\n\tonToggle: () => void;\n}) {\n\tconst [hover, setHover] = useState(false);\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName=\"mf-focus\"\n\t\t\tonClick={onToggle}\n\t\t\tonMouseEnter={() => setHover(true)}\n\t\t\tonMouseLeave={() => setHover(false)}\n\t\t\taria-expanded={open}\n\t\t\tstyle={{\n\t\t\t\tdisplay: \"inline-flex\",\n\t\t\t\talignItems: \"center\",\n\t\t\t\tgap: 7,\n\t\t\t\tpadding: \"4px 9px 4px 8px\",\n\t\t\t\tmarginLeft: -8,\n\t\t\t\tborderRadius: 6,\n\t\t\t\tbackground: hover ? ink(4) : \"transparent\",\n\t\t\t\tborder: \"none\",\n\t\t\t\tcursor: \"pointer\",\n\t\t\t\tfont: \"inherit\",\n\t\t\t\tfontSize: 12.5,\n\t\t\t\tletterSpacing: \"-0.004em\",\n\t\t\t\ttransition: reducedMotion ? undefined : `background 180ms ${EASE}`,\n\t\t\t}}\n\t\t>\n\t\t\t<span style={{ color: ink(hover ? 76 : 62), fontWeight: 500 }}>\n\t\t\t\t{seconds !== undefined && seconds > 0 ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\tThought for{\" \"}\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontFamily: MONO_STACK,\n\t\t\t\t\t\t\t\tfontVariantNumeric: \"tabular-nums\",\n\t\t\t\t\t\t\t\tfontVariantLigatures: \"none\",\n\t\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{formatDuration(seconds)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\t\"Reasoning\"\n\t\t\t\t)}\n\t\t\t</span>\n\n\t\t\t{writeCount > 0 && (\n\t\t\t\t<>\n\t\t\t\t\t<Dot />\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: 4,\n\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\tcolor: ink(92),\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span aria-hidden style={{ display: \"inline-flex\", color: ink(80) }}>\n\t\t\t\t\t\t\t<WriteMark size={11.5} />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{writeCount} {writeCount === 1 ? \"change\" : \"changes\"}\n\t\t\t\t\t</span>\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{agentCount > 0 && (\n\t\t\t\t<>\n\t\t\t\t\t<Dot />\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: 4,\n\t\t\t\t\t\t\tcolor: ink(58),\n\t\t\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span aria-hidden style={{ display: \"inline-flex\", color: ink(45) }}>\n\t\t\t\t\t\t\t<DispatchMark size={11.5} />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{agentCount}\n\t\t\t\t\t</span>\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{failedCount > 0 && (\n\t\t\t\t<>\n\t\t\t\t\t<Dot />\n\t\t\t\t\t<span style={{ color: \"var(--chat-error)\", fontWeight: 560 }}>\n\t\t\t\t\t\t{failedCount} failed\n\t\t\t\t\t</span>\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t<Dot />\n\t\t\t<span style={{ color: ink(42), fontWeight: 400 }}>\n\t\t\t\t{stepCount} {stepCount === 1 ? \"step\" : \"steps\"}\n\t\t\t</span>\n\n\t\t\t<span\n\t\t\t\taria-hidden\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: \"inline-flex\",\n\t\t\t\t\tcolor: ink(hover ? 52 : 34),\n\t\t\t\t\tmarginLeft: 1,\n\t\t\t\t\ttransform: open ? \"rotate(90deg)\" : \"none\",\n\t\t\t\t\ttransition: reducedMotion ? undefined : `transform 240ms ${EASE}, color 180ms ${EASE}`,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<Chevron size={11} />\n\t\t\t</span>\n\t\t</button>\n\t);\n}\n\n/** Live status line: what is happening, for how long, and a way to see it all. */\nfunction LiveFooter({\n\telapsed,\n\ttotalSteps,\n\tshowingAll,\n\tcanToggle,\n\treducedMotion,\n\tonToggle,\n}: {\n\telapsed: number;\n\ttotalSteps: number;\n\tshowingAll: boolean;\n\tcanToggle: boolean;\n\treducedMotion: boolean;\n\tonToggle: () => void;\n}) {\n\treturn (\n\t\t<div\n\t\t\tstyle={{\n\t\t\t\tdisplay: \"flex\",\n\t\t\t\talignItems: \"center\",\n\t\t\t\tgap: 8,\n\t\t\t\tmarginTop: 8,\n\t\t\t\tfontSize: 11.5,\n\t\t\t\tcolor: ink(42),\n\t\t\t}}\n\t\t>\n\t\t\t<span style={{ display: \"inline-flex\", color: ink(52) }}>\n\t\t\t\t<ActivityMeter reducedMotion={reducedMotion} />\n\t\t\t</span>\n\t\t\t{elapsed >= 1 && (\n\t\t\t\t<span\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tfontFamily: MONO_STACK,\n\t\t\t\t\t\tfontVariantNumeric: \"tabular-nums\",\n\t\t\t\t\t\tfontVariantLigatures: \"none\",\n\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\tletterSpacing: \"0.02em\",\n\t\t\t\t\t\tcolor: ink(72),\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{formatElapsed(elapsed)}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{canToggle && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName=\"mf-focus\"\n\t\t\t\t\tonClick={onToggle}\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\tgap: 3,\n\t\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\tfont: \"inherit\",\n\t\t\t\t\t\tfontSize: 11.5,\n\t\t\t\t\t\tcolor: ink(42),\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{showingAll ? \"Show less\" : `Show all ${totalSteps} steps`}\n\t\t\t\t\t<span\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"inline-flex\",\n\t\t\t\t\t\t\ttransform: showingAll ? \"rotate(90deg)\" : \"none\",\n\t\t\t\t\t\t\ttransition: reducedMotion ? undefined : `transform 240ms ${EASE}`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Chevron size={11} />\n\t\t\t\t\t</span>\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nfunction Dot() {\n\treturn (\n\t\t<span\n\t\t\taria-hidden\n\t\t\tstyle={{\n\t\t\t\twidth: 2,\n\t\t\t\theight: 2,\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\tbackground: ink(28),\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t}}\n\t\t/>\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// Visualizations render inside a chat panel that is much narrower than the\n// window, so layout here is driven by the container (intrinsic grid/flex sizing\n// and `cqi` units) rather than by Tailwind's viewport breakpoints.\nconst GRID_GAP_PX = 16; // gap-4\n\n/**\n * Column template that never exceeds `maxCols` tracks but sheds columns as the\n * container narrows, keeping every card at least `minPx` wide. `min(100%, …)`\n * is the floor that stops a single card from overflowing a very narrow panel.\n */\nfunction autoColumns(maxCols: number, minPx: number, gapPx = GRID_GAP_PX): string {\n const capped = `calc((100% - ${(maxCols - 1) * gapPx}px) / ${maxCols})`;\n return `repeat(auto-fit, minmax(min(100%, max(${minPx}px, ${capped})), 1fr))`;\n}\n\n/** Cards are their own query containers so `cqi` value sizing tracks card width. */\nconst CARD_CONTAINER = { containerType: \"inline-size\" as const };\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\n className=\"h-full p-4 rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 relative overflow-hidden\"\n style={CARD_CONTAINER}\n >\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 [overflow-wrap:anywhere]\">{metric.label}</span>\n <div className=\"flex items-baseline gap-1 mt-1 min-w-0\">\n <span\n className=\"font-bold [overflow-wrap:anywhere]\"\n style={{ fontSize: \"clamp(1.25rem, 9cqi, 1.5rem)\" }}\n >\n {metric.value}\n </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 ...CARD_CONTAINER,\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 [overflow-wrap:anywhere]\",\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 min-w-0\", isHero ? \"mt-2\" : \"mt-1\")}>\n <span\n className=\"font-extrabold tabular-nums text-gray-900 dark:text-gray-100 leading-tight tracking-tight [overflow-wrap:anywhere]\"\n style={{\n // Scales with the card, not the window — a satellite in a narrow\n // chat panel steps down instead of clipping.\n fontSize: isHero\n ? \"clamp(1.75rem, 11cqi, 2.75rem)\"\n : \"clamp(1.125rem, 10cqi, 1.5rem)\",\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\n // Hero and satellites sit side by side (roughly 5:7) only while the container\n // can hold both flex bases; below that they stack. Flex basis is the container\n // query here — no viewport breakpoint involved.\n return (\n <div className=\"w-full flex flex-wrap gap-4 items-stretch\">\n <div className=\"min-w-0\" style={{ flex: \"5 1 260px\" }}>\n <KpiBentoCard metric={hero} index={heroIdx} isHero animate={animate} />\n </div>\n <div\n className=\"min-w-0 grid gap-4\"\n style={{ flex: \"7 1 320px\", gridTemplateColumns: autoColumns(satCols, 140) }}\n >\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 // \"row\" asks for one line of equal cards, but the line only holds as many as\n // the container can fit at a readable width — the rest wrap.\n return (\n <div\n className=\"w-full grid gap-4\"\n style={{\n gridTemplateColumns: isGrid\n ? autoColumns(2, 200)\n : autoColumns(Math.max(metrics.length, 1), 170),\n }}\n >\n {metrics.map((metric, idx) => (\n <KpiMetricCard\n key={idx}\n metric={metric}\n color={metric.color || colors[idx % colors.length]}\n animate={animate}\n />\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: \"var(--chat-font-mono)\" },\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 { Lock } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport type {\n AuthPromptVisualizationData,\n VisualizationActionEvent,\n VisualizationConfig,\n} from \"../../types\";\n\nexport interface AuthPromptVisualizationProps {\n data: AuthPromptVisualizationData;\n config?: VisualizationConfig;\n isStreaming?: boolean;\n onAction?: (event: VisualizationActionEvent) => void;\n}\n\n/**\n * \"Connect your account\" card for an integration the assistant could not use.\n *\n * This is the PACKAGE-level renderer, and it is deliberately presentational:\n * running the OAuth flow needs the host's session, GraphQL client and popup\n * plumbing, none of which belong here (see the styled/ agnosticism rule). A\n * host that can connect passes `onAction`; the app's MUI override in\n * `web/components/assistants/chat/visualizations/` replaces this entirely.\n *\n * It exists because a registered *fallback* is what separates a degraded render\n * from a broken one. Every other visualization type had one; `auth_prompt` was\n * contributed only by the host's registration module, so when a production\n * build elided that module the card rendered as the literal text \"Unknown\n * visualization type: auth_prompt\" in users' threads (2026-08-02).\n *\n * Without `onAction` there is nothing a button could do, so none is drawn — a\n * dead Connect button reads as a broken feature rather than a missing one.\n */\nexport function AuthPromptVisualization({\n data,\n onAction,\n}: AuthPromptVisualizationProps) {\n const name = data.mcpServerName || data.providerName;\n const canConnect = Boolean(onAction);\n\n return (\n <div\n className={cn(\n \"flex items-center gap-3 rounded-lg border px-3 py-2\",\n \"border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-900\",\n )}\n >\n {data.providerLogo ? (\n <img\n src={data.providerLogo}\n alt={name}\n className=\"h-6 w-6 shrink-0 object-contain\"\n />\n ) : (\n <Lock size={16} className=\"shrink-0 text-gray-400\" aria-hidden />\n )}\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium text-gray-900 dark:text-gray-100\">\n {name}\n </div>\n {data.reason && (\n <div className=\"truncate text-xs text-gray-500 dark:text-gray-400\">\n {data.reason}\n </div>\n )}\n </div>\n\n {canConnect && (\n <button\n type=\"button\"\n onClick={() =>\n onAction?.({\n type: \"auth_connect\",\n providerName: data.providerName,\n mcpServerId: data.mcpServerId,\n serviceProviderId: data.serviceProviderId,\n })\n }\n className={cn(\n \"shrink-0 rounded-md px-3 py-1 text-sm font-medium\",\n \"bg-gray-900 text-white hover:bg-gray-700\",\n \"dark:bg-gray-100 dark:text-gray-900 dark:hover:bg-gray-300\",\n )}\n >\n Connect\n </button>\n )}\n </div>\n );\n}\n\nexport default AuthPromptVisualization;\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\";\nimport { AuthPromptVisualization } from \"./AuthPromptVisualization\";\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// Every type the server can emit needs an entry here, not only the ones this\n// package styles best. A type contributed exclusively by a host registration\n// module renders as \"Unknown visualization type\" the moment that module isn't\n// evaluated — which is how `auth_prompt` shipped broken in production builds.\nregisterVisualization(\"auth_prompt\", { component: AuthPromptVisualization });\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// Auth prompt\n// ---------------------------------------------------------------------------\n\n// `providerName` is the only field the card cannot render without. Everything\n// else is optional because the two emitters populate different halves: the\n// tool-level OAuth prompt sends serviceProviderId/authMethods, the MCP-server\n// one sends mcpServerId/mcpServerName and leaves `provider` an empty string.\nexport const authPromptVisualizationSchema = z.object({\n\tproviderName: z.string(),\n\treason: z.string().nullish(),\n\tprovider: z.string().nullish(),\n\tproviderLogo: z.string().nullish(),\n\tserviceProviderId: z.string().nullish(),\n\tmcpServerId: z.string().nullish(),\n\tmcpServerName: z.string().nullish(),\n\tauthMethods: z\n\t\t.array(z.object({ id: z.string(), name: z.string(), authType: z.string() }))\n\t\t.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\tauth_prompt: authPromptVisualizationSchema,\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 { ThinkingIndicator } from \"./ThinkingIndicator\";\nimport { MarkdownContent } from \"./MarkdownContent\";\nimport { MessageActionBar } from \"./MessageActionBar\";\nimport { MessageAttachments } from \"./MessageAttachments\";\nimport { ReasoningStream } from \"./reasoning\";\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/**\n\t * @deprecated No longer read. Host adapters already reconstruct these into\n\t * `reasoning` chunks, so passing them separately made the same run\n\t * describable two ways. Kept on the interface so existing callers compile;\n\t * remove in the next major.\n\t */\n\texecutionPlan?: unknown;\n\t/** @deprecated No longer read — see `executionPlan`. */\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/** Epoch ms the in-progress run started. Supply the run's durable start\n\t * (e.g. from a server snapshot) so the streaming elapsed figure stays\n\t * correct across remounts; omit to time from when this component mounted. */\n\tstreamStartedAt?: number;\n\t/** This turn finished moments ago. The streaming message and the completed\n\t * message are different elements, so this component cannot see that edge\n\t * itself — the host reports it, and it is what animates the reasoning\n\t * steps folding into the \"Thought for …\" line instead of snapping shut. */\n\tjustCompleted?: boolean;\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\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\tstreamStartedAt,\n\t\t\tjustCompleted,\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\t// Gate on the chunks the panel actually renders from. `executionPlan` /\n\t\t// `executionTimeline` used to open this block on their own, which left an\n\t\t// empty wrapper whenever they carried nothing the panel could show — the\n\t\t// host adapter already reconstructs chunks from both.\n\t\tconst hasReasoning = !!reasoningChunks && reasoningChunks.length > 0;\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<ThinkingIndicator />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* The agent's work, above the answer: a rolling window of steps\n\t\t\t\t\t while the run is live, one \"Thought for …\" line once it ends. */}\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<ReasoningStream\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\texecutionTime={executionTime}\n\t\t\t\t\t\t\t\tstreamStartedAt={streamStartedAt}\n\t\t\t\t\t\t\t\tjustCompleted={justCompleted}\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 Attachments count as content: an image sent without a caption\n\t\t\t\t\t is a valid message, and gating this row on text alone made the\n\t\t\t\t\t user's own image vanish from the transcript (the attachments\n\t\t\t\t\t block below lives inside this row). */}\n\t\t\t\t\t{(message.textContent || hasAttachments) && (\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) : message.textContent ? (\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\t\"rounded-2xl\",\n\t\t\t\t\t\t\t\t\t\tisViewer || showAvatar ? \"px-4 py-3\" : \"\",\n\t\t\t\t\t\t\t\t\t\t// The timestamp and invisible hover actions share the\n\t\t\t\t\t\t\t\t\t\t// wrapper below. Keep their width from stretching a short\n\t\t\t\t\t\t\t\t\t\t// viewer bubble and looking like trailing whitespace.\n\t\t\t\t\t\t\t\t\t\tisViewer && \"self-end w-fit max-w-full\",\n\t\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) : null}\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\n\t\t\t\t\t\t\t\t\t\t\tattachments={attachments}\n\t\t\t\t\t\t\t\t\t\t\talign={isViewer ? \"end\" : \"start\"}\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\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 // `isStreaming` is the per-conversation gate: the send button is already\n // swapped for Stop while a turn is running, but Enter bypasses the\n // button, and a second concurrent turn on one conversation is invalid.\n if (isStreaming) return;\n // `isSubmittingRef` guards only the handshake (double Enter / double\n // click). `onSubmit` must resolve once the message is accepted — if a\n // host holds it open for the whole response, this latch becomes a lock\n // on every conversation the composer is reused for.\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, isStreaming, 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 // `isStreaming` matters here only for hosts that pass it\n // without `onStopStreaming` (no Stop button to swap in) —\n // without it the button would look live but silently no-op.\n disabled={!hasContent || isSubmitDisabled || isAnyUploading || isStreaming}\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{/* gap-6: the largest gap in the transcript must be between turns.\n\t\t\t\t\t\t At gap-4 it was only double a paragraph gap, and assistant\n\t\t\t\t\t\t messages have no background to delimit them. */}\n\t\t\t\t\t\t<MessageScroller.Content className={cn(\"flex flex-col gap-6 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 { type ReactNode, forwardRef } from \"react\";\nimport { TypingIndicator as TypingIndicatorPrimitive } from \"../primitives\";\nimport { cn } from \"../utils/cn\";\nimport { ThinkingIndicator } from \"./ThinkingIndicator\";\n\nexport interface TypingIndicatorProps {\n /** Additional CSS classes */\n className?: string;\n /** Optional status line rendered beside the mark (e.g. \"Getting started…\") */\n label?: string | null;\n /** Brand mark for the waiting state, supplied by the host. */\n mark?: ReactNode;\n}\n\n/**\n * The pre-first-token waiting state.\n *\n * Kept as a thin wrapper over `ThinkingIndicator` so the primitive's semantics\n * (and every existing `<TypingIndicator label=… />` call site) survive the\n * change from three bouncing dots to a decoding line.\n */\nexport const TypingIndicator = forwardRef<HTMLDivElement, TypingIndicatorProps>(\n ({ className, label, mark }, ref) => {\n return (\n <TypingIndicatorPrimitive ref={ref} className={cn(\"inline-flex\", className)}>\n <ThinkingIndicator mark={mark} label={label} />\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 { 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\n/** Themed through the chat token so every surface resolves the same stack. */\nconst MONO_STACK = \"var(--chat-font-mono)\";\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 *\n * @deprecated Never called. It was the only producer of `durationSeconds`, and\n * `ReasoningPanel` built its events with `convertChunkToEvent` instead — which\n * is why that panel's duration trail never drew. Per-step timing now travels on\n * `StreamingChunk.startedAt` / `endedAt`; see `reasoning/build-steps.ts`.\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 * Live duration counter for the streaming header.\n *\n * `startedAt` (epoch ms) is the run's own start, supplied by the host app from\n * a durable source. It is preferred over the mount's clock because this panel\n * remounts whenever the user navigates away from a thread and back: timing from\n * mount restarts the counter at 0 while the run is minutes old. The local\n * fallback covers hosts that don't track a run start.\n *\n * `finalSeconds` is state, not a ref — the completion render happens before the\n * effect that computes it, so a ref would never surface.\n */\nfunction useStreamDuration(\n\tisStreaming: boolean,\n\tstartedAt?: number,\n): { liveSeconds: number; finalSeconds: number } {\n\tconst localStartRef = useRef<number | null>(null);\n\tconst durableStartRef = useRef<number | null>(null);\n\tconst [liveSeconds, setLiveSeconds] = useState(0);\n\tconst [finalSeconds, setFinalSeconds] = useState(0);\n\n\tif (isStreaming && localStartRef.current === null) localStartRef.current = Date.now();\n\n\tconst durableStart = startedAt && startedAt > 0 ? startedAt : null;\n\t// Remembered because the host may drop the run start in the same commit the\n\t// run completes — the final figure below still needs it.\n\tif (durableStart !== null) durableStartRef.current = durableStart;\n\tconst startTime = durableStart ?? localStartRef.current;\n\n\tuseEffect(() => {\n\t\tif (!isStreaming || startTime === null) return;\n\t\t// Clamp: a durable start comes from the server, so a client clock running\n\t\t// behind it must not render a negative figure.\n\t\tconst tick = () => setLiveSeconds(Math.max(0, (Date.now() - startTime) / 1000));\n\t\ttick();\n\t\tconst interval = setInterval(tick, 1000);\n\t\treturn () => clearInterval(interval);\n\t}, [isStreaming, startTime]);\n\n\tuseEffect(() => {\n\t\tif (isStreaming || localStartRef.current === null) return;\n\t\t// Streaming just ended — capture final elapsed time\n\t\tsetFinalSeconds(Math.max(0, (Date.now() - (durableStartRef.current ?? localStartRef.current)) / 1000));\n\t\tlocalStartRef.current = null;\n\t\t// Consumed: a later run in this same instance must not reuse this start.\n\t\tdurableStartRef.current = null;\n\t}, [isStreaming, durableStart]);\n\n\treturn { liveSeconds, finalSeconds };\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\n/**\n * @deprecated Superseded by `ReasoningStream`, which renders the agent's work as\n * steps in the transcript rather than as a timeline nested under a chip. This\n * component is no longer used by `Message`; it stays exported because\n * `@miiflow/assistant-ui` is published and external consumers may mount it\n * directly. Remove in the next major.\n *\n * Known limitations, kept as-is rather than fixed here: thinking rows are always\n * built with `status: \"completed\"`, so the live-state shimmer never fires on\n * them; and `convertChunkToEvent` never sets `durationSeconds`, so the per-step\n * duration trail never draws.\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/** Epoch ms the in-progress run started. Supply the run's durable start so\n\t * the live counter survives this panel remounting; omit to time from mount. */\n\tstreamStartedAt?: 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\n/** Live counter: `42s` under a minute, `2:07` beyond it. Now that the figure\n * reflects the run's real age it routinely passes a minute, and `127s` reads\n * worse than `2:07` at a glance. */\nfunction formatElapsed(seconds: number): string {\n\tconst total = Math.floor(seconds);\n\tif (total < 60) return `${total}s`;\n\treturn `${Math.floor(total / 60)}:${String(total % 60).padStart(2, \"0\")}`;\n}\n\n/** Monospace for figures and machine text. Themed through the chat token so\n * every surface resolves the same stack — the literals this replaced named\n * JetBrains Mono and Fira Code, neither of which is loaded anywhere. */\nconst MONO_STACK = \"var(--chat-font-mono)\";\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\tstreamStartedAt,\n\tdefaultExpanded = false,\n\texpanded: controlledExpanded,\n\tonExpandedChange,\n\tclassName,\n}: ReasoningPanelProps) {\n\tconst [localExpanded, setLocalExpanded] = useState(defaultExpanded);\n\tconst { liveSeconds, finalSeconds: wallClockSeconds } = useStreamDuration(isStreaming, streamStartedAt);\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. The timer\n\t\t\t\t counts from the run's start (see useStreamDuration), so leaving\n\t\t\t\t the thread and returning mid-run resumes the real figure instead\n\t\t\t\t of restarting at zero. */}\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{liveSeconds >= 1 && (\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{formatElapsed(liveSeconds)}\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. The label is prose and reads in\n\t\t\t\t the body face; only the figure is mono + tabular. Setting the\n\t\t\t\t whole header in mono made it read as a code artifact. */}\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\tfontSize: 12,\n\t\t\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\t\t\tletterSpacing: \"-0.003em\",\n\t\t\t\t\t\t\tcolor: \"color-mix(in srgb, var(--chat-text) 55%, transparent)\",\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>\n\t\t\t\t\t\t\t\tThought for{\" \"}\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tfontFamily: MONO_STACK,\n\t\t\t\t\t\t\t\t\t\tfontVariantNumeric: \"tabular-nums\",\n\t\t\t\t\t\t\t\t\t\tfontVariantLigatures: \"none\",\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\t{formatDuration(completedDuration)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</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 { 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/** Blocks the built-in input (e.g. while a response is already streaming).\n\t * Ignored when `composerSlot` is provided — that composer owns its own gating. */\n\tdisabled?: 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\tdisabled,\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\tdisabled={disabled}\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\t//\n\t// A transferred sub-agent has no `result` to append: it answered the user\n\t// directly, so its reply is the message body below this panel. Showing the\n\t// text here too would render the same answer twice. Note instead who wrote\n\t// it, so the tool work above doesn't look orphaned.\n\tif (data.transferred) {\n\t\tnestedEvents.push({\n\t\t\tid: `transferred-${data.subagentId}`,\n\t\t\ttype: \"thinking\",\n\t\t\tstatus: \"completed\",\n\t\t\tcontent: `Answered directly by ${humanizeHandle(data.subagentType)}.`,\n\t\t});\n\t} else if (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"]}
|