@optilogic/chat 1.0.0-beta.5 → 1.0.0-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/agent-response/components/ActivityIndicators.tsx","../src/components/agent-response/utils.ts","../src/components/agent-response/components/MetadataRow.tsx","../src/components/agent-response/components/ThinkingSection.tsx","../src/components/agent-response/components/ActionBar.tsx","../src/components/agent-response/hooks/useThinkingTimer.ts","../src/components/agent-response/types.ts","../src/components/agent-response/hooks/useAgentResponseAccumulator.ts","../src/components/agent-response/AgentResponse.tsx","../src/components/user-prompt/UserPrompt.tsx","../src/components/user-prompt-input/UserPromptInput.tsx"],"names":["React","jsxs","cn","Popover","jsx","PopoverTrigger","Wrench","PopoverContent","Book","HardDrive","React2","ChevronUp","ChevronDown","LoadingSpinner","React3","React4","useState","useCallback","Check","Copy","ThumbsUp","ThumbsDown","useEffect","React5","useMemo","Fragment","React6","Text","React7","SlateEditor","IconButton","Loader2","Send"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Activity Indicators Component\n *\n * Displays tool, knowledge, memory icons with counts and popovers\n */\n\nimport * as React from \"react\";\nimport { Wrench, Book, HardDrive } from \"lucide-react\";\nimport { cn, Popover, PopoverTrigger, PopoverContent } from \"@optilogic/core\";\nimport type { ToolCall, KnowledgeItem, MemoryItem } from \"../types\";\n\nexport interface ActivityIndicatorsProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool calls to display */\n toolCalls: ToolCall[];\n /** Knowledge items to display */\n knowledge: KnowledgeItem[];\n /** Memory items to display */\n memory: MemoryItem[];\n}\n\n/**\n * ActivityIndicators Component\n *\n * Displays icons with counts for tool calls, knowledge retrieval, and memory access.\n * Each icon has a popover showing details when clicked.\n *\n * @example\n * <ActivityIndicators\n * toolCalls={state.toolCalls}\n * knowledge={state.knowledge}\n * memory={state.memory}\n * />\n */\nconst ActivityIndicators = React.forwardRef<HTMLDivElement, ActivityIndicatorsProps>(\n ({ toolCalls, knowledge, memory, className, ...props }, ref) => {\n const hasAnyActivity =\n toolCalls.length > 0 || knowledge.length > 0 || memory.length > 0;\n\n if (!hasAnyActivity) return null;\n\n return (\n <div ref={ref} className={cn(\"flex items-center gap-2\", className)} {...props}>\n {/* Tool Calls */}\n {toolCalls.length > 0 && (\n <Popover>\n <PopoverTrigger asChild>\n <button\n className=\"flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors\"\n onClick={(e) => e.stopPropagation()}\n >\n <Wrench className=\"w-3.5 h-3.5\" />\n <span className=\"text-xs\">{toolCalls.length}</span>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-80\">\n <div className=\"space-y-2\">\n <h4 className=\"font-medium text-sm\">Tool Calls</h4>\n <div className=\"space-y-2 max-h-60 overflow-auto\">\n {toolCalls.map((tool) => (\n <div key={tool.id} className=\"p-2 bg-muted rounded text-xs\">\n <div className=\"font-medium\">{tool.name}</div>\n {tool.arguments && (\n <pre className=\"mt-1 text-muted-foreground overflow-x-auto\">\n {JSON.stringify(tool.arguments, null, 2)}\n </pre>\n )}\n </div>\n ))}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )}\n\n {/* Knowledge */}\n {knowledge.length > 0 && (\n <Popover>\n <PopoverTrigger asChild>\n <button\n className=\"flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors\"\n onClick={(e) => e.stopPropagation()}\n >\n <Book className=\"w-3.5 h-3.5\" />\n <span className=\"text-xs\">{knowledge.length}</span>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-80\">\n <div className=\"space-y-2\">\n <h4 className=\"font-medium text-sm\">Knowledge Retrieved</h4>\n <div className=\"space-y-2 max-h-60 overflow-auto\">\n {knowledge.map((item) => (\n <div key={item.id} className=\"p-2 bg-muted rounded text-xs\">\n <div className=\"font-medium\">{item.source}</div>\n <div className=\"mt-1 text-muted-foreground\">\n {item.content}\n </div>\n </div>\n ))}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )}\n\n {/* Memory */}\n {memory.length > 0 && (\n <Popover>\n <PopoverTrigger asChild>\n <button\n className=\"flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors\"\n onClick={(e) => e.stopPropagation()}\n >\n <HardDrive className=\"w-3.5 h-3.5\" />\n <span className=\"text-xs\">{memory.length}</span>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-80\">\n <div className=\"space-y-2\">\n <h4 className=\"font-medium text-sm\">Memory Accessed</h4>\n <div className=\"space-y-2 max-h-60 overflow-auto\">\n {memory.map((item) => (\n <div key={item.id} className=\"p-2 bg-muted rounded text-xs\">\n <div className=\"font-medium\">{item.type}</div>\n <div className=\"mt-1 text-muted-foreground\">\n {item.content}\n </div>\n </div>\n ))}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )}\n </div>\n );\n }\n);\nActivityIndicators.displayName = \"ActivityIndicators\";\n\nexport { ActivityIndicators };\n","/**\n * Agent Response Utility Functions\n */\n\n/**\n * Format elapsed time for display\n * - Under 60s: \"Xs\" (e.g., \"23s\")\n * - 60+ seconds while active: \"M:SS\" (e.g., \"1:23\")\n * - Complete under 60s: \"Xs\" (e.g., \"45s\")\n * - Complete 60-119s: \"1.X min\" (e.g., \"1.2 min\")\n * - Complete 120+ s: \"X.X min\" (e.g., \"2.5 min\")\n */\nexport function formatTime(seconds: number, isComplete: boolean): string {\n if (seconds < 1) {\n return isComplete ? \"<1s\" : \"0s\";\n }\n\n if (isComplete) {\n // Completed state formatting\n if (seconds < 60) {\n return `${Math.round(seconds)}s`;\n }\n const minutes = seconds / 60;\n return `${minutes.toFixed(1)} min`;\n }\n\n // Active state formatting\n if (seconds < 60) {\n return `${Math.floor(seconds)}s`;\n }\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, \"0\")}`;\n}\n\n/**\n * Format total time for action bar display\n */\nexport function formatTotalTime(seconds: number): string {\n if (seconds < 1) {\n return \"<1s\";\n }\n if (seconds < 60) {\n return `${seconds.toFixed(1)}s`;\n }\n const minutes = seconds / 60;\n return `${minutes.toFixed(1)}m`;\n}\n","/**\n * Metadata Row Component\n *\n * Displays thinking toggle, timer, and activity indicators\n */\n\nimport * as React from \"react\";\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\nimport { cn, LoadingSpinner } from \"@optilogic/core\";\nimport { ActivityIndicators } from \"./ActivityIndicators\";\nimport { formatTime } from \"../utils\";\nimport type { AgentResponseStatus, ToolCall, KnowledgeItem, MemoryItem } from \"../types\";\n\nexport interface MetadataRowProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Whether there is thinking content */\n hasThinking: boolean;\n /** Whether the thinking section is expanded */\n isExpanded: boolean;\n /** Toggle callback for thinking expansion */\n onToggle: () => void;\n /** Tool calls to display */\n toolCalls: ToolCall[];\n /** Knowledge items to display */\n knowledge: KnowledgeItem[];\n /** Memory items to display */\n memory: MemoryItem[];\n /** Current response status */\n status: AgentResponseStatus;\n /** Elapsed time in seconds */\n elapsedTime: number;\n}\n\n/**\n * MetadataRow Component\n *\n * Displays the metadata row with thinking toggle, timer, and activity indicators.\n * When thinking content is present, the row is clickable to toggle expansion.\n *\n * @example\n * <MetadataRow\n * hasThinking={!!state.thinking}\n * isExpanded={thinkingExpanded}\n * onToggle={toggleThinking}\n * toolCalls={state.toolCalls}\n * knowledge={state.knowledge}\n * memory={state.memory}\n * status={state.status}\n * elapsedTime={elapsedTime}\n * />\n */\nconst MetadataRow = React.forwardRef<HTMLDivElement, MetadataRowProps>(\n (\n {\n hasThinking,\n isExpanded,\n onToggle,\n toolCalls,\n knowledge,\n memory,\n status,\n elapsedTime,\n className,\n ...props\n },\n ref\n ) => {\n const isProcessing = status === \"processing\";\n const isComplete = status === \"complete\";\n const hasActivity =\n toolCalls.length > 0 || knowledge.length > 0 || memory.length > 0;\n\n // Determine what to show on the left side\n const renderLeftContent = () => {\n // If we have thinking text, show collapse toggle + label + timer\n if (hasThinking) {\n return (\n <div className=\"flex items-center gap-1.5\">\n {isExpanded ? (\n <ChevronUp className=\"w-3.5 h-3.5 text-muted-foreground\" />\n ) : (\n <ChevronDown className=\"w-3.5 h-3.5 text-muted-foreground\" />\n )}\n <span className=\"text-xs text-muted-foreground\">\n {isComplete\n ? `Thought for ${formatTime(elapsedTime, true)}`\n : `Thinking... ${formatTime(elapsedTime, false)}`}\n </span>\n </div>\n );\n }\n\n // If processing but no thinking text yet, show spinner\n if (isProcessing) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <LoadingSpinner size=\"sm\" variant=\"muted\" className=\"w-3.5 h-3.5\" />\n <span className=\"text-xs text-muted-foreground\">Processing</span>\n </div>\n );\n }\n\n // Complete with no thinking - show nothing on left (just activity on right)\n return null;\n };\n\n const leftContent = renderLeftContent();\n\n // If nothing to show (no thinking, not processing, no activity), hide the row\n if (!leftContent && !hasActivity) {\n return null;\n }\n\n // Always use a div for the row to avoid nesting buttons\n // When there's thinking, only the left side is clickable\n return (\n <div\n ref={ref}\n className={cn(\"w-full flex items-center justify-between px-3 py-2\", className)}\n {...props}\n >\n {/* Left content - clickable when there's thinking */}\n {hasThinking ? (\n <button\n onClick={onToggle}\n className=\"flex items-center gap-1.5 hover:bg-muted/50 -ml-1.5 pl-1.5 pr-2 py-0.5 rounded transition-colors\"\n >\n {leftContent}\n </button>\n ) : (\n <div className=\"flex items-center gap-1.5\">\n {leftContent}\n </div>\n )}\n <ActivityIndicators\n toolCalls={toolCalls}\n knowledge={knowledge}\n memory={memory}\n />\n </div>\n );\n }\n);\nMetadataRow.displayName = \"MetadataRow\";\n\nexport { MetadataRow };\n","/**\n * Thinking Section Component\n *\n * Collapsible section for displaying agent thinking/reasoning content\n */\n\nimport * as React from \"react\";\nimport { cn } from \"@optilogic/core\";\n\nexport interface ThinkingSectionProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The thinking content to display */\n content: string;\n /** Whether the section is expanded */\n isExpanded: boolean;\n}\n\n/**\n * ThinkingSection Component\n *\n * Displays the agent's thinking/reasoning content in a collapsible panel.\n *\n * @example\n * <ThinkingSection content={state.thinking} isExpanded={isExpanded} />\n */\nconst ThinkingSection = React.forwardRef<HTMLDivElement, ThinkingSectionProps>(\n ({ content, isExpanded, className, ...props }, ref) => {\n if (!isExpanded || !content) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n className={cn(\"px-3 pb-3 border-t border-border\", className)}\n {...props}\n >\n <div className=\"mt-2 max-h-[200px] overflow-y-auto\">\n <pre className=\"text-xs text-muted-foreground whitespace-pre-wrap font-mono\">\n {content}\n </pre>\n </div>\n </div>\n );\n }\n);\nThinkingSection.displayName = \"ThinkingSection\";\n\nexport { ThinkingSection };\n","/**\n * Action Bar Component\n *\n * Displays copy, feedback, and timing actions for the response\n */\n\nimport * as React from \"react\";\nimport { useState, useCallback } from \"react\";\nimport { Copy, Check, ThumbsUp, ThumbsDown } from \"lucide-react\";\nimport { cn } from \"@optilogic/core\";\nimport { formatTotalTime } from \"../utils\";\nimport type { FeedbackValue } from \"../types\";\n\nexport interface ActionBarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The response text (for copying) */\n response: string;\n /** Whether the action bar is visible */\n isVisible: boolean;\n /** Total time in seconds */\n totalTimeSeconds: number;\n /** Current feedback value */\n feedback?: FeedbackValue;\n /** Callback when feedback changes */\n onFeedbackChange?: (feedback: FeedbackValue) => void;\n /** Callback when response is copied */\n onResponseCopy?: (response: string) => void;\n}\n\n/**\n * ActionBar Component\n *\n * Displays action buttons for copying the response, providing feedback,\n * and showing total response time.\n *\n * @example\n * <ActionBar\n * response={state.response}\n * isVisible={isHovered}\n * totalTimeSeconds={totalTime}\n * feedback={feedback}\n * onFeedbackChange={setFeedback}\n * onCopy={handleCopy}\n * />\n */\nconst ActionBar = React.forwardRef<HTMLDivElement, ActionBarProps>(\n (\n {\n response,\n isVisible,\n totalTimeSeconds,\n feedback,\n onFeedbackChange,\n onResponseCopy,\n className,\n ...props\n },\n ref\n ) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(response);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n onResponseCopy?.(response);\n } catch (err) {\n console.error(\"Failed to copy response:\", err);\n }\n }, [response, onResponseCopy]);\n\n const handleThumbsUp = useCallback(() => {\n const newValue = feedback === \"up\" ? null : \"up\";\n onFeedbackChange?.(newValue);\n }, [feedback, onFeedbackChange]);\n\n const handleThumbsDown = useCallback(() => {\n const newValue = feedback === \"down\" ? null : \"down\";\n onFeedbackChange?.(newValue);\n }, [feedback, onFeedbackChange]);\n\n const isThumbsUp = feedback === \"up\";\n const isThumbsDown = feedback === \"down\";\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex items-center justify-between px-4 py-2\",\n \"transition-opacity duration-200\",\n isVisible ? \"opacity-100\" : \"opacity-0 pointer-events-none\",\n className\n )}\n {...props}\n >\n {/* Left side - action buttons */}\n <div className=\"flex items-center gap-1\">\n {/* Copy button */}\n <button\n onClick={handleCopy}\n className=\"p-1.5 rounded hover:bg-muted transition-colors text-muted-foreground hover:text-foreground\"\n title={copied ? \"Copied!\" : \"Copy response\"}\n >\n {copied ? (\n <Check className=\"w-4 h-4 text-green-500\" />\n ) : (\n <Copy className=\"w-4 h-4\" />\n )}\n </button>\n\n {/* Thumbs up */}\n <button\n onClick={handleThumbsUp}\n className={cn(\n \"p-1.5 rounded hover:bg-muted transition-colors\",\n isThumbsUp\n ? \"text-green-500\"\n : \"text-muted-foreground hover:text-foreground\"\n )}\n title=\"Good response\"\n >\n <ThumbsUp className={cn(\"w-4 h-4\", isThumbsUp && \"fill-current\")} />\n </button>\n\n {/* Thumbs down */}\n <button\n onClick={handleThumbsDown}\n className={cn(\n \"p-1.5 rounded hover:bg-muted transition-colors\",\n isThumbsDown\n ? \"text-red-500\"\n : \"text-muted-foreground hover:text-foreground\"\n )}\n title=\"Poor response\"\n >\n <ThumbsDown className={cn(\"w-4 h-4\", isThumbsDown && \"fill-current\")} />\n </button>\n </div>\n\n {/* Right side - timing info */}\n <span className=\"text-xs text-muted-foreground\">\n Total time: {formatTotalTime(totalTimeSeconds)}\n </span>\n </div>\n );\n }\n);\nActionBar.displayName = \"ActionBar\";\n\nexport { ActionBar };\n","/**\n * useThinkingTimer Hook\n *\n * Tracks elapsed time during agent thinking/processing\n */\n\nimport { useState, useEffect } from \"react\";\nimport type { AgentResponseStatus } from \"../types\";\n\nexport interface UseThinkingTimerOptions {\n startTime: number | null;\n endTime: number | null;\n status: AgentResponseStatus;\n}\n\n/**\n * Custom hook for thinking timer\n * Returns elapsed time in seconds\n */\nexport function useThinkingTimer({\n startTime,\n endTime,\n status,\n}: UseThinkingTimerOptions): number {\n const [elapsed, setElapsed] = useState(0);\n\n useEffect(() => {\n if (!startTime) {\n setElapsed(0);\n return;\n }\n\n // If complete, calculate final elapsed time\n if (status === \"complete\" && endTime) {\n setElapsed((endTime - startTime) / 1000);\n return;\n }\n\n // If still processing, update every second\n if (status === \"processing\") {\n const updateElapsed = () => {\n setElapsed((Date.now() - startTime) / 1000);\n };\n\n updateElapsed(); // Initial update\n const interval = setInterval(updateElapsed, 1000);\n return () => clearInterval(interval);\n }\n }, [startTime, endTime, status]);\n\n return elapsed;\n}\n","/**\n * Agent Response Component Types\n *\n * Type definitions for the library-ready agent response component\n */\n\n/**\n * Status of the agent response cycle\n */\nexport type AgentResponseStatus = \"idle\" | \"processing\" | \"complete\";\n\n/**\n * Feedback value for the response\n */\nexport type FeedbackValue = \"up\" | \"down\" | null;\n\n/**\n * Tool call information from the agent\n */\nexport interface ToolCall {\n id: string;\n name: string;\n arguments?: Record<string, unknown>;\n timestamp: number;\n}\n\n/**\n * Knowledge retrieval information\n */\nexport interface KnowledgeItem {\n id: string;\n source: string;\n content: string;\n timestamp: number;\n}\n\n/**\n * Memory access information\n */\nexport interface MemoryItem {\n id: string;\n type: string;\n content: string;\n timestamp: number;\n}\n\n/**\n * State shape for the agent response component\n */\nexport interface AgentResponseState {\n /** Current status of the response cycle */\n status: AgentResponseStatus;\n /** Accumulated thinking/reasoning text */\n thinking: string;\n /** Tool calls made during processing */\n toolCalls: ToolCall[];\n /** Knowledge items retrieved */\n knowledge: KnowledgeItem[];\n /** Memory items accessed */\n memory: MemoryItem[];\n /** Final response text */\n response: string;\n /** Timestamp when first thinking message was received (for timer) */\n thinkingStartTime: number | null;\n /** Timestamp when response was completed (for final timer display) */\n responseCompleteTime: number | null;\n /** Timestamp when first message of any type was received (for total time) */\n firstMessageTime: number | null;\n}\n\n/**\n * WebSocket message payload for agent responses\n */\nexport interface AgentMessage {\n type: \"status\" | \"thinking\" | \"tool_call\" | \"knowledge\" | \"memory\" | \"response\";\n /** Message content - for simple string payloads */\n message?: string;\n /** Alternative content field */\n content?: string;\n /** For status messages */\n status?: string;\n /** For tool_call messages */\n tool?: {\n id: string;\n name: string;\n arguments?: Record<string, unknown>;\n };\n /** For knowledge messages */\n knowledge?: {\n id: string;\n source: string;\n content: string;\n };\n /** For memory messages */\n memory?: {\n id: string;\n type: string;\n content: string;\n };\n}\n\n/**\n * Generic websocket message wrapper type\n */\nexport interface GenericWebSocketMessage {\n topic: string;\n message: AgentMessage;\n accountId?: string;\n}\n\n/**\n * Initial state for the agent response component\n */\nexport const initialAgentResponseState: AgentResponseState = {\n status: \"idle\",\n thinking: \"\",\n toolCalls: [],\n knowledge: [],\n memory: [],\n response: \"\",\n thinkingStartTime: null,\n responseCompleteTime: null,\n firstMessageTime: null,\n};\n","/**\n * useAgentResponseAccumulator Hook\n *\n * Accumulates agent response messages into a unified state\n */\n\nimport { useState, useCallback } from \"react\";\nimport {\n initialAgentResponseState,\n type AgentResponseState,\n type AgentMessage,\n type GenericWebSocketMessage,\n type ToolCall,\n type KnowledgeItem,\n type MemoryItem,\n} from \"../types\";\n\nexport interface UseAgentResponseAccumulatorOptions {\n /** WebSocket topic to filter messages (optional, for convenience) */\n topic?: string;\n}\n\nexport interface UseAgentResponseAccumulatorReturn {\n /** Current accumulated state */\n state: AgentResponseState;\n\n /** Handler to process incoming messages */\n handleMessage: (message: unknown) => void;\n\n /** Reset state to initial */\n reset: () => void;\n}\n\n/**\n * Hook for accumulating agent response messages into a unified state\n *\n * @example\n * const { state, handleMessage, reset } = useAgentResponseAccumulator({ topic: \"agent\" });\n *\n * // In your WebSocket handler:\n * websocket.onmessage = (event) => {\n * handleMessage(JSON.parse(event.data));\n * };\n */\nexport function useAgentResponseAccumulator(\n options?: UseAgentResponseAccumulatorOptions\n): UseAgentResponseAccumulatorReturn {\n const [state, setState] = useState<AgentResponseState>(initialAgentResponseState);\n const topic = options?.topic;\n\n const handleMessage = useCallback(\n (message: unknown) => {\n // If topic filter is provided, check for matching topic\n let payload: AgentMessage;\n\n if (topic) {\n const msg = message as GenericWebSocketMessage;\n if (msg.topic !== topic) return;\n payload = msg.message;\n } else {\n // Assume message is the payload directly\n payload = message as AgentMessage;\n }\n\n setState((prev) => {\n // If we receive a non-status message while idle, transition to processing\n let newStatus = prev.status;\n const isFirstMessage = prev.status === \"idle\" && payload.type !== \"status\";\n if (isFirstMessage) {\n newStatus = \"processing\";\n }\n\n // Track first message time for total time calculation\n const firstMessageTime =\n prev.firstMessageTime ?? (isFirstMessage ? Date.now() : null);\n\n switch (payload.type) {\n case \"status\":\n // \"Harness connected\" resets to idle\n if (\n payload.message === \"Harness connected\" ||\n payload.status === \"Harness connected\"\n ) {\n return { ...initialAgentResponseState };\n }\n return { ...prev, status: newStatus };\n\n case \"thinking\": {\n const newThinking = payload.message || payload.content || \"\";\n // Add line break between thinking messages\n const separator = prev.thinking && newThinking ? \"\\n\\n\" : \"\";\n // Set thinkingStartTime on first thinking message\n const thinkingStartTime =\n prev.thinkingStartTime ?? (newThinking ? Date.now() : null);\n return {\n ...prev,\n status: newStatus,\n thinking: prev.thinking + separator + newThinking,\n thinkingStartTime,\n firstMessageTime,\n };\n }\n\n case \"tool_call\": {\n // Handle both formats: { message: \"ToolName\" } or { tool: { id, name, arguments } }\n const toolName = payload.message || payload.tool?.name;\n if (toolName) {\n const newToolCall: ToolCall = {\n id: payload.tool?.id || `tool-${Date.now()}`,\n name: toolName,\n arguments: payload.tool?.arguments,\n timestamp: Date.now(),\n };\n return {\n ...prev,\n status: newStatus,\n toolCalls: [...prev.toolCalls, newToolCall],\n firstMessageTime,\n };\n }\n return { ...prev, status: newStatus, firstMessageTime };\n }\n\n case \"knowledge\": {\n // Handle both formats: { message: \"content\" } or { knowledge: { id, source, content } }\n const knowledgeContent = payload.message || payload.knowledge?.content;\n if (knowledgeContent) {\n const newKnowledge: KnowledgeItem = {\n id: payload.knowledge?.id || `knowledge-${Date.now()}`,\n source: payload.knowledge?.source || \"unknown\",\n content: knowledgeContent,\n timestamp: Date.now(),\n };\n return {\n ...prev,\n status: newStatus,\n knowledge: [...prev.knowledge, newKnowledge],\n firstMessageTime,\n };\n }\n return { ...prev, status: newStatus, firstMessageTime };\n }\n\n case \"memory\": {\n // Handle both formats: { message: \"content\" } or { memory: { id, type, content } }\n const memoryContent = payload.message || payload.memory?.content;\n if (memoryContent) {\n const newMemory: MemoryItem = {\n id: payload.memory?.id || `memory-${Date.now()}`,\n type: payload.memory?.type || \"unknown\",\n content: memoryContent,\n timestamp: Date.now(),\n };\n return {\n ...prev,\n status: newStatus,\n memory: [...prev.memory, newMemory],\n firstMessageTime,\n };\n }\n return { ...prev, status: newStatus, firstMessageTime };\n }\n\n case \"response\":\n return {\n ...prev,\n status: \"complete\",\n response: payload.message || payload.content || \"\",\n responseCompleteTime: Date.now(),\n firstMessageTime: prev.firstMessageTime ?? Date.now(),\n };\n\n default:\n return { ...prev, status: newStatus, firstMessageTime };\n }\n });\n },\n [topic]\n );\n\n const reset = useCallback(() => {\n setState(initialAgentResponseState);\n }, []);\n\n return { state, handleMessage, reset };\n}\n","/**\n * AgentResponse Component\n *\n * A library-ready presentational component for displaying AI agent responses.\n * Displays thinking, tool calls, knowledge retrieval, memory access, and final response.\n */\n\nimport * as React from \"react\";\nimport { useState, useMemo, useCallback } from \"react\";\nimport { cn } from \"@optilogic/core\";\nimport { MetadataRow, ThinkingSection, ActionBar } from \"./components\";\nimport { useThinkingTimer } from \"./hooks\";\nimport type { AgentResponseState, FeedbackValue } from \"./types\";\n\nexport interface AgentResponseProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The response state to render */\n state: AgentResponseState;\n\n /** Optional unique ID (for list keys) */\n id?: string;\n\n /** Optional timestamp to display */\n timestamp?: Date;\n\n /** Feedback state (controlled) */\n feedback?: FeedbackValue;\n onFeedbackChange?: (feedback: FeedbackValue) => void;\n\n /** Callback when the response is copied via the action bar */\n onResponseCopy?: (response: string) => void;\n\n /** Thinking section expansion (controlled or uncontrolled) */\n defaultThinkingExpanded?: boolean;\n thinkingExpanded?: boolean;\n onThinkingExpandedChange?: (expanded: boolean) => void;\n\n /** Action bar visibility mode */\n actionsVisible?: boolean | \"hover\";\n\n /**\n * Custom markdown renderer for the response content.\n * If not provided, the response will be rendered as plain text.\n *\n * @example\n * <AgentResponse\n * state={state}\n * renderMarkdown={(content) => <MyMarkdownRenderer content={content} />}\n * />\n */\n renderMarkdown?: (content: string) => React.ReactNode;\n}\n\n/**\n * AgentResponse Component\n *\n * A complete component for displaying AI agent responses including:\n * - Thinking/reasoning content (collapsible)\n * - Tool calls, knowledge retrieval, and memory access indicators\n * - Final response with optional markdown rendering\n * - Action bar with copy and feedback buttons\n *\n * @example\n * // Basic usage with useAgentResponseAccumulator hook\n * const { state, handleMessage } = useAgentResponseAccumulator();\n *\n * <AgentResponse state={state} />\n *\n * @example\n * // With markdown rendering and feedback\n * <AgentResponse\n * state={state}\n * renderMarkdown={(content) => <ReactMarkdown>{content}</ReactMarkdown>}\n * feedback={feedback}\n * onFeedbackChange={setFeedback}\n * />\n *\n * @example\n * // Controlled thinking expansion\n * <AgentResponse\n * state={state}\n * thinkingExpanded={isExpanded}\n * onThinkingExpandedChange={setIsExpanded}\n * />\n */\nconst AgentResponse = React.forwardRef<HTMLDivElement, AgentResponseProps>(\n (\n {\n state,\n id,\n timestamp,\n feedback,\n onFeedbackChange,\n onResponseCopy,\n defaultThinkingExpanded = false,\n thinkingExpanded: controlledThinkingExpanded,\n onThinkingExpandedChange,\n actionsVisible = \"hover\",\n renderMarkdown,\n className,\n ...props\n },\n ref\n ) => {\n // Uncontrolled thinking expanded state\n const [uncontrolledExpanded, setUncontrolledExpanded] = useState(defaultThinkingExpanded);\n\n // Determine if thinking is controlled\n const isThinkingControlled = controlledThinkingExpanded !== undefined;\n const thinkingExpanded = isThinkingControlled\n ? controlledThinkingExpanded\n : uncontrolledExpanded;\n\n // Toggle thinking handler\n const toggleThinking = useCallback(() => {\n const newValue = !thinkingExpanded;\n if (isThinkingControlled) {\n onThinkingExpandedChange?.(newValue);\n } else {\n setUncontrolledExpanded(newValue);\n }\n }, [thinkingExpanded, isThinkingControlled, onThinkingExpandedChange]);\n\n // Hover state for action bar visibility\n const [isHovered, setIsHovered] = useState(false);\n\n // Thinking timer\n const elapsedTime = useThinkingTimer({\n startTime: state.thinkingStartTime,\n endTime: state.responseCompleteTime,\n status: state.status,\n });\n\n // Calculate total time (from first message to response complete)\n const totalTimeSeconds = useMemo(() => {\n if (!state.firstMessageTime || !state.responseCompleteTime) return 0;\n return (state.responseCompleteTime - state.firstMessageTime) / 1000;\n }, [state.firstMessageTime, state.responseCompleteTime]);\n\n // Derived state: has any content been received?\n const hasAnyContent =\n state.thinking ||\n state.toolCalls.length > 0 ||\n state.knowledge.length > 0 ||\n state.memory.length > 0 ||\n state.response;\n\n // Derived state: should show metadata row?\n const showMetadataRow =\n state.thinking ||\n state.toolCalls.length > 0 ||\n state.knowledge.length > 0 ||\n state.memory.length > 0 ||\n state.status === \"processing\";\n\n // Determine action bar visibility\n const showActionBar = state.status === \"complete\" && state.response;\n const isActionBarVisible =\n actionsVisible === true ||\n (actionsVisible === \"hover\" && isHovered);\n\n // If no content, render nothing\n if (!hasAnyContent) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n className={className}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...props}\n >\n {/* Message Content Container */}\n <div className=\"border border-border rounded-lg overflow-hidden\">\n {/* Metadata Row - show if there's any metadata or thinking */}\n {showMetadataRow && (\n <>\n <MetadataRow\n hasThinking={!!state.thinking}\n isExpanded={thinkingExpanded}\n onToggle={toggleThinking}\n toolCalls={state.toolCalls}\n knowledge={state.knowledge}\n memory={state.memory}\n status={state.status}\n elapsedTime={elapsedTime}\n />\n\n {/* Thinking Content - collapsible with max-height */}\n <ThinkingSection\n content={state.thinking}\n isExpanded={thinkingExpanded}\n />\n </>\n )}\n\n {/* Response Section */}\n {state.response && (\n <div\n className={cn(\n \"bg-muted/50 p-4\",\n showMetadataRow && \"border-t border-border\"\n )}\n >\n {renderMarkdown ? (\n renderMarkdown(state.response)\n ) : (\n <span className=\"whitespace-pre-wrap\">{state.response}</span>\n )}\n </div>\n )}\n </div>\n\n {/* Action Bar - outside the message container, visible on hover when complete */}\n {showActionBar && (\n <ActionBar\n response={state.response}\n isVisible={isActionBarVisible}\n totalTimeSeconds={totalTimeSeconds}\n feedback={feedback}\n onFeedbackChange={onFeedbackChange}\n onResponseCopy={onResponseCopy}\n />\n )}\n </div>\n );\n }\n);\nAgentResponse.displayName = \"AgentResponse\";\n\nexport { AgentResponse };\n","import * as React from \"react\";\nimport { cn } from \"@optilogic/core\";\n\nexport interface UserPromptProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The text content of the user's message */\n content: string;\n /** Optional timestamp to display below the message */\n timestamp?: Date;\n}\n\n/**\n * UserPrompt component\n *\n * Displays a user's chat message in a styled bubble.\n * Used alongside AgentResponse to create chat interfaces.\n *\n * @example\n * ```tsx\n * <UserPrompt\n * content=\"What is the weather today?\"\n * timestamp={new Date()}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Custom styling\n * <UserPrompt\n * content=\"Hello world\"\n * className=\"max-w-full\"\n * />\n * ```\n */\nexport const UserPrompt = React.forwardRef<HTMLDivElement, UserPromptProps>(\n ({ content, timestamp, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"w-fit max-w-[80%] rounded-lg px-4 pt-3.5 pb-3\",\n \"bg-secondary text-secondary-foreground\",\n className\n )}\n {...props}\n >\n <p className=\"whitespace-pre-wrap\">{content}</p>\n {timestamp && (\n <p className=\"text-xs text-secondary-foreground/70 mt-1\">\n {timestamp.toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </p>\n )}\n </div>\n );\n }\n);\n\nUserPrompt.displayName = \"UserPrompt\";\n","import * as React from \"react\";\nimport { Send, Loader2 } from \"lucide-react\";\nimport { cn, IconButton } from \"@optilogic/core\";\nimport {\n SlateEditor,\n Text,\n type SlateEditorRef,\n type NodeEntry,\n type DecoratedRange,\n type RenderLeafProps,\n} from \"@optilogic/editor\";\nimport type { UserPromptInputProps, UserPromptInputRef } from \"./types\";\n\n/**\n * Creates a decorate function that highlights code blocks.\n * Handles both complete (```...```) and unclosed (```...) code blocks.\n */\nfunction createCodeBlockDecorate(entry: NodeEntry): DecoratedRange[] {\n const [node, path] = entry;\n const ranges: DecoratedRange[] = [];\n\n if (!Text.isText(node)) {\n return ranges;\n }\n\n const { text } = node;\n\n // Find all ``` positions\n const backtickPositions: number[] = [];\n let searchStart = 0;\n while (true) {\n const pos = text.indexOf(\"```\", searchStart);\n if (pos === -1) break;\n backtickPositions.push(pos);\n searchStart = pos + 3;\n }\n\n // Process pairs of backticks (and handle unclosed blocks)\n let i = 0;\n while (i < backtickPositions.length) {\n const openPos = backtickPositions[i];\n const closePos = backtickPositions[i + 1];\n\n // Mark opening delimiter\n ranges.push({\n anchor: { path, offset: openPos },\n focus: { path, offset: openPos + 3 },\n codeDelimiter: true,\n } as DecoratedRange);\n\n if (closePos !== undefined) {\n // Complete code block - mark content and closing delimiter\n if (closePos > openPos + 3) {\n ranges.push({\n anchor: { path, offset: openPos + 3 },\n focus: { path, offset: closePos },\n codeBlock: true,\n } as DecoratedRange);\n }\n ranges.push({\n anchor: { path, offset: closePos },\n focus: { path, offset: closePos + 3 },\n codeDelimiter: true,\n } as DecoratedRange);\n i += 2; // Move past both opening and closing\n } else {\n // Unclosed code block - mark everything to end as code\n if (text.length > openPos + 3) {\n ranges.push({\n anchor: { path, offset: openPos + 3 },\n focus: { path, offset: text.length },\n codeBlock: true,\n } as DecoratedRange);\n }\n i += 1; // Move past opening only\n }\n }\n\n return ranges;\n}\n\n/**\n * Custom leaf renderer for code block styling\n */\nfunction CodeBlockLeaf({ attributes, children, leaf }: RenderLeafProps) {\n const leafAny = leaf as { codeBlock?: boolean; codeDelimiter?: boolean };\n\n if (leafAny.codeBlock) {\n return (\n <span\n {...attributes}\n className=\"bg-muted/50 text-muted-foreground font-mono text-sm rounded px-1\"\n >\n {children}\n </span>\n );\n }\n\n if (leafAny.codeDelimiter) {\n return (\n <span\n {...attributes}\n className=\"text-muted-foreground/50 font-mono text-sm\"\n >\n {children}\n </span>\n );\n }\n\n return <span {...attributes}>{children}</span>;\n}\n\n/**\n * UserPromptInput Component\n *\n * A rich text input for user messages that wraps SlateEditor.\n * Features:\n * - Code block styling with triple backticks\n * - Send button with loading state\n * - Action slot for additional buttons\n * - Tag support (optional)\n *\n * @example\n * <UserPromptInput\n * placeholder=\"Type your message...\"\n * onSubmit={(text) => sendMessage(text)}\n * renderActions={() => (\n * <IconButton icon={<Paperclip />} aria-label=\"Attach file\" />\n * )}\n * />\n */\nexport const UserPromptInput = React.forwardRef<\n UserPromptInputRef,\n UserPromptInputProps\n>(\n (\n {\n value = \"\",\n onChange,\n onSubmit,\n clearOnSubmit = true,\n placeholder = \"Type your message...\",\n disabled = false,\n isSubmitting = false,\n minRows = 1,\n maxRows = 6,\n renderActions,\n enableTags = false,\n onTagCreate,\n onTagDelete,\n className,\n ...props\n },\n ref\n ) => {\n const editorRef = React.useRef<SlateEditorRef>(null);\n const [internalValue, setInternalValue] = React.useState(value);\n\n // Sync internal value with prop\n React.useEffect(() => {\n setInternalValue(value);\n }, [value]);\n\n // Expose ref methods\n React.useImperativeHandle(\n ref,\n () => ({\n focus: () => editorRef.current?.focus(),\n clear: () => {\n editorRef.current?.clear();\n setInternalValue(\"\");\n },\n getText: () => editorRef.current?.getText() ?? \"\",\n insertText: (text: string) => editorRef.current?.insertText(text),\n }),\n []\n );\n\n const handleChange = React.useCallback(\n (newValue: string) => {\n setInternalValue(newValue);\n onChange?.(newValue);\n },\n [onChange]\n );\n\n const handleSubmit = React.useCallback(\n (text: string) => {\n if (disabled || isSubmitting) return;\n if (!text.trim()) return;\n\n onSubmit?.(text.trim());\n\n if (clearOnSubmit) {\n editorRef.current?.clear();\n setInternalValue(\"\");\n }\n },\n [disabled, isSubmitting, onSubmit, clearOnSubmit]\n );\n\n const handleSendClick = React.useCallback(() => {\n const text = editorRef.current?.getText() ?? \"\";\n handleSubmit(text);\n }, [handleSubmit]);\n\n const hasContent = internalValue.trim().length > 0;\n const canSubmit = hasContent && !disabled && !isSubmitting;\n\n return (\n <div\n className={cn(\n \"rounded-lg border border-input bg-background\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n {...props}\n >\n {/* Editor area */}\n <div className=\"pl-2 pr-0 pt-1 pb-1\">\n <SlateEditor\n ref={editorRef}\n value={internalValue}\n onChange={handleChange}\n onSubmit={handleSubmit}\n clearOnSubmit={false}\n placeholder={placeholder}\n disabled={disabled || isSubmitting}\n enableTags={enableTags}\n onTagCreate={onTagCreate}\n onTagDelete={onTagDelete}\n minRows={minRows}\n maxRows={maxRows}\n decorate={createCodeBlockDecorate}\n renderLeaf={CodeBlockLeaf}\n />\n </div>\n\n {/* Actions row */}\n <div className=\"flex items-center justify-between pl-2 pr-1 pb-1 pt-1\">\n {/* Left actions slot */}\n <div className=\"flex items-center gap-1\">{renderActions?.()}</div>\n\n {/* Send button */}\n <IconButton\n icon={\n isSubmitting ? (\n <Loader2 className=\"animate-spin\" />\n ) : (\n <Send />\n )\n }\n variant=\"filled\"\n size=\"sm\"\n aria-label={isSubmitting ? \"Sending...\" : \"Send message\"}\n disabled={!canSubmit}\n onClick={handleSendClick}\n />\n </div>\n </div>\n );\n }\n);\n\nUserPromptInput.displayName = \"UserPromptInput\";\n"]}
1
+ {"version":3,"sources":["../src/components/agent-response/components/ActivityIndicators.tsx","../src/components/agent-response/utils.ts","../src/components/agent-response/components/MetadataRow.tsx","../src/components/agent-response/components/ThinkingSection.tsx","../src/components/agent-response/components/ActionBar.tsx","../src/components/agent-response/hooks/useThinkingTimer.ts","../src/components/agent-response/types.ts","../src/components/agent-response/hooks/useAgentResponseAccumulator.ts","../src/components/agent-response/AgentResponse.tsx","../src/components/user-prompt/UserPrompt.tsx","../src/components/user-prompt-input/UserPromptInput.tsx"],"names":["React","jsxs","cn","Popover","jsx","PopoverTrigger","Activity","PopoverContent","Wrench","Book","HardDrive","React2","ChevronUp","ChevronDown","LoadingSpinner","useState","useCallback","ChevronRight","React3","React4","Check","Copy","ThumbsUp","ThumbsDown","useEffect","thinkingStartTime","React5","useMemo","Fragment","React6","Text","React7","SlateEditor","IconButton","Square","Loader2","Send"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Activity Indicators Component\n *\n * Displays tool, knowledge, memory icons with counts and popovers\n */\n\nimport * as React from \"react\";\nimport { Wrench, Book, HardDrive, Activity } from \"lucide-react\";\nimport { cn, Popover, PopoverTrigger, PopoverContent } from \"@optilogic/core\";\nimport type { ToolCall, KnowledgeItem, MemoryItem, StatusItem } from \"../types\";\n\nexport interface ActivityIndicatorsProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool calls to display */\n toolCalls: ToolCall[];\n /** Knowledge items to display */\n knowledge: KnowledgeItem[];\n /** Memory items to display */\n memory: MemoryItem[];\n /** Status updates to display */\n statusUpdates?: StatusItem[];\n}\n\n/**\n * ActivityIndicators Component\n *\n * Displays icons with counts for tool calls, knowledge retrieval, and memory access.\n * Each icon has a popover showing details when clicked.\n *\n * @example\n * <ActivityIndicators\n * toolCalls={state.toolCalls}\n * knowledge={state.knowledge}\n * memory={state.memory}\n * />\n */\nconst ActivityIndicators = React.forwardRef<HTMLDivElement, ActivityIndicatorsProps>(\n ({ toolCalls, knowledge, memory, statusUpdates = [], className, ...props }, ref) => {\n const hasAnyActivity =\n toolCalls.length > 0 || knowledge.length > 0 || memory.length > 0 || statusUpdates.length > 0;\n\n if (!hasAnyActivity) return null;\n\n return (\n <div ref={ref} className={cn(\"flex items-center gap-2\", className)} {...props}>\n {/* Status Updates */}\n {statusUpdates.length > 0 && (\n <Popover>\n <PopoverTrigger asChild>\n <button\n className=\"flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors\"\n onClick={(e) => e.stopPropagation()}\n >\n <Activity className=\"w-3.5 h-3.5\" />\n <span className=\"text-xs\">{statusUpdates.length}</span>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-80\">\n <div className=\"space-y-2\">\n <h4 className=\"font-medium text-sm\">Status Updates</h4>\n <div className=\"space-y-2 max-h-60 overflow-auto\">\n {statusUpdates.map((item) => (\n <div key={item.id} className=\"p-2 bg-muted rounded text-xs\">\n {item.agent && (\n <div className=\"font-medium text-muted-foreground\">{item.agent}</div>\n )}\n <div className={item.agent ? \"mt-1\" : \"\"}>{item.message}</div>\n </div>\n ))}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )}\n\n {/* Tool Calls */}\n {toolCalls.length > 0 && (\n <Popover>\n <PopoverTrigger asChild>\n <button\n className=\"flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors\"\n onClick={(e) => e.stopPropagation()}\n >\n <Wrench className=\"w-3.5 h-3.5\" />\n <span className=\"text-xs\">{toolCalls.length}</span>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-80\">\n <div className=\"space-y-2\">\n <h4 className=\"font-medium text-sm\">Tool Calls</h4>\n <div className=\"space-y-2 max-h-60 overflow-auto\">\n {toolCalls.map((tool) => (\n <div key={tool.id} className=\"p-2 bg-muted rounded text-xs\">\n <div className=\"font-medium\">{tool.name}</div>\n {tool.arguments && (\n <pre className=\"mt-1 text-muted-foreground overflow-x-auto\">\n {JSON.stringify(tool.arguments, null, 2)}\n </pre>\n )}\n </div>\n ))}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )}\n\n {/* Knowledge */}\n {knowledge.length > 0 && (\n <Popover>\n <PopoverTrigger asChild>\n <button\n className=\"flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors\"\n onClick={(e) => e.stopPropagation()}\n >\n <Book className=\"w-3.5 h-3.5\" />\n <span className=\"text-xs\">{knowledge.length}</span>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-80\">\n <div className=\"space-y-2\">\n <h4 className=\"font-medium text-sm\">Knowledge Retrieved</h4>\n <div className=\"space-y-2 max-h-60 overflow-auto\">\n {knowledge.map((item) => (\n <div key={item.id} className=\"p-2 bg-muted rounded text-xs\">\n <div className=\"font-medium\">{item.source}</div>\n <div className=\"mt-1 text-muted-foreground\">\n {item.content}\n </div>\n </div>\n ))}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )}\n\n {/* Memory */}\n {memory.length > 0 && (\n <Popover>\n <PopoverTrigger asChild>\n <button\n className=\"flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors\"\n onClick={(e) => e.stopPropagation()}\n >\n <HardDrive className=\"w-3.5 h-3.5\" />\n <span className=\"text-xs\">{memory.length}</span>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-80\">\n <div className=\"space-y-2\">\n <h4 className=\"font-medium text-sm\">Memory Accessed</h4>\n <div className=\"space-y-2 max-h-60 overflow-auto\">\n {memory.map((item) => (\n <div key={item.id} className=\"p-2 bg-muted rounded text-xs\">\n <div className=\"font-medium\">{item.type}</div>\n <div className=\"mt-1 text-muted-foreground\">\n {item.content}\n </div>\n </div>\n ))}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )}\n </div>\n );\n }\n);\nActivityIndicators.displayName = \"ActivityIndicators\";\n\nexport { ActivityIndicators };\n","/**\n * Agent Response Utility Functions\n */\n\n/**\n * Format elapsed time for display\n * - Under 60s: \"Xs\" (e.g., \"23s\")\n * - 60+ seconds while active: \"M:SS\" (e.g., \"1:23\")\n * - Complete under 60s: \"Xs\" (e.g., \"45s\")\n * - Complete 60-119s: \"1.X min\" (e.g., \"1.2 min\")\n * - Complete 120+ s: \"X.X min\" (e.g., \"2.5 min\")\n */\nexport function formatTime(seconds: number, isComplete: boolean): string {\n if (seconds < 1) {\n return isComplete ? \"<1s\" : \"0s\";\n }\n\n if (isComplete) {\n // Completed state formatting\n if (seconds < 60) {\n return `${Math.round(seconds)}s`;\n }\n const minutes = seconds / 60;\n return `${minutes.toFixed(1)} min`;\n }\n\n // Active state formatting\n if (seconds < 60) {\n return `${Math.floor(seconds)}s`;\n }\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, \"0\")}`;\n}\n\n/**\n * Format total time for action bar display\n */\nexport function formatTotalTime(seconds: number): string {\n if (seconds < 1) {\n return \"<1s\";\n }\n if (seconds < 60) {\n return `${seconds.toFixed(1)}s`;\n }\n const minutes = seconds / 60;\n return `${minutes.toFixed(1)}m`;\n}\n","/**\n * Metadata Row Component\n *\n * Displays thinking toggle, timer, and activity indicators\n */\n\nimport * as React from \"react\";\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\nimport { cn, LoadingSpinner } from \"@optilogic/core\";\nimport { ActivityIndicators } from \"./ActivityIndicators\";\nimport { formatTime } from \"../utils\";\nimport type { AgentResponseStatus, ToolCall, KnowledgeItem, MemoryItem, StatusItem } from \"../types\";\n\nexport interface MetadataRowProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Whether there is thinking content */\n hasThinking: boolean;\n /** Whether the thinking section is expanded */\n isExpanded: boolean;\n /** Toggle callback for thinking expansion */\n onToggle: () => void;\n /** Tool calls to display */\n toolCalls: ToolCall[];\n /** Knowledge items to display */\n knowledge: KnowledgeItem[];\n /** Memory items to display */\n memory: MemoryItem[];\n /** Status updates to display */\n statusUpdates?: StatusItem[];\n /** Current response status */\n status: AgentResponseStatus;\n /** Elapsed time in seconds */\n elapsedTime: number;\n}\n\n/**\n * MetadataRow Component\n *\n * Displays the metadata row with thinking toggle, timer, and activity indicators.\n * When thinking content is present, the row is clickable to toggle expansion.\n *\n * @example\n * <MetadataRow\n * hasThinking={!!state.thinking}\n * isExpanded={thinkingExpanded}\n * onToggle={toggleThinking}\n * toolCalls={state.toolCalls}\n * knowledge={state.knowledge}\n * memory={state.memory}\n * status={state.status}\n * elapsedTime={elapsedTime}\n * />\n */\nconst MetadataRow = React.forwardRef<HTMLDivElement, MetadataRowProps>(\n (\n {\n hasThinking,\n isExpanded,\n onToggle,\n toolCalls,\n knowledge,\n memory,\n statusUpdates = [],\n status,\n elapsedTime,\n className,\n ...props\n },\n ref\n ) => {\n const isProcessing = status === \"processing\";\n const isComplete = status === \"complete\";\n const hasActivity =\n toolCalls.length > 0 || knowledge.length > 0 || memory.length > 0 || statusUpdates.length > 0;\n\n // Determine what to show on the left side\n const renderLeftContent = () => {\n // If we have thinking text, show collapse toggle + label + timer\n if (hasThinking) {\n return (\n <div className=\"flex items-center gap-1.5\">\n {isExpanded ? (\n <ChevronUp className=\"w-3.5 h-3.5 text-muted-foreground\" />\n ) : (\n <ChevronDown className=\"w-3.5 h-3.5 text-muted-foreground\" />\n )}\n <span className=\"text-xs text-muted-foreground\">\n {isComplete\n ? `Thought for ${formatTime(elapsedTime, true)}`\n : `Thinking... ${formatTime(elapsedTime, false)}`}\n </span>\n </div>\n );\n }\n\n // If processing but no thinking text yet, show spinner\n if (isProcessing) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <LoadingSpinner size=\"sm\" variant=\"muted\" className=\"w-3.5 h-3.5\" />\n <span className=\"text-xs text-muted-foreground\">Processing</span>\n </div>\n );\n }\n\n // Complete with no thinking - show nothing on left (just activity on right)\n return null;\n };\n\n const leftContent = renderLeftContent();\n\n // If nothing to show (no thinking, not processing, no activity), hide the row\n if (!leftContent && !hasActivity) {\n return null;\n }\n\n // Always use a div for the row to avoid nesting buttons\n // When there's thinking, only the left side is clickable\n return (\n <div\n ref={ref}\n className={cn(\"w-full flex items-center justify-between px-3 py-2\", className)}\n {...props}\n >\n {/* Left content - clickable when there's thinking */}\n {hasThinking ? (\n <button\n onClick={onToggle}\n className=\"flex items-center gap-1.5 hover:bg-muted/50 -ml-1.5 pl-1.5 pr-2 py-0.5 rounded transition-colors\"\n >\n {leftContent}\n </button>\n ) : (\n <div className=\"flex items-center gap-1.5\">\n {leftContent}\n </div>\n )}\n <ActivityIndicators\n toolCalls={toolCalls}\n knowledge={knowledge}\n memory={memory}\n statusUpdates={statusUpdates}\n />\n </div>\n );\n }\n);\nMetadataRow.displayName = \"MetadataRow\";\n\nexport { MetadataRow };\n","/**\n * Thinking Section Component\n *\n * Collapsible section for displaying agent thinking/reasoning content.\n * Supports both plain text and structured collapsible sub-sections.\n */\n\nimport * as React from \"react\";\nimport { useState, useCallback } from \"react\";\nimport { ChevronDown, ChevronRight } from \"lucide-react\";\nimport { cn } from \"@optilogic/core\";\nimport type { ThinkingStep } from \"../types\";\n\nexport interface ThinkingSectionProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"content\"> {\n /** The thinking content to display (string or structured steps) */\n content: string | ThinkingStep[];\n /** Whether the section is expanded */\n isExpanded: boolean;\n /**\n * Custom markdown renderer for the thinking content.\n * If not provided, the content will be rendered as plain preformatted text.\n */\n renderMarkdown?: (content: string) => React.ReactNode;\n}\n\n/**\n * Internal component for rendering a collapsible thinking step\n */\ninterface ThinkingStepItemProps {\n step: ThinkingStep;\n renderMarkdown?: (content: string) => React.ReactNode;\n}\n\nconst ThinkingStepItem: React.FC<ThinkingStepItemProps> = ({ step, renderMarkdown }) => {\n const [isCollapsed, setIsCollapsed] = useState(step.isCollapsed ?? false);\n\n const toggleCollapse = useCallback(() => {\n setIsCollapsed((prev) => !prev);\n }, []);\n\n const indentPadding = step.depth * 16;\n\n return (\n <div className=\"border-b border-border/50 last:border-b-0\">\n <button\n onClick={toggleCollapse}\n className=\"w-full flex items-center gap-1.5 py-1.5 px-2 hover:bg-muted/50 transition-colors text-left\"\n style={{ paddingLeft: `${indentPadding + 8}px` }}\n >\n {isCollapsed ? (\n <ChevronRight className=\"w-3 h-3 text-muted-foreground flex-shrink-0\" />\n ) : (\n <ChevronDown className=\"w-3 h-3 text-muted-foreground flex-shrink-0\" />\n )}\n <span className=\"text-xs font-medium text-foreground/80\">{step.label}</span>\n </button>\n\n {!isCollapsed && (\n <div\n className=\"pb-2 px-2\"\n style={{ paddingLeft: `${indentPadding + 28}px` }}\n >\n {renderMarkdown ? (\n <div className=\"text-xs text-muted-foreground\">\n {renderMarkdown(step.content)}\n </div>\n ) : (\n <pre className=\"text-xs text-muted-foreground whitespace-pre-wrap font-mono\">\n {step.content}\n </pre>\n )}\n </div>\n )}\n </div>\n );\n};\n\n/**\n * ThinkingSection Component\n *\n * Displays the agent's thinking/reasoning content in a collapsible panel.\n * Supports both plain text content and structured collapsible sub-sections.\n *\n * @example\n * // Plain text content\n * <ThinkingSection content={state.thinking} isExpanded={isExpanded} />\n *\n * @example\n * // Structured content with sub-sections\n * <ThinkingSection\n * content={[\n * { id: \"1\", label: \"Analysis\", content: \"...\", depth: 0 },\n * { id: \"2\", label: \"Sub-analysis\", content: \"...\", depth: 1 },\n * ]}\n * isExpanded={isExpanded}\n * />\n */\nconst ThinkingSection = React.forwardRef<HTMLDivElement, ThinkingSectionProps>(\n ({ content, isExpanded, renderMarkdown, className, ...props }, ref) => {\n if (!isExpanded || !content || (Array.isArray(content) && content.length === 0)) {\n return null;\n }\n\n const isStructured = Array.isArray(content);\n\n return (\n <div\n ref={ref}\n className={cn(\"px-3 pb-3 border-t border-border\", className)}\n {...props}\n >\n <div className=\"mt-2 max-h-[200px] overflow-y-auto\">\n {isStructured ? (\n <div className=\"space-y-0\">\n {content.map((step) => (\n <ThinkingStepItem\n key={step.id}\n step={step}\n renderMarkdown={renderMarkdown}\n />\n ))}\n </div>\n ) : renderMarkdown ? (\n <div className=\"text-xs text-muted-foreground\">\n {renderMarkdown(content)}\n </div>\n ) : (\n <pre className=\"text-xs text-muted-foreground whitespace-pre-wrap font-mono\">\n {content}\n </pre>\n )}\n </div>\n </div>\n );\n }\n);\nThinkingSection.displayName = \"ThinkingSection\";\n\nexport { ThinkingSection };\n","/**\n * Action Bar Component\n *\n * Displays copy, feedback, and timing actions for the response\n */\n\nimport * as React from \"react\";\nimport { useState, useCallback } from \"react\";\nimport { Copy, Check, ThumbsUp, ThumbsDown } from \"lucide-react\";\nimport { cn } from \"@optilogic/core\";\nimport { formatTotalTime } from \"../utils\";\nimport type { FeedbackValue } from \"../types\";\n\nexport interface ActionBarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The response text (for copying) */\n response: string;\n /** Whether the action bar is visible */\n isVisible: boolean;\n /** Total time in seconds */\n totalTimeSeconds: number;\n /** Current feedback value */\n feedback?: FeedbackValue;\n /** Callback when feedback changes */\n onFeedbackChange?: (feedback: FeedbackValue) => void;\n /** Callback when response is copied */\n onResponseCopy?: (response: string) => void;\n}\n\n/**\n * ActionBar Component\n *\n * Displays action buttons for copying the response, providing feedback,\n * and showing total response time.\n *\n * @example\n * <ActionBar\n * response={state.response}\n * isVisible={isHovered}\n * totalTimeSeconds={totalTime}\n * feedback={feedback}\n * onFeedbackChange={setFeedback}\n * onCopy={handleCopy}\n * />\n */\nconst ActionBar = React.forwardRef<HTMLDivElement, ActionBarProps>(\n (\n {\n response,\n isVisible,\n totalTimeSeconds,\n feedback,\n onFeedbackChange,\n onResponseCopy,\n className,\n ...props\n },\n ref\n ) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(response);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n onResponseCopy?.(response);\n } catch (err) {\n console.error(\"Failed to copy response:\", err);\n }\n }, [response, onResponseCopy]);\n\n const handleThumbsUp = useCallback(() => {\n const newValue = feedback === \"up\" ? null : \"up\";\n onFeedbackChange?.(newValue);\n }, [feedback, onFeedbackChange]);\n\n const handleThumbsDown = useCallback(() => {\n const newValue = feedback === \"down\" ? null : \"down\";\n onFeedbackChange?.(newValue);\n }, [feedback, onFeedbackChange]);\n\n const isThumbsUp = feedback === \"up\";\n const isThumbsDown = feedback === \"down\";\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex items-center justify-between px-4 py-2\",\n \"transition-opacity duration-200\",\n isVisible ? \"opacity-100\" : \"opacity-0 pointer-events-none\",\n className\n )}\n {...props}\n >\n {/* Left side - action buttons */}\n <div className=\"flex items-center gap-1\">\n {/* Copy button */}\n <button\n onClick={handleCopy}\n className=\"p-1.5 rounded hover:bg-muted transition-colors text-muted-foreground hover:text-foreground\"\n title={copied ? \"Copied!\" : \"Copy response\"}\n >\n {copied ? (\n <Check className=\"w-4 h-4 text-green-500\" />\n ) : (\n <Copy className=\"w-4 h-4\" />\n )}\n </button>\n\n {/* Thumbs up */}\n <button\n onClick={handleThumbsUp}\n className={cn(\n \"p-1.5 rounded hover:bg-muted transition-colors\",\n isThumbsUp\n ? \"text-green-500\"\n : \"text-muted-foreground hover:text-foreground\"\n )}\n title=\"Good response\"\n >\n <ThumbsUp className={cn(\"w-4 h-4\", isThumbsUp && \"fill-current\")} />\n </button>\n\n {/* Thumbs down */}\n <button\n onClick={handleThumbsDown}\n className={cn(\n \"p-1.5 rounded hover:bg-muted transition-colors\",\n isThumbsDown\n ? \"text-red-500\"\n : \"text-muted-foreground hover:text-foreground\"\n )}\n title=\"Poor response\"\n >\n <ThumbsDown className={cn(\"w-4 h-4\", isThumbsDown && \"fill-current\")} />\n </button>\n </div>\n\n {/* Right side - timing info */}\n <span className=\"text-xs text-muted-foreground\">\n Total time: {formatTotalTime(totalTimeSeconds)}\n </span>\n </div>\n );\n }\n);\nActionBar.displayName = \"ActionBar\";\n\nexport { ActionBar };\n","/**\n * useThinkingTimer Hook\n *\n * Tracks elapsed time during agent thinking/processing\n */\n\nimport { useState, useEffect } from \"react\";\nimport type { AgentResponseStatus } from \"../types\";\n\nexport interface UseThinkingTimerOptions {\n startTime: number | null;\n endTime: number | null;\n status: AgentResponseStatus;\n}\n\n/**\n * Custom hook for thinking timer\n * Returns elapsed time in seconds\n */\nexport function useThinkingTimer({\n startTime,\n endTime,\n status,\n}: UseThinkingTimerOptions): number {\n const [elapsed, setElapsed] = useState(0);\n\n useEffect(() => {\n if (!startTime) {\n setElapsed(0);\n return;\n }\n\n // If complete, calculate final elapsed time\n if (status === \"complete\" && endTime) {\n setElapsed((endTime - startTime) / 1000);\n return;\n }\n\n // If still processing, update every second\n if (status === \"processing\") {\n const updateElapsed = () => {\n setElapsed((Date.now() - startTime) / 1000);\n };\n\n updateElapsed(); // Initial update\n const interval = setInterval(updateElapsed, 1000);\n return () => clearInterval(interval);\n }\n }, [startTime, endTime, status]);\n\n return elapsed;\n}\n","/**\n * Agent Response Component Types\n *\n * Type definitions for the library-ready agent response component\n */\n\n/**\n * Status of the agent response cycle\n */\nexport type AgentResponseStatus = \"idle\" | \"processing\" | \"complete\";\n\n/**\n * Feedback value for the response\n */\nexport type FeedbackValue = \"up\" | \"down\" | null;\n\n/**\n * Tool call information from the agent\n */\nexport interface ToolCall {\n id: string;\n name: string;\n arguments?: Record<string, unknown>;\n timestamp: number;\n}\n\n/**\n * Knowledge retrieval information\n */\nexport interface KnowledgeItem {\n id: string;\n source: string;\n content: string;\n timestamp: number;\n}\n\n/**\n * Memory access information\n */\nexport interface MemoryItem {\n id: string;\n type: string;\n content: string;\n timestamp: number;\n}\n\n/**\n * Status update information from the agent\n */\nexport interface StatusItem {\n id: string;\n message: string;\n timestamp: number;\n /** Optional agent name if in multi-agent scenario */\n agent?: string;\n}\n\n/**\n * A single step in structured thinking content\n */\nexport interface ThinkingStep {\n /** Unique identifier for the step */\n id: string;\n /** Label/title shown in the collapsible header */\n label: string;\n /** Content of the thinking step */\n content: string;\n /** Nesting depth (0 = root level, 1 = first indent, etc.) */\n depth: number;\n /** Whether this step should start collapsed (default: false) */\n isCollapsed?: boolean;\n}\n\n/**\n * Union type for thinking content\n * - string: plain text (backward compatible)\n * - ThinkingStep[]: structured with collapsible sub-sections\n */\nexport type ThinkingContent = string | ThinkingStep[];\n\n/**\n * State shape for the agent response component\n */\nexport interface AgentResponseState {\n /** Current status of the response cycle */\n status: AgentResponseStatus;\n /** Accumulated thinking/reasoning text */\n thinking: string;\n /** Structured thinking steps (if provided, takes precedence over thinking string) */\n thinkingSteps?: ThinkingStep[];\n /** Tool calls made during processing */\n toolCalls: ToolCall[];\n /** Knowledge items retrieved */\n knowledge: KnowledgeItem[];\n /** Memory items accessed */\n memory: MemoryItem[];\n /** Status updates from the agent */\n statusUpdates: StatusItem[];\n /** Final response text */\n response: string;\n /** Timestamp when first thinking message was received (for timer) */\n thinkingStartTime: number | null;\n /** Timestamp when response was completed (for final timer display) */\n responseCompleteTime: number | null;\n /** Timestamp when first message of any type was received (for total time) */\n firstMessageTime: number | null;\n}\n\n/**\n * WebSocket message payload for agent responses\n */\nexport interface AgentMessage {\n type: \"status\" | \"thinking\" | \"tool_call\" | \"knowledge\" | \"memory\" | \"response\" | \"status_update\";\n /** Message content - for simple string payloads */\n message?: string;\n /** Alternative content field */\n content?: string;\n /** For status messages */\n status?: string;\n /** For tool_call messages */\n tool?: {\n id: string;\n name: string;\n arguments?: Record<string, unknown>;\n };\n /** For knowledge messages */\n knowledge?: {\n id: string;\n source: string;\n content: string;\n };\n /** For memory messages */\n memory?: {\n id: string;\n type: string;\n content: string;\n };\n /** For status_update messages */\n statusUpdate?: {\n id: string;\n message: string;\n agent?: string;\n };\n /** For structured thinking step messages */\n thinkingStep?: {\n id?: string;\n label: string;\n content: string;\n depth?: number;\n isCollapsed?: boolean;\n };\n}\n\n/**\n * Generic websocket message wrapper type\n */\nexport interface GenericWebSocketMessage {\n topic: string;\n message: AgentMessage;\n accountId?: string;\n}\n\n/**\n * Initial state for the agent response component\n */\nexport const initialAgentResponseState: AgentResponseState = {\n status: \"idle\",\n thinking: \"\",\n toolCalls: [],\n knowledge: [],\n memory: [],\n statusUpdates: [],\n response: \"\",\n thinkingStartTime: null,\n responseCompleteTime: null,\n firstMessageTime: null,\n};\n","/**\n * useAgentResponseAccumulator Hook\n *\n * Accumulates agent response messages into a unified state\n */\n\nimport { useState, useCallback } from \"react\";\nimport {\n initialAgentResponseState,\n type AgentResponseState,\n type AgentMessage,\n type GenericWebSocketMessage,\n type ToolCall,\n type KnowledgeItem,\n type MemoryItem,\n type StatusItem,\n type ThinkingStep,\n} from \"../types\";\n\nexport interface UseAgentResponseAccumulatorOptions {\n /** WebSocket topic to filter messages (optional, for convenience) */\n topic?: string;\n}\n\nexport interface UseAgentResponseAccumulatorReturn {\n /** Current accumulated state */\n state: AgentResponseState;\n\n /** Handler to process incoming messages */\n handleMessage: (message: unknown) => void;\n\n /** Reset state to initial */\n reset: () => void;\n}\n\n/**\n * Hook for accumulating agent response messages into a unified state\n *\n * @example\n * const { state, handleMessage, reset } = useAgentResponseAccumulator({ topic: \"agent\" });\n *\n * // In your WebSocket handler:\n * websocket.onmessage = (event) => {\n * handleMessage(JSON.parse(event.data));\n * };\n */\nexport function useAgentResponseAccumulator(\n options?: UseAgentResponseAccumulatorOptions\n): UseAgentResponseAccumulatorReturn {\n const [state, setState] = useState<AgentResponseState>(initialAgentResponseState);\n const topic = options?.topic;\n\n const handleMessage = useCallback(\n (message: unknown) => {\n // If topic filter is provided, check for matching topic\n let payload: AgentMessage;\n\n if (topic) {\n const msg = message as GenericWebSocketMessage;\n if (msg.topic !== topic) return;\n payload = msg.message;\n } else {\n // Assume message is the payload directly\n payload = message as AgentMessage;\n }\n\n setState((prev) => {\n // If we receive a non-status message while idle, transition to processing\n let newStatus = prev.status;\n const isFirstMessage = prev.status === \"idle\" && payload.type !== \"status\";\n if (isFirstMessage) {\n newStatus = \"processing\";\n }\n\n // Track first message time for total time calculation\n const firstMessageTime =\n prev.firstMessageTime ?? (isFirstMessage ? Date.now() : null);\n\n switch (payload.type) {\n case \"status\":\n // \"Harness connected\" resets to idle\n if (\n payload.message === \"Harness connected\" ||\n payload.status === \"Harness connected\"\n ) {\n return { ...initialAgentResponseState };\n }\n return { ...prev, status: newStatus };\n\n case \"thinking\": {\n // Check if this is a structured thinking step\n if (payload.thinkingStep) {\n const newStep: ThinkingStep = {\n id: payload.thinkingStep.id || `step-${Date.now()}`,\n label: payload.thinkingStep.label,\n content: payload.thinkingStep.content,\n depth: payload.thinkingStep.depth ?? 0,\n isCollapsed: payload.thinkingStep.isCollapsed,\n };\n const thinkingStartTime = prev.thinkingStartTime ?? Date.now();\n return {\n ...prev,\n status: newStatus,\n thinkingSteps: [...(prev.thinkingSteps || []), newStep],\n thinkingStartTime,\n firstMessageTime,\n };\n }\n\n // Plain text thinking (existing behavior)\n const newThinking = payload.message || payload.content || \"\";\n // Add line break between thinking messages\n const separator = prev.thinking && newThinking ? \"\\n\\n\" : \"\";\n // Set thinkingStartTime on first thinking message\n const thinkingStartTime =\n prev.thinkingStartTime ?? (newThinking ? Date.now() : null);\n return {\n ...prev,\n status: newStatus,\n thinking: prev.thinking + separator + newThinking,\n thinkingStartTime,\n firstMessageTime,\n };\n }\n\n case \"tool_call\": {\n // Handle both formats: { message: \"ToolName\" } or { tool: { id, name, arguments } }\n const toolName = payload.message || payload.tool?.name;\n if (toolName) {\n const newToolCall: ToolCall = {\n id: payload.tool?.id || `tool-${Date.now()}`,\n name: toolName,\n arguments: payload.tool?.arguments,\n timestamp: Date.now(),\n };\n return {\n ...prev,\n status: newStatus,\n toolCalls: [...prev.toolCalls, newToolCall],\n firstMessageTime,\n };\n }\n return { ...prev, status: newStatus, firstMessageTime };\n }\n\n case \"knowledge\": {\n // Handle both formats: { message: \"content\" } or { knowledge: { id, source, content } }\n const knowledgeContent = payload.message || payload.knowledge?.content;\n if (knowledgeContent) {\n const newKnowledge: KnowledgeItem = {\n id: payload.knowledge?.id || `knowledge-${Date.now()}`,\n source: payload.knowledge?.source || \"unknown\",\n content: knowledgeContent,\n timestamp: Date.now(),\n };\n return {\n ...prev,\n status: newStatus,\n knowledge: [...prev.knowledge, newKnowledge],\n firstMessageTime,\n };\n }\n return { ...prev, status: newStatus, firstMessageTime };\n }\n\n case \"memory\": {\n // Handle both formats: { message: \"content\" } or { memory: { id, type, content } }\n const memoryContent = payload.message || payload.memory?.content;\n if (memoryContent) {\n const newMemory: MemoryItem = {\n id: payload.memory?.id || `memory-${Date.now()}`,\n type: payload.memory?.type || \"unknown\",\n content: memoryContent,\n timestamp: Date.now(),\n };\n return {\n ...prev,\n status: newStatus,\n memory: [...prev.memory, newMemory],\n firstMessageTime,\n };\n }\n return { ...prev, status: newStatus, firstMessageTime };\n }\n\n case \"response\":\n return {\n ...prev,\n status: \"complete\",\n response: payload.message || payload.content || \"\",\n responseCompleteTime: Date.now(),\n firstMessageTime: prev.firstMessageTime ?? Date.now(),\n };\n\n case \"status_update\": {\n const statusMessage = payload.message || payload.statusUpdate?.message;\n if (statusMessage) {\n const newStatusItem: StatusItem = {\n id: payload.statusUpdate?.id || `status-${Date.now()}`,\n message: statusMessage,\n agent: payload.statusUpdate?.agent,\n timestamp: Date.now(),\n };\n return {\n ...prev,\n status: newStatus,\n statusUpdates: [...prev.statusUpdates, newStatusItem],\n firstMessageTime,\n };\n }\n return { ...prev, status: newStatus, firstMessageTime };\n }\n\n default:\n return { ...prev, status: newStatus, firstMessageTime };\n }\n });\n },\n [topic]\n );\n\n const reset = useCallback(() => {\n setState(initialAgentResponseState);\n }, []);\n\n return { state, handleMessage, reset };\n}\n","/**\n * AgentResponse Component\n *\n * A library-ready presentational component for displaying AI agent responses.\n * Displays thinking, tool calls, knowledge retrieval, memory access, and final response.\n */\n\nimport * as React from \"react\";\nimport { useState, useMemo, useCallback } from \"react\";\nimport { cn } from \"@optilogic/core\";\nimport { MetadataRow, ThinkingSection, ActionBar } from \"./components\";\nimport { useThinkingTimer } from \"./hooks\";\nimport type { AgentResponseState, FeedbackValue } from \"./types\";\n\nexport interface AgentResponseProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The response state to render */\n state: AgentResponseState;\n\n /** Optional unique ID (for list keys) */\n id?: string;\n\n /** Optional timestamp to display */\n timestamp?: Date;\n\n /** Feedback state (controlled) */\n feedback?: FeedbackValue;\n onFeedbackChange?: (feedback: FeedbackValue) => void;\n\n /** Callback when the response is copied via the action bar */\n onResponseCopy?: (response: string) => void;\n\n /** Thinking section expansion (controlled or uncontrolled) */\n defaultThinkingExpanded?: boolean;\n thinkingExpanded?: boolean;\n onThinkingExpandedChange?: (expanded: boolean) => void;\n\n /** Action bar visibility mode */\n actionsVisible?: boolean | \"hover\";\n\n /**\n * Custom markdown renderer for the response content.\n * If not provided, the response will be rendered as plain text.\n *\n * @example\n * <AgentResponse\n * state={state}\n * renderMarkdown={(content) => <MyMarkdownRenderer content={content} />}\n * />\n */\n renderMarkdown?: (content: string) => React.ReactNode;\n\n /**\n * Custom markdown renderer for the thinking content.\n * If not provided, the thinking will be rendered as plain preformatted text.\n *\n * @example\n * <AgentResponse\n * state={state}\n * renderThinkingMarkdown={(content) => <MyMarkdownRenderer content={content} />}\n * />\n */\n renderThinkingMarkdown?: (content: string) => React.ReactNode;\n}\n\n/**\n * AgentResponse Component\n *\n * A complete component for displaying AI agent responses including:\n * - Thinking/reasoning content (collapsible)\n * - Tool calls, knowledge retrieval, and memory access indicators\n * - Final response with optional markdown rendering\n * - Action bar with copy and feedback buttons\n *\n * @example\n * // Basic usage with useAgentResponseAccumulator hook\n * const { state, handleMessage } = useAgentResponseAccumulator();\n *\n * <AgentResponse state={state} />\n *\n * @example\n * // With markdown rendering and feedback\n * <AgentResponse\n * state={state}\n * renderMarkdown={(content) => <ReactMarkdown>{content}</ReactMarkdown>}\n * feedback={feedback}\n * onFeedbackChange={setFeedback}\n * />\n *\n * @example\n * // Controlled thinking expansion\n * <AgentResponse\n * state={state}\n * thinkingExpanded={isExpanded}\n * onThinkingExpandedChange={setIsExpanded}\n * />\n */\nconst AgentResponse = React.forwardRef<HTMLDivElement, AgentResponseProps>(\n (\n {\n state,\n id,\n timestamp,\n feedback,\n onFeedbackChange,\n onResponseCopy,\n defaultThinkingExpanded = false,\n thinkingExpanded: controlledThinkingExpanded,\n onThinkingExpandedChange,\n actionsVisible = \"hover\",\n renderMarkdown,\n renderThinkingMarkdown,\n className,\n ...props\n },\n ref\n ) => {\n // Uncontrolled thinking expanded state\n const [uncontrolledExpanded, setUncontrolledExpanded] = useState(defaultThinkingExpanded);\n\n // Determine if thinking is controlled\n const isThinkingControlled = controlledThinkingExpanded !== undefined;\n const thinkingExpanded = isThinkingControlled\n ? controlledThinkingExpanded\n : uncontrolledExpanded;\n\n // Toggle thinking handler\n const toggleThinking = useCallback(() => {\n const newValue = !thinkingExpanded;\n if (isThinkingControlled) {\n onThinkingExpandedChange?.(newValue);\n } else {\n setUncontrolledExpanded(newValue);\n }\n }, [thinkingExpanded, isThinkingControlled, onThinkingExpandedChange]);\n\n // Hover state for action bar visibility\n const [isHovered, setIsHovered] = useState(false);\n\n // Thinking timer\n const elapsedTime = useThinkingTimer({\n startTime: state.thinkingStartTime,\n endTime: state.responseCompleteTime,\n status: state.status,\n });\n\n // Calculate total time (from first message to response complete)\n const totalTimeSeconds = useMemo(() => {\n if (!state.firstMessageTime || !state.responseCompleteTime) return 0;\n return (state.responseCompleteTime - state.firstMessageTime) / 1000;\n }, [state.firstMessageTime, state.responseCompleteTime]);\n\n // Check if we have any thinking content (plain text or structured)\n const hasThinkingContent =\n !!state.thinking || (state.thinkingSteps && state.thinkingSteps.length > 0) || false;\n\n // Derived state: has any content been received?\n const hasAnyContent =\n hasThinkingContent ||\n state.toolCalls.length > 0 ||\n state.knowledge.length > 0 ||\n state.memory.length > 0 ||\n state.statusUpdates.length > 0 ||\n state.response;\n\n // Derived state: should show metadata row?\n const showMetadataRow =\n hasThinkingContent ||\n state.toolCalls.length > 0 ||\n state.knowledge.length > 0 ||\n state.memory.length > 0 ||\n state.statusUpdates.length > 0 ||\n state.status === \"processing\";\n\n // Determine action bar visibility\n const showActionBar = state.status === \"complete\" && state.response;\n const isActionBarVisible =\n actionsVisible === true ||\n (actionsVisible === \"hover\" && isHovered);\n\n // If no content, render nothing\n if (!hasAnyContent) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n className={className}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...props}\n >\n {/* Message Content Container */}\n <div className=\"border border-border rounded-lg overflow-hidden\">\n {/* Metadata Row - show if there's any metadata or thinking */}\n {showMetadataRow && (\n <>\n <MetadataRow\n hasThinking={hasThinkingContent}\n isExpanded={thinkingExpanded}\n onToggle={toggleThinking}\n toolCalls={state.toolCalls}\n knowledge={state.knowledge}\n memory={state.memory}\n statusUpdates={state.statusUpdates}\n status={state.status}\n elapsedTime={elapsedTime}\n />\n\n {/* Thinking Content - collapsible with max-height */}\n <ThinkingSection\n content={\n state.thinkingSteps && state.thinkingSteps.length > 0\n ? state.thinkingSteps\n : state.thinking\n }\n isExpanded={thinkingExpanded}\n renderMarkdown={renderThinkingMarkdown}\n />\n </>\n )}\n\n {/* Response Section */}\n {state.response && (\n <div\n className={cn(\n \"bg-muted/50 p-4\",\n showMetadataRow && \"border-t border-border\"\n )}\n >\n {renderMarkdown ? (\n renderMarkdown(state.response)\n ) : (\n <span className=\"whitespace-pre-wrap\">{state.response}</span>\n )}\n </div>\n )}\n </div>\n\n {/* Action Bar - outside the message container, visible on hover when complete */}\n {showActionBar && (\n <ActionBar\n response={state.response}\n isVisible={isActionBarVisible}\n totalTimeSeconds={totalTimeSeconds}\n feedback={feedback}\n onFeedbackChange={onFeedbackChange}\n onResponseCopy={onResponseCopy}\n />\n )}\n </div>\n );\n }\n);\nAgentResponse.displayName = \"AgentResponse\";\n\nexport { AgentResponse };\n","import * as React from \"react\";\nimport { cn } from \"@optilogic/core\";\n\nexport interface UserPromptProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The text content of the user's message */\n content: string;\n /** Optional timestamp to display below the message */\n timestamp?: Date;\n}\n\n/**\n * UserPrompt component\n *\n * Displays a user's chat message in a styled bubble.\n * Used alongside AgentResponse to create chat interfaces.\n *\n * @example\n * ```tsx\n * <UserPrompt\n * content=\"What is the weather today?\"\n * timestamp={new Date()}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Custom styling\n * <UserPrompt\n * content=\"Hello world\"\n * className=\"max-w-full\"\n * />\n * ```\n */\nexport const UserPrompt = React.forwardRef<HTMLDivElement, UserPromptProps>(\n ({ content, timestamp, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"w-fit max-w-[80%] rounded-lg px-4 pt-3.5 pb-3\",\n \"bg-secondary text-secondary-foreground\",\n className\n )}\n {...props}\n >\n <p className=\"whitespace-pre-wrap\">{content}</p>\n {timestamp && (\n <p className=\"text-xs text-secondary-foreground/70 mt-1\">\n {timestamp.toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </p>\n )}\n </div>\n );\n }\n);\n\nUserPrompt.displayName = \"UserPrompt\";\n","import * as React from \"react\";\nimport { Send, Loader2, Square } from \"lucide-react\";\nimport { cn, IconButton } from \"@optilogic/core\";\nimport {\n SlateEditor,\n Text,\n type SlateEditorRef,\n type NodeEntry,\n type DecoratedRange,\n type RenderLeafProps,\n} from \"@optilogic/editor\";\nimport type { UserPromptInputProps, UserPromptInputRef } from \"./types\";\n\n/**\n * Creates a decorate function that highlights code blocks.\n * Handles both complete (```...```) and unclosed (```...) code blocks.\n */\nfunction createCodeBlockDecorate(entry: NodeEntry): DecoratedRange[] {\n const [node, path] = entry;\n const ranges: DecoratedRange[] = [];\n\n if (!Text.isText(node)) {\n return ranges;\n }\n\n const { text } = node;\n\n // Find all ``` positions\n const backtickPositions: number[] = [];\n let searchStart = 0;\n while (true) {\n const pos = text.indexOf(\"```\", searchStart);\n if (pos === -1) break;\n backtickPositions.push(pos);\n searchStart = pos + 3;\n }\n\n // Process pairs of backticks (and handle unclosed blocks)\n let i = 0;\n while (i < backtickPositions.length) {\n const openPos = backtickPositions[i];\n const closePos = backtickPositions[i + 1];\n\n // Mark opening delimiter\n ranges.push({\n anchor: { path, offset: openPos },\n focus: { path, offset: openPos + 3 },\n codeDelimiter: true,\n } as DecoratedRange);\n\n if (closePos !== undefined) {\n // Complete code block - mark content and closing delimiter\n if (closePos > openPos + 3) {\n ranges.push({\n anchor: { path, offset: openPos + 3 },\n focus: { path, offset: closePos },\n codeBlock: true,\n } as DecoratedRange);\n }\n ranges.push({\n anchor: { path, offset: closePos },\n focus: { path, offset: closePos + 3 },\n codeDelimiter: true,\n } as DecoratedRange);\n i += 2; // Move past both opening and closing\n } else {\n // Unclosed code block - mark everything to end as code\n if (text.length > openPos + 3) {\n ranges.push({\n anchor: { path, offset: openPos + 3 },\n focus: { path, offset: text.length },\n codeBlock: true,\n } as DecoratedRange);\n }\n i += 1; // Move past opening only\n }\n }\n\n return ranges;\n}\n\n/**\n * Custom leaf renderer for code block styling\n */\nfunction CodeBlockLeaf({ attributes, children, leaf }: RenderLeafProps) {\n const leafAny = leaf as { codeBlock?: boolean; codeDelimiter?: boolean };\n\n if (leafAny.codeBlock) {\n return (\n <span\n {...attributes}\n className=\"bg-muted/50 text-muted-foreground font-mono text-sm rounded px-1\"\n >\n {children}\n </span>\n );\n }\n\n if (leafAny.codeDelimiter) {\n return (\n <span\n {...attributes}\n className=\"text-muted-foreground/50 font-mono text-sm\"\n >\n {children}\n </span>\n );\n }\n\n return <span {...attributes}>{children}</span>;\n}\n\n/**\n * UserPromptInput Component\n *\n * A rich text input for user messages that wraps SlateEditor.\n * Features:\n * - Code block styling with triple backticks\n * - Send button with loading state\n * - Action slot for additional buttons\n * - Tag support (optional)\n *\n * @example\n * <UserPromptInput\n * placeholder=\"Type your message...\"\n * onSubmit={(text) => sendMessage(text)}\n * renderActions={() => (\n * <IconButton icon={<Paperclip />} aria-label=\"Attach file\" />\n * )}\n * />\n */\nexport const UserPromptInput = React.forwardRef<\n UserPromptInputRef,\n UserPromptInputProps\n>(\n (\n {\n value = \"\",\n onChange,\n onSubmit,\n clearOnSubmit = true,\n placeholder = \"Type your message...\",\n disabled = false,\n isSubmitting = false,\n onStop,\n disableWhileSubmitting = true,\n autoFocus = false,\n refocusAfterSubmit = false,\n onReady,\n minRows = 1,\n maxRows = 6,\n renderActions,\n enableTags = false,\n onTagCreate,\n onTagDelete,\n className,\n ...props\n },\n ref\n ) => {\n const editorRef = React.useRef<SlateEditorRef>(null);\n const [internalValue, setInternalValue] = React.useState(value);\n const prevIsSubmitting = React.useRef(isSubmitting);\n const hasEmittedReady = React.useRef(false);\n\n // Sync internal value with prop\n React.useEffect(() => {\n setInternalValue(value);\n }, [value]);\n\n // Handle autoFocus - use double RAF to ensure Slate is fully initialized\n React.useEffect(() => {\n if (autoFocus) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n editorRef.current?.focus();\n });\n });\n }\n }, [autoFocus]);\n\n // Emit onReady callback when editor is initialized\n React.useEffect(() => {\n if (!hasEmittedReady.current && onReady) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n hasEmittedReady.current = true;\n onReady();\n });\n });\n }\n }, [onReady]);\n\n // Refocus after submit completes\n React.useEffect(() => {\n if (refocusAfterSubmit && prevIsSubmitting.current && !isSubmitting) {\n requestAnimationFrame(() => {\n editorRef.current?.focus();\n });\n }\n prevIsSubmitting.current = isSubmitting;\n }, [isSubmitting, refocusAfterSubmit]);\n\n // Expose ref methods\n React.useImperativeHandle(\n ref,\n () => ({\n focus: () => {\n try {\n editorRef.current?.focus();\n } catch {\n // Retry after Slate initializes (handles early calls)\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n editorRef.current?.focus();\n });\n });\n }\n },\n clear: () => {\n editorRef.current?.clear();\n setInternalValue(\"\");\n },\n getText: () => editorRef.current?.getText() ?? \"\",\n insertText: (text: string) => editorRef.current?.insertText(text),\n }),\n []\n );\n\n const handleChange = React.useCallback(\n (newValue: string) => {\n setInternalValue(newValue);\n onChange?.(newValue);\n },\n [onChange]\n );\n\n const handleSubmit = React.useCallback(\n (text: string) => {\n if (disabled || isSubmitting) return;\n if (!text.trim()) return;\n\n onSubmit?.(text.trim());\n\n if (clearOnSubmit) {\n editorRef.current?.clear();\n setInternalValue(\"\");\n }\n },\n [disabled, isSubmitting, onSubmit, clearOnSubmit]\n );\n\n const handleSendClick = React.useCallback(() => {\n const text = editorRef.current?.getText() ?? \"\";\n handleSubmit(text);\n }, [handleSubmit]);\n\n const hasContent = internalValue.trim().length > 0;\n const canSubmit = hasContent && !disabled && !isSubmitting;\n\n return (\n <div\n className={cn(\n \"rounded-lg border border-input bg-background\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n {...props}\n >\n {/* Editor area */}\n <div className=\"pl-2 pr-0 pt-1 pb-1\">\n <SlateEditor\n ref={editorRef}\n value={internalValue}\n onChange={handleChange}\n onSubmit={handleSubmit}\n clearOnSubmit={false}\n placeholder={placeholder}\n disabled={disabled || (disableWhileSubmitting && isSubmitting)}\n enableTags={enableTags}\n onTagCreate={onTagCreate}\n onTagDelete={onTagDelete}\n minRows={minRows}\n maxRows={maxRows}\n decorate={createCodeBlockDecorate}\n renderLeaf={CodeBlockLeaf}\n />\n </div>\n\n {/* Actions row */}\n <div className=\"flex items-center justify-between pl-2 pr-1 pb-1 pt-1\">\n {/* Left actions slot */}\n <div className=\"flex items-center gap-1\">{renderActions?.()}</div>\n\n {/* Send/Stop button */}\n {isSubmitting && onStop ? (\n <IconButton\n icon={<Square />}\n variant=\"filled\"\n size=\"sm\"\n aria-label=\"Stop\"\n onClick={onStop}\n />\n ) : (\n <IconButton\n icon={\n isSubmitting ? (\n <Loader2 className=\"animate-spin\" />\n ) : (\n <Send />\n )\n }\n variant=\"filled\"\n size=\"sm\"\n aria-label={isSubmitting ? \"Sending...\" : \"Send message\"}\n disabled={!canSubmit}\n onClick={handleSendClick}\n />\n )}\n </div>\n </div>\n );\n }\n);\n\nUserPromptInput.displayName = \"UserPromptInput\";\n"]}
package/dist/index.d.cts CHANGED
@@ -40,6 +40,37 @@ interface MemoryItem {
40
40
  content: string;
41
41
  timestamp: number;
42
42
  }
43
+ /**
44
+ * Status update information from the agent
45
+ */
46
+ interface StatusItem {
47
+ id: string;
48
+ message: string;
49
+ timestamp: number;
50
+ /** Optional agent name if in multi-agent scenario */
51
+ agent?: string;
52
+ }
53
+ /**
54
+ * A single step in structured thinking content
55
+ */
56
+ interface ThinkingStep {
57
+ /** Unique identifier for the step */
58
+ id: string;
59
+ /** Label/title shown in the collapsible header */
60
+ label: string;
61
+ /** Content of the thinking step */
62
+ content: string;
63
+ /** Nesting depth (0 = root level, 1 = first indent, etc.) */
64
+ depth: number;
65
+ /** Whether this step should start collapsed (default: false) */
66
+ isCollapsed?: boolean;
67
+ }
68
+ /**
69
+ * Union type for thinking content
70
+ * - string: plain text (backward compatible)
71
+ * - ThinkingStep[]: structured with collapsible sub-sections
72
+ */
73
+ type ThinkingContent = string | ThinkingStep[];
43
74
  /**
44
75
  * State shape for the agent response component
45
76
  */
@@ -48,12 +79,16 @@ interface AgentResponseState {
48
79
  status: AgentResponseStatus;
49
80
  /** Accumulated thinking/reasoning text */
50
81
  thinking: string;
82
+ /** Structured thinking steps (if provided, takes precedence over thinking string) */
83
+ thinkingSteps?: ThinkingStep[];
51
84
  /** Tool calls made during processing */
52
85
  toolCalls: ToolCall[];
53
86
  /** Knowledge items retrieved */
54
87
  knowledge: KnowledgeItem[];
55
88
  /** Memory items accessed */
56
89
  memory: MemoryItem[];
90
+ /** Status updates from the agent */
91
+ statusUpdates: StatusItem[];
57
92
  /** Final response text */
58
93
  response: string;
59
94
  /** Timestamp when first thinking message was received (for timer) */
@@ -67,7 +102,7 @@ interface AgentResponseState {
67
102
  * WebSocket message payload for agent responses
68
103
  */
69
104
  interface AgentMessage {
70
- type: "status" | "thinking" | "tool_call" | "knowledge" | "memory" | "response";
105
+ type: "status" | "thinking" | "tool_call" | "knowledge" | "memory" | "response" | "status_update";
71
106
  /** Message content - for simple string payloads */
72
107
  message?: string;
73
108
  /** Alternative content field */
@@ -92,6 +127,20 @@ interface AgentMessage {
92
127
  type: string;
93
128
  content: string;
94
129
  };
130
+ /** For status_update messages */
131
+ statusUpdate?: {
132
+ id: string;
133
+ message: string;
134
+ agent?: string;
135
+ };
136
+ /** For structured thinking step messages */
137
+ thinkingStep?: {
138
+ id?: string;
139
+ label: string;
140
+ content: string;
141
+ depth?: number;
142
+ isCollapsed?: boolean;
143
+ };
95
144
  }
96
145
  /**
97
146
  * Generic websocket message wrapper type
@@ -142,6 +191,17 @@ interface AgentResponseProps extends React.HTMLAttributes<HTMLDivElement> {
142
191
  * />
143
192
  */
144
193
  renderMarkdown?: (content: string) => React.ReactNode;
194
+ /**
195
+ * Custom markdown renderer for the thinking content.
196
+ * If not provided, the thinking will be rendered as plain preformatted text.
197
+ *
198
+ * @example
199
+ * <AgentResponse
200
+ * state={state}
201
+ * renderThinkingMarkdown={(content) => <MyMarkdownRenderer content={content} />}
202
+ * />
203
+ */
204
+ renderThinkingMarkdown?: (content: string) => React.ReactNode;
145
205
  }
146
206
  /**
147
207
  * AgentResponse Component
@@ -190,6 +250,8 @@ interface ActivityIndicatorsProps extends React.HTMLAttributes<HTMLDivElement> {
190
250
  knowledge: KnowledgeItem[];
191
251
  /** Memory items to display */
192
252
  memory: MemoryItem[];
253
+ /** Status updates to display */
254
+ statusUpdates?: StatusItem[];
193
255
  }
194
256
  /**
195
257
  * ActivityIndicators Component
@@ -225,6 +287,8 @@ interface MetadataRowProps extends React.HTMLAttributes<HTMLDivElement> {
225
287
  knowledge: KnowledgeItem[];
226
288
  /** Memory items to display */
227
289
  memory: MemoryItem[];
290
+ /** Status updates to display */
291
+ statusUpdates?: StatusItem[];
228
292
  /** Current response status */
229
293
  status: AgentResponseStatus;
230
294
  /** Elapsed time in seconds */
@@ -253,22 +317,40 @@ declare const MetadataRow: React.ForwardRefExoticComponent<MetadataRowProps & Re
253
317
  /**
254
318
  * Thinking Section Component
255
319
  *
256
- * Collapsible section for displaying agent thinking/reasoning content
320
+ * Collapsible section for displaying agent thinking/reasoning content.
321
+ * Supports both plain text and structured collapsible sub-sections.
257
322
  */
258
323
 
259
- interface ThinkingSectionProps extends React.HTMLAttributes<HTMLDivElement> {
260
- /** The thinking content to display */
261
- content: string;
324
+ interface ThinkingSectionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "content"> {
325
+ /** The thinking content to display (string or structured steps) */
326
+ content: string | ThinkingStep[];
262
327
  /** Whether the section is expanded */
263
328
  isExpanded: boolean;
329
+ /**
330
+ * Custom markdown renderer for the thinking content.
331
+ * If not provided, the content will be rendered as plain preformatted text.
332
+ */
333
+ renderMarkdown?: (content: string) => React.ReactNode;
264
334
  }
265
335
  /**
266
336
  * ThinkingSection Component
267
337
  *
268
338
  * Displays the agent's thinking/reasoning content in a collapsible panel.
339
+ * Supports both plain text content and structured collapsible sub-sections.
269
340
  *
270
341
  * @example
342
+ * // Plain text content
271
343
  * <ThinkingSection content={state.thinking} isExpanded={isExpanded} />
344
+ *
345
+ * @example
346
+ * // Structured content with sub-sections
347
+ * <ThinkingSection
348
+ * content={[
349
+ * { id: "1", label: "Analysis", content: "...", depth: 0 },
350
+ * { id: "2", label: "Sub-analysis", content: "...", depth: 1 },
351
+ * ]}
352
+ * isExpanded={isExpanded}
353
+ * />
272
354
  */
273
355
  declare const ThinkingSection: React.ForwardRefExoticComponent<ThinkingSectionProps & React.RefAttributes<HTMLDivElement>>;
274
356
 
@@ -421,6 +503,16 @@ interface UserPromptInputProps extends Omit<React.HTMLAttributes<HTMLDivElement>
421
503
  disabled?: boolean;
422
504
  /** Whether a submission is in progress (shows loading state) */
423
505
  isSubmitting?: boolean;
506
+ /** Called when user clicks Stop during submission */
507
+ onStop?: () => void;
508
+ /** Whether to disable input while submitting (default: true) */
509
+ disableWhileSubmitting?: boolean;
510
+ /** Auto-focus the editor when mounted (handles Slate initialization timing) */
511
+ autoFocus?: boolean;
512
+ /** Refocus the input after submission completes (default: false) */
513
+ refocusAfterSubmit?: boolean;
514
+ /** Called when the editor is fully initialized and ready for interaction */
515
+ onReady?: () => void;
424
516
  /** Minimum number of rows for the editor */
425
517
  minRows?: number;
426
518
  /** Maximum number of rows before scrolling */
@@ -466,4 +558,4 @@ interface UserPromptInputRef {
466
558
  */
467
559
  declare const UserPromptInput: React.ForwardRefExoticComponent<UserPromptInputProps & React.RefAttributes<UserPromptInputRef>>;
468
560
 
469
- export { ActionBar, type ActionBarProps, ActivityIndicators, type ActivityIndicatorsProps, type AgentMessage, AgentResponse, type AgentResponseProps, type AgentResponseState, type AgentResponseStatus, type FeedbackValue, type GenericWebSocketMessage, type KnowledgeItem, type MemoryItem, MetadataRow, type MetadataRowProps, ThinkingSection, type ThinkingSectionProps, type ToolCall, type UseAgentResponseAccumulatorOptions, type UseAgentResponseAccumulatorReturn, type UseThinkingTimerOptions, UserPrompt, UserPromptInput, type UserPromptInputProps, type UserPromptInputRef, type UserPromptProps, formatTime, formatTotalTime, initialAgentResponseState, useAgentResponseAccumulator, useThinkingTimer };
561
+ export { ActionBar, type ActionBarProps, ActivityIndicators, type ActivityIndicatorsProps, type AgentMessage, AgentResponse, type AgentResponseProps, type AgentResponseState, type AgentResponseStatus, type FeedbackValue, type GenericWebSocketMessage, type KnowledgeItem, type MemoryItem, MetadataRow, type MetadataRowProps, type StatusItem, type ThinkingContent, ThinkingSection, type ThinkingSectionProps, type ThinkingStep, type ToolCall, type UseAgentResponseAccumulatorOptions, type UseAgentResponseAccumulatorReturn, type UseThinkingTimerOptions, UserPrompt, UserPromptInput, type UserPromptInputProps, type UserPromptInputRef, type UserPromptProps, formatTime, formatTotalTime, initialAgentResponseState, useAgentResponseAccumulator, useThinkingTimer };