@mcp-b/embedded-agent 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -0
- package/dist/embed.iife.js +5 -0
- package/dist/index.d.ts +1153 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7030 -0
- package/dist/index.js.map +1 -0
- package/dist/styles/globals.css +2 -0
- package/dist/web-component-standalone.iife.js +6 -0
- package/dist/web-component.d.ts +56 -0
- package/dist/web-component.d.ts.map +1 -0
- package/dist/web-component.js +4741 -0
- package/dist/web-component.js.map +1 -0
- package/package.json +102 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["clsx","twMerge","ClassValue","cn","inputs","MCP_MAX_RECONNECT_ATTEMPTS","MCP_BASE_RECONNECT_DELAY_MS","MCP_MAX_RECONNECT_DELAY_MS","MCP_TAB_CONNECT_DELAY_MS","AUDIO_FREQUENCY_BINS","REALTIME_DEFAULT_MODEL","REALTIME_DEFAULT_VOICE","REALTIME_DEFAULT_API_URL","AUDIO_VISUALIZATION_INTERVAL_MS","RESPONSE_REQUEST_DELAY_MS","TOOL_CALL_DISPLAY_DURATION_MS","TOOL_CALL_ERROR_DISPLAY_DURATION_MS","WAVEFORM_HISTORY_SIZE","WAVEFORM_UPDATE_RATE_MS","WEBSOCKET_OPEN","DEBUG_LOGGING_ENABLED","window","__WEBMCP_DEBUG__","debugLog","component","message","data","isDebugEnabled","undefined","console","log","debugLog","AudioAnalyzer","audioContext","AudioContext","analyser","AnalyserNode","source","MediaStreamAudioSourceNode","dataArray","Uint8Array","ArrayBuffer","animationId","initialize","stream","MediaStream","Promise","audioTracks","getAudioTracks","streamId","id","length","trackInfo","map","t","label","enabled","muted","readyState","state","resume","err","console","warn","createAnalyser","fftSize","smoothingTimeConstant","createMediaStreamSource","connect","bufferLength","frequencyBinCount","sampleRate","contextState","getAudioLevel","getByteFrequencyData","sum","i","average","Math","min","getFrequencyData","bins","Array","fill","result","samplesPerBin","floor","j","push","startAnalysis","callback","level","frequencies","analyze","requestAnimationFrame","stopAnalysis","cancelAnimationFrame","destroy","disconnect","close","EventCallback","IEventEmitter","EventEmitter","listeners","Map","Set","on","event","callback","has","set","get","add","off","delete","emit","data","forEach","error","console","removeAllListeners","clear","listenerCount","size","RESPONSE_REQUEST_DELAY_MS","EventEmitter","ToolManager","FunctionCall","RealtimeMessage","ResponseOutputItem","type","status","name","call_id","arguments","isCompletedFunctionCall","item","MessageHandler","isProcessingResponse","pendingFunctionCalls","Set","responseRequestTimer","ReturnType","setTimeout","hasRequestedResponse","constructor","toolManager","eventEmitter","handleMessage","data","dataChannel","RTCDataChannel","Promise","msg","JSON","parse","error","console","handleResponseCreated","handleResponseDone","handleFunctionCallArguments","handleSpeechEvents","handleAudioEvents","handleTranscriptEvents","handleUserTranscript","handleError","handleSessionEvents","_msg","outputItems","extractResponseOutput","response","hasFunctionCalls","some","length","functionCalls","filter","map","functionCall","has","add","executeFunctionCall","warn","size","requestResponseIfNeeded","r","Record","Array","isArray","output","eventType","emit","log","hasAudio","delta","eventMap","text","transcript","clearTimeout","result","executeToolCall","readyState","stringify","success","send","undefined","sendToolError","String","delete","errorResponse","reset","clear","FunctionCall","OpenAITool","ToolExecutionResult","RegisteredTool","name","description","inputSchema","Record","ToolExecutor","args","Promise","ToolManager","tools","executor","lastSentToolSignature","setTools","setExecutor","resetSession","console","log","getToolSignature","map","t","sort","join","hasToolsChanged","currentSignature","markToolsSent","formatToolsForOpenAI","builtInTools","type","parameters","properties","required","registeredTools","tool","const","validateToolSchema","schema","result","Object","entries","filter","prop","p","optional","nullable","key","executeToolCall","functionCall","arguments","argsString","executeListTools","success","error","find","JSON","parse","data","String","toolList","count","length","message","getChangesSummary","added","removed","total","prevTools","split","Boolean","currTools","prevSet","Set","currSet","has","debugLog","REALTIME_DEFAULT_API_URL","REALTIME_DEFAULT_MODEL","REALTIME_DEFAULT_VOICE","RealtimeConfig","RealtimeSession","EphemeralTokenResponse","client_secret","value","hasClientSecret","response","secret","WebRTCManager","tokenEndpoint","constructor","createSession","config","Promise","model","voice","apiUrl","ephemeralKey","getEphemeralToken","pc","RTCPeerConnection","audioElement","createAudioElement","remoteStream","MediaStream","ontrack","e","streams","srcObject","streamId","id","tracks","getTracks","length","localStream","getUserMedia","map","t","kind","enabled","muted","readyState","forEach","track","addTrack","dataChannel","createDataChannel","offer","createOffer","setLocalDescription","sdp","Error","answer","connectToOpenAI","setRemoteDescription","cleanup","stop","remove","close","fetch","method","headers","body","JSON","stringify","ok","errorText","text","console","error","statusText","data","json","HTMLAudioElement","document","createElement","autoplay","style","display","appendChild","navigator","mediaDevices","audio","echoCancellation","noiseSuppression","autoGainControl","baseUrl","RTCSessionDescriptionInit","Authorization","answerSdp","type","const","AUDIO_FREQUENCY_BINS","AUDIO_VISUALIZATION_INTERVAL_MS","debugLog","AudioAnalyzer","EventEmitter","MessageHandler","ToolManager","WebRTCManager","RegisteredTool","ToolExecutor","EventCallback","RealtimeConfig","RealtimeSession","SessionConfig","EMPTY_FREQUENCY_TEMPLATE","Object","freeze","Array","fill","createZeroFrequencyArray","OpenAIRealtimeService","session","webrtcManager","toolManager","messageHandler","eventEmitter","muted","lastState","localAnalyzer","remoteAnalyzer","visualizationInterval","ReturnType","setInterval","sessionStartTime","onToolsChangedCallback","constructor","tokenEndpoint","setTools","tools","isSessionActive","updateSessionTools","setToolExecutor","executor","setExecutor","onToolsChanged","callback","startSession","config","Promise","stopSession","Date","now","emitSessionState","createSession","setupDataChannel","dataChannel","setupPeerConnectionMonitoring","pc","localStream","initializeLocalAnalyzer","remoteStream","initializeRemoteAnalyzer","originalOntrack","ontrack","e","call","streams","console","warn","error","handleSessionError","durationSeconds","Math","floor","clearInterval","destroy","cleanup","reset","resetSession","sendUserMessage","text","Error","message","type","item","role","content","send","JSON","stringify","readyState","getLocalStream","MediaStream","getRemoteStream","toggleMute","audioElement","isMuted","on","event","off","getSessionStatus","state","isActive","RTCDataChannel","addEventListener","configureSession","MessageEvent","handleMessage","data","emit","RTCPeerConnection","connectionState","iceConnectionState","formatToolsForOpenAI","markToolsSent","sessionConfig","modalities","instructions","getSessionInstructions","voice","tool_choice","turn_detection","threshold","prefix_padding_ms","silence_duration_ms","input_audio_transcription","model","sessionUpdate","changesSummary","getChangesSummary","log","total","added","length","slice","join","removed","String","stream","clonedStream","getAudioTracks","map","t","clone","initialize","startAudioVisualization","logCounter","micLevel","getAudioLevel","micFrequency","getFrequencyData","speakerLevel","speakerFrequency","mic","toFixed","speaker","extra","Record","payload","RealtimeConfig","model","voice","apiUrl","tokenEndpoint","RealtimeSession","pc","RTCPeerConnection","dataChannel","RTCDataChannel","audioElement","HTMLAudioElement","localStream","MediaStream","remoteStream","cleanup","OpenAITool","type","name","description","parameters","properties","Record","required","SessionConfig","modalities","instructions","tools","tool_choice","turn_detection","threshold","prefix_padding_ms","silence_duration_ms","input_audio_transcription","FunctionCall","arguments","call_id","status","ConversationItem","role","content","output","RealtimeMessage","key","ToolExecutionResult","success","data","error","EventCallback","IEventEmitter","on","event","callback","off","emit","AudioLevelData","micLevel","micFrequency","speakerLevel","speakerFrequency","TranscriptData","text","isDone","ToolCallData","toolName","VoiceModeState","isActive","isConnecting","isMuted","isError","connectionState","audioLevel","transcript","toolCall","SessionStateEventData","state","durationSeconds","UserTranscriptEventData","AssistantTranscriptEventData","delta","ToolCallStartedEventData","ToolCallCompletedEventData","ErrorEventData","message","isSessionStateEventData","d","includes","isUserTranscriptEventData","isAssistantTranscriptEventData","undefined","isToolCallStartedEventData","isToolCallCompletedEventData","isErrorEventData","isAudioLevelData","Array","isArray","useCallback","useEffect","useMemo","useRef","useState","TOOL_CALL_DISPLAY_DURATION_MS","TOOL_CALL_ERROR_DISPLAY_DURATION_MS","isAssistantTranscriptEventData","isAudioLevelData","isErrorEventData","isSessionStateEventData","isToolCallCompletedEventData","isToolCallStartedEventData","isUserTranscriptEventData","OpenAIRealtimeService","AudioLevelData","RealtimeConfig","RegisteredTool","ToolCallData","ToolExecutor","TranscriptData","VoiceModeState","UseVoiceModeOptions","tokenEndpoint","tools","toolExecutor","onConnect","onDisconnect","durationSeconds","onError","error","onUserTranscript","text","onAssistantTranscript","UseVoiceModeReturn","startSession","config","Promise","stopSession","toggleMute","muted","sendMessage","useVoiceMode","options","$","_c","isActive","setIsActive","isConnecting","setIsConnecting","isMuted","setIsMuted","isError","setIsError","connectionState","setConnectionState","audioLevel","setAudioLevel","transcript","setTranscript","toolCall","setToolCall","setError","serviceRef","onConnectRef","onDisconnectRef","onErrorRef","onUserTranscriptRef","onAssistantTranscriptRef","t0","t1","current","t2","getService","t3","t4","service","setTools","t5","t6","service_0","setToolExecutor","t7","t8","service_1","handleSessionState","data","console","warn","state","handleAudioLevel","data_0","handleUserTranscript","data_1","type","isDone","handleAssistantTranscript","data_2","delta","prev","handleAssistantTranscriptDone","data_3","text_0","handleToolCallStarted","data_4","status","toolName","name","handleToolCallCompleted","data_5","setTimeout","undefined","handleError","data_6","errorMsg","message","on","off","t9","service_2","t10","err","errorMsg_0","Error","service_3","t11","service_4","newMuted","t12","text_1","service_5","isSessionActive","sendUserMessage","t13","createContext","useContext","useMemo","useVoiceMode","ReactNode","UseVoiceModeReturn","RegisteredTool","ToolExecutor","VoiceModeContextValue","isSupported","VoiceModeContext","VoiceModeProviderProps","children","tokenEndpoint","tools","toolExecutor","onConnect","onDisconnect","durationSeconds","onError","error","onUserTranscript","text","onAssistantTranscript","checkVoiceModeSupport","window","RTCPeerConnection","navigator","mediaDevices","getUserMedia","VoiceModeProvider","t0","$","_c","t1","voiceMode","t2","Symbol","for","t3","value","t4","useVoiceModeContext","context","Error","useOptionalVoiceModeContext","c","_c","AvatarPrimitive","React","cn","Avatar","t0","$","className","props","t1","t2","AvatarImage","AvatarFallback","c","_c","DialogPrimitive","XIcon","React","cn","Dialog","t0","$","props","t1","DialogTrigger","DialogPortal","DialogClose","DialogOverlay","className","t2","DialogContent","children","showCloseButton","undefined","Symbol","for","t3","t4","t5","DialogHeader","DialogFooter","DialogTitle","DialogDescription","c","_c","TooltipPrimitive","React","cn","TooltipProvider","t0","$","props","t1","delayDuration","undefined","t2","Tooltip","TooltipTrigger","TooltipContent","children","className","sideOffset","t3","Symbol","for","t4","Slot","cva","React","cn","VariantProps","ButtonProps","ComponentProps","buttonVariants","asChild","variants","variant","default","destructive","outline","secondary","ghost","link","size","sm","lg","icon","defaultVariants","Button","t0","$","_c","className","props","t1","undefined","Comp","t2","t3","c","_c","Slottable","forwardRef","cn","Button","Tooltip","TooltipContent","TooltipTrigger","ComponentPropsWithRef","TooltipIconButtonProps","tooltip","side","TooltipIconButton","HTMLButtonElement","t0","ref","$","children","className","rest","t1","undefined","t2","t3","t4","t5","t6","t7","displayName","c","_c","AttachmentPrimitive","ComposerPrimitive","MessagePrimitive","useAssistantApi","useAssistantState","FileText","PlusIcon","XIcon","useEffect","useState","useShallow","cn","Avatar","AvatarFallback","AvatarImage","Dialog","DialogContent","DialogTitle","DialogTrigger","Tooltip","TooltipContent","TooltipTrigger","TooltipIconButton","FC","PropsWithChildren","useFileSrc","file","$","src","setSrc","undefined","t0","t1","objectUrl","URL","createObjectURL","revokeObjectURL","useAttachmentSrc","src_0","_temp2","AttachmentPreviewProps","AttachmentPreview","AttachmentPreviewDialog","children","t2","Symbol","for","t3","t4","AttachmentThumb","isImage","_temp3","AttachmentUI","api","isComposer","attachment","source","_temp4","typeLabel","_temp5","t5","t6","t7","t8","t9","t10","AttachmentRemove","UserMessageAttachments","Attachment","ComposerAttachments","ComposerAddAttachment","_temp","type","content","filter","image","attachment_0","_exhaustiveCheck","Error","c","_c","MarkdownTextPrimitive","unstable_memoizeMarkdownComponents","memoizeMarkdownComponents","useIsMarkdownCodeBlock","CheckIcon","CopyIcon","memo","useState","remarkGfm","cn","TooltipIconButton","CodeHeaderProps","FC","MarkdownTextImpl","$","t0","Symbol","for","defaultComponents","MarkdownText","CodeHeader","language","code","isCopied","copyToClipboard","useCopyToClipboard","t1","onCopy","t2","t3","t4","t5","t6","undefined","copiedDuration","setIsCopied","value","navigator","clipboard","writeText","then","setTimeout","h1","className","props","h2","h3","h4","h5","h6","p","a","blockquote","ul","ol","hr","table","th","td","tr","sup","pre","Code","isCodeBlock","TabClientTransport","SSEClientTransport","StreamableHTTPClientTransport","MCPSourceConfig","Transport","TransportType","createMCPTransport","config","transportType","type","targetOrigin","window","location","origin","channelId","serverUrl","URL","url","headers","Record","Accept","customHeaders","authToken","Authorization","transportOptions","requestInit","shouldFallbackToSSE","error","Error","message","includes","calculateReconnectDelay","attempt","baseDelay","maxDelay","Math","min","pow","Client","ToolListChangedNotificationSchema","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","MCP_TAB_CONNECT_DELAY_MS","createMCPTransport","CallToolResult","MCPSource","MCPSourceConfig","Prompt","Resource","ResourceTemplate","ToolWithSource","Transport","ReactNode","SOURCE_LOCAL","SOURCE_REMOTE","SourceState","Omit","client","transport","resources","resourceTemplates","prompts","MCPToolsContextValue","tools","sources","Map","addSource","id","config","Promise","removeSource","getSource","isConnected","callTool","name","args","Record","callToolOnSource","sourceId","MCPToolsContext","MCPToolsProviderProps","children","autoConnectLocal","onToolsChange","MCPToolsProvider","sourcesRef","forceUpdate","toolsList","setToolsList","rebuildTools","allTools","current","forEach","source","tool","push","_sourceId","getPublicSource","state","error","has","sourceState","set","version","connect","listTools","setNotificationHandler","updated","err","console","Error","String","get","close","delete","undefined","arguments","find","t","publicSources","timer","setTimeout","type","clearTimeout","catch","clear","value","useMCPTools","context","useOptionalMCPTools","Loader2","Plug","Plus","X","useCallback","useState","cn","SOURCE_REMOTE","useMCPTools","Button","Dialog","DialogContent","DialogDescription","DialogHeader","DialogTitle","DialogTrigger","TooltipIconButton","FC","RemoteServer","id","url","RemoteMCPSettings","sources","addSource","removeSource","isOpen","setIsOpen","setUrl","isConnecting","setIsConnecting","error","setError","remoteServers","forEach","source","config","type","push","handleConnect","trim","URL","serverId","length","Date","now","err","Error","message","handleDisconnect","handleKeyDown","e","React","KeyboardEvent","key","connectedCount","filter","s","get","state","target","value","map","server","isConnected","isLoading","tools","CheckIcon","ChevronDownIcon","ChevronUpIcon","useState","Button","ToolCallMessagePartComponent","ToolFallback","t0","$","_c","toolName","argsText","result","isCollapsed","setIsCollapsed","t1","Symbol","for","t2","t3","t4","t5","undefined","JSON","stringify","t6","useEffect","useRef","cn","HTMLAttributes","LiveWaveformProps","HTMLDivElement","active","processing","barWidth","barGap","barRadius","barColor","fadeEdges","fadeWidth","height","sensitivity","smoothingTimeConstant","mode","manualAudioLevel","LiveWaveform","t0","$","_c","className","props","t1","t10","t2","t3","t4","t5","t6","t7","t8","t9","undefined","canvasRef","containerRef","t11","Symbol","for","historyRef","lastUpdateRef","processingAnimationRef","t12","lastActiveDataRef","transitionProgressRef","t13","staticBarsRef","needsRedrawRef","gradientCacheRef","lastWidthRef","heightStyle","t14","t15","canvas","current","container","resizeObserver","ResizeObserver","rect","getBoundingClientRect","dpr","window","devicePixelRatio","width","style","ctx","getContext","scale","observe","disconnect","t16","t17","time","animateProcessing","Math","min","processingData","barCount","floor","halfCount","i","normalizedPosition","centerWeight","abs","wave1","sin","wave2","wave3","cos","combinedWave","processingValue","finalValue","length","lastDataIndex","lastValue","push","max","i_0","normalizedPosition_0","centerWeight_0","wave1_0","wave2_0","wave3_0","combinedWave_0","processingValue_0","finalValue_0","lastDataIndex_0","lastValue_0","requestAnimationFrame","cancelAnimationFrame","hasData","fadeProgress","fadeToIdle","map","value","value_0","t18","t19","canvas_0","ctx_0","rafId","animate","currentTime","rect_0","level","barCount_0","halfCount_0","newBars","i_1","distanceFromCenter","value_1","i_2","distanceFromCenter_0","value_2","shift","clearRect","computedBarColor","getComputedStyle","color","step","barCount_1","centerY","dataToRender","i_3","value_3","x","barHeight","y","fillStyle","globalAlpha","beginPath","roundRect","fill","fillRect","i_4","dataIndex","value_4","x_0","barHeight_0","y_0","gradient","createLinearGradient","fadePercent","addColorStop","globalCompositeOperation","t20","t21","t22","t23","t24","t25","Mic","MicOff","Phone","PhoneOff","Volume2","cn","Button","LiveWaveform","AudioLevelData","ToolCallData","VoiceIndicatorProps","isActive","isConnecting","isMuted","audioLevel","toolCall","onStart","onStop","onToggleMute","className","VoiceIndicator","t0","$","_c","micLevel","speakerLevel","toolCallStatus","status","error","t1","getBorderClass","t2","t3","t4","Symbol","for","t5","t6","t7","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","t21","t22","t23","t24","toolName","t25","t26","ActionBarPrimitive","BranchPickerPrimitive","ComposerPrimitive","ErrorPrimitive","MessagePrimitive","ThreadPrimitive","ArrowDownIcon","ArrowUpIcon","CheckIcon","ChevronLeftIcon","ChevronRightIcon","CopyIcon","PencilIcon","Phone","RefreshCwIcon","Square","AnimatePresence","domAnimation","LazyMotion","MotionConfig","m","cn","useOptionalVoiceModeContext","ComposerAddAttachment","ComposerAttachments","UserMessageAttachments","Button","MarkdownText","RemoteMCPSettings","ToolFallback","TooltipIconButton","VoiceIndicator","FC","ThreadWithVoice","UserMessage","EditComposer","AssistantMessage","ComposerArea","$","_c","voiceMode","t0","Symbol","for","t1","isSupported","isActive","isConnecting","opacity","y","duration","isMuted","audioLevel","toolCall","startSession","stopSession","toggleMute","t2","t3","t4","TextComposer","t5","t6","t7","t8","t9","ThreadScrollToBottom","ThreadWelcome","delay","ThreadSuggestions","title","label","action","map","_temp","MessageError","Text","tools","Fallback","AssistantActionBar","UserActionBar","BranchPicker","Root","Props","className","rest","suggestedAction","index","c","_c","AssistantModalPrimitive","ChevronDownIcon","forwardRef","ThreadWithVoice","TooltipIconButton","FC","AssistantModal","$","t0","Symbol","for","t1","AssistantModalButtonProps","AssistantModalButton","HTMLButtonElement","ref","rest","state","tooltip","t2","t3","t4","displayName","useAssistantTool","useMCPTools","CallToolResult","ToolWithSource","FC","ToolBridge","tool","callTool","name","args","Record","Promise","toolName","description","parameters","inputSchema","execute","result","textContent","content","map","c","text","JSON","stringify","join","error","console","MCPToolRegistry","$","_c","tools","t0","t1","_sourceId","MCPToolsDebug","sources","Symbol","for","t2","Array","from","values","_temp2","t3","length","t4","_temp3","t5","t6","source","id","state","message","WEBMCP_STYLES","injectStyles","document","styleId","getElementById","style","createElement","id","textContent","head","appendChild","AssistantRuntimeProvider","useChatRuntime","r2wc","lastAssistantMessageIsCompleteWithToolCalls","AssistantModal","MCPToolRegistry","injectStyles","MCPToolsProvider","VoiceModeProvider","FC","EmbeddedAgentProps","appId","apiBase","tokenEndpoint","autoConnectLocal","onToolsChange","tools","onVoiceError","error","onVoiceConnect","onVoiceDisconnect","duration","EmbeddedAgent","t0","$","_c","t1","undefined","t2","Symbol","for","sendAutomaticallyWhen","_temp","runtime","resolvedTokenEndpoint","window","console","debug","t3","t4","WebMCPAgentElement","Parameters","props","registerWebMCPAgent","tagName","customElements","get","define","messages","ActionBarPrimitive","BranchPickerPrimitive","ComposerPrimitive","ErrorPrimitive","MessagePrimitive","ThreadPrimitive","ArrowDownIcon","ArrowUpIcon","CheckIcon","ChevronLeftIcon","ChevronRightIcon","CopyIcon","PencilIcon","RefreshCwIcon","Square","domAnimation","LazyMotion","MotionConfig","m","cn","ComposerAddAttachment","ComposerAttachments","UserMessageAttachments","Button","MarkdownText","ToolFallback","TooltipIconButton","FC","Thread","UserMessage","EditComposer","AssistantMessage","ThreadScrollToBottom","$","_c","t0","Symbol","for","ThreadWelcome","opacity","y","t1","delay","ThreadSuggestions","title","label","action","map","_temp","Composer","ComposerAction","t2","MessageError","Text","tools","Fallback","AssistantActionBar","UserActionBar","BranchPicker","Root","Props","className","rest","t3","t4","t5","t6","suggestedAction","index","c","_c","MessagePrimitive","Bot","Avatar","AvatarFallback","MarkdownText","FC","AssistantMessage","$","t0","Symbol","for","t1","Text","c","_c","MessagePrimitive","User","Avatar","AvatarFallback","FC","UserMessage","$","t0","Symbol","for","t1","c","_c","ComposerPrimitive","ThreadPrimitive","ArrowUpIcon","Square","cn","Button","FC","Composer","$","t0","t1","Symbol","for","t2","t3","AlertCircle","CheckCircle2","Loader2","Wrench","cn","ToolCallData","RealtimeToolCardProps","toolCall","className","RealtimeToolCard","t0","$","_c","status","toolName","error","isRunning","isSuccess","isError","t1","t2","t3","t4","t5","t6","t7","t8","t9","t10","t11","t12","t13","Symbol","for","t14","t15","t16","t17","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","t31","t32","RealtimeToolStackProps","toolCalls","RealtimeToolStack","length","map","_temp","index","cva","React","cn","VariantProps","badgeVariants","variants","variant","default","secondary","destructive","outline","defaultVariants","BadgeProps","HTMLAttributes","HTMLDivElement","Badge","t0","$","_c","className","props","t1","t2","c","_c","ScrollAreaPrimitive","React","cn","ScrollArea","t0","$","children","className","props","t1","t2","t3","t4","Symbol","for","t5","ScrollBar","orientation","undefined","t6","c","_c","SeparatorPrimitive","React","cn","Separator","t0","$","className","props","t1","t2","orientation","decorative","undefined","t3","t4","ThreadMessageLike","UIDataTypes","UIMessage","UITools","convertToAssistantUiMessages","messages","map","msg","role","content","parts","part","type","text","toolCall","const","toolCallId","toolName","String","input","argsText","JSON","stringify","args","Record","result","undefined","id","createdAt","Date","convertAssistantUIMessage","isSyncMessage","isToolsNeededMessage","MessageType","useCallback","useEffect","useRef","useState","AgentChatState","PendingTool","SyncMessage","ToolResultPayload","ToolsNeededMessage","UIMessage","FrontendTool","description","execute","input","TInput","Promise","TOutput","FrontendTools","Record","AgentConnection","send","data","addEventListener","event","handler","MessageEvent","removeEventListener","readyState","UseAgentChatOptions","agent","tools","initialMessages","onToolsNeedConfirmation","onStateChange","state","UseAgentChatReturn","messages","setMessages","setInput","handleSubmit","e","React","FormEvent","sendMessage","content","addToolResult","toolCallId","toolName","output","agentState","isStreaming","pendingConfirmationTools","clearHistory","useAgentChat","options","$","_c","t0","t1","undefined","t2","Symbol","for","status","setAgentState","t3","setPendingConfirmationTools","toolsRef","messagesRef","t4","t5","current","t6","t7","t8","pendingTools","currentTools","results","confirmationRequired","pendingTool","tool","push","t9","error","Error","message","String","length","JSON","stringify","type","CF_AGENT_TOOL_RESULTS","executeToolsFromState","syncData","messagesToSet","streamingMessage","handleSyncMessage","t10","toolsData","messageId","id","handleToolsNeededMessage","t11","t12","handleMessage","parse","t13","trim","userMessage","Date","now","Math","random","toString","slice","role","parts","text","prev","CF_AGENT_USE_CHAT_REQUEST","t14","preventDefault","t15","output_0","prev_0","filter","t","t16","CF_AGENT_CHAT_CLEAR","t17","t18","useAgentConnection","isConnected","setIsConnected","checkConnection","interval","setInterval","clearInterval","reconnect","_temp","useToolConfirmation","find","confirmTool","toolCallId_0","tool_0","t_0","denyTool","tool_1","get","confirmAll","tool_2","denyAll","useExternalStoreRuntime","useAgent","convertAssistantUIMessage","useAgentChat","AppendMessage","AssistantRuntime","PendingTool","UIDataTypes","UIMessage","UITools","FrontendTools","UseCloudflareRuntimeOptions","host","agent","tools","onToolsNeedConfirmation","Array","toolCallId","toolName","input","useCloudflareRuntime","t0","$","_c","t1","undefined","options","t2","t3","agentName","t4","t5","messages","sendMessage","isStreaming","t6","message","firstContent","content","type","text","onNew","t7","isRunning","convertMessage","_temp","runtime","message_0","CloudflareRuntimeWithTools","pendingTools","confirmTool","output","denyTool","clearHistory","useCloudflareRuntimeWithTools","pendingConfirmationTools","addToolResult","_temp2","t8","tool","find","t","t9","toolCallId_0","tool_0","t_0","t10","c","_c","AssistantRuntimeProvider","useCloudflareRuntime","FC","ReactNode","ChatRuntimeProviderProps","children","ChatRuntimeProvider","t0","$","runtime","t1","Client","CreateMessageRequestSchema","GetPromptResultSchema","ListPromptsResultSchema","ListResourcesResultSchema","PromptListChangedNotificationSchema","ReadResourceResultSchema","ResourceListChangedNotificationSchema","ToolListChangedNotificationSchema","useCallback","useEffect","useRef","useState","MCP_BASE_RECONNECT_DELAY_MS","MCP_MAX_RECONNECT_ATTEMPTS","MCP_MAX_RECONNECT_DELAY_MS","MCP_TAB_CONNECT_DELAY_MS","calculateReconnectDelay","createMCPTransport","shouldFallbackToSSE","CallToolResult","CreateMessageResult","GetPromptResult","MCPConnectionState","MCPSourceConfig","Prompt","ReadResourceResult","Resource","ResourceTemplate","SamplingHandler","Tool","Transport","TransportType","UseMCPSourceOptions","autoConnect","onToolsUpdate","tools","onResourcesUpdate","resources","templates","onPromptsUpdate","prompts","onStateChange","state","onError","error","Error","samplingHandler","UseMCPSourceReturn","client","resourceTemplates","isConnected","connect","Promise","disconnect","callTool","name","args","Record","readResource","uri","getPrompt","refreshTools","refreshResources","refreshPrompts","useMCPSource","id","config","options","setTools","setResources","setResourceTemplates","setPrompts","setState","setError","clientRef","transportRef","connectingRef","reconnectTimeoutRef","ReturnType","setTimeout","reconnectAttemptsRef","isMountedRef","successfulTransportRef","updateState","newState","current","clearReconnectTimeout","clearTimeout","scheduleReconnect","type","autoReconnect","console","delay","log","connectInternal","loadCapabilities","toolsResponse","listTools","err","warn","resourcesResponse","request","method","Array","isArray","debug","promptsResponse","setupNotificationHandlers","setNotificationHandler","updated","setupSamplingHandler","handler","setRequestHandler","result","params","tryConnectWithTransport","transportType","toUpperCase","close","catch","capabilities","sampling","version","transport","onclose","onerror","connectionError","String","preferredTransport","arguments","response","timer","tool","useAssistantRuntime","useEffect","useMemo","Client","Tool","McpTool","stripNullish","input","Record","Object","fromEntries","entries","filter","value","undefined","mcpToolToJSONSchema","inputSchema","type","properties","UseAssistantMCPOptions","tools","client","systemPrompt","useAssistantMCP","options","mcpTools","runtime","toolsKey","map","t","name","join","length","assistantTools","mcpTool","assistantTool","description","parameters","execute","args","abortSignal","console","log","cleanedArgs","result","callTool","arguments","signal","content","Array","text","data","mimeType","hasImages","some","item","imageContent","const","transformedParts","error","unregister","registerModelContextProvider","getModelContext","system"],"sources":["../src/lib/utils.ts","../src/lib/constants.ts","../src/services/realtime/audio-analyzer.ts","../src/services/realtime/event-emitter.ts","../src/services/realtime/message-handler.ts","../src/services/realtime/tool-manager.ts","../src/services/realtime/webrtc-manager.ts","../src/services/realtime/openai-realtime-service.ts","../src/services/realtime/types.ts","../src/hooks/useVoiceMode.ts","../src/providers/VoiceModeProvider.tsx","../src/components/avatar.tsx","../src/components/dialog.tsx","../src/components/tooltip.tsx","../src/components/button.tsx","../src/components/tooltip-icon-button.tsx","../src/components/attachment.tsx","../src/components/markdown-text.tsx","../src/lib/mcp-transport.ts","../src/providers/MCPToolsProvider.tsx","../src/components/RemoteMCPSettings.tsx","../src/components/tool-fallback.tsx","../src/components/live-waveform.tsx","../src/components/voice-indicator.tsx","../src/components/thread-with-voice.tsx","../src/components/assistant-modal.tsx","../src/components/MCPToolRegistry.tsx","../src/generated/inline-styles.ts","../src/web-component.tsx","../src/components/Thread.tsx","../src/components/AssistantMessage.tsx","../src/components/UserMessage.tsx","../src/components/Composer.tsx","../src/components/realtime-tool-card.tsx","../src/components/badge.tsx","../src/components/scroll-area.tsx","../src/components/separator.tsx","../src/lib/converter.ts","../../agents/dist/index.mjs","../src/hooks/useAgentChat.ts","../src/hooks/useCloudflareRuntime.tsx","../src/providers/ChatRuntimeProvider.tsx","../src/hooks/useMCPSource.ts","../src/hooks/useAssistantMCP.ts"],"sourcesContent":["import { clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nimport type { ClassValue } from 'clsx'\n\n/**\n * Merges Tailwind CSS classes with proper precedence handling.\n * Combines clsx for conditional classes and tailwind-merge for deduplication.\n */\nexport function cn(...inputs: ClassValue[]): string {\n\treturn twMerge(clsx(inputs))\n}\n","/**\n * Shared Constants\n *\n * Centralized location for all magic numbers, timeouts, and configuration values.\n * Having these in one place makes the codebase more maintainable and easier to tune.\n */\n\n// ============================================================================\n// MCP Connection Constants\n// ============================================================================\n\n/** Maximum number of reconnection attempts before giving up */\nexport const MCP_MAX_RECONNECT_ATTEMPTS = 5\n\n/** Base delay in milliseconds for exponential backoff reconnection */\nexport const MCP_BASE_RECONNECT_DELAY_MS = 1000\n\n/** Maximum reconnect delay in milliseconds (caps exponential backoff) */\nexport const MCP_MAX_RECONNECT_DELAY_MS = 30000\n\n/** Delay before auto-connecting to tab-based MCP sources (allows server initialization) */\nexport const MCP_TAB_CONNECT_DELAY_MS = 100\n\n// ============================================================================\n// Voice Mode / Realtime API Constants\n// ============================================================================\n\n/** Number of frequency bins for audio visualization */\nexport const AUDIO_FREQUENCY_BINS = 32\n\n/** Default OpenAI Realtime model */\nexport const REALTIME_DEFAULT_MODEL = 'gpt-4o-realtime-preview-2024-12-17'\n\n/** Default voice for OpenAI Realtime */\nexport const REALTIME_DEFAULT_VOICE = 'verse'\n\n/** Default OpenAI Realtime API URL */\nexport const REALTIME_DEFAULT_API_URL = 'https://api.openai.com/v1/realtime'\n\n/** Interval in milliseconds for audio visualization updates (~60fps) */\nexport const AUDIO_VISUALIZATION_INTERVAL_MS = 16\n\n/** Delay in milliseconds before requesting response after tool execution */\nexport const RESPONSE_REQUEST_DELAY_MS = 150\n\n/** Duration to show completed tool calls before clearing (success) */\nexport const TOOL_CALL_DISPLAY_DURATION_MS = 1500\n\n/** Duration to show failed tool calls before clearing (error) */\nexport const TOOL_CALL_ERROR_DISPLAY_DURATION_MS = 3000\n\n// ============================================================================\n// Waveform Visualization Constants\n// ============================================================================\n\n/** Default history size for scrolling waveform mode */\nexport const WAVEFORM_HISTORY_SIZE = 60\n\n/** Update rate in milliseconds for waveform visualization */\nexport const WAVEFORM_UPDATE_RATE_MS = 30\n\n// ============================================================================\n// WebSocket States (for type-safe comparisons)\n// ============================================================================\n\n/** WebSocket OPEN state value */\nexport const WEBSOCKET_OPEN = 1\n\n// ============================================================================\n// Logging Configuration\n// ============================================================================\n\n/**\n * Enable debug logging for development.\n * Can be enabled by setting window.__WEBMCP_DEBUG__ = true in the browser console.\n * In production builds, this defaults to false.\n */\nexport const DEBUG_LOGGING_ENABLED =\n\ttypeof window !== 'undefined' &&\n\t(window as { __WEBMCP_DEBUG__?: boolean }).__WEBMCP_DEBUG__ === true\n\n/**\n * Conditional debug logger that only logs when DEBUG_LOGGING_ENABLED is true.\n * Can be enabled at runtime by setting window.__WEBMCP_DEBUG__ = true\n *\n * @param component - The component or service name for the log prefix\n * @param message - The log message\n * @param data - Optional data to include in the log\n */\nexport function debugLog(component: string, message: string, data?: unknown): void {\n\t// Check the flag at runtime to allow enabling after page load\n\tconst isDebugEnabled =\n\t\ttypeof window !== 'undefined' &&\n\t\t(window as { __WEBMCP_DEBUG__?: boolean }).__WEBMCP_DEBUG__ === true\n\n\tif (isDebugEnabled) {\n\t\tif (data !== undefined) {\n\t\t\tconsole.log(`[${component}] ${message}`, data)\n\t\t} else {\n\t\t\tconsole.log(`[${component}] ${message}`)\n\t\t}\n\t}\n}\n","import { debugLog } from '../../lib/constants'\n\n/**\n * Audio analyzer for processing microphone and speaker audio streams.\n * Uses Web Audio API to analyze audio levels and frequency data.\n */\nexport class AudioAnalyzer {\n\tprivate audioContext: AudioContext | null = null\n\tprivate analyser: AnalyserNode | null = null\n\tprivate source: MediaStreamAudioSourceNode | null = null\n\tprivate dataArray: Uint8Array<ArrayBuffer> | null = null\n\tprivate animationId: number | null = null\n\n\t/**\n\t * Initialize the audio analyzer with a media stream\n\t * @param stream - MediaStream to analyze (typically from microphone or speaker)\n\t */\n\tasync initialize(stream: MediaStream): Promise<void> {\n\t\t// Log stream info for debugging\n\t\tconst audioTracks = stream.getAudioTracks()\n\t\tdebugLog('AudioAnalyzer', 'Initializing with stream', {\n\t\t\tstreamId: stream.id,\n\t\t\taudioTracks: audioTracks.length,\n\t\t\ttrackInfo: audioTracks.map((t) => ({\n\t\t\t\tid: t.id,\n\t\t\t\tlabel: t.label,\n\t\t\t\tenabled: t.enabled,\n\t\t\t\tmuted: t.muted,\n\t\t\t\treadyState: t.readyState,\n\t\t\t})),\n\t\t})\n\n\t\tthis.audioContext = new AudioContext()\n\t\tdebugLog('AudioAnalyzer', `AudioContext created, initial state: ${this.audioContext.state}`)\n\n\t\t// Always try to resume - some browsers need this regardless of reported state\n\t\ttry {\n\t\t\tawait this.audioContext.resume()\n\t\t\tdebugLog('AudioAnalyzer', `AudioContext after resume: ${this.audioContext.state}`)\n\t\t} catch (err) {\n\t\t\tconsole.warn('[AudioAnalyzer] Failed to resume AudioContext:', err)\n\t\t}\n\n\t\tthis.analyser = this.audioContext.createAnalyser()\n\t\tthis.analyser.fftSize = 256\n\t\tthis.analyser.smoothingTimeConstant = 0.8\n\n\t\tthis.source = this.audioContext.createMediaStreamSource(stream)\n\t\tthis.source.connect(this.analyser)\n\n\t\tconst bufferLength = this.analyser.frequencyBinCount\n\t\tthis.dataArray = new Uint8Array(new ArrayBuffer(bufferLength))\n\n\t\tdebugLog('AudioAnalyzer', 'Setup complete', {\n\t\t\tsampleRate: this.audioContext.sampleRate,\n\t\t\tfrequencyBinCount: bufferLength,\n\t\t\tcontextState: this.audioContext.state,\n\t\t})\n\t}\n\n\tgetAudioLevel(): number {\n\t\tif (!this.analyser || !this.dataArray) return 0\n\n\t\tthis.analyser.getByteFrequencyData(this.dataArray)\n\n\t\t// Calculate average volume\n\t\tlet sum = 0\n\t\tfor (let i = 0; i < this.dataArray.length; i++) {\n\t\t\tsum += this.dataArray[i]\n\t\t}\n\t\tconst average = sum / this.dataArray.length\n\n\t\t// Normalize to 0-1 range\n\t\treturn Math.min(1, average / 128)\n\t}\n\n\tgetFrequencyData(bins = 16): number[] {\n\t\tif (!this.analyser || !this.dataArray) return new Array(bins).fill(0)\n\n\t\tthis.analyser.getByteFrequencyData(this.dataArray)\n\n\t\tconst result: number[] = []\n\t\tconst samplesPerBin = Math.floor(this.dataArray.length / bins)\n\n\t\tfor (let i = 0; i < bins; i++) {\n\t\t\tlet sum = 0\n\t\t\tfor (let j = 0; j < samplesPerBin; j++) {\n\t\t\t\tsum += this.dataArray[i * samplesPerBin + j]\n\t\t\t}\n\t\t\t// Normalize to 0-1 range\n\t\t\tresult.push(Math.min(1, sum / samplesPerBin / 255))\n\t\t}\n\n\t\treturn result\n\t}\n\n\tstartAnalysis(callback: (level: number, frequencies: number[]) => void): void {\n\t\tconst analyze = () => {\n\t\t\tconst level = this.getAudioLevel()\n\t\t\tconst frequencies = this.getFrequencyData()\n\t\t\tcallback(level, frequencies)\n\t\t\tthis.animationId = requestAnimationFrame(analyze)\n\t\t}\n\t\tanalyze()\n\t}\n\n\tstopAnalysis(): void {\n\t\tif (this.animationId !== null) {\n\t\t\tcancelAnimationFrame(this.animationId)\n\t\t\tthis.animationId = null\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\tthis.stopAnalysis()\n\n\t\tif (this.source) {\n\t\t\tthis.source.disconnect()\n\t\t\tthis.source = null\n\t\t}\n\n\t\tif (this.analyser) {\n\t\t\tthis.analyser.disconnect()\n\t\t\tthis.analyser = null\n\t\t}\n\n\t\tif (this.audioContext) {\n\t\t\tvoid this.audioContext.close()\n\t\t\tthis.audioContext = null\n\t\t}\n\n\t\tthis.dataArray = null\n\t}\n}\n","import type { EventCallback, IEventEmitter } from './types'\n\nexport class EventEmitter implements IEventEmitter {\n\tprivate listeners = new Map<string, Set<EventCallback>>()\n\n\ton(event: string, callback: EventCallback): void {\n\t\tif (!this.listeners.has(event)) {\n\t\t\tthis.listeners.set(event, new Set())\n\t\t}\n\t\tconst listeners = this.listeners.get(event)\n\t\tif (listeners) {\n\t\t\tlisteners.add(callback)\n\t\t}\n\t}\n\n\toff(event: string, callback: EventCallback): void {\n\t\tthis.listeners.get(event)?.delete(callback)\n\t}\n\n\temit(event: string, data: unknown): void {\n\t\tthis.listeners.get(event)?.forEach((callback) => {\n\t\t\ttry {\n\t\t\t\tcallback(data)\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`Error in event listener for ${event}:`, error)\n\t\t\t}\n\t\t})\n\t}\n\n\tremoveAllListeners(event?: string): void {\n\t\tif (event) {\n\t\t\tthis.listeners.delete(event)\n\t\t} else {\n\t\t\tthis.listeners.clear()\n\t\t}\n\t}\n\n\tlistenerCount(event: string): number {\n\t\treturn this.listeners.get(event)?.size || 0\n\t}\n}\n","import { RESPONSE_REQUEST_DELAY_MS } from '../../lib/constants'\n\nimport type { EventEmitter } from './event-emitter'\nimport type { ToolManager } from './tool-manager'\nimport type { FunctionCall, RealtimeMessage } from './types'\n\n/**\n * Type for response output items from OpenAI Realtime API\n */\ninterface ResponseOutputItem {\n\ttype: string\n\tstatus?: string\n\tname?: string\n\tcall_id?: string\n\targuments?: string\n}\n\n/**\n * Type guard to check if an output item is a completed function call\n */\nfunction isCompletedFunctionCall(item: ResponseOutputItem): item is ResponseOutputItem & {\n\tname: string\n\tcall_id: string\n\targuments: string\n} {\n\treturn (\n\t\titem.type === 'function_call' &&\n\t\titem.status === 'completed' &&\n\t\ttypeof item.name === 'string' &&\n\t\ttypeof item.call_id === 'string'\n\t)\n}\n\nexport class MessageHandler {\n\tprivate isProcessingResponse = false\n\tprivate pendingFunctionCalls = new Set<string>()\n\tprivate responseRequestTimer: ReturnType<typeof setTimeout> | null = null\n\tprivate hasRequestedResponse = false\n\n\tconstructor(\n\t\tprivate toolManager: ToolManager,\n\t\tprivate eventEmitter: EventEmitter\n\t) {}\n\n\tasync handleMessage(data: string, dataChannel: RTCDataChannel): Promise<void> {\n\t\tlet msg: RealtimeMessage\n\n\t\ttry {\n\t\t\tmsg = JSON.parse(data) as RealtimeMessage\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to parse realtime message:', error)\n\t\t\treturn\n\t\t}\n\n\t\t// Log all incoming events for debugging\n\t\t// Route message to appropriate handler\n\t\tswitch (msg.type) {\n\t\t\tcase 'response.created':\n\t\t\t\tthis.handleResponseCreated(msg)\n\t\t\t\tbreak\n\n\t\t\tcase 'response.done':\n\t\t\t\tawait this.handleResponseDone(msg, dataChannel)\n\t\t\t\tbreak\n\n\t\t\tcase 'response.function_call_arguments.done':\n\t\t\t\tthis.handleFunctionCallArguments()\n\t\t\t\tbreak\n\n\t\t\tcase 'input_audio_buffer.speech_started':\n\t\t\tcase 'input_audio_buffer.speech_stopped':\n\t\t\t\tthis.handleSpeechEvents(msg)\n\t\t\t\tbreak\n\n\t\t\t// GA API: response.output_audio events\n\t\t\tcase 'response.output_audio.delta':\n\t\t\tcase 'response.output_audio.done':\n\t\t\t\tthis.handleAudioEvents(msg)\n\t\t\t\tbreak\n\n\t\t\t// GA API: response.output_audio_transcript and response.output_text events\n\t\t\tcase 'response.output_audio_transcript.delta':\n\t\t\tcase 'response.output_audio_transcript.done':\n\t\t\tcase 'response.output_text.delta':\n\t\t\tcase 'response.output_text.done':\n\t\t\t\tthis.handleTranscriptEvents(msg)\n\t\t\t\tbreak\n\n\t\t\tcase 'conversation.item.input_audio_transcription.completed':\n\t\t\t\tthis.handleUserTranscript(msg)\n\t\t\t\tbreak\n\n\t\t\tcase 'error':\n\t\t\t\tthis.handleError(msg)\n\t\t\t\tbreak\n\n\t\t\tcase 'session.created':\n\t\t\tcase 'session.updated':\n\t\t\t\tthis.handleSessionEvents(msg)\n\t\t\t\tbreak\n\n\t\t\tcase 'conversation.item.created':\n\t\t\tcase 'input_audio_buffer.committed':\n\t\t\t\t// Log only, no action needed\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tprivate handleResponseCreated(_msg: RealtimeMessage): void {\n\t\tthis.isProcessingResponse = true\n\t\tthis.hasRequestedResponse = false\n\t}\n\n\tprivate async handleResponseDone(\n\t\tmsg: RealtimeMessage,\n\t\tdataChannel: RTCDataChannel\n\t): Promise<void> {\n\t\t// Safely extract response output with proper type checking\n\t\tconst outputItems = this.extractResponseOutput(msg.response)\n\n\t\t// Check if there are function calls to process\n\t\tconst hasFunctionCalls = outputItems.some(isCompletedFunctionCall)\n\n\t\t// Only set isProcessingResponse to false if there are no function calls\n\t\tif (!hasFunctionCalls) {\n\t\t\tthis.isProcessingResponse = false\n\t\t\tthis.hasRequestedResponse = false\n\t\t}\n\n\t\t// Process any function calls in the response\n\t\tif (outputItems.length > 0) {\n\t\t\t// Extract function calls with proper type narrowing\n\t\t\tconst functionCalls: FunctionCall[] = outputItems\n\t\t\t\t.filter(isCompletedFunctionCall)\n\t\t\t\t.map((item) => ({\n\t\t\t\t\tname: item.name,\n\t\t\t\t\tcall_id: item.call_id,\n\t\t\t\t\targuments: item.arguments ?? '',\n\t\t\t\t}))\n\n\t\t\tfor (const functionCall of functionCalls) {\n\t\t\t\tif (!this.pendingFunctionCalls.has(functionCall.call_id)) {\n\t\t\t\t\tthis.pendingFunctionCalls.add(functionCall.call_id)\n\t\t\t\t\tawait this.executeFunctionCall(functionCall, dataChannel)\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[MessageHandler] Skipping duplicate function call: ${functionCall.name} (${functionCall.call_id})`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// After all function calls are processed, check if we need to request a response\n\t\t\tif (functionCalls.length > 0 && this.pendingFunctionCalls.size === 0) {\n\t\t\t\tthis.requestResponseIfNeeded(dataChannel)\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Safely extract response output array from response object\n\t */\n\tprivate extractResponseOutput(response: unknown): ResponseOutputItem[] {\n\t\tif (!response || typeof response !== 'object') {\n\t\t\treturn []\n\t\t}\n\n\t\tconst r = response as Record<string, unknown>\n\t\tif (!Array.isArray(r.output)) {\n\t\t\treturn []\n\t\t}\n\n\t\t// Filter to only valid output items\n\t\treturn r.output.filter(\n\t\t\t(item): item is ResponseOutputItem =>\n\t\t\t\titem !== null &&\n\t\t\t\ttypeof item === 'object' &&\n\t\t\t\ttypeof (item as ResponseOutputItem).type === 'string'\n\t\t)\n\t}\n\n\tprivate handleFunctionCallArguments(): void {\n\t\t// Function call arguments are being accumulated\n\t\t// Actual execution happens in handleResponseDone\n\t}\n\n\tprivate handleSpeechEvents(msg: RealtimeMessage): void {\n\t\tconst eventType =\n\t\t\tmsg.type === 'input_audio_buffer.speech_started' ? 'speech_started' : 'speech_stopped'\n\t\tthis.eventEmitter.emit(eventType, msg)\n\t}\n\n\tprivate handleAudioEvents(msg: RealtimeMessage): void {\n\t\tconst eventType = msg.type === 'response.output_audio.delta' ? 'audio_started' : 'audio_stopped'\n\t\tconsole.log(`[MessageHandler] Assistant ${eventType}`, {\n\t\t\ttype: msg.type,\n\t\t\thasAudio: !!(msg as { delta?: unknown }).delta,\n\t\t})\n\t\tthis.eventEmitter.emit(eventType, msg)\n\t}\n\n\tprivate handleTranscriptEvents(msg: RealtimeMessage): void {\n\t\t// GA API event name mappings\n\t\tconst eventMap: Record<string, string> = {\n\t\t\t'response.output_audio_transcript.delta': 'assistant_transcript',\n\t\t\t'response.output_audio_transcript.done': 'assistant_transcript_done',\n\t\t\t'response.output_text.delta': 'text',\n\t\t\t'response.output_text.done': 'text_done',\n\t\t}\n\n\t\tconst eventType = eventMap[msg.type]\n\t\tif (eventType) {\n\t\t\tthis.eventEmitter.emit(eventType, msg)\n\t\t}\n\t}\n\n\tprivate handleUserTranscript(msg: RealtimeMessage): void {\n\t\tthis.eventEmitter.emit('user_transcript_done', { text: msg.transcript })\n\t}\n\n\tprivate handleSessionEvents(_msg: RealtimeMessage): void {\n\t\t// Session events are handled but no action is needed at this time\n\t}\n\n\tprivate handleError(msg: RealtimeMessage): void {\n\t\tconsole.error('Realtime API error:', msg)\n\t\tthis.eventEmitter.emit('error', msg)\n\t\tthis.isProcessingResponse = false\n\t\tthis.hasRequestedResponse = false\n\n\t\t// Clear any pending response timer\n\t\tif (this.responseRequestTimer) {\n\t\t\tclearTimeout(this.responseRequestTimer)\n\t\t\tthis.responseRequestTimer = null\n\t\t}\n\t}\n\n\tprivate async executeFunctionCall(\n\t\tfunctionCall: FunctionCall,\n\t\tdataChannel: RTCDataChannel\n\t): Promise<void> {\n\t\tconst { name, call_id } = functionCall\n\n\t\ttry {\n\t\t\t// Emit start event\n\t\t\tthis.eventEmitter.emit('tool_call_started', { name })\n\n\t\t\t// Execute tool\n\t\t\tconst result = await this.toolManager.executeToolCall(functionCall)\n\n\t\t\t// Check if data channel is still open before sending\n\t\t\tif (dataChannel.readyState !== 'open') {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[MessageHandler] Cannot send tool result for ${name}: DataChannel is ${dataChannel.readyState}`\n\t\t\t\t)\n\t\t\t\tthis.eventEmitter.emit('tool_call_completed', {\n\t\t\t\t\tname,\n\t\t\t\t\terror: 'DataChannel closed during tool execution',\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Send result back\n\t\t\tconst response = {\n\t\t\t\ttype: 'conversation.item.create',\n\t\t\t\titem: {\n\t\t\t\t\ttype: 'function_call_output',\n\t\t\t\t\tcall_id: call_id,\n\t\t\t\t\toutput: JSON.stringify(\n\t\t\t\t\t\tresult.success\n\t\t\t\t\t\t\t? result.data\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\terror: result.error,\n\t\t\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t}\n\n\t\t\tdataChannel.send(JSON.stringify(response))\n\n\t\t\t// Emit completion event\n\t\t\tthis.eventEmitter.emit('tool_call_completed', {\n\t\t\t\tname,\n\t\t\t\terror: result.success ? undefined : result.error,\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tconsole.error(`[MessageHandler] Tool execution failed for ${name}:`, error)\n\t\t\tthis.sendToolError(call_id, String(error), dataChannel)\n\t\t} finally {\n\t\t\tthis.pendingFunctionCalls.delete(call_id)\n\n\t\t\t// After removing this function call, check if all are complete\n\t\t\tif (this.pendingFunctionCalls.size === 0) {\n\t\t\t\t// All function calls are done, now we can request a response\n\t\t\t\tthis.isProcessingResponse = false\n\t\t\t\tthis.hasRequestedResponse = false\n\t\t\t\tthis.requestResponseIfNeeded(dataChannel)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate sendToolError(call_id: string, error: string, dataChannel: RTCDataChannel): void {\n\t\t// Check if data channel is still open before sending error\n\t\tif (dataChannel.readyState !== 'open') {\n\t\t\tconsole.error(\n\t\t\t\t`[MessageHandler] Cannot send tool error: DataChannel is ${dataChannel.readyState}`\n\t\t\t)\n\t\t\treturn\n\t\t}\n\n\t\tconst errorResponse = {\n\t\t\ttype: 'conversation.item.create',\n\t\t\titem: {\n\t\t\t\ttype: 'function_call_output',\n\t\t\t\tcall_id: call_id,\n\t\t\t\toutput: JSON.stringify({ error, success: false }),\n\t\t\t},\n\t\t}\n\n\t\tdataChannel.send(JSON.stringify(errorResponse))\n\t}\n\n\tprivate requestResponseIfNeeded(dataChannel: RTCDataChannel): void {\n\t\t// Clear any existing timer\n\t\tif (this.responseRequestTimer) {\n\t\t\tclearTimeout(this.responseRequestTimer)\n\t\t\tthis.responseRequestTimer = null\n\t\t}\n\n\t\t// Set a new timer to request response (delay prevents race conditions)\n\t\tthis.responseRequestTimer = setTimeout(() => {\n\t\t\tif (\n\t\t\t\t!this.isProcessingResponse &&\n\t\t\t\t!this.hasRequestedResponse &&\n\t\t\t\tdataChannel.readyState === 'open' &&\n\t\t\t\tthis.pendingFunctionCalls.size === 0\n\t\t\t) {\n\t\t\t\tthis.hasRequestedResponse = true\n\t\t\t\tthis.isProcessingResponse = true\n\t\t\t\tdataChannel.send(JSON.stringify({ type: 'response.create' }))\n\t\t\t}\n\t\t\tthis.responseRequestTimer = null\n\t\t}, RESPONSE_REQUEST_DELAY_MS)\n\t}\n\n\treset(): void {\n\t\tthis.isProcessingResponse = false\n\t\tthis.hasRequestedResponse = false\n\t\tthis.pendingFunctionCalls.clear()\n\n\t\t// Clear any pending response timer\n\t\tif (this.responseRequestTimer) {\n\t\t\tclearTimeout(this.responseRequestTimer)\n\t\t\tthis.responseRequestTimer = null\n\t\t}\n\t}\n}\n","import type { FunctionCall, OpenAITool, ToolExecutionResult } from './types'\n\nexport interface RegisteredTool {\n\tname: string\n\tdescription: string\n\tinputSchema?: Record<string, unknown>\n}\n\nexport type ToolExecutor = (name: string, args: Record<string, unknown>) => Promise<unknown>\n\nexport class ToolManager {\n\tprivate tools: RegisteredTool[] = []\n\tprivate executor: ToolExecutor | null = null\n\tprivate lastSentToolSignature = ''\n\n\tsetTools(tools: RegisteredTool[]): void {\n\t\tthis.tools = tools\n\t}\n\n\tsetExecutor(executor: ToolExecutor): void {\n\t\tthis.executor = executor\n\t}\n\n\tresetSession(): void {\n\t\tconsole.log('[ToolManager] resetSession called (lastSentToolSignature preserved)')\n\t}\n\n\tprivate getToolSignature(tools: RegisteredTool[]): string {\n\t\treturn tools\n\t\t\t.map((t) => t.name)\n\t\t\t.sort()\n\t\t\t.join('|')\n\t}\n\n\thasToolsChanged(): boolean {\n\t\tconst currentSignature = this.getToolSignature(this.tools)\n\t\treturn currentSignature !== this.lastSentToolSignature\n\t}\n\n\tmarkToolsSent(): void {\n\t\tthis.lastSentToolSignature = this.getToolSignature(this.tools)\n\t}\n\n\tformatToolsForOpenAI(): OpenAITool[] {\n\t\t// Built-in tools\n\t\tconst builtInTools: OpenAITool[] = [\n\t\t\t{\n\t\t\t\ttype: 'function',\n\t\t\t\tname: 'list_available_tools',\n\t\t\t\tdescription:\n\t\t\t\t\t'List all currently available tools that can be called. Use this when you need to know what tools are available or when the user asks about available capabilities.',\n\t\t\t\tparameters: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties: {},\n\t\t\t\t\trequired: [],\n\t\t\t\t},\n\t\t\t},\n\t\t]\n\n\t\t// Registered tools\n\t\tconst registeredTools = this.tools.map((tool) => ({\n\t\t\ttype: 'function' as const,\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description || `Execute ${tool.name} action`,\n\t\t\tparameters: this.validateToolSchema(tool.inputSchema),\n\t\t}))\n\n\t\treturn [...builtInTools, ...registeredTools]\n\t}\n\n\tprivate validateToolSchema(schema: Record<string, unknown> | undefined): {\n\t\ttype: string\n\t\tproperties?: Record<string, unknown>\n\t\trequired?: string[]\n\t} {\n\t\tif (!schema) {\n\t\t\treturn { type: 'object', properties: {}, required: [] }\n\t\t}\n\n\t\tconst result: {\n\t\t\ttype: string\n\t\t\tproperties?: Record<string, unknown>\n\t\t\trequired?: string[]\n\t\t} = { type: 'object', ...schema }\n\n\t\tif (result.type === 'object') {\n\t\t\tresult.properties = (result.properties as Record<string, unknown>) || {}\n\n\t\t\t// Generate required array if not present\n\t\t\tif (!result.required && result.properties) {\n\t\t\t\tresult.required = Object.entries(result.properties)\n\t\t\t\t\t.filter(([, prop]) => {\n\t\t\t\t\t\tif (prop && typeof prop === 'object') {\n\t\t\t\t\t\t\tconst p = prop as { optional?: boolean; nullable?: boolean; type?: string }\n\t\t\t\t\t\t\treturn !p.optional && !p.nullable && p.type !== 'null'\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false\n\t\t\t\t\t})\n\t\t\t\t\t.map(([key]) => key)\n\t\t\t}\n\t\t}\n\n\t\treturn result\n\t}\n\n\tasync executeToolCall(functionCall: FunctionCall): Promise<ToolExecutionResult> {\n\t\tconst { name, arguments: argsString } = functionCall\n\n\t\t// Handle built-in tools\n\t\tif (name === 'list_available_tools') {\n\t\t\treturn this.executeListTools()\n\t\t}\n\n\t\t// Check if executor is set\n\t\tif (!this.executor) {\n\t\t\treturn { success: false, error: 'Tool executor not configured' }\n\t\t}\n\n\t\t// Find the tool\n\t\tconst tool = this.tools.find((t) => t.name === name)\n\t\tif (!tool) {\n\t\t\tconsole.error(`[ToolManager] Tool not found: ${name}`)\n\t\t\treturn { success: false, error: `Tool not found: ${name}` }\n\t\t}\n\n\t\t// Parse arguments\n\t\tlet args: Record<string, unknown>\n\t\ttry {\n\t\t\targs = argsString ? (JSON.parse(argsString) as Record<string, unknown>) : {}\n\t\t} catch (error) {\n\t\t\tconsole.error('[ToolManager] Failed to parse arguments:', error)\n\t\t\treturn { success: false, error: 'Invalid arguments format' }\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await this.executor(name, args)\n\t\t\treturn { success: true, data: result }\n\t\t} catch (error) {\n\t\t\tconsole.error(`[ToolManager] Tool execution error for ${name}:`, error)\n\t\t\treturn { success: false, error: String(error) }\n\t\t}\n\t}\n\n\tprivate executeListTools(): ToolExecutionResult {\n\t\tconst toolList = this.tools.map((tool) => ({\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description || 'No description available',\n\t\t\tparameters: tool.inputSchema || {},\n\t\t}))\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: {\n\t\t\t\ttools: toolList,\n\t\t\t\tcount: toolList.length,\n\t\t\t\tmessage:\n\t\t\t\t\ttoolList.length > 0\n\t\t\t\t\t\t? `Found ${toolList.length} available tools`\n\t\t\t\t\t\t: 'No tools currently available',\n\t\t\t},\n\t\t}\n\t}\n\n\tgetChangesSummary(): { added: string[]; removed: string[]; total: number } | null {\n\t\tif (!this.hasToolsChanged()) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst prevTools = this.lastSentToolSignature.split('|').filter(Boolean)\n\t\tconst currTools = this.tools.map((t) => t.name)\n\n\t\tconst prevSet = new Set(prevTools)\n\t\tconst currSet = new Set(currTools)\n\n\t\tconst added = currTools.filter((name) => !prevSet.has(name))\n\t\tconst removed = prevTools.filter((name) => !currSet.has(name))\n\n\t\treturn {\n\t\t\tadded,\n\t\t\tremoved,\n\t\t\ttotal: this.tools.length,\n\t\t}\n\t}\n}\n","import {\n\tdebugLog,\n\tREALTIME_DEFAULT_API_URL,\n\tREALTIME_DEFAULT_MODEL,\n\tREALTIME_DEFAULT_VOICE,\n} from '../../lib/constants'\n\nimport type { RealtimeConfig, RealtimeSession } from './types'\n\ninterface EphemeralTokenResponse {\n\tclient_secret?: {\n\t\tvalue?: string\n\t}\n}\n\nfunction hasClientSecret(response: unknown): response is {\n\tclient_secret: { value: string }\n} {\n\tif (!response || typeof response !== 'object') {\n\t\treturn false\n\t}\n\tconst secret = (response as EphemeralTokenResponse).client_secret\n\treturn typeof secret?.value === 'string'\n}\n\nexport class WebRTCManager {\n\tprivate tokenEndpoint: string\n\n\tconstructor(tokenEndpoint: string) {\n\t\tthis.tokenEndpoint = tokenEndpoint\n\t}\n\n\tasync createSession(config: RealtimeConfig = {}): Promise<RealtimeSession> {\n\t\tconst model = config.model || REALTIME_DEFAULT_MODEL\n\t\tconst voice = config.voice || REALTIME_DEFAULT_VOICE\n\t\tconst apiUrl = config.apiUrl || REALTIME_DEFAULT_API_URL\n\n\t\t// Get ephemeral token from our backend\n\t\tconst ephemeralKey = await this.getEphemeralToken(model, voice)\n\n\t\t// Create peer connection\n\t\tconst pc = new RTCPeerConnection()\n\n\t\t// Set up audio playback\n\t\tconst audioElement = this.createAudioElement()\n\t\t// Track streams\n\t\tlet remoteStream: MediaStream | null = null\n\t\tpc.ontrack = (e) => {\n\t\t\tremoteStream = e.streams[0]\n\t\t\taudioElement.srcObject = remoteStream\n\t\t\tdebugLog('WebRTC', 'Remote audio stream received and connected to audio element', {\n\t\t\t\tstreamId: remoteStream.id,\n\t\t\t\ttracks: remoteStream.getTracks().length,\n\t\t\t})\n\t\t}\n\n\t\t// Add microphone\n\t\tconst localStream = await this.getUserMedia()\n\t\tdebugLog('WebRTC', 'Local microphone stream acquired', {\n\t\t\tstreamId: localStream.id,\n\t\t\ttracks: localStream.getTracks().map((t) => ({\n\t\t\t\tkind: t.kind,\n\t\t\t\tenabled: t.enabled,\n\t\t\t\tmuted: t.muted,\n\t\t\t\treadyState: t.readyState,\n\t\t\t})),\n\t\t})\n\n\t\tlocalStream.getTracks().forEach((track) => {\n\t\t\tpc.addTrack(track, localStream)\n\t\t})\n\n\t\t// Create data channel for events\n\t\tconst dataChannel = pc.createDataChannel('oai-events')\n\n\t\t// Create offer and establish connection\n\t\tconst offer = await pc.createOffer()\n\t\tawait pc.setLocalDescription(offer)\n\n\t\t// Connect to OpenAI\n\t\tif (!offer.sdp) {\n\t\t\tthrow new Error('Failed to create offer SDP')\n\t\t}\n\t\tconst answer = await this.connectToOpenAI(apiUrl, model, offer.sdp, ephemeralKey)\n\t\tawait pc.setRemoteDescription(answer)\n\n\t\t// Create cleanup function\n\t\tconst cleanup = () => {\n\t\t\tlocalStream.getTracks().forEach((track) => {\n\t\t\t\ttrack.stop()\n\t\t\t})\n\t\t\taudioElement.remove()\n\t\t\tdataChannel.close()\n\t\t\tpc.close()\n\t\t}\n\n\t\treturn {\n\t\t\tpc,\n\t\t\tdataChannel,\n\t\t\taudioElement,\n\t\t\tlocalStream,\n\t\t\tremoteStream,\n\t\t\tcleanup,\n\t\t}\n\t}\n\n\tprivate async getEphemeralToken(model: string, voice: string): Promise<string> {\n\t\tconst response = await fetch(this.tokenEndpoint, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify({ model, voice }),\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text()\n\t\t\tconsole.error('Failed to get ephemeral token:', errorText)\n\t\t\tthrow new Error(`Failed to get ephemeral token: ${response.statusText}`)\n\t\t}\n\n\t\tconst data: unknown = await response.json()\n\n\t\tif (!hasClientSecret(data)) {\n\t\t\tthrow new Error('Invalid token response format')\n\t\t}\n\n\t\treturn data.client_secret.value\n\t}\n\n\tprivate createAudioElement(): HTMLAudioElement {\n\t\tconst audioElement = document.createElement('audio')\n\t\taudioElement.autoplay = true\n\t\taudioElement.style.display = 'none'\n\t\tdocument.body.appendChild(audioElement)\n\t\treturn audioElement\n\t}\n\n\tprivate async getUserMedia(): Promise<MediaStream> {\n\t\ttry {\n\t\t\treturn await navigator.mediaDevices.getUserMedia({\n\t\t\t\taudio: {\n\t\t\t\t\techoCancellation: true,\n\t\t\t\t\tnoiseSuppression: true,\n\t\t\t\t\tautoGainControl: true,\n\t\t\t\t},\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tthrow new Error(`Failed to access microphone: ${error}`)\n\t\t}\n\t}\n\n\tprivate async connectToOpenAI(\n\t\tbaseUrl: string,\n\t\tmodel: string,\n\t\tsdp: string,\n\t\tephemeralKey: string\n\t): Promise<RTCSessionDescriptionInit> {\n\t\tconst response = await fetch(`${baseUrl}?model=${model}`, {\n\t\t\tmethod: 'POST',\n\t\t\tbody: sdp,\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${ephemeralKey}`,\n\t\t\t\t'Content-Type': 'application/sdp',\n\t\t\t},\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to establish WebRTC connection: ${response.statusText}`)\n\t\t}\n\n\t\tconst answerSdp = await response.text()\n\t\treturn {\n\t\t\ttype: 'answer' as const,\n\t\t\tsdp: answerSdp,\n\t\t}\n\t}\n}\n","import {\n\tAUDIO_FREQUENCY_BINS,\n\tAUDIO_VISUALIZATION_INTERVAL_MS,\n\tdebugLog,\n} from '../../lib/constants'\nimport { AudioAnalyzer } from './audio-analyzer'\nimport { EventEmitter } from './event-emitter'\nimport { MessageHandler } from './message-handler'\nimport { ToolManager } from './tool-manager'\nimport { WebRTCManager } from './webrtc-manager'\n\nimport type { RegisteredTool, ToolExecutor } from './tool-manager'\nimport type { EventCallback, RealtimeConfig, RealtimeSession, SessionConfig } from './types'\n\n/** Pre-allocated zero frequency array for performance */\nconst EMPTY_FREQUENCY_TEMPLATE = Object.freeze(new Array(AUDIO_FREQUENCY_BINS).fill(0))\nconst createZeroFrequencyArray = (): number[] => [...EMPTY_FREQUENCY_TEMPLATE]\n\n/**\n * OpenAI Realtime API Service\n *\n * Manages voice conversations with OpenAI's Realtime API,\n * including WebRTC connections, tool integration, and message handling.\n */\nexport class OpenAIRealtimeService {\n\tprivate session: RealtimeSession | null = null\n\tprivate webrtcManager: WebRTCManager\n\tprivate toolManager: ToolManager\n\tprivate messageHandler: MessageHandler\n\tprivate eventEmitter: EventEmitter\n\tprivate muted = false\n\tprivate lastState: 'disconnected' | 'connecting' | 'connected' | 'error' = 'disconnected'\n\tprivate localAnalyzer: AudioAnalyzer | null = null\n\tprivate remoteAnalyzer: AudioAnalyzer | null = null\n\tprivate visualizationInterval: ReturnType<typeof setInterval> | null = null\n\tprivate sessionStartTime: number | null = null\n\tprivate onToolsChangedCallback: (() => void) | null = null\n\n\tconstructor(tokenEndpoint: string) {\n\t\tthis.webrtcManager = new WebRTCManager(tokenEndpoint)\n\t\tthis.toolManager = new ToolManager()\n\t\tthis.eventEmitter = new EventEmitter()\n\t\tthis.messageHandler = new MessageHandler(this.toolManager, this.eventEmitter)\n\t}\n\n\t/**\n\t * Set the tools available for the voice session\n\t */\n\tsetTools(tools: RegisteredTool[]): void {\n\t\tthis.toolManager.setTools(tools)\n\t\tif (this.isSessionActive()) {\n\t\t\tthis.updateSessionTools()\n\t\t}\n\t}\n\n\t/**\n\t * Set the tool executor function\n\t */\n\tsetToolExecutor(executor: ToolExecutor): void {\n\t\tthis.toolManager.setExecutor(executor)\n\t}\n\n\t/**\n\t * Register callback for when tools change\n\t */\n\tonToolsChanged(callback: () => void): void {\n\t\tthis.onToolsChangedCallback = callback\n\t}\n\n\t/**\n\t * Start a new realtime session\n\t */\n\tasync startSession(config: RealtimeConfig = {}): Promise<RealtimeSession> {\n\t\ttry {\n\t\t\t// Clean up existing session\n\t\t\tif (this.session) {\n\t\t\t\tthis.stopSession()\n\t\t\t}\n\n\t\t\tthis.muted = false\n\t\t\tthis.sessionStartTime = Date.now()\n\t\t\tthis.emitSessionState('connecting')\n\n\t\t\t// Create new WebRTC session\n\t\t\tthis.session = await this.webrtcManager.createSession(config)\n\n\t\t\t// Setup data channel handlers\n\t\t\tthis.setupDataChannel(this.session.dataChannel)\n\n\t\t\t// Monitor peer connection state\n\t\t\tthis.setupPeerConnectionMonitoring(this.session.pc)\n\n\t\t\tif (this.session.localStream) {\n\t\t\t\tawait this.initializeLocalAnalyzer(this.session.localStream)\n\t\t\t}\n\n\t\t\tif (this.session.remoteStream) {\n\t\t\t\tvoid this.initializeRemoteAnalyzer(this.session.remoteStream)\n\t\t\t}\n\n\t\t\t// Update session reference for remote stream\n\t\t\tconst originalOntrack = this.session.pc.ontrack\n\t\t\tconst session = this.session\n\t\t\tthis.session.pc.ontrack = (e) => {\n\t\t\t\tif (originalOntrack) originalOntrack.call(session.pc, e)\n\t\t\t\tif (this.session) {\n\t\t\t\t\tthis.session.remoteStream = e.streams[0]\n\t\t\t\t}\n\n\t\t\t\tconst remoteStream = e.streams[0]\n\t\t\t\tif (!remoteStream) {\n\t\t\t\t\tconsole.warn('[OpenAIRealtimeService] Received ontrack event without stream')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tvoid this.initializeRemoteAnalyzer(remoteStream)\n\t\t\t}\n\n\t\t\treturn this.session\n\t\t} catch (error) {\n\t\t\tthis.handleSessionError(error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\t/**\n\t * Stop the current session\n\t */\n\tstopSession(): void {\n\t\t// Calculate session duration for usage tracking\n\t\tlet durationSeconds = 0\n\t\tif (this.sessionStartTime) {\n\t\t\tdurationSeconds = Math.floor((Date.now() - this.sessionStartTime) / 1000)\n\t\t}\n\n\t\tif (this.visualizationInterval) {\n\t\t\tclearInterval(this.visualizationInterval)\n\t\t\tthis.visualizationInterval = null\n\t\t}\n\n\t\tif (this.localAnalyzer) {\n\t\t\tthis.localAnalyzer.destroy()\n\t\t\tthis.localAnalyzer = null\n\t\t}\n\n\t\tif (this.remoteAnalyzer) {\n\t\t\tthis.remoteAnalyzer.destroy()\n\t\t\tthis.remoteAnalyzer = null\n\t\t}\n\t\tif (this.session) {\n\t\t\tthis.session.cleanup()\n\t\t\tthis.session = null\n\t\t}\n\t\tthis.messageHandler.reset()\n\t\tthis.toolManager.resetSession()\n\n\t\t// Emit disconnected state with session duration\n\t\tthis.muted = false\n\t\tthis.emitSessionState('disconnected', { durationSeconds })\n\n\t\t// Reset session start time\n\t\tthis.sessionStartTime = null\n\t}\n\n\t/**\n\t * Send a text message to the assistant\n\t */\n\tsendUserMessage(text: string): void {\n\t\tif (!this.isSessionActive()) {\n\t\t\tthrow new Error('No active session')\n\t\t}\n\n\t\tconst message = {\n\t\t\ttype: 'conversation.item.create',\n\t\t\titem: {\n\t\t\t\ttype: 'message',\n\t\t\t\trole: 'user',\n\t\t\t\tcontent: [{ type: 'input_text', text }],\n\t\t\t},\n\t\t}\n\n\t\tif (!this.session) {\n\t\t\tthrow new Error('Session is not active')\n\t\t}\n\t\tthis.session.dataChannel.send(JSON.stringify(message))\n\t\tthis.session.dataChannel.send(JSON.stringify({ type: 'response.create' }))\n\t}\n\n\t/**\n\t * Check if session is active\n\t */\n\tisSessionActive(): boolean {\n\t\treturn this.session !== null && this.session.dataChannel.readyState === 'open'\n\t}\n\n\t/**\n\t * Get the local audio stream\n\t */\n\tgetLocalStream(): MediaStream | null {\n\t\treturn this.session?.localStream || null\n\t}\n\n\t/**\n\t * Get the remote audio stream\n\t */\n\tgetRemoteStream(): MediaStream | null {\n\t\treturn this.session?.remoteStream || null\n\t}\n\n\t/**\n\t * Toggle audio mute\n\t */\n\ttoggleMute(muted: boolean): void {\n\t\tif (this.session?.audioElement) {\n\t\t\tthis.session.audioElement.muted = muted\n\t\t}\n\t\tthis.muted = muted\n\t\tthis.emitSessionState(this.lastState, { isMuted: this.muted })\n\t}\n\n\t/**\n\t * Event handling\n\t */\n\ton(event: string, callback: EventCallback): void {\n\t\tthis.eventEmitter.on(event, callback)\n\t}\n\n\toff(event: string, callback: EventCallback): void {\n\t\tthis.eventEmitter.off(event, callback)\n\t}\n\n\tgetSessionStatus(): {\n\t\tstate: 'connecting' | 'connected' | 'disconnected' | 'error'\n\t\tisActive: boolean\n\t\tisMuted: boolean\n\t} {\n\t\treturn {\n\t\t\tstate: this.lastState,\n\t\t\tisActive: this.lastState === 'connected',\n\t\t\tisMuted: this.muted,\n\t\t}\n\t}\n\n\t/**\n\t * Private methods\n\t */\n\tprivate setupDataChannel(dataChannel: RTCDataChannel): void {\n\t\t// Configure session when channel opens\n\t\tdataChannel.addEventListener('open', () => {\n\t\t\tthis.configureSession(dataChannel)\n\t\t\tthis.muted = false\n\t\t\tthis.emitSessionState('connected')\n\t\t})\n\n\t\t// Handle incoming messages\n\t\tdataChannel.addEventListener('message', (event: MessageEvent<string>) => {\n\t\t\tvoid (async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.messageHandler.handleMessage(event.data, dataChannel)\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('Error handling message:', error)\n\t\t\t\t}\n\t\t\t})()\n\t\t})\n\n\t\t// Handle errors\n\t\tdataChannel.addEventListener('error', (error) => {\n\t\t\tconsole.error('DataChannel error:', error)\n\t\t\tthis.eventEmitter.emit('error', { type: 'datachannel_error', error })\n\t\t})\n\n\t\t// Handle close\n\t\tdataChannel.addEventListener('close', () => {\n\t\t\tthis.messageHandler.reset()\n\t\t\tthis.eventEmitter.emit('session_closed', {})\n\t\t})\n\t}\n\n\tprivate setupPeerConnectionMonitoring(pc: RTCPeerConnection): void {\n\t\t// Monitor connection state changes\n\t\tpc.addEventListener('connectionstatechange', () => {\n\t\t\tif (pc.connectionState === 'failed' || pc.connectionState === 'disconnected') {\n\t\t\t\tconsole.error('Peer connection failed or disconnected')\n\t\t\t\tthis.messageHandler.reset()\n\t\t\t\tthis.eventEmitter.emit('error', {\n\t\t\t\t\ttype: 'connection_error',\n\t\t\t\t\tmessage: `Connection ${pc.connectionState}`,\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\n\t\t// Monitor ICE connection state\n\t\tpc.addEventListener('iceconnectionstatechange', () => {\n\t\t\tif (pc.iceConnectionState === 'failed' || pc.iceConnectionState === 'disconnected') {\n\t\t\t\tconsole.error('ICE connection failed or disconnected')\n\t\t\t}\n\t\t})\n\n\t\t// Monitor signaling state\n\t\tpc.addEventListener('signalingstatechange', () => {})\n\t}\n\n\tprivate configureSession(dataChannel: RTCDataChannel): void {\n\t\t// Reset per-session state\n\t\tthis.toolManager.resetSession()\n\n\t\t// Get initial tools\n\t\tconst tools = this.toolManager.formatToolsForOpenAI()\n\t\t// Mark tools as sent\n\t\tthis.toolManager.markToolsSent()\n\n\t\tconst sessionConfig: SessionConfig = {\n\t\t\tmodalities: ['text', 'audio'],\n\t\t\tinstructions: this.getSessionInstructions(),\n\t\t\tvoice: 'verse',\n\t\t\ttools: tools,\n\t\t\ttool_choice: 'auto',\n\t\t\tturn_detection: {\n\t\t\t\ttype: 'server_vad',\n\t\t\t\tthreshold: 0.5,\n\t\t\t\tprefix_padding_ms: 300,\n\t\t\t\tsilence_duration_ms: 500,\n\t\t\t},\n\t\t\tinput_audio_transcription: {\n\t\t\t\tmodel: 'whisper-1',\n\t\t\t},\n\t\t}\n\n\t\tconst sessionUpdate = {\n\t\t\ttype: 'session.update',\n\t\t\tsession: sessionConfig,\n\t\t}\n\n\t\tdataChannel.send(JSON.stringify(sessionUpdate))\n\t}\n\n\tprivate updateSessionTools(): void {\n\t\tif (!this.session) {\n\t\t\tconsole.warn('[OpenAIRealtimeService] Cannot update tools: no active session')\n\t\t\treturn\n\t\t}\n\n\t\tif (this.session.dataChannel.readyState !== 'open') {\n\t\t\tconsole.warn(\n\t\t\t\t`[OpenAIRealtimeService] Cannot update tools: DataChannel is ${this.session.dataChannel.readyState}`\n\t\t\t)\n\t\t\treturn\n\t\t}\n\n\t\t// Check if tools have actually changed\n\t\tconst changesSummary = this.toolManager.getChangesSummary()\n\t\tif (!changesSummary) {\n\t\t\treturn\n\t\t}\n\n\t\t// Get the full tool list\n\t\tconst tools = this.toolManager.formatToolsForOpenAI()\n\n\t\tconsole.log(\n\t\t\t'[OpenAIRealtimeService] Sending tool update to OpenAI:',\n\t\t\t`${changesSummary.total} total tools,`,\n\t\t\tchangesSummary.added.length > 0\n\t\t\t\t? `+${changesSummary.added.length} added (${changesSummary.added.slice(0, 3).join(', ')}${changesSummary.added.length > 3 ? '...' : ''})`\n\t\t\t\t: '',\n\t\t\tchangesSummary.removed.length > 0 ? `-${changesSummary.removed.length} removed` : ''\n\t\t)\n\n\t\t// Mark tools as sent\n\t\tthis.toolManager.markToolsSent()\n\n\t\tconst sessionUpdate = {\n\t\t\ttype: 'session.update',\n\t\t\tsession: {\n\t\t\t\ttools: tools,\n\t\t\t\ttool_choice: 'auto',\n\t\t\t},\n\t\t}\n\n\t\tthis.session.dataChannel.send(JSON.stringify(sessionUpdate))\n\t}\n\n\tprivate getSessionInstructions(): string {\n\t\treturn `You are a helpful assistant with access to tools.\n Use the available tools to help users with their tasks.\n You can use the list_available_tools function to see what tools are currently available.\n Be concise and helpful in your responses.`\n\t}\n\n\tprivate handleSessionError(error: unknown): void {\n\t\tconsole.error('Session error:', error)\n\t\tthis.emitSessionState('error', {\n\t\t\ttype: 'session_error',\n\t\t\terror: String(error),\n\t\t})\n\t\tthis.stopSession()\n\t}\n\n\tprivate async initializeLocalAnalyzer(stream: MediaStream): Promise<void> {\n\t\tif (this.localAnalyzer) {\n\t\t\tthis.localAnalyzer.destroy()\n\t\t}\n\n\t\tthis.localAnalyzer = new AudioAnalyzer()\n\t\ttry {\n\t\t\t// Clone the stream to avoid conflicts with WebRTC which consumes the original\n\t\t\tconst clonedStream = new MediaStream(stream.getAudioTracks().map((t) => t.clone()))\n\t\t\tawait this.localAnalyzer.initialize(clonedStream)\n\t\t\tthis.startAudioVisualization()\n\t\t} catch (error) {\n\t\t\tconsole.error('[OpenAIRealtimeService] Failed to initialize local audio analyzer', error)\n\t\t\tif (this.localAnalyzer) {\n\t\t\t\tthis.localAnalyzer.destroy()\n\t\t\t\tthis.localAnalyzer = null\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async initializeRemoteAnalyzer(stream: MediaStream): Promise<void> {\n\t\tif (this.remoteAnalyzer) {\n\t\t\tthis.remoteAnalyzer.destroy()\n\t\t}\n\n\t\tthis.remoteAnalyzer = new AudioAnalyzer()\n\t\ttry {\n\t\t\t// Clone the stream to avoid conflicts with WebRTC\n\t\t\tconst clonedStream = new MediaStream(stream.getAudioTracks().map((t) => t.clone()))\n\t\t\tawait this.remoteAnalyzer.initialize(clonedStream)\n\t\t\tthis.startAudioVisualization()\n\t\t} catch (error) {\n\t\t\tconsole.error('[OpenAIRealtimeService] Failed to initialize remote audio analyzer', error)\n\t\t\tif (this.remoteAnalyzer) {\n\t\t\t\tthis.remoteAnalyzer.destroy()\n\t\t\t\tthis.remoteAnalyzer = null\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate startAudioVisualization(): void {\n\t\tif (!this.localAnalyzer && !this.remoteAnalyzer) {\n\t\t\tdebugLog('OpenAIRealtimeService', 'Audio visualization not started: no analyzers ready')\n\t\t\treturn\n\t\t}\n\n\t\tif (this.visualizationInterval) {\n\t\t\tclearInterval(this.visualizationInterval)\n\t\t}\n\n\t\tlet logCounter = 0\n\t\tthis.visualizationInterval = setInterval(() => {\n\t\t\tconst micLevel = this.localAnalyzer?.getAudioLevel() ?? 0\n\t\t\tconst micFrequency =\n\t\t\t\tthis.localAnalyzer?.getFrequencyData(AUDIO_FREQUENCY_BINS) ?? createZeroFrequencyArray()\n\t\t\tconst speakerLevel = this.remoteAnalyzer?.getAudioLevel() ?? 0\n\t\t\tconst speakerFrequency =\n\t\t\t\tthis.remoteAnalyzer?.getFrequencyData(AUDIO_FREQUENCY_BINS) ?? createZeroFrequencyArray()\n\n\t\t\t// Log audio levels periodically for debugging (every ~1 second)\n\t\t\tlogCounter++\n\t\t\tif (logCounter % 60 === 0) {\n\t\t\t\tdebugLog('OpenAIRealtimeService', 'Audio levels', {\n\t\t\t\t\tmic: micLevel.toFixed(3),\n\t\t\t\t\tspeaker: speakerLevel.toFixed(3),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tthis.eventEmitter.emit('audio_level', {\n\t\t\t\tmicLevel,\n\t\t\t\tmicFrequency,\n\t\t\t\tspeakerLevel,\n\t\t\t\tspeakerFrequency,\n\t\t\t})\n\t\t}, AUDIO_VISUALIZATION_INTERVAL_MS)\n\t}\n\n\tprivate emitSessionState(\n\t\tstate: 'connecting' | 'connected' | 'disconnected' | 'error',\n\t\textra: Record<string, unknown> = {}\n\t): void {\n\t\tthis.lastState = state\n\t\tconst payload = {\n\t\t\tstate,\n\t\t\tisActive: state === 'connected',\n\t\t\tisMuted: this.muted,\n\t\t\t...extra,\n\t\t}\n\n\t\tthis.eventEmitter.emit('session_state', payload)\n\n\t\tswitch (state) {\n\t\t\tcase 'connecting':\n\t\t\t\tthis.eventEmitter.emit('session_connecting', payload)\n\t\t\t\tbreak\n\t\t\tcase 'connected':\n\t\t\t\tthis.eventEmitter.emit('session_connected', payload)\n\t\t\t\tbreak\n\t\t\tcase 'disconnected':\n\t\t\t\tthis.eventEmitter.emit('session_closed', payload)\n\t\t\t\tbreak\n\t\t\tcase 'error':\n\t\t\t\tthis.eventEmitter.emit('error', payload)\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tbreak\n\t\t}\n\t}\n}\n\n// Re-export types for convenience\nexport type { RealtimeConfig, RealtimeSession } from './types'\n","/**\n * Types for OpenAI Realtime API integration\n */\n\nexport interface RealtimeConfig {\n\tmodel?: string\n\tvoice?: string\n\tapiUrl?: string\n\ttokenEndpoint?: string\n}\n\nexport interface RealtimeSession {\n\tpc: RTCPeerConnection\n\tdataChannel: RTCDataChannel\n\taudioElement: HTMLAudioElement\n\tlocalStream: MediaStream | null\n\tremoteStream: MediaStream | null\n\tcleanup: () => void\n}\n\nexport interface OpenAITool {\n\ttype: 'function'\n\tname: string\n\tdescription: string\n\tparameters: {\n\t\ttype: string\n\t\tproperties?: Record<string, unknown>\n\t\trequired?: string[]\n\t}\n}\n\nexport interface SessionConfig {\n\tmodalities: string[]\n\tinstructions: string\n\tvoice?: string\n\ttools: OpenAITool[]\n\ttool_choice: string\n\tturn_detection: {\n\t\ttype: string\n\t\tthreshold: number\n\t\tprefix_padding_ms: number\n\t\tsilence_duration_ms: number\n\t}\n\tinput_audio_transcription?: {\n\t\tmodel: string\n\t}\n}\n\nexport interface FunctionCall {\n\tname: string\n\targuments: string\n\tcall_id: string\n\ttype?: string\n\tstatus?: string\n}\n\nexport interface ConversationItem {\n\ttype: string\n\trole?: string\n\tcontent?: unknown[]\n\tcall_id?: string\n\toutput?: string\n}\n\nexport interface RealtimeMessage {\n\ttype: string\n\t[key: string]: unknown\n}\n\nexport interface ToolExecutionResult {\n\tsuccess: boolean\n\tdata?: unknown\n\terror?: string\n}\n\nexport type EventCallback = (data: unknown) => void\n\nexport interface IEventEmitter {\n\ton(event: string, callback: EventCallback): void\n\toff(event: string, callback: EventCallback): void\n\temit(event: string, data: unknown): void\n}\n\nexport interface AudioLevelData {\n\tmicLevel: number\n\tmicFrequency: number[]\n\tspeakerLevel: number\n\tspeakerFrequency: number[]\n}\n\nexport interface TranscriptData {\n\ttype: 'user' | 'assistant'\n\ttext: string\n\tisDone: boolean\n}\n\nexport interface ToolCallData {\n\tstatus: 'started' | 'completed'\n\ttoolName: string\n\terror?: string\n}\n\nexport interface VoiceModeState {\n\tisActive: boolean\n\tisConnecting: boolean\n\tisMuted: boolean\n\tisError: boolean\n\tconnectionState: string\n\taudioLevel?: AudioLevelData\n\ttranscript?: TranscriptData\n\ttoolCall?: ToolCallData\n\terror?: string\n}\n\n// ============================================================================\n// Event Data Types - For type-safe event handling\n// ============================================================================\n\n/**\n * Session state event data from the realtime service\n */\nexport interface SessionStateEventData {\n\tstate: 'connecting' | 'connected' | 'disconnected' | 'error'\n\tisActive: boolean\n\tisMuted: boolean\n\tdurationSeconds?: number\n}\n\n/**\n * User transcript event data\n */\nexport interface UserTranscriptEventData {\n\ttext: string\n}\n\n/**\n * Assistant transcript streaming event data\n */\nexport interface AssistantTranscriptEventData {\n\tdelta?: string\n\ttranscript?: string\n}\n\n/**\n * Tool call started event data\n */\nexport interface ToolCallStartedEventData {\n\tname: string\n}\n\n/**\n * Tool call completed event data\n */\nexport interface ToolCallCompletedEventData {\n\tname: string\n\terror?: string\n}\n\n/**\n * Error event data\n */\nexport interface ErrorEventData {\n\terror?: string\n\tmessage?: string\n\ttype?: string\n}\n\n// ============================================================================\n// Type Guards - Runtime type checking for event data\n// ============================================================================\n\n/**\n * Type guard for SessionStateEventData\n */\nexport function isSessionStateEventData(data: unknown): data is SessionStateEventData {\n\tif (!data || typeof data !== 'object') return false\n\tconst d = data as Record<string, unknown>\n\treturn (\n\t\ttypeof d.state === 'string' &&\n\t\t['connecting', 'connected', 'disconnected', 'error'].includes(d.state) &&\n\t\ttypeof d.isActive === 'boolean' &&\n\t\ttypeof d.isMuted === 'boolean'\n\t)\n}\n\n/**\n * Type guard for UserTranscriptEventData\n */\nexport function isUserTranscriptEventData(data: unknown): data is UserTranscriptEventData {\n\tif (!data || typeof data !== 'object') return false\n\tconst d = data as Record<string, unknown>\n\treturn typeof d.text === 'string'\n}\n\n/**\n * Type guard for AssistantTranscriptEventData\n */\nexport function isAssistantTranscriptEventData(\n\tdata: unknown\n): data is AssistantTranscriptEventData {\n\tif (!data || typeof data !== 'object') return false\n\tconst d = data as Record<string, unknown>\n\treturn d.delta === undefined || typeof d.delta === 'string'\n}\n\n/**\n * Type guard for ToolCallStartedEventData\n */\nexport function isToolCallStartedEventData(data: unknown): data is ToolCallStartedEventData {\n\tif (!data || typeof data !== 'object') return false\n\tconst d = data as Record<string, unknown>\n\treturn typeof d.name === 'string'\n}\n\n/**\n * Type guard for ToolCallCompletedEventData\n */\nexport function isToolCallCompletedEventData(data: unknown): data is ToolCallCompletedEventData {\n\tif (!data || typeof data !== 'object') return false\n\tconst d = data as Record<string, unknown>\n\treturn typeof d.name === 'string'\n}\n\n/**\n * Type guard for ErrorEventData\n */\nexport function isErrorEventData(data: unknown): data is ErrorEventData {\n\tif (!data || typeof data !== 'object') return false\n\t// Error events must have at least one of these fields\n\tconst d = data as Record<string, unknown>\n\treturn typeof d.error === 'string' || typeof d.message === 'string' || typeof d.type === 'string'\n}\n\n/**\n * Type guard for AudioLevelData\n */\nexport function isAudioLevelData(data: unknown): data is AudioLevelData {\n\tif (!data || typeof data !== 'object') return false\n\tconst d = data as Record<string, unknown>\n\treturn (\n\t\ttypeof d.micLevel === 'number' &&\n\t\tArray.isArray(d.micFrequency) &&\n\t\ttypeof d.speakerLevel === 'number' &&\n\t\tArray.isArray(d.speakerFrequency)\n\t)\n}\n","/**\n * Voice Mode Hook\n *\n * Manages OpenAI Realtime API voice sessions with WebRTC.\n * Provides audio level streaming, transcript events, and tool call tracking.\n *\n * @example Basic usage\n * ```tsx\n * const {\n * isActive,\n * startSession,\n * stopSession,\n * toggleMute\n * } = useVoiceMode({\n * tokenEndpoint: '/api/realtime/session'\n * })\n * ```\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport {\n\tTOOL_CALL_DISPLAY_DURATION_MS,\n\tTOOL_CALL_ERROR_DISPLAY_DURATION_MS,\n} from '../lib/constants'\nimport {\n\tisAssistantTranscriptEventData,\n\tisAudioLevelData,\n\tisErrorEventData,\n\tisSessionStateEventData,\n\tisToolCallCompletedEventData,\n\tisToolCallStartedEventData,\n\tisUserTranscriptEventData,\n\tOpenAIRealtimeService,\n} from '../services/realtime'\n\nimport type {\n\tAudioLevelData,\n\tRealtimeConfig,\n\tRegisteredTool,\n\tToolCallData,\n\tToolExecutor,\n\tTranscriptData,\n\tVoiceModeState,\n} from '../services/realtime'\n\nexport interface UseVoiceModeOptions {\n\t/** Endpoint to get ephemeral tokens from */\n\ttokenEndpoint: string\n\t/** Tools available for the voice session */\n\ttools?: RegisteredTool[]\n\t/** Tool executor function */\n\ttoolExecutor?: ToolExecutor\n\t/** Callback when session connects */\n\tonConnect?: () => void\n\t/** Callback when session disconnects */\n\tonDisconnect?: (durationSeconds: number) => void\n\t/** Callback when error occurs */\n\tonError?: (error: string) => void\n\t/** Callback when user transcript is complete */\n\tonUserTranscript?: (text: string) => void\n\t/** Callback when assistant transcript is complete */\n\tonAssistantTranscript?: (text: string) => void\n}\n\nexport interface UseVoiceModeReturn extends VoiceModeState {\n\t/** Start voice session */\n\tstartSession: (config?: RealtimeConfig) => Promise<void>\n\t/** Stop voice session */\n\tstopSession: () => void\n\t/** Toggle microphone mute */\n\ttoggleMute: (muted?: boolean) => void\n\t/** Send text message while in voice mode */\n\tsendMessage: (text: string) => void\n}\n\nexport function useVoiceMode(options: UseVoiceModeOptions): UseVoiceModeReturn {\n\tconst {\n\t\ttokenEndpoint,\n\t\ttools,\n\t\ttoolExecutor,\n\t\tonConnect,\n\t\tonDisconnect,\n\t\tonError,\n\t\tonUserTranscript,\n\t\tonAssistantTranscript,\n\t} = options\n\n\t// State\n\tconst [isActive, setIsActive] = useState(false)\n\tconst [isConnecting, setIsConnecting] = useState(false)\n\tconst [isMuted, setIsMuted] = useState(false)\n\tconst [isError, setIsError] = useState(false)\n\tconst [connectionState, setConnectionState] = useState('disconnected')\n\tconst [audioLevel, setAudioLevel] = useState<AudioLevelData | undefined>()\n\tconst [transcript, setTranscript] = useState<TranscriptData | undefined>()\n\tconst [toolCall, setToolCall] = useState<ToolCallData | undefined>()\n\tconst [error, setError] = useState<string | undefined>()\n\n\t// Service ref\n\tconst serviceRef = useRef<OpenAIRealtimeService | null>(null)\n\n\t// Callbacks refs to avoid stale closures\n\tconst onConnectRef = useRef(onConnect)\n\tconst onDisconnectRef = useRef(onDisconnect)\n\tconst onErrorRef = useRef(onError)\n\tconst onUserTranscriptRef = useRef(onUserTranscript)\n\tconst onAssistantTranscriptRef = useRef(onAssistantTranscript)\n\n\tuseEffect(() => {\n\t\tonConnectRef.current = onConnect\n\t\tonDisconnectRef.current = onDisconnect\n\t\tonErrorRef.current = onError\n\t\tonUserTranscriptRef.current = onUserTranscript\n\t\tonAssistantTranscriptRef.current = onAssistantTranscript\n\t}, [onConnect, onDisconnect, onError, onUserTranscript, onAssistantTranscript])\n\n\t// Get or create service instance\n\tconst getService = useCallback(() => {\n\t\tif (!serviceRef.current) {\n\t\t\tserviceRef.current = new OpenAIRealtimeService(tokenEndpoint)\n\t\t}\n\t\treturn serviceRef.current\n\t}, [tokenEndpoint])\n\n\t// Update tools when they change\n\tuseEffect(() => {\n\t\tif (tools) {\n\t\t\tconst service = getService()\n\t\t\tservice.setTools(tools)\n\t\t}\n\t}, [tools, getService])\n\n\t// Update tool executor when it changes\n\tuseEffect(() => {\n\t\tif (toolExecutor) {\n\t\t\tconst service = getService()\n\t\t\tservice.setToolExecutor(toolExecutor)\n\t\t}\n\t}, [toolExecutor, getService])\n\n\t// Set up event listeners\n\tuseEffect(() => {\n\t\tconst service = getService()\n\n\t\t// Session state handler - uses type guard for safe access\n\t\tconst handleSessionState = (data: unknown) => {\n\t\t\tif (!isSessionStateEventData(data)) {\n\t\t\t\tconsole.warn('[useVoiceMode] Invalid session state event data:', data)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tsetConnectionState(data.state)\n\t\t\tsetIsActive(data.isActive)\n\t\t\tsetIsMuted(data.isMuted)\n\t\t\tsetIsConnecting(data.state === 'connecting')\n\t\t\tsetIsError(data.state === 'error')\n\n\t\t\tif (data.state === 'connected') {\n\t\t\t\tonConnectRef.current?.()\n\t\t\t} else if (data.state === 'disconnected') {\n\t\t\t\tonDisconnectRef.current?.(data.durationSeconds ?? 0)\n\t\t\t}\n\t\t}\n\n\t\t// Audio level handler - uses type guard for safe access\n\t\tconst handleAudioLevel = (data: unknown) => {\n\t\t\tif (isAudioLevelData(data)) {\n\t\t\t\tsetAudioLevel(data)\n\t\t\t}\n\t\t}\n\n\t\t// User transcript handler - uses type guard for safe access\n\t\tconst handleUserTranscript = (data: unknown) => {\n\t\t\tif (!isUserTranscriptEventData(data)) {\n\t\t\t\tconsole.warn('[useVoiceMode] Invalid user transcript event data:', data)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tsetTranscript({ type: 'user', text: data.text, isDone: true })\n\t\t\tonUserTranscriptRef.current?.(data.text)\n\t\t}\n\n\t\t// Assistant transcript handler (streaming) - uses type guard for safe access\n\t\tconst handleAssistantTranscript = (data: unknown) => {\n\t\t\tif (!isAssistantTranscriptEventData(data)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst text = data.delta || data.transcript || ''\n\t\t\tsetTranscript((prev) => ({\n\t\t\t\ttype: 'assistant',\n\t\t\t\ttext: prev?.type === 'assistant' ? prev.text + text : text,\n\t\t\t\tisDone: false,\n\t\t\t}))\n\t\t}\n\n\t\t// Assistant transcript done handler - uses type guard for safe access\n\t\tconst handleAssistantTranscriptDone = (data: unknown) => {\n\t\t\tif (!isAssistantTranscriptEventData(data)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst text = data.transcript || ''\n\t\t\tsetTranscript({ type: 'assistant', text, isDone: true })\n\t\t\tonAssistantTranscriptRef.current?.(text)\n\t\t}\n\n\t\t// Tool call started handler - uses type guard for safe access\n\t\tconst handleToolCallStarted = (data: unknown) => {\n\t\t\tif (!isToolCallStartedEventData(data)) {\n\t\t\t\tconsole.warn('[useVoiceMode] Invalid tool call started event data:', data)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tsetToolCall({ status: 'started', toolName: data.name })\n\t\t}\n\n\t\t// Tool call completed handler - uses type guard for safe access\n\t\tconst handleToolCallCompleted = (data: unknown) => {\n\t\t\tif (!isToolCallCompletedEventData(data)) {\n\t\t\t\tconsole.warn('[useVoiceMode] Invalid tool call completed event data:', data)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tsetToolCall({ status: 'completed', toolName: data.name, error: data.error })\n\n\t\t\t// Clear tool call after a delay (longer for errors)\n\t\t\tsetTimeout(\n\t\t\t\t() => {\n\t\t\t\t\tsetToolCall(undefined)\n\t\t\t\t},\n\t\t\t\tdata.error ? TOOL_CALL_ERROR_DISPLAY_DURATION_MS : TOOL_CALL_DISPLAY_DURATION_MS\n\t\t\t)\n\t\t}\n\n\t\t// Error handler - uses type guard for safe access\n\t\tconst handleError = (data: unknown) => {\n\t\t\tif (!isErrorEventData(data)) {\n\t\t\t\tsetError('Unknown error')\n\t\t\t\tsetIsError(true)\n\t\t\t\tonErrorRef.current?.('Unknown error')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst errorMsg = data.error || data.message || 'Unknown error'\n\t\t\tsetError(errorMsg)\n\t\t\tsetIsError(true)\n\t\t\tonErrorRef.current?.(errorMsg)\n\t\t}\n\n\t\t// Register listeners\n\t\tservice.on('session_state', handleSessionState)\n\t\tservice.on('audio_level', handleAudioLevel)\n\t\tservice.on('user_transcript_done', handleUserTranscript)\n\t\tservice.on('assistant_transcript', handleAssistantTranscript)\n\t\tservice.on('assistant_transcript_done', handleAssistantTranscriptDone)\n\t\tservice.on('tool_call_started', handleToolCallStarted)\n\t\tservice.on('tool_call_completed', handleToolCallCompleted)\n\t\tservice.on('error', handleError)\n\n\t\t// Cleanup\n\t\treturn () => {\n\t\t\tservice.off('session_state', handleSessionState)\n\t\t\tservice.off('audio_level', handleAudioLevel)\n\t\t\tservice.off('user_transcript_done', handleUserTranscript)\n\t\t\tservice.off('assistant_transcript', handleAssistantTranscript)\n\t\t\tservice.off('assistant_transcript_done', handleAssistantTranscriptDone)\n\t\t\tservice.off('tool_call_started', handleToolCallStarted)\n\t\t\tservice.off('tool_call_completed', handleToolCallCompleted)\n\t\t\tservice.off('error', handleError)\n\t\t}\n\t}, [getService])\n\n\t// Start session\n\tconst startSession = useCallback(\n\t\tasync (config?: RealtimeConfig) => {\n\t\t\ttry {\n\t\t\t\tsetIsConnecting(true)\n\t\t\t\tsetIsError(false)\n\t\t\t\tsetError(undefined)\n\n\t\t\t\tconst service = getService()\n\t\t\t\tawait service.startSession(config)\n\t\t\t} catch (err) {\n\t\t\t\tsetIsConnecting(false)\n\t\t\t\tsetIsError(true)\n\t\t\t\tconst errorMsg = err instanceof Error ? err.message : 'Failed to start session'\n\t\t\t\tsetError(errorMsg)\n\t\t\t\tonErrorRef.current?.(errorMsg)\n\t\t\t}\n\t\t},\n\t\t[getService]\n\t)\n\n\t// Stop session\n\tconst stopSession = useCallback(() => {\n\t\tconst service = getService()\n\t\tservice.stopSession()\n\t\tsetAudioLevel(undefined)\n\t\tsetTranscript(undefined)\n\t\tsetToolCall(undefined)\n\t}, [getService])\n\n\t// Toggle mute\n\tconst toggleMute = useCallback(\n\t\t(muted?: boolean) => {\n\t\t\tconst service = getService()\n\t\t\tconst newMuted = muted !== undefined ? muted : !isMuted\n\t\t\tservice.toggleMute(newMuted)\n\t\t\tsetIsMuted(newMuted)\n\t\t},\n\t\t[getService, isMuted]\n\t)\n\n\t// Send message\n\tconst sendMessage = useCallback(\n\t\t(text: string) => {\n\t\t\tconst service = getService()\n\t\t\tif (service.isSessionActive()) {\n\t\t\t\tservice.sendUserMessage(text)\n\t\t\t}\n\t\t},\n\t\t[getService]\n\t)\n\n\t// Memoize return value\n\treturn useMemo(\n\t\t() => ({\n\t\t\tisActive,\n\t\t\tisConnecting,\n\t\t\tisMuted,\n\t\t\tisError,\n\t\t\tconnectionState,\n\t\t\taudioLevel,\n\t\t\ttranscript,\n\t\t\ttoolCall,\n\t\t\terror,\n\t\t\tstartSession,\n\t\t\tstopSession,\n\t\t\ttoggleMute,\n\t\t\tsendMessage,\n\t\t}),\n\t\t[\n\t\t\tisActive,\n\t\t\tisConnecting,\n\t\t\tisMuted,\n\t\t\tisError,\n\t\t\tconnectionState,\n\t\t\taudioLevel,\n\t\t\ttranscript,\n\t\t\ttoolCall,\n\t\t\terror,\n\t\t\tstartSession,\n\t\t\tstopSession,\n\t\t\ttoggleMute,\n\t\t\tsendMessage,\n\t\t]\n\t)\n}\n","import { createContext, useContext, useMemo } from 'react'\n\nimport { useVoiceMode } from '../hooks/useVoiceMode'\n\nimport type { ReactNode } from 'react'\nimport type { UseVoiceModeReturn } from '../hooks/useVoiceMode'\nimport type { RegisteredTool, ToolExecutor } from '../services/realtime'\n\n/**\n * Voice Mode Provider\n *\n * Provides voice mode state and controls to the component tree.\n */\n\ninterface VoiceModeContextValue extends UseVoiceModeReturn {\n\tisSupported: boolean\n}\n\nconst VoiceModeContext = createContext<VoiceModeContextValue | null>(null)\n\nexport interface VoiceModeProviderProps {\n\tchildren: ReactNode\n\t/** Backend endpoint for ephemeral tokens */\n\ttokenEndpoint: string\n\t/** Tools available for voice mode */\n\ttools?: RegisteredTool[]\n\t/** Tool executor function */\n\ttoolExecutor?: ToolExecutor\n\t/** Callback when session connects */\n\tonConnect?: () => void\n\t/** Callback when session disconnects */\n\tonDisconnect?: (durationSeconds: number) => void\n\t/** Callback when error occurs */\n\tonError?: (error: string) => void\n\t/** Callback when user transcript is complete */\n\tonUserTranscript?: (text: string) => void\n\t/** Callback when assistant transcript is complete */\n\tonAssistantTranscript?: (text: string) => void\n}\n\n/**\n * Check if the browser supports WebRTC and getUserMedia\n */\nfunction checkVoiceModeSupport(): boolean {\n\treturn !!(\n\t\ttypeof window !== 'undefined' &&\n\t\twindow.RTCPeerConnection &&\n\t\tnavigator.mediaDevices?.getUserMedia\n\t)\n}\n\nexport function VoiceModeProvider({\n\tchildren,\n\ttokenEndpoint,\n\ttools,\n\ttoolExecutor,\n\tonConnect,\n\tonDisconnect,\n\tonError,\n\tonUserTranscript,\n\tonAssistantTranscript,\n}: VoiceModeProviderProps) {\n\tconst voiceMode = useVoiceMode({\n\t\ttokenEndpoint,\n\t\ttools,\n\t\ttoolExecutor,\n\t\tonConnect,\n\t\tonDisconnect,\n\t\tonError,\n\t\tonUserTranscript,\n\t\tonAssistantTranscript,\n\t})\n\n\tconst isSupported = useMemo(() => checkVoiceModeSupport(), [])\n\n\tconst value = useMemo(\n\t\t() => ({\n\t\t\t...voiceMode,\n\t\t\tisSupported,\n\t\t}),\n\t\t[voiceMode, isSupported]\n\t)\n\n\treturn <VoiceModeContext.Provider value={value}>{children}</VoiceModeContext.Provider>\n}\n\n/**\n * Hook to access voice mode context\n */\nexport function useVoiceModeContext(): VoiceModeContextValue {\n\tconst context = useContext(VoiceModeContext)\n\tif (!context) {\n\t\tthrow new Error('useVoiceModeContext must be used within a VoiceModeProvider')\n\t}\n\treturn context\n}\n\n/**\n * Hook to optionally access voice mode context (returns null if not in provider)\n */\nexport function useOptionalVoiceModeContext(): VoiceModeContextValue | null {\n\treturn useContext(VoiceModeContext)\n}\n","'use client'\n\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nfunction Avatar({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n\treturn (\n\t\t<AvatarPrimitive.Root\n\t\t\tdata-slot=\"avatar\"\n\t\t\tclassName={cn('relative flex size-8 shrink-0 overflow-hidden rounded-full', className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction AvatarImage({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n\treturn (\n\t\t<AvatarPrimitive.Image\n\t\t\tdata-slot=\"avatar-image\"\n\t\t\tclassName={cn('aspect-square size-full', className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction AvatarFallback({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n\treturn (\n\t\t<AvatarPrimitive.Fallback\n\t\t\tdata-slot=\"avatar-fallback\"\n\t\t\tclassName={cn('bg-muted flex size-full items-center justify-center rounded-full', className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","'use client'\n\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { XIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nfunction Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n\treturn <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n\treturn <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n\treturn <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n\treturn <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n\treturn (\n\t\t<DialogPrimitive.Overlay\n\t\t\tdata-slot=\"dialog-overlay\"\n\t\t\tclassName={cn(\n\t\t\t\t'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction DialogContent({\n\tclassName,\n\tchildren,\n\tshowCloseButton = true,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n\tshowCloseButton?: boolean\n}) {\n\treturn (\n\t\t<DialogPortal data-slot=\"dialog-portal\">\n\t\t\t<DialogOverlay />\n\t\t\t<DialogPrimitive.Content\n\t\t\t\tdata-slot=\"dialog-content\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg',\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t{showCloseButton && (\n\t\t\t\t\t<DialogPrimitive.Close\n\t\t\t\t\t\tdata-slot=\"dialog-close\"\n\t\t\t\t\t\tclassName=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t<span className=\"sr-only\">Close</span>\n\t\t\t\t\t</DialogPrimitive.Close>\n\t\t\t\t)}\n\t\t\t</DialogPrimitive.Content>\n\t\t</DialogPortal>\n\t)\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dialog-header\"\n\t\t\tclassName={cn('flex flex-col gap-2 text-center sm:text-left', className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dialog-footer\"\n\t\t\tclassName={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {\n\treturn (\n\t\t<DialogPrimitive.Title\n\t\t\tdata-slot=\"dialog-title\"\n\t\t\tclassName={cn('text-lg leading-none font-semibold', className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction DialogDescription({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n\treturn (\n\t\t<DialogPrimitive.Description\n\t\t\tdata-slot=\"dialog-description\"\n\t\t\tclassName={cn('text-muted-foreground text-sm', className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nexport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogOverlay,\n\tDialogPortal,\n\tDialogTitle,\n\tDialogTrigger,\n}\n","'use client'\n\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nfunction TooltipProvider({\n\tdelayDuration = 0,\n\t...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n\treturn (\n\t\t<TooltipPrimitive.Provider\n\t\t\tdata-slot=\"tooltip-provider\"\n\t\t\tdelayDuration={delayDuration}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n\t\t</TooltipProvider>\n\t)\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n\treturn <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n\tclassName,\n\tsideOffset = 0,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n\treturn (\n\t\t<TooltipPrimitive.Portal>\n\t\t\t<TooltipPrimitive.Content\n\t\t\t\tdata-slot=\"tooltip-content\"\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance',\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n\t\t\t</TooltipPrimitive.Content>\n\t\t</TooltipPrimitive.Portal>\n\t)\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import { Slot } from '@radix-ui/react-slot'\nimport { cva } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nimport type { VariantProps } from 'class-variance-authority'\n\nexport interface ButtonProps\n\textends React.ComponentProps<'button'>,\n\t\tVariantProps<typeof buttonVariants> {\n\tasChild?: boolean\n}\n\nconst buttonVariants = cva(\n\t\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: 'bg-primary text-primary-foreground hover:bg-primary/90',\n\t\t\t\tdestructive:\n\t\t\t\t\t'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n\t\t\t\toutline:\n\t\t\t\t\t'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n\t\t\t\tsecondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n\t\t\t\tghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n\t\t\t\tlink: 'text-primary underline-offset-4 hover:underline',\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tdefault: 'h-9 px-4 py-2 has-[>svg]:px-3',\n\t\t\t\tsm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\n\t\t\t\tlg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n\t\t\t\ticon: 'size-9',\n\t\t\t\t'icon-sm': 'size-8',\n\t\t\t\t'icon-lg': 'size-10',\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: 'default',\n\t\t\tsize: 'default',\n\t\t},\n\t}\n)\n\nfunction Button({\n\tclassName,\n\tvariant,\n\tsize,\n\tasChild = false,\n\t...props\n}: React.ComponentProps<'button'> &\n\tVariantProps<typeof buttonVariants> & {\n\t\tasChild?: boolean\n\t}) {\n\tconst Comp = asChild ? Slot : 'button'\n\n\treturn (\n\t\t<Comp\n\t\t\tdata-slot=\"button\"\n\t\t\tclassName={cn(buttonVariants({ variant, size, className }))}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nexport { Button, buttonVariants }\n","'use client'\n\nimport { Slottable } from '@radix-ui/react-slot'\nimport { forwardRef } from 'react'\n\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\nimport { Tooltip, TooltipContent, TooltipTrigger } from './tooltip'\n\nimport type { ComponentPropsWithRef } from 'react'\n\nexport type TooltipIconButtonProps = ComponentPropsWithRef<typeof Button> & {\n\ttooltip: string\n\tside?: 'top' | 'bottom' | 'left' | 'right'\n}\n\nexport const TooltipIconButton = forwardRef<HTMLButtonElement, TooltipIconButtonProps>(\n\t({ children, tooltip, side = 'bottom', className, ...rest }, ref) => {\n\t\treturn (\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\tclassName={cn('aui-button-icon size-6 p-1', className)}\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Slottable>{children}</Slottable>\n\t\t\t\t\t\t<span className=\"aui-sr-only sr-only\">{tooltip}</span>\n\t\t\t\t\t</Button>\n\t\t\t\t</TooltipTrigger>\n\t\t\t\t<TooltipContent side={side}>{tooltip}</TooltipContent>\n\t\t\t</Tooltip>\n\t\t)\n\t}\n)\n\nTooltipIconButton.displayName = 'TooltipIconButton'\n","'use client'\n\nimport {\n\tAttachmentPrimitive,\n\tComposerPrimitive,\n\tMessagePrimitive,\n\tuseAssistantApi,\n\tuseAssistantState,\n} from '@assistant-ui/react'\nimport { FileText, PlusIcon, XIcon } from 'lucide-react'\nimport { useEffect, useState } from 'react'\nimport { useShallow } from 'zustand/shallow'\n\nimport { cn } from '../lib/utils'\nimport { Avatar, AvatarFallback, AvatarImage } from './avatar'\nimport { Dialog, DialogContent, DialogTitle, DialogTrigger } from './dialog'\nimport { Tooltip, TooltipContent, TooltipTrigger } from './tooltip'\nimport { TooltipIconButton } from './tooltip-icon-button'\n\nimport type { FC, PropsWithChildren } from 'react'\n\nconst useFileSrc = (file: File | undefined) => {\n\tconst [src, setSrc] = useState<string | undefined>(undefined)\n\n\tuseEffect(() => {\n\t\tif (!file) {\n\t\t\tsetSrc(undefined)\n\t\t\treturn\n\t\t}\n\n\t\tconst objectUrl = URL.createObjectURL(file)\n\t\tsetSrc(objectUrl)\n\n\t\treturn () => {\n\t\t\tURL.revokeObjectURL(objectUrl)\n\t\t}\n\t}, [file])\n\n\treturn src\n}\n\nconst useAttachmentSrc = () => {\n\tconst { file, src } = useAssistantState(\n\t\tuseShallow(({ attachment }): { file?: File; src?: string } => {\n\t\t\tif (attachment.type !== 'image') return {}\n\t\t\tif (attachment.file) return { file: attachment.file }\n\t\t\tconst src = attachment.content?.filter((c) => c.type === 'image')[0]?.image\n\t\t\tif (!src) return {}\n\t\t\treturn { src }\n\t\t})\n\t)\n\n\treturn useFileSrc(file) ?? src\n}\n\ntype AttachmentPreviewProps = {\n\tsrc: string\n}\n\nconst AttachmentPreview: FC<AttachmentPreviewProps> = ({ src }) => {\n\treturn (\n\t\t<img\n\t\t\tsrc={src}\n\t\t\talt=\"Image Preview\"\n\t\t\twidth={1}\n\t\t\theight={1}\n\t\t\tclassName=\"aui-attachment-preview-image-loaded block h-auto max-h-[80vh] w-auto max-w-full object-contain\"\n\t\t/>\n\t)\n}\n\nconst AttachmentPreviewDialog: FC<PropsWithChildren> = ({ children }) => {\n\tconst src = useAttachmentSrc()\n\n\tif (!src) return children\n\n\treturn (\n\t\t<Dialog>\n\t\t\t<DialogTrigger\n\t\t\t\tclassName=\"aui-attachment-preview-trigger cursor-pointer transition-colors hover:bg-accent/50\"\n\t\t\t\tasChild\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</DialogTrigger>\n\t\t\t<DialogContent className=\"aui-attachment-preview-dialog-content p-2 sm:max-w-3xl [&_svg]:text-background [&>button]:rounded-full [&>button]:bg-foreground/60 [&>button]:p-1 [&>button]:opacity-100 [&>button]:!ring-0 [&>button]:hover:[&_svg]:text-destructive\">\n\t\t\t\t<DialogTitle className=\"aui-sr-only sr-only\">Image Attachment Preview</DialogTitle>\n\t\t\t\t<div className=\"aui-attachment-preview relative mx-auto flex max-h-[80dvh] w-full items-center justify-center overflow-hidden bg-background\">\n\t\t\t\t\t<AttachmentPreview src={src} />\n\t\t\t\t</div>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t)\n}\n\nconst AttachmentThumb: FC = () => {\n\tconst isImage = useAssistantState(({ attachment }) => attachment.type === 'image')\n\tconst src = useAttachmentSrc()\n\n\treturn (\n\t\t<Avatar className=\"aui-attachment-tile-avatar h-full w-full rounded-none\">\n\t\t\t<AvatarImage\n\t\t\t\tsrc={src}\n\t\t\t\talt=\"Attachment preview\"\n\t\t\t\tclassName=\"aui-attachment-tile-image object-cover\"\n\t\t\t/>\n\t\t\t<AvatarFallback delayMs={isImage ? 200 : 0}>\n\t\t\t\t<FileText className=\"aui-attachment-tile-fallback-icon size-8 text-muted-foreground\" />\n\t\t\t</AvatarFallback>\n\t\t</Avatar>\n\t)\n}\n\nconst AttachmentUI: FC = () => {\n\tconst api = useAssistantApi()\n\tconst isComposer = api.attachment.source === 'composer'\n\n\tconst isImage = useAssistantState(({ attachment }) => attachment.type === 'image')\n\tconst typeLabel = useAssistantState(({ attachment }) => {\n\t\tconst type = attachment.type\n\t\tswitch (type) {\n\t\t\tcase 'image':\n\t\t\t\treturn 'Image'\n\t\t\tcase 'document':\n\t\t\t\treturn 'Document'\n\t\t\tcase 'file':\n\t\t\t\treturn 'File'\n\t\t\tdefault: {\n\t\t\t\tconst _exhaustiveCheck: never = type\n\t\t\t\tthrow new Error(`Unknown attachment type: ${_exhaustiveCheck}`)\n\t\t\t}\n\t\t}\n\t})\n\n\treturn (\n\t\t<Tooltip>\n\t\t\t<AttachmentPrimitive.Root\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'aui-attachment-root relative',\n\t\t\t\t\tisImage && 'aui-attachment-root-composer only:[&>#attachment-tile]:size-24'\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<AttachmentPreviewDialog>\n\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'aui-attachment-tile size-14 cursor-pointer overflow-hidden rounded-[14px] border bg-muted transition-opacity hover:opacity-75',\n\t\t\t\t\t\t\t\tisComposer && 'aui-attachment-tile-composer border-foreground/20'\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\tid=\"attachment-tile\"\n\t\t\t\t\t\t\taria-label={`${typeLabel} attachment`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<AttachmentThumb />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t</AttachmentPreviewDialog>\n\t\t\t\t{isComposer && <AttachmentRemove />}\n\t\t\t</AttachmentPrimitive.Root>\n\t\t\t<TooltipContent side=\"top\">\n\t\t\t\t<AttachmentPrimitive.Name />\n\t\t\t</TooltipContent>\n\t\t</Tooltip>\n\t)\n}\n\nconst AttachmentRemove: FC = () => {\n\treturn (\n\t\t<AttachmentPrimitive.Remove asChild>\n\t\t\t<TooltipIconButton\n\t\t\t\ttooltip=\"Remove file\"\n\t\t\t\tclassName=\"aui-attachment-tile-remove absolute top-1.5 right-1.5 size-3.5 rounded-full bg-white text-muted-foreground opacity-100 shadow-sm hover:!bg-white [&_svg]:text-black hover:[&_svg]:text-destructive\"\n\t\t\t\tside=\"top\"\n\t\t\t>\n\t\t\t\t<XIcon className=\"aui-attachment-remove-icon size-3 dark:stroke-[2.5px]\" />\n\t\t\t</TooltipIconButton>\n\t\t</AttachmentPrimitive.Remove>\n\t)\n}\n\nexport const UserMessageAttachments: FC = () => {\n\treturn (\n\t\t<div className=\"aui-user-message-attachments-end col-span-full col-start-1 row-start-1 flex w-full flex-row justify-end gap-2\">\n\t\t\t<MessagePrimitive.Attachments components={{ Attachment: AttachmentUI }} />\n\t\t</div>\n\t)\n}\n\nexport const ComposerAttachments: FC = () => {\n\treturn (\n\t\t<div className=\"aui-composer-attachments mb-2 flex w-full flex-row items-center gap-2 overflow-x-auto px-1.5 pt-0.5 pb-1 empty:hidden\">\n\t\t\t<ComposerPrimitive.Attachments components={{ Attachment: AttachmentUI }} />\n\t\t</div>\n\t)\n}\n\nexport const ComposerAddAttachment: FC = () => {\n\treturn (\n\t\t<ComposerPrimitive.AddAttachment asChild>\n\t\t\t<TooltipIconButton\n\t\t\t\ttooltip=\"Add Attachment\"\n\t\t\t\tside=\"bottom\"\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tclassName=\"aui-composer-add-attachment size-[34px] rounded-full p-1 text-xs font-semibold hover:bg-muted-foreground/15 dark:border-muted-foreground/15 dark:hover:bg-muted-foreground/30\"\n\t\t\t\taria-label=\"Add Attachment\"\n\t\t\t>\n\t\t\t\t<PlusIcon className=\"aui-attachment-add-icon size-5 stroke-[1.5px]\" />\n\t\t\t</TooltipIconButton>\n\t\t</ComposerPrimitive.AddAttachment>\n\t)\n}\n","'use client'\n\n// CSS imported via globals.css - see src/styles/globals.css for @assistant-ui/react-markdown styles\nimport {\n\tMarkdownTextPrimitive,\n\tunstable_memoizeMarkdownComponents as memoizeMarkdownComponents,\n\tuseIsMarkdownCodeBlock,\n} from '@assistant-ui/react-markdown'\nimport { CheckIcon, CopyIcon } from 'lucide-react'\nimport { memo, useState } from 'react'\nimport remarkGfm from 'remark-gfm'\n\nimport { cn } from '../lib/utils'\nimport { TooltipIconButton } from './tooltip-icon-button'\n\nimport type { CodeHeaderProps } from '@assistant-ui/react-markdown'\nimport type { FC } from 'react'\n\nconst MarkdownTextImpl = () => {\n\treturn (\n\t\t<MarkdownTextPrimitive\n\t\t\tremarkPlugins={[remarkGfm]}\n\t\t\tclassName=\"aui-md\"\n\t\t\tcomponents={defaultComponents}\n\t\t/>\n\t)\n}\n\nexport const MarkdownText = memo(MarkdownTextImpl)\n\nconst CodeHeader: FC<CodeHeaderProps> = ({ language, code }) => {\n\tconst { isCopied, copyToClipboard } = useCopyToClipboard()\n\tconst onCopy = () => {\n\t\tif (!code || isCopied) return\n\t\tcopyToClipboard(code)\n\t}\n\n\treturn (\n\t\t<div className=\"aui-code-header-root mt-2 flex items-center justify-between gap-2 rounded-t-lg bg-muted-foreground/15 px-2 py-1 text-sm font-semibold text-foreground dark:bg-muted-foreground/20\">\n\t\t\t<span className=\"aui-code-header-language lowercase [&>span]:text-xs\">{language}</span>\n\t\t\t<TooltipIconButton tooltip=\"Copy\" onClick={onCopy}>\n\t\t\t\t{!isCopied && <CopyIcon />}\n\t\t\t\t{isCopied && <CheckIcon />}\n\t\t\t</TooltipIconButton>\n\t\t</div>\n\t)\n}\n\nconst useCopyToClipboard = ({\n\tcopiedDuration = 3000,\n}: {\n\tcopiedDuration?: number\n} = {}) => {\n\tconst [isCopied, setIsCopied] = useState<boolean>(false)\n\n\tconst copyToClipboard = (value: string) => {\n\t\tif (!value) return\n\n\t\tvoid navigator.clipboard.writeText(value).then(() => {\n\t\t\tsetIsCopied(true)\n\t\t\tsetTimeout(() => setIsCopied(false), copiedDuration)\n\t\t})\n\t}\n\n\treturn { isCopied, copyToClipboard }\n}\n\nconst defaultComponents = memoizeMarkdownComponents({\n\th1: ({ className, ...props }) => (\n\t\t<h1\n\t\t\tclassName={cn(\n\t\t\t\t'aui-md-h1 mb-4 scroll-m-20 text-[25px] font-extrabold tracking-tight last:mb-0',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t),\n\th2: ({ className, ...props }) => (\n\t\t<h2\n\t\t\tclassName={cn(\n\t\t\t\t'aui-md-h2 mt-4 mb-2 scroll-m-20 text-[21px] font-semibold tracking-tight first:mt-0 last:mb-0',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t),\n\th3: ({ className, ...props }) => (\n\t\t<h3\n\t\t\tclassName={cn(\n\t\t\t\t'aui-md-h3 mt-3 mb-2 scroll-m-20 text-[19px] font-semibold tracking-tight first:mt-0 last:mb-0',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t),\n\th4: ({ className, ...props }) => (\n\t\t<h4\n\t\t\tclassName={cn(\n\t\t\t\t'aui-md-h4 mt-3 mb-2 scroll-m-20 text-[17px] font-semibold tracking-tight first:mt-0 last:mb-0',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t),\n\th5: ({ className, ...props }) => (\n\t\t<h5\n\t\t\tclassName={cn('aui-md-h5 my-2 text-[15px] font-semibold first:mt-0 last:mb-0', className)}\n\t\t\t{...props}\n\t\t/>\n\t),\n\th6: ({ className, ...props }) => (\n\t\t<h6\n\t\t\tclassName={cn('aui-md-h6 my-2 text-[15px] font-semibold first:mt-0 last:mb-0', className)}\n\t\t\t{...props}\n\t\t/>\n\t),\n\tp: ({ className, ...props }) => (\n\t\t<p\n\t\t\tclassName={cn(\n\t\t\t\t'aui-md-p mt-2 mb-2 text-[13px] leading-relaxed first:mt-0 last:mb-0',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t),\n\ta: ({ className, ...props }) => (\n\t\t<a\n\t\t\tclassName={cn(\n\t\t\t\t'aui-md-a text-[13px] font-medium text-primary underline underline-offset-4',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t),\n\tblockquote: ({ className, ...props }) => (\n\t\t<blockquote\n\t\t\tclassName={cn('aui-md-blockquote text-[13px] border-l-2 pl-3 italic', className)}\n\t\t\t{...props}\n\t\t/>\n\t),\n\tul: ({ className, ...props }) => (\n\t\t<ul\n\t\t\tclassName={cn('aui-md-ul text-[13px] my-2 ml-4 list-disc [&>li]:mt-1', className)}\n\t\t\t{...props}\n\t\t/>\n\t),\n\tol: ({ className, ...props }) => (\n\t\t<ol\n\t\t\tclassName={cn('aui-md-ol text-[13px] my-2 ml-4 list-decimal [&>li]:mt-1', className)}\n\t\t\t{...props}\n\t\t/>\n\t),\n\thr: ({ className, ...props }) => (\n\t\t<hr className={cn('aui-md-hr my-2 border-b', className)} {...props} />\n\t),\n\ttable: ({ className, ...props }) => (\n\t\t<table\n\t\t\tclassName={cn(\n\t\t\t\t'aui-md-table text-[13px] my-2 w-full border-separate border-spacing-0 overflow-y-auto',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t),\n\tth: ({ className, ...props }) => (\n\t\t<th\n\t\t\tclassName={cn(\n\t\t\t\t'aui-md-th bg-muted px-2 py-1 text-left font-bold first:rounded-tl-lg last:rounded-tr-lg [&[align=center]]:text-center [&[align=right]]:text-right',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t),\n\ttd: ({ className, ...props }) => (\n\t\t<td\n\t\t\tclassName={cn(\n\t\t\t\t'aui-md-td border-b border-l px-2 py-1 text-left last:border-r [&[align=center]]:text-center [&[align=right]]:text-right',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t),\n\ttr: ({ className, ...props }) => (\n\t\t<tr\n\t\t\tclassName={cn(\n\t\t\t\t'aui-md-tr m-0 border-b p-0 first:border-t [&:last-child>td:first-child]:rounded-bl-lg [&:last-child>td:last-child]:rounded-br-lg',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t),\n\tsup: ({ className, ...props }) => (\n\t\t<sup className={cn('aui-md-sup [&>a]:text-xs [&>a]:no-underline', className)} {...props} />\n\t),\n\tpre: ({ className, ...props }) => (\n\t\t<pre\n\t\t\tclassName={cn(\n\t\t\t\t'aui-md-pre text-[13px] overflow-x-auto !rounded-t-none rounded-b-lg bg-black p-2 text-white',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t),\n\tcode: function Code({ className, ...props }) {\n\t\tconst isCodeBlock = useIsMarkdownCodeBlock()\n\t\treturn (\n\t\t\t<code\n\t\t\t\tclassName={cn(\n\t\t\t\t\t!isCodeBlock && 'aui-md-inline-code text-[13px] rounded border bg-muted font-semibold',\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n\tCodeHeader,\n})\n","/**\n * MCP Transport Utilities\n *\n * Shared transport creation logic for MCP sources.\n * This eliminates duplication between MCPToolsProvider and useMCPSource.\n */\nimport { TabClientTransport } from '@mcp-b/transports'\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\n\nimport type { MCPSourceConfig } from '@mcp-b/cloud-mirror-types'\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'\n\n/**\n * Transport type options for HTTP-based connections\n */\nexport type TransportType = 'http' | 'sse'\n\n/**\n * Creates the appropriate MCP transport based on source configuration.\n *\n * @param config - The MCP source configuration\n * @param transportType - For HTTP sources, specifies whether to use HTTP or SSE transport\n * @returns A configured MCP Transport instance\n *\n * @example Tab-based transport (same-tab or iframe)\n * ```ts\n * const transport = createMCPTransport({ type: 'tab' })\n * ```\n *\n * @example HTTP transport with auth\n * ```ts\n * const transport = createMCPTransport({\n * type: 'http',\n * url: 'https://example.com/mcp',\n * authToken: 'secret'\n * }, 'http')\n * ```\n */\nexport function createMCPTransport(\n\tconfig: MCPSourceConfig,\n\ttransportType: TransportType = 'http'\n): Transport {\n\tif (config.type === 'tab') {\n\t\treturn new TabClientTransport({\n\t\t\ttargetOrigin: config.targetOrigin ?? window.location.origin,\n\t\t\tchannelId: config.channelId ?? 'mcp-default',\n\t\t})\n\t}\n\n\t// HTTP/SSE transport configuration\n\tconst serverUrl = new URL(config.url)\n\tconst headers: Record<string, string> = {\n\t\tAccept: 'application/json, text/event-stream',\n\t\t...(config.customHeaders ?? {}),\n\t}\n\n\tif (config.authToken) {\n\t\theaders.Authorization = `Bearer ${config.authToken}`\n\t}\n\n\tconst transportOptions = {\n\t\trequestInit: { headers },\n\t}\n\n\tif (transportType === 'sse') {\n\t\treturn new SSEClientTransport(serverUrl, transportOptions)\n\t}\n\n\treturn new StreamableHTTPClientTransport(serverUrl, transportOptions)\n}\n\n/**\n * Check if an error indicates we should try SSE fallback.\n *\n * This handles cases where HTTP streaming isn't supported (404/405) or\n * when the connection fails due to CORS/network issues.\n *\n * @param error - The error from the failed HTTP connection\n * @returns true if the error suggests trying SSE transport instead\n */\nexport function shouldFallbackToSSE(error: Error): boolean {\n\tconst message = error.message\n\treturn (\n\t\tmessage.includes('404') ||\n\t\tmessage.includes('Not Found') ||\n\t\tmessage.includes('405') ||\n\t\tmessage.includes('Method Not Allowed') ||\n\t\tmessage === 'Failed to fetch' || // Chrome CORS\n\t\tmessage === 'NetworkError when attempting to fetch resource.' || // Firefox\n\t\tmessage === 'Load failed' // Safari\n\t)\n}\n\n/**\n * Calculate exponential backoff delay for reconnection attempts.\n *\n * @param attempt - The current attempt number (0-based)\n * @param baseDelay - Base delay in milliseconds\n * @param maxDelay - Maximum delay cap in milliseconds\n * @returns The calculated delay in milliseconds\n */\nexport function calculateReconnectDelay(\n\tattempt: number,\n\tbaseDelay: number,\n\tmaxDelay: number\n): number {\n\treturn Math.min(baseDelay * Math.pow(2, attempt), maxDelay)\n}\n","/**\n * MCP Tools Provider\n *\n * Simplified provider for managing tools from multiple MCP sources.\n * Sources can be tab-based (same-tab, iframes) or HTTP-based (remote servers).\n *\n * @example Basic usage\n * ```tsx\n * <MCPToolsProvider>\n * <App />\n * </MCPToolsProvider>\n * ```\n *\n * @example Using the hook\n * ```tsx\n * const { tools, addSource, callTool } = useMCPTools()\n * await addSource('remote', { type: 'http', url: 'http://localhost:8888/mcp' })\n * ```\n */\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js'\nimport { ToolListChangedNotificationSchema } from '@modelcontextprotocol/sdk/types.js'\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { MCP_TAB_CONNECT_DELAY_MS } from '../lib/constants'\nimport { createMCPTransport } from '../lib/mcp-transport'\n\nimport type {\n\tCallToolResult,\n\tMCPSource,\n\tMCPSourceConfig,\n\tPrompt,\n\tResource,\n\tResourceTemplate,\n\tToolWithSource,\n} from '@mcp-b/cloud-mirror-types'\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'\nimport type { ReactNode } from 'react'\n\n/** Well-known source IDs */\nexport const SOURCE_LOCAL = 'local'\nexport const SOURCE_REMOTE = 'remote'\n\n/** Internal source state with client reference */\ninterface SourceState extends Omit<MCPSource, 'resources' | 'resourceTemplates' | 'prompts'> {\n\tclient: Client | null\n\ttransport: Transport | null\n\tresources: Resource[]\n\tresourceTemplates: ResourceTemplate[]\n\tprompts: Prompt[]\n}\n\n/**\n * MCP Tools Context Value\n */\nexport interface MCPToolsContextValue {\n\t/** All tools from all sources, tagged with _sourceId */\n\ttools: ToolWithSource[]\n\n\t/** All sources and their states */\n\tsources: Map<string, MCPSource>\n\n\t/** Add a new source */\n\taddSource: (id: string, config: MCPSourceConfig) => Promise<void>\n\n\t/** Remove a source */\n\tremoveSource: (id: string) => Promise<void>\n\n\t/** Get a specific source */\n\tgetSource: (id: string) => MCPSource | undefined\n\n\t/** Check if a source is connected */\n\tisConnected: (id: string) => boolean\n\n\t/** Call a tool (auto-routes based on tool name lookup) */\n\tcallTool: (name: string, args: Record<string, unknown>) => Promise<CallToolResult>\n\n\t/** Call a tool on a specific source */\n\tcallToolOnSource: (\n\t\tsourceId: string,\n\t\tname: string,\n\t\targs: Record<string, unknown>\n\t) => Promise<CallToolResult>\n}\n\nconst MCPToolsContext = createContext<MCPToolsContextValue | null>(null)\n\nexport interface MCPToolsProviderProps {\n\tchildren: ReactNode\n\t/** Auto-connect to same-tab source on mount (default: true) */\n\tautoConnectLocal?: boolean\n\t/** Callback when tools change */\n\tonToolsChange?: (tools: ToolWithSource[]) => void\n}\n\nexport function MCPToolsProvider({\n\tchildren,\n\tautoConnectLocal = true,\n\tonToolsChange,\n}: MCPToolsProviderProps) {\n\t// Sources map (internal state with client references)\n\tconst sourcesRef = useRef<Map<string, SourceState>>(new Map())\n\n\t// Trigger re-renders when sources change\n\tconst [, forceUpdate] = useState({})\n\n\t// Derived tools list\n\tconst [toolsList, setToolsList] = useState<ToolWithSource[]>([])\n\n\t/**\n\t * Rebuild tools list from all sources\n\t */\n\tconst rebuildTools = useCallback(() => {\n\t\tconst allTools: ToolWithSource[] = []\n\n\t\tsourcesRef.current.forEach((source) => {\n\t\t\tsource.tools.forEach((tool) => {\n\t\t\t\tallTools.push({\n\t\t\t\t\t...tool,\n\t\t\t\t\t_sourceId: source.id,\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\n\t\tsetToolsList(allTools)\n\t}, [])\n\n\t/**\n\t * Get public source state (without client reference)\n\t */\n\tconst getPublicSource = useCallback((source: SourceState): MCPSource => {\n\t\treturn {\n\t\t\tid: source.id,\n\t\t\tconfig: source.config,\n\t\t\tstate: source.state,\n\t\t\terror: source.error,\n\t\t\ttools: source.tools,\n\t\t\tresources: source.resources,\n\t\t\tresourceTemplates: source.resourceTemplates,\n\t\t\tprompts: source.prompts,\n\t\t}\n\t}, [])\n\n\t/**\n\t * Add a new source\n\t */\n\tconst addSource = useCallback(\n\t\tasync (id: string, config: MCPSourceConfig): Promise<void> => {\n\t\t\t// Remove existing source if any\n\t\t\tif (sourcesRef.current.has(id)) {\n\t\t\t\tawait removeSource(id)\n\t\t\t}\n\n\t\t\t// Create initial state\n\t\t\tconst sourceState: SourceState = {\n\t\t\t\tid,\n\t\t\t\tconfig,\n\t\t\t\tstate: 'connecting',\n\t\t\t\terror: null,\n\t\t\t\ttools: [],\n\t\t\t\tresources: [],\n\t\t\t\tresourceTemplates: [],\n\t\t\t\tprompts: [],\n\t\t\t\tclient: null,\n\t\t\t\ttransport: null,\n\t\t\t}\n\n\t\t\tsourcesRef.current.set(id, sourceState)\n\t\t\tforceUpdate({})\n\n\t\t\ttry {\n\t\t\t\t// Create client and transport\n\t\t\t\tconst client = new Client({\n\t\t\t\t\tname: `MCP-Source-${id}`,\n\t\t\t\t\tversion: '1.0.0',\n\t\t\t\t})\n\n\t\t\t\tconst transport = createMCPTransport(config)\n\n\t\t\t\t// Connect\n\t\t\t\tawait client.connect(transport)\n\n\t\t\t\t// Update state with client\n\t\t\t\tsourceState.client = client\n\t\t\t\tsourceState.transport = transport\n\n\t\t\t\t// Get initial tools\n\t\t\t\tconst { tools } = await client.listTools()\n\t\t\t\tsourceState.tools = tools\n\t\t\t\tsourceState.state = 'connected'\n\n\t\t\t\t// Listen for tool updates\n\t\t\t\tclient.setNotificationHandler(ToolListChangedNotificationSchema, async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst updated = await client.listTools()\n\t\t\t\t\t\tsourceState.tools = updated.tools\n\t\t\t\t\t\trebuildTools()\n\t\t\t\t\t\tforceUpdate({})\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconsole.error(`[MCPToolsProvider:${id}] Failed to update tools:`, err)\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\trebuildTools()\n\t\t\t\tforceUpdate({})\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err instanceof Error ? err : new Error(String(err))\n\t\t\t\tconsole.error(`[MCPToolsProvider:${id}] Connection failed:`, error)\n\n\t\t\t\tsourceState.state = 'error'\n\t\t\t\tsourceState.error = error\n\t\t\t\tforceUpdate({})\n\t\t\t}\n\t\t},\n\t\t[rebuildTools]\n\t)\n\n\t/**\n\t * Remove a source\n\t */\n\tconst removeSource = useCallback(\n\t\tasync (id: string): Promise<void> => {\n\t\t\tconst source = sourcesRef.current.get(id)\n\t\t\tif (!source) return\n\n\t\t\t// Close client and transport\n\t\t\tif (source.client) {\n\t\t\t\ttry {\n\t\t\t\t\tawait source.client.close()\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(`[MCPToolsProvider:${id}] Error closing client:`, err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (source.transport) {\n\t\t\t\ttry {\n\t\t\t\t\tawait source.transport.close()\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(`[MCPToolsProvider:${id}] Error closing transport:`, err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsourcesRef.current.delete(id)\n\t\t\trebuildTools()\n\t\t\tforceUpdate({})\n\t\t},\n\t\t[rebuildTools]\n\t)\n\n\t/**\n\t * Get a source by ID\n\t */\n\tconst getSource = useCallback(\n\t\t(id: string): MCPSource | undefined => {\n\t\t\tconst source = sourcesRef.current.get(id)\n\t\t\treturn source ? getPublicSource(source) : undefined\n\t\t},\n\t\t[getPublicSource]\n\t)\n\n\t/**\n\t * Check if a source is connected\n\t */\n\tconst isConnected = useCallback((id: string): boolean => {\n\t\tconst source = sourcesRef.current.get(id)\n\t\treturn source?.state === 'connected'\n\t}, [])\n\n\t/**\n\t * Call a tool on a specific source\n\t */\n\tconst callToolOnSource = useCallback(\n\t\tasync (\n\t\t\tsourceId: string,\n\t\t\tname: string,\n\t\t\targs: Record<string, unknown>\n\t\t): Promise<CallToolResult> => {\n\t\t\tconst source = sourcesRef.current.get(sourceId)\n\t\t\tif (!source?.client) {\n\t\t\t\tthrow new Error(`Source '${sourceId}' not connected`)\n\t\t\t}\n\n\t\t\treturn (await source.client.callTool({ name, arguments: args })) as CallToolResult\n\t\t},\n\t\t[]\n\t)\n\n\t/**\n\t * Call a tool (auto-routes based on tool name)\n\t */\n\tconst callTool = useCallback(\n\t\tasync (name: string, args: Record<string, unknown>): Promise<CallToolResult> => {\n\t\t\t// Find which source has this tool\n\t\t\tconst tool = toolsList.find((t) => t.name === name)\n\t\t\tif (!tool) {\n\t\t\t\tthrow new Error(`Tool '${name}' not found`)\n\t\t\t}\n\n\t\t\treturn callToolOnSource(tool._sourceId, name, args)\n\t\t},\n\t\t[toolsList, callToolOnSource]\n\t)\n\n\t/**\n\t * Get sources map for context (public view)\n\t */\n\tconst sources = useMemo(() => {\n\t\tconst publicSources = new Map<string, MCPSource>()\n\t\tsourcesRef.current.forEach((source) => {\n\t\t\tpublicSources.set(source.id, getPublicSource(source))\n\t\t})\n\t\treturn publicSources\n\t}, [toolsList, getPublicSource]) // Rebuild when tools change (which triggers on source changes)\n\n\t// Auto-connect to local source on mount\n\tuseEffect(() => {\n\t\tif (autoConnectLocal) {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tvoid addSource(SOURCE_LOCAL, { type: 'tab' })\n\t\t\t}, MCP_TAB_CONNECT_DELAY_MS)\n\t\t\treturn () => clearTimeout(timer)\n\t\t}\n\t}, [autoConnectLocal, addSource])\n\n\t// Notify on tools change\n\tuseEffect(() => {\n\t\tonToolsChange?.(toolsList)\n\t}, [toolsList, onToolsChange])\n\n\t// Cleanup on unmount\n\tuseEffect(() => {\n\t\tconst sources = sourcesRef\n\t\treturn () => {\n\t\t\tsources.current.forEach((source) => {\n\t\t\t\tif (source.client) {\n\t\t\t\t\tvoid source.client.close().catch(console.error)\n\t\t\t\t}\n\t\t\t\tif (source.transport) {\n\t\t\t\t\tvoid source.transport.close().catch(console.error)\n\t\t\t\t}\n\t\t\t})\n\t\t\tsources.current.clear()\n\t\t}\n\t}, [])\n\n\tconst value = useMemo<MCPToolsContextValue>(\n\t\t() => ({\n\t\t\ttools: toolsList,\n\t\t\tsources,\n\t\t\taddSource,\n\t\t\tremoveSource,\n\t\t\tgetSource,\n\t\t\tisConnected,\n\t\t\tcallTool,\n\t\t\tcallToolOnSource,\n\t\t}),\n\t\t[\n\t\t\ttoolsList,\n\t\t\tsources,\n\t\t\taddSource,\n\t\t\tremoveSource,\n\t\t\tgetSource,\n\t\t\tisConnected,\n\t\t\tcallTool,\n\t\t\tcallToolOnSource,\n\t\t]\n\t)\n\n\treturn <MCPToolsContext.Provider value={value}>{children}</MCPToolsContext.Provider>\n}\n\n/**\n * Hook to access MCP Tools context\n */\nexport function useMCPTools(): MCPToolsContextValue {\n\tconst context = useContext(MCPToolsContext)\n\tif (!context) {\n\t\tthrow new Error('useMCPTools must be used within an MCPToolsProvider')\n\t}\n\treturn context\n}\n\n/**\n * Hook to optionally access MCP Tools context\n */\nexport function useOptionalMCPTools(): MCPToolsContextValue | null {\n\treturn useContext(MCPToolsContext)\n}\n","/**\n * Remote MCP Settings\n *\n * A dialog component for managing remote MCP server connections.\n * Allows users to add, connect, and disconnect from remote MCP servers.\n */\n\nimport { Loader2, Plug, Plus, X } from 'lucide-react'\nimport { useCallback, useState } from 'react'\n\nimport { cn } from '../lib/utils'\nimport { SOURCE_REMOTE, useMCPTools } from '../providers/MCPToolsProvider'\nimport { Button } from './button'\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogTrigger,\n} from './dialog'\nimport { TooltipIconButton } from './tooltip-icon-button'\n\nimport type { FC } from 'react'\n\ninterface RemoteServer {\n\tid: string\n\turl: string\n}\n\nexport const RemoteMCPSettings: FC = () => {\n\tconst { sources, addSource, removeSource } = useMCPTools()\n\tconst [isOpen, setIsOpen] = useState(false)\n\tconst [url, setUrl] = useState('')\n\tconst [isConnecting, setIsConnecting] = useState(false)\n\tconst [error, setError] = useState<string | null>(null)\n\n\t// Get connected remote servers\n\tconst remoteServers: RemoteServer[] = []\n\tsources.forEach((source, id) => {\n\t\tif (source.config.type === 'http' && id !== 'local') {\n\t\t\tremoteServers.push({ id, url: source.config.url })\n\t\t}\n\t})\n\n\tconst handleConnect = useCallback(async () => {\n\t\tif (!url.trim()) {\n\t\t\tsetError('Please enter a URL')\n\t\t\treturn\n\t\t}\n\n\t\t// Validate URL\n\t\ttry {\n\t\t\tnew URL(url)\n\t\t} catch {\n\t\t\tsetError('Please enter a valid URL')\n\t\t\treturn\n\t\t}\n\n\t\tsetIsConnecting(true)\n\t\tsetError(null)\n\n\t\ttry {\n\t\t\t// Generate a unique ID for this server\n\t\t\tconst serverId = remoteServers.length === 0 ? SOURCE_REMOTE : `remote-${Date.now()}`\n\t\t\tawait addSource(serverId, { type: 'http', url })\n\t\t\tsetUrl('')\n\t\t} catch (err) {\n\t\t\tsetError(err instanceof Error ? err.message : 'Failed to connect')\n\t\t} finally {\n\t\t\tsetIsConnecting(false)\n\t\t}\n\t}, [url, addSource, remoteServers.length])\n\n\tconst handleDisconnect = useCallback(\n\t\tasync (serverId: string) => {\n\t\t\tawait removeSource(serverId)\n\t\t},\n\t\t[removeSource]\n\t)\n\n\tconst handleKeyDown = useCallback(\n\t\t(e: React.KeyboardEvent) => {\n\t\t\tif (e.key === 'Enter' && !isConnecting) {\n\t\t\t\tvoid handleConnect()\n\t\t\t}\n\t\t},\n\t\t[handleConnect, isConnecting]\n\t)\n\n\t// Count connected servers\n\tconst connectedCount = remoteServers.filter((s) => {\n\t\tconst source = sources.get(s.id)\n\t\treturn source?.state === 'connected'\n\t}).length\n\n\treturn (\n\t\t<Dialog open={isOpen} onOpenChange={setIsOpen}>\n\t\t\t<DialogTrigger asChild>\n\t\t\t\t<TooltipIconButton\n\t\t\t\t\ttooltip=\"Connect MCP Server\"\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'gap-2 rounded-full text-muted-foreground hover:text-foreground',\n\t\t\t\t\t\tconnectedCount > 0 && 'text-green-600 dark:text-green-400'\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Plug className=\"h-4 w-4\" />\n\t\t\t\t\t{connectedCount > 0 && <span className=\"text-xs\">{connectedCount}</span>}\n\t\t\t\t</TooltipIconButton>\n\t\t\t</DialogTrigger>\n\t\t\t<DialogContent className=\"sm:max-w-md\">\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Remote MCP Servers</DialogTitle>\n\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\tConnect to remote MCP servers to access their tools, resources, and prompts.\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t{/* URL Input */}\n\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t<label htmlFor=\"mcp-url\" className=\"text-sm font-medium\">\n\t\t\t\t\t\t\tServer URL\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"mcp-url\"\n\t\t\t\t\t\t\t\ttype=\"url\"\n\t\t\t\t\t\t\t\tvalue={url}\n\t\t\t\t\t\t\t\tonChange={(e) => setUrl(e.target.value)}\n\t\t\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\t\t\tplaceholder=\"https://mcp.example.com/sse\"\n\t\t\t\t\t\t\t\tdisabled={isConnecting}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm transition-colors',\n\t\t\t\t\t\t\t\t\t'placeholder:text-muted-foreground',\n\t\t\t\t\t\t\t\t\t'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n\t\t\t\t\t\t\t\t\t'disabled:cursor-not-allowed disabled:opacity-50'\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tonClick={() => void handleConnect()}\n\t\t\t\t\t\t\t\tdisabled={isConnecting || !url.trim()}\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isConnecting ? (\n\t\t\t\t\t\t\t\t\t<Loader2 className=\"h-4 w-4 animate-spin\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Plus className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{error && <p className=\"text-xs text-destructive\">{error}</p>}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Connected Servers List */}\n\t\t\t\t\t{remoteServers.length > 0 && (\n\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t<label className=\"text-sm font-medium\">Connected Servers</label>\n\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t{remoteServers.map((server) => {\n\t\t\t\t\t\t\t\t\tconst source = sources.get(server.id)\n\t\t\t\t\t\t\t\t\tconst isConnected = source?.state === 'connected'\n\t\t\t\t\t\t\t\t\tconst isLoading = source?.state === 'connecting'\n\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={server.id}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-2 rounded-md border border-border bg-muted/50 px-3 py-2\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{/* Status indicator */}\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'h-2 w-2 shrink-0 rounded-full',\n\t\t\t\t\t\t\t\t\t\t\t\t\tisConnected && 'bg-green-500',\n\t\t\t\t\t\t\t\t\t\t\t\t\tisLoading && 'bg-yellow-500 animate-pulse',\n\t\t\t\t\t\t\t\t\t\t\t\t\tsource?.state === 'error' && 'bg-red-500'\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t\t\t{/* URL */}\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex-1 truncate text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t{server.url}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t\t\t\t\t\t{/* Tools count */}\n\t\t\t\t\t\t\t\t\t\t\t{isConnected && source && (\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{source.tools.length} tools\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t\t\t{/* Disconnect button */}\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => void handleDisconnect(server.id)}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0 rounded p-1 text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Disconnect server\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Loader2 className=\"h-3 w-3 animate-spin\" />\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<X className=\"h-3 w-3\" />\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Help text */}\n\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\tEnter the URL of an MCP server that supports the Streamable HTTP transport (SSE).\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t)\n}\n","import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react'\nimport { useState } from 'react'\n\nimport { Button } from './button'\n\nimport type { ToolCallMessagePartComponent } from '@assistant-ui/react'\n\nexport const ToolFallback: ToolCallMessagePartComponent = ({ toolName, argsText, result }) => {\n\tconst [isCollapsed, setIsCollapsed] = useState(true)\n\treturn (\n\t\t<div className=\"aui-tool-fallback-root mb-3 flex w-full flex-col gap-2 rounded-xl border border-border/20 bg-muted/5 py-2\">\n\t\t\t<div className=\"aui-tool-fallback-header flex items-center gap-2 px-3\">\n\t\t\t\t<CheckIcon className=\"aui-tool-fallback-icon size-3.5 text-emerald-500\" />\n\t\t\t\t<p className=\"aui-tool-fallback-title flex-grow text-sm font-medium\">{toolName}</p>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tclassName=\"h-6 w-6 p-0\"\n\t\t\t\t\tonClick={() => setIsCollapsed(!isCollapsed)}\n\t\t\t\t>\n\t\t\t\t\t{isCollapsed ? (\n\t\t\t\t\t\t<ChevronUpIcon className=\"size-3.5\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ChevronDownIcon className=\"size-3.5\" />\n\t\t\t\t\t)}\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t{!isCollapsed && (\n\t\t\t\t<div className=\"aui-tool-fallback-content flex flex-col gap-2 border-t border-border/20 pt-2\">\n\t\t\t\t\t<div className=\"aui-tool-fallback-args-root px-3\">\n\t\t\t\t\t\t<span className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground/70\">\n\t\t\t\t\t\t\tInput\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<pre className=\"aui-tool-fallback-args-value mt-1 max-h-40 overflow-auto rounded-lg bg-muted/30 px-2 py-1.5 font-mono text-[11px] leading-relaxed text-foreground/80 whitespace-pre-wrap\">\n\t\t\t\t\t\t\t{argsText}\n\t\t\t\t\t\t</pre>\n\t\t\t\t\t</div>\n\t\t\t\t\t{result !== undefined && (\n\t\t\t\t\t\t<div className=\"aui-tool-fallback-result-root border-t border-dashed border-border/20 px-3 pt-2\">\n\t\t\t\t\t\t\t<span className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground/70\">\n\t\t\t\t\t\t\t\tOutput\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<pre className=\"aui-tool-fallback-result-content mt-1 max-h-60 overflow-auto rounded-lg bg-muted/30 px-2 py-1.5 font-mono text-[11px] leading-relaxed text-foreground/80 whitespace-pre-wrap\">\n\t\t\t\t\t\t\t\t{typeof result === 'string' ? result : JSON.stringify(result, null, 2)}\n\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n","import { useEffect, useRef } from 'react'\n\nimport { cn } from '../lib/utils'\n\nimport type { HTMLAttributes } from 'react'\n\nexport type LiveWaveformProps = HTMLAttributes<HTMLDivElement> & {\n\tactive?: boolean\n\tprocessing?: boolean\n\tbarWidth?: number\n\tbarGap?: number\n\tbarRadius?: number\n\tbarColor?: string\n\tfadeEdges?: boolean\n\tfadeWidth?: number\n\theight?: string | number\n\tsensitivity?: number\n\tsmoothingTimeConstant?: number\n\tmode?: 'scrolling' | 'static'\n\t/** Manual audio level (0-1) instead of using microphone */\n\tmanualAudioLevel?: number\n}\n\nexport const LiveWaveform = ({\n\tactive = false,\n\tprocessing = false,\n\tbarWidth = 3,\n\tbarGap = 1,\n\tbarRadius = 1.5,\n\tbarColor,\n\tfadeEdges = true,\n\tfadeWidth = 24,\n\theight = 64,\n\tsensitivity = 1,\n\tmode = 'static',\n\tmanualAudioLevel,\n\tclassName,\n\t...props\n}: LiveWaveformProps) => {\n\tconst canvasRef = useRef<HTMLCanvasElement>(null)\n\tconst containerRef = useRef<HTMLDivElement>(null)\n\tconst historyRef = useRef<number[]>([])\n\tconst _animationRef = useRef<number>(0)\n\tconst lastUpdateRef = useRef<number>(0)\n\tconst processingAnimationRef = useRef<number | null>(null)\n\tconst lastActiveDataRef = useRef<number[]>([])\n\tconst transitionProgressRef = useRef(0)\n\tconst staticBarsRef = useRef<number[]>([])\n\tconst needsRedrawRef = useRef(true)\n\tconst gradientCacheRef = useRef<CanvasGradient | null>(null)\n\tconst lastWidthRef = useRef(0)\n\n\tconst heightStyle = typeof height === 'number' ? `${height}px` : height\n\tconst historySize = 60\n\tconst updateRate = 30\n\n\t// Handle canvas resizing\n\tuseEffect(() => {\n\t\tconst canvas = canvasRef.current\n\t\tconst container = containerRef.current\n\t\tif (!canvas || !container) return\n\n\t\tconst resizeObserver = new ResizeObserver(() => {\n\t\t\tconst rect = container.getBoundingClientRect()\n\t\t\tconst dpr = window.devicePixelRatio || 1\n\n\t\t\tcanvas.width = rect.width * dpr\n\t\t\tcanvas.height = rect.height * dpr\n\t\t\tcanvas.style.width = `${rect.width}px`\n\t\t\tcanvas.style.height = `${rect.height}px`\n\n\t\t\tconst ctx = canvas.getContext('2d')\n\t\t\tif (ctx) {\n\t\t\t\tctx.scale(dpr, dpr)\n\t\t\t}\n\n\t\t\tgradientCacheRef.current = null\n\t\t\tlastWidthRef.current = rect.width\n\t\t\tneedsRedrawRef.current = true\n\t\t})\n\n\t\tresizeObserver.observe(container)\n\t\treturn () => resizeObserver.disconnect()\n\t}, [])\n\n\t// Processing animation effect\n\tuseEffect(() => {\n\t\tif (processing && !active) {\n\t\t\tlet time = 0\n\t\t\ttransitionProgressRef.current = 0\n\n\t\t\tconst animateProcessing = () => {\n\t\t\t\ttime += 0.03\n\t\t\t\ttransitionProgressRef.current = Math.min(1, transitionProgressRef.current + 0.02)\n\n\t\t\t\tconst processingData: number[] = []\n\t\t\t\tconst barCount = Math.floor(\n\t\t\t\t\t(containerRef.current?.getBoundingClientRect().width || 200) / (barWidth + barGap)\n\t\t\t\t)\n\n\t\t\t\tif (mode === 'static') {\n\t\t\t\t\tconst halfCount = Math.floor(barCount / 2)\n\n\t\t\t\t\tfor (let i = 0; i < barCount; i++) {\n\t\t\t\t\t\tconst normalizedPosition = (i - halfCount) / halfCount\n\t\t\t\t\t\tconst centerWeight = 1 - Math.abs(normalizedPosition) * 0.4\n\n\t\t\t\t\t\tconst wave1 = Math.sin(time * 1.5 + normalizedPosition * 3) * 0.25\n\t\t\t\t\t\tconst wave2 = Math.sin(time * 0.8 - normalizedPosition * 2) * 0.2\n\t\t\t\t\t\tconst wave3 = Math.cos(time * 2 + normalizedPosition) * 0.15\n\t\t\t\t\t\tconst combinedWave = wave1 + wave2 + wave3\n\t\t\t\t\t\tconst processingValue = (0.2 + combinedWave) * centerWeight\n\n\t\t\t\t\t\tlet finalValue = processingValue\n\t\t\t\t\t\tif (lastActiveDataRef.current.length > 0 && transitionProgressRef.current < 1) {\n\t\t\t\t\t\t\tconst lastDataIndex = Math.min(i, lastActiveDataRef.current.length - 1)\n\t\t\t\t\t\t\tconst lastValue = lastActiveDataRef.current[lastDataIndex] || 0\n\t\t\t\t\t\t\tfinalValue =\n\t\t\t\t\t\t\t\tlastValue * (1 - transitionProgressRef.current) +\n\t\t\t\t\t\t\t\tprocessingValue * transitionProgressRef.current\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tprocessingData.push(Math.max(0.05, Math.min(1, finalValue)))\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 0; i < barCount; i++) {\n\t\t\t\t\t\tconst normalizedPosition = (i - barCount / 2) / (barCount / 2)\n\t\t\t\t\t\tconst centerWeight = 1 - Math.abs(normalizedPosition) * 0.4\n\n\t\t\t\t\t\tconst wave1 = Math.sin(time * 1.5 + i * 0.15) * 0.25\n\t\t\t\t\t\tconst wave2 = Math.sin(time * 0.8 - i * 0.1) * 0.2\n\t\t\t\t\t\tconst wave3 = Math.cos(time * 2 + i * 0.05) * 0.15\n\t\t\t\t\t\tconst combinedWave = wave1 + wave2 + wave3\n\t\t\t\t\t\tconst processingValue = (0.2 + combinedWave) * centerWeight\n\n\t\t\t\t\t\tlet finalValue = processingValue\n\t\t\t\t\t\tif (lastActiveDataRef.current.length > 0 && transitionProgressRef.current < 1) {\n\t\t\t\t\t\t\tconst lastDataIndex = Math.floor((i / barCount) * lastActiveDataRef.current.length)\n\t\t\t\t\t\t\tconst lastValue = lastActiveDataRef.current[lastDataIndex] || 0\n\t\t\t\t\t\t\tfinalValue =\n\t\t\t\t\t\t\t\tlastValue * (1 - transitionProgressRef.current) +\n\t\t\t\t\t\t\t\tprocessingValue * transitionProgressRef.current\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tprocessingData.push(Math.max(0.05, Math.min(1, finalValue)))\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (mode === 'static') {\n\t\t\t\t\tstaticBarsRef.current = processingData\n\t\t\t\t} else {\n\t\t\t\t\thistoryRef.current = processingData\n\t\t\t\t}\n\n\t\t\t\tneedsRedrawRef.current = true\n\t\t\t\tprocessingAnimationRef.current = requestAnimationFrame(animateProcessing)\n\t\t\t}\n\n\t\t\tanimateProcessing()\n\n\t\t\treturn () => {\n\t\t\t\tif (processingAnimationRef.current) {\n\t\t\t\t\tcancelAnimationFrame(processingAnimationRef.current)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!active && !processing) {\n\t\t\tconst hasData =\n\t\t\t\tmode === 'static' ? staticBarsRef.current.length > 0 : historyRef.current.length > 0\n\n\t\t\tif (hasData) {\n\t\t\t\tlet fadeProgress = 0\n\t\t\t\tconst fadeToIdle = () => {\n\t\t\t\t\tfadeProgress += 0.03\n\t\t\t\t\tif (fadeProgress < 1) {\n\t\t\t\t\t\tif (mode === 'static') {\n\t\t\t\t\t\t\tstaticBarsRef.current = staticBarsRef.current.map(\n\t\t\t\t\t\t\t\t(value) => value * (1 - fadeProgress)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thistoryRef.current = historyRef.current.map((value) => value * (1 - fadeProgress))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tneedsRedrawRef.current = true\n\t\t\t\t\t\trequestAnimationFrame(fadeToIdle)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (mode === 'static') {\n\t\t\t\t\t\t\tstaticBarsRef.current = []\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thistoryRef.current = []\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfadeToIdle()\n\t\t\t}\n\t\t}\n\t}, [processing, active, barWidth, barGap, mode])\n\n\t// Animation loop\n\tuseEffect(() => {\n\t\tconst canvas = canvasRef.current\n\t\tif (!canvas) return\n\n\t\tconst ctx = canvas.getContext('2d')\n\t\tif (!ctx) return\n\n\t\tlet rafId: number\n\n\t\tconst animate = (currentTime: number) => {\n\t\t\tconst rect = canvas.getBoundingClientRect()\n\n\t\t\t// Update audio data if active\n\t\t\tif (active && currentTime - lastUpdateRef.current > updateRate) {\n\t\t\t\tlastUpdateRef.current = currentTime\n\n\t\t\t\t// Use manual audio level if provided\n\t\t\t\tif (manualAudioLevel !== undefined) {\n\t\t\t\t\tconst level = Math.max(0.05, Math.min(1, manualAudioLevel * sensitivity))\n\n\t\t\t\t\tif (mode === 'static') {\n\t\t\t\t\t\tconst barCount = Math.floor(rect.width / (barWidth + barGap))\n\t\t\t\t\t\tconst halfCount = Math.floor(barCount / 2)\n\t\t\t\t\t\tconst newBars: number[] = []\n\n\t\t\t\t\t\t// Create symmetric bars based on manual level\n\t\t\t\t\t\tfor (let i = halfCount - 1; i >= 0; i--) {\n\t\t\t\t\t\t\tconst distanceFromCenter = Math.abs(i - halfCount / 2) / (halfCount / 2)\n\t\t\t\t\t\t\tconst value = level * (1 - distanceFromCenter * 0.3)\n\t\t\t\t\t\t\tnewBars.push(Math.max(0.05, value))\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (let i = 0; i < halfCount; i++) {\n\t\t\t\t\t\t\tconst distanceFromCenter = Math.abs(i - halfCount / 2) / (halfCount / 2)\n\t\t\t\t\t\t\tconst value = level * (1 - distanceFromCenter * 0.3)\n\t\t\t\t\t\t\tnewBars.push(Math.max(0.05, value))\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstaticBarsRef.current = newBars\n\t\t\t\t\t\tlastActiveDataRef.current = newBars\n\t\t\t\t\t} else {\n\t\t\t\t\t\thistoryRef.current.push(level)\n\t\t\t\t\t\tlastActiveDataRef.current = [...historyRef.current]\n\n\t\t\t\t\t\tif (historyRef.current.length > historySize) {\n\t\t\t\t\t\t\thistoryRef.current.shift()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tneedsRedrawRef.current = true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Only redraw if needed\n\t\t\tif (!needsRedrawRef.current && !active) {\n\t\t\t\trafId = requestAnimationFrame(animate)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tneedsRedrawRef.current = active\n\t\t\tctx.clearRect(0, 0, rect.width, rect.height)\n\n\t\t\tconst computedBarColor =\n\t\t\t\tbarColor ||\n\t\t\t\t(() => {\n\t\t\t\t\tconst style = getComputedStyle(canvas)\n\t\t\t\t\tconst color = style.color\n\t\t\t\t\treturn color || '#000'\n\t\t\t\t})()\n\n\t\t\tconst step = barWidth + barGap\n\t\t\tconst barCount = Math.floor(rect.width / step)\n\t\t\tconst centerY = rect.height / 2\n\n\t\t\t// Draw bars based on mode\n\t\t\tif (mode === 'static') {\n\t\t\t\tconst dataToRender = processing\n\t\t\t\t\t? staticBarsRef.current\n\t\t\t\t\t: active\n\t\t\t\t\t\t? staticBarsRef.current\n\t\t\t\t\t\t: staticBarsRef.current.length > 0\n\t\t\t\t\t\t\t? staticBarsRef.current\n\t\t\t\t\t\t\t: []\n\n\t\t\t\tfor (let i = 0; i < barCount && i < dataToRender.length; i++) {\n\t\t\t\t\tconst value = dataToRender[i] || 0.1\n\t\t\t\t\tconst x = i * step\n\t\t\t\t\tconst barHeight = Math.max(4, value * rect.height * 0.8)\n\t\t\t\t\tconst y = centerY - barHeight / 2\n\n\t\t\t\t\tctx.fillStyle = computedBarColor\n\t\t\t\t\tctx.globalAlpha = 0.4 + value * 0.6\n\n\t\t\t\t\tif (barRadius > 0) {\n\t\t\t\t\t\tctx.beginPath()\n\t\t\t\t\t\tctx.roundRect(x, y, barWidth, barHeight, barRadius)\n\t\t\t\t\t\tctx.fill()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tctx.fillRect(x, y, barWidth, barHeight)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Scrolling mode\n\t\t\t\tfor (let i = 0; i < barCount && i < historyRef.current.length; i++) {\n\t\t\t\t\tconst dataIndex = historyRef.current.length - 1 - i\n\t\t\t\t\tconst value = historyRef.current[dataIndex] || 0.1\n\t\t\t\t\tconst x = rect.width - (i + 1) * step\n\t\t\t\t\tconst barHeight = Math.max(4, value * rect.height * 0.8)\n\t\t\t\t\tconst y = centerY - barHeight / 2\n\n\t\t\t\t\tctx.fillStyle = computedBarColor\n\t\t\t\t\tctx.globalAlpha = 0.4 + value * 0.6\n\n\t\t\t\t\tif (barRadius > 0) {\n\t\t\t\t\t\tctx.beginPath()\n\t\t\t\t\t\tctx.roundRect(x, y, barWidth, barHeight, barRadius)\n\t\t\t\t\t\tctx.fill()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tctx.fillRect(x, y, barWidth, barHeight)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply edge fading\n\t\t\tif (fadeEdges && fadeWidth > 0 && rect.width > 0) {\n\t\t\t\tif (!gradientCacheRef.current || lastWidthRef.current !== rect.width) {\n\t\t\t\t\tconst gradient = ctx.createLinearGradient(0, 0, rect.width, 0)\n\t\t\t\t\tconst fadePercent = Math.min(0.3, fadeWidth / rect.width)\n\n\t\t\t\t\tgradient.addColorStop(0, 'rgba(255,255,255,1)')\n\t\t\t\t\tgradient.addColorStop(fadePercent, 'rgba(255,255,255,0)')\n\t\t\t\t\tgradient.addColorStop(1 - fadePercent, 'rgba(255,255,255,0)')\n\t\t\t\t\tgradient.addColorStop(1, 'rgba(255,255,255,1)')\n\n\t\t\t\t\tgradientCacheRef.current = gradient\n\t\t\t\t\tlastWidthRef.current = rect.width\n\t\t\t\t}\n\n\t\t\t\tctx.globalCompositeOperation = 'destination-out'\n\t\t\t\tctx.fillStyle = gradientCacheRef.current\n\t\t\t\tctx.fillRect(0, 0, rect.width, rect.height)\n\t\t\t\tctx.globalCompositeOperation = 'source-over'\n\t\t\t}\n\n\t\t\tctx.globalAlpha = 1\n\n\t\t\trafId = requestAnimationFrame(animate)\n\t\t}\n\n\t\trafId = requestAnimationFrame(animate)\n\n\t\treturn () => {\n\t\t\tif (rafId) {\n\t\t\t\tcancelAnimationFrame(rafId)\n\t\t\t}\n\t\t}\n\t}, [\n\t\tactive,\n\t\tprocessing,\n\t\tsensitivity,\n\t\tbarWidth,\n\t\tbarGap,\n\t\tbarRadius,\n\t\tbarColor,\n\t\tfadeEdges,\n\t\tfadeWidth,\n\t\tmode,\n\t\tmanualAudioLevel,\n\t\thistorySize,\n\t\tupdateRate,\n\t])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn('relative h-full w-full', className)}\n\t\t\tref={containerRef}\n\t\t\tstyle={{ height: heightStyle }}\n\t\t\taria-label={\n\t\t\t\tactive ? 'Live audio waveform' : processing ? 'Processing audio' : 'Audio waveform idle'\n\t\t\t}\n\t\t\trole=\"img\"\n\t\t\t{...props}\n\t\t>\n\t\t\t{!active && !processing && (\n\t\t\t\t<div className=\"border-muted-foreground/20 absolute top-1/2 right-0 left-0 -translate-y-1/2 border-t-2 border-dotted\" />\n\t\t\t)}\n\t\t\t<canvas className=\"block h-full w-full\" ref={canvasRef} />\n\t\t</div>\n\t)\n}\n","import { Mic, MicOff, Phone, PhoneOff, Volume2 } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\nimport { LiveWaveform } from './live-waveform'\n\nimport type { AudioLevelData, ToolCallData } from '../services/realtime'\n\nexport interface VoiceIndicatorProps {\n\tisActive: boolean\n\tisConnecting: boolean\n\tisMuted: boolean\n\taudioLevel?: AudioLevelData\n\ttoolCall?: ToolCallData\n\tonStart: () => void\n\tonStop: () => void\n\tonToggleMute: () => void\n\tclassName?: string\n}\n\nexport function VoiceIndicator({\n\tisActive,\n\tisConnecting,\n\tisMuted,\n\taudioLevel,\n\ttoolCall,\n\tonStart,\n\tonStop,\n\tonToggleMute,\n\tclassName,\n}: VoiceIndicatorProps) {\n\tconst micLevel = audioLevel?.micLevel ?? 0\n\tconst speakerLevel = audioLevel?.speakerLevel ?? 0\n\n\t// Determine tool call status for border styling\n\tconst toolCallStatus =\n\t\ttoolCall?.status === 'started'\n\t\t\t? 'calling'\n\t\t\t: toolCall?.status === 'completed'\n\t\t\t\t? toolCall.error\n\t\t\t\t\t? 'error'\n\t\t\t\t\t: 'success'\n\t\t\t\t: 'idle'\n\n\t// Get border style based on tool call status\n\tconst getBorderClass = () => {\n\t\tswitch (toolCallStatus) {\n\t\t\tcase 'calling':\n\t\t\t\treturn 'border-blue-500/60 shadow-[0_0_12px_rgba(59,130,246,0.3)]'\n\t\t\tcase 'success':\n\t\t\t\treturn 'border-green-500/60 shadow-[0_0_12px_rgba(34,197,94,0.3)]'\n\t\t\tcase 'error':\n\t\t\t\treturn 'border-red-500/60 shadow-[0_0_12px_rgba(239,68,68,0.3)]'\n\t\t\tdefault:\n\t\t\t\treturn 'border-border'\n\t\t}\n\t}\n\n\tif (!isActive && !isConnecting) {\n\t\t// Collapsed state - just show start button\n\t\treturn (\n\t\t\t<div className={cn('flex items-center', className)}>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonClick={onStart}\n\t\t\t\t\tclassName=\"gap-2 rounded-full\"\n\t\t\t\t\taria-label=\"Start voice session\"\n\t\t\t\t>\n\t\t\t\t\t<Phone className=\"h-4 w-4\" />\n\t\t\t\t\t<span className=\"text-xs\">Voice</span>\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t)\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'flex items-center gap-3 rounded-full border bg-background/95 px-3 py-2 backdrop-blur-sm transition-all duration-300',\n\t\t\t\tgetBorderClass(),\n\t\t\t\tclassName\n\t\t\t)}\n\t\t>\n\t\t\t{/* User microphone indicator */}\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'flex h-8 w-8 items-center justify-center rounded-full transition-colors',\n\t\t\t\t\t\tisMuted ? 'bg-muted text-muted-foreground' : 'bg-primary/10 text-primary'\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{isMuted ? <MicOff className=\"h-4 w-4\" /> : <Mic className=\"h-4 w-4\" />}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"h-6 w-16\">\n\t\t\t\t\t<LiveWaveform\n\t\t\t\t\t\tactive={isActive && !isMuted}\n\t\t\t\t\t\tprocessing={isConnecting}\n\t\t\t\t\t\tmanualAudioLevel={micLevel}\n\t\t\t\t\t\tbarWidth={2}\n\t\t\t\t\t\tbarGap={1}\n\t\t\t\t\t\tbarRadius={2}\n\t\t\t\t\t\tbarColor=\"hsl(var(--primary))\"\n\t\t\t\t\t\theight={24}\n\t\t\t\t\t\tmode=\"static\"\n\t\t\t\t\t\tsensitivity={2.0}\n\t\t\t\t\t\tfadeEdges={false}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Separator */}\n\t\t\t<div className=\"h-6 w-px bg-border\" />\n\n\t\t\t{/* Agent speaker indicator */}\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<div className=\"h-6 w-16\">\n\t\t\t\t\t<LiveWaveform\n\t\t\t\t\t\tactive={isActive}\n\t\t\t\t\t\tprocessing={isConnecting}\n\t\t\t\t\t\tmanualAudioLevel={speakerLevel}\n\t\t\t\t\t\tbarWidth={2}\n\t\t\t\t\t\tbarGap={1}\n\t\t\t\t\t\tbarRadius={2}\n\t\t\t\t\t\tbarColor=\"hsl(var(--muted-foreground))\"\n\t\t\t\t\t\theight={24}\n\t\t\t\t\t\tmode=\"static\"\n\t\t\t\t\t\tsensitivity={2.0}\n\t\t\t\t\t\tfadeEdges={false}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'flex h-8 w-8 items-center justify-center rounded-full bg-muted text-muted-foreground'\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Volume2 className=\"h-4 w-4\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Separator */}\n\t\t\t<div className=\"h-6 w-px bg-border\" />\n\n\t\t\t{/* Controls */}\n\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={onToggleMute}\n\t\t\t\t\tdisabled={!isActive}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'h-8 w-8 rounded-full',\n\t\t\t\t\t\tisMuted && 'text-destructive hover:text-destructive'\n\t\t\t\t\t)}\n\t\t\t\t\taria-label={isMuted ? 'Unmute microphone' : 'Mute microphone'}\n\t\t\t\t>\n\t\t\t\t\t{isMuted ? <MicOff className=\"h-4 w-4\" /> : <Mic className=\"h-4 w-4\" />}\n\t\t\t\t</Button>\n\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={onStop}\n\t\t\t\t\tclassName=\"h-8 w-8 rounded-full text-destructive hover:bg-destructive/10 hover:text-destructive\"\n\t\t\t\t\taria-label=\"End voice session\"\n\t\t\t\t>\n\t\t\t\t\t<PhoneOff className=\"h-4 w-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\n\t\t\t{/* Tool call indicator */}\n\t\t\t{toolCall && toolCallStatus !== 'idle' && (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'ml-1 flex items-center gap-1 rounded-full px-2 py-0.5 text-xs',\n\t\t\t\t\t\ttoolCallStatus === 'calling' && 'bg-blue-500/10 text-blue-600',\n\t\t\t\t\t\ttoolCallStatus === 'success' && 'bg-green-500/10 text-green-600',\n\t\t\t\t\t\ttoolCallStatus === 'error' && 'bg-red-500/10 text-red-600'\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'h-1.5 w-1.5 rounded-full',\n\t\t\t\t\t\t\ttoolCallStatus === 'calling' && 'animate-pulse bg-blue-500',\n\t\t\t\t\t\t\ttoolCallStatus === 'success' && 'bg-green-500',\n\t\t\t\t\t\t\ttoolCallStatus === 'error' && 'bg-red-500'\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"max-w-[80px] truncate\">{toolCall.toolName}</span>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Connecting indicator */}\n\t\t\t{isConnecting && (\n\t\t\t\t<div className=\"ml-1 flex items-center gap-1 text-xs text-muted-foreground\">\n\t\t\t\t\t<span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-amber-500\" />\n\t\t\t\t\t<span>Connecting...</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n","/**\n * Thread with Voice Mode\n *\n * Enhanced thread component that includes voice mode.\n * Replaces the composer with a voice panel when voice is active.\n */\n\nimport {\n\tActionBarPrimitive,\n\tBranchPickerPrimitive,\n\tComposerPrimitive,\n\tErrorPrimitive,\n\tMessagePrimitive,\n\tThreadPrimitive,\n} from '@assistant-ui/react'\nimport {\n\tArrowDownIcon,\n\tArrowUpIcon,\n\tCheckIcon,\n\tChevronLeftIcon,\n\tChevronRightIcon,\n\tCopyIcon,\n\tPencilIcon,\n\tPhone,\n\tRefreshCwIcon,\n\tSquare,\n} from 'lucide-react'\nimport { AnimatePresence, domAnimation, LazyMotion, MotionConfig } from 'motion/react'\nimport * as m from 'motion/react-m'\n\nimport { cn } from '../lib/utils'\nimport { useOptionalVoiceModeContext } from '../providers/VoiceModeProvider'\nimport { ComposerAddAttachment, ComposerAttachments, UserMessageAttachments } from './attachment'\nimport { Button } from './button'\nimport { MarkdownText } from './markdown-text'\nimport { RemoteMCPSettings } from './RemoteMCPSettings'\nimport { ToolFallback } from './tool-fallback'\nimport { TooltipIconButton } from './tooltip-icon-button'\nimport { VoiceIndicator } from './voice-indicator'\n\nimport type { FC } from 'react'\n\nexport const ThreadWithVoice: FC = () => {\n\treturn (\n\t\t<LazyMotion features={domAnimation}>\n\t\t\t<MotionConfig reducedMotion=\"user\">\n\t\t\t\t<ThreadPrimitive.Root\n\t\t\t\t\tclassName=\"aui-root aui-thread-root app-shell @container relative flex h-full flex-col bg-background/50\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t['--thread-max-width' as string]: '100%',\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll px-4\">\n\t\t\t\t\t\t<ThreadPrimitive.If empty>\n\t\t\t\t\t\t\t<ThreadWelcome />\n\t\t\t\t\t\t</ThreadPrimitive.If>\n\n\t\t\t\t\t\t<ThreadPrimitive.Messages\n\t\t\t\t\t\t\tcomponents={{\n\t\t\t\t\t\t\t\tUserMessage,\n\t\t\t\t\t\t\t\tEditComposer,\n\t\t\t\t\t\t\t\tAssistantMessage,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<ThreadPrimitive.If empty={false}>\n\t\t\t\t\t\t\t<div className=\"aui-thread-viewport-spacer min-h-8 grow\" />\n\t\t\t\t\t\t</ThreadPrimitive.If>\n\n\t\t\t\t\t\t<ComposerArea />\n\t\t\t\t\t</ThreadPrimitive.Viewport>\n\t\t\t\t</ThreadPrimitive.Root>\n\t\t\t</MotionConfig>\n\t\t</LazyMotion>\n\t)\n}\n\n/**\n * Composer area with voice indicator\n */\nconst ComposerArea: FC = () => {\n\tconst voiceMode = useOptionalVoiceModeContext()\n\n\treturn (\n\t\t<div className=\"aui-composer-wrapper sticky bottom-0 mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 overflow-visible rounded-t-3xl pb-4 md:pb-6\">\n\t\t\t<ThreadScrollToBottom />\n\n\t\t\t{/* Voice indicator - shown above composer when voice mode is active */}\n\t\t\t<AnimatePresence>\n\t\t\t\t{voiceMode?.isSupported && (voiceMode.isActive || voiceMode.isConnecting) && (\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tinitial={{ opacity: 0, y: 20 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\texit={{ opacity: 0, y: -10 }}\n\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\tclassName=\"flex justify-center\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<VoiceIndicator\n\t\t\t\t\t\t\tisActive={voiceMode.isActive}\n\t\t\t\t\t\t\tisConnecting={voiceMode.isConnecting}\n\t\t\t\t\t\t\tisMuted={voiceMode.isMuted}\n\t\t\t\t\t\t\taudioLevel={voiceMode.audioLevel}\n\t\t\t\t\t\t\ttoolCall={voiceMode.toolCall}\n\t\t\t\t\t\t\tonStart={voiceMode.startSession}\n\t\t\t\t\t\t\tonStop={voiceMode.stopSession}\n\t\t\t\t\t\t\tonToggleMute={() => voiceMode.toggleMute()}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</m.div>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\n\t\t\t<TextComposer />\n\t\t</div>\n\t)\n}\n\nconst TextComposer: FC = () => {\n\tconst voiceMode = useOptionalVoiceModeContext()\n\n\treturn (\n\t\t<ComposerPrimitive.Root\n\t\t\tclassName={cn(\n\t\t\t\t'aui-composer-root group/composer flex w-full flex-col overflow-hidden rounded-2xl px-3 py-2',\n\t\t\t\t'border border-border/40 shadow-sm backdrop-blur-md',\n\t\t\t\t'bg-background/80',\n\t\t\t\t'transition-all duration-200',\n\t\t\t\t'focus-within:border-ring/50 focus-within:shadow-md',\n\t\t\t\t'hover:border-border/60'\n\t\t\t)}\n\t\t>\n\t\t\t<ComposerAttachments />\n\t\t\t<ComposerPrimitive.Input\n\t\t\t\tplaceholder=\"Send a message...\"\n\t\t\t\tclassName=\"aui-composer-input mt-2 max-h-24 w-full resize-none bg-transparent px-0 py-2 text-sm leading-relaxed text-foreground placeholder:text-muted-foreground/70 focus-visible:outline-none focus-visible:ring-0\"\n\t\t\t\trows={1}\n\t\t\t\tautoFocus\n\t\t\t\taria-label=\"Message input\"\n\t\t\t/>\n\t\t\t<div className=\"aui-composer-action-wrapper mt-2 flex items-center justify-between text-muted-foreground\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<ComposerAddAttachment />\n\n\t\t\t\t\t{/* Remote MCP settings */}\n\t\t\t\t\t<RemoteMCPSettings />\n\n\t\t\t\t\t{/* Voice mode button */}\n\t\t\t\t\t{voiceMode?.isSupported && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tonClick={() => voiceMode.startSession()}\n\t\t\t\t\t\t\tclassName=\"gap-2 rounded-full text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\t\taria-label=\"Start voice session\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Phone className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t<span className=\"text-xs\">Voice</span>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex items-center gap-1.5\">\n\t\t\t\t\t<ThreadPrimitive.If running={false}>\n\t\t\t\t\t\t<ComposerPrimitive.Send asChild>\n\t\t\t\t\t\t\t<TooltipIconButton\n\t\t\t\t\t\t\t\ttooltip=\"Send message\"\n\t\t\t\t\t\t\t\tside=\"top\"\n\t\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName=\"aui-composer-send size-8 shrink-0 rounded-full border border-primary/60 bg-primary px-0 text-primary-foreground shadow-[0_12px_24px_-16px_rgba(37,99,235,0.55)] transition-shadow hover:shadow-[0_14px_24px_-14px_rgba(37,99,235,0.6)] focus-visible:ring-2 focus-visible:ring-primary/40\"\n\t\t\t\t\t\t\t\taria-label=\"Send message\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ArrowUpIcon className=\"aui-composer-send-icon size-4\" />\n\t\t\t\t\t\t\t</TooltipIconButton>\n\t\t\t\t\t\t</ComposerPrimitive.Send>\n\t\t\t\t\t</ThreadPrimitive.If>\n\n\t\t\t\t\t<ThreadPrimitive.If running>\n\t\t\t\t\t\t<ComposerPrimitive.Cancel asChild>\n\t\t\t\t\t\t\t<TooltipIconButton\n\t\t\t\t\t\t\t\ttooltip=\"Stop generating\"\n\t\t\t\t\t\t\t\tside=\"top\"\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName=\"aui-composer-cancel size-8 shrink-0 rounded-full border border-destructive/60 bg-destructive px-0 text-destructive-foreground shadow-[0_12px_24px_-18px_rgba(220,38,38,0.55)] transition-shadow hover:shadow-[0_14px_24px_-16px_rgba(220,38,38,0.6)] focus-visible:ring-2 focus-visible:ring-destructive/40\"\n\t\t\t\t\t\t\t\taria-label=\"Stop generating\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Square className=\"aui-composer-cancel-icon size-3.5\" />\n\t\t\t\t\t\t\t</TooltipIconButton>\n\t\t\t\t\t\t</ComposerPrimitive.Cancel>\n\t\t\t\t\t</ThreadPrimitive.If>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</ComposerPrimitive.Root>\n\t)\n}\n\nconst ThreadScrollToBottom: FC = () => {\n\treturn (\n\t\t<ThreadPrimitive.ScrollToBottom asChild>\n\t\t\t<TooltipIconButton\n\t\t\t\ttooltip=\"Scroll to bottom\"\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tclassName=\"aui-thread-scroll-to-bottom absolute -top-12 z-10 self-center rounded-full p-4 disabled:invisible dark:bg-background dark:hover:bg-accent\"\n\t\t\t>\n\t\t\t\t<ArrowDownIcon />\n\t\t\t</TooltipIconButton>\n\t\t</ThreadPrimitive.ScrollToBottom>\n\t)\n}\n\nconst ThreadWelcome: FC = () => {\n\treturn (\n\t\t<div className=\"aui-thread-welcome-root mx-auto my-auto flex w-full max-w-[var(--thread-max-width)] flex-grow flex-col\">\n\t\t\t<div className=\"aui-thread-welcome-center flex w-full flex-grow flex-col items-center justify-center\">\n\t\t\t\t<div className=\"aui-thread-welcome-message flex size-full flex-col justify-center px-8\">\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tinitial={{ opacity: 0, y: 10 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\texit={{ opacity: 0, y: 10 }}\n\t\t\t\t\t\tclassName=\"aui-thread-welcome-message-motion-1 text-3xl font-bold tracking-tight\"\n\t\t\t\t\t>\n\t\t\t\t\t\tHello there!\n\t\t\t\t\t</m.div>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tinitial={{ opacity: 0, y: 10 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\texit={{ opacity: 0, y: 10 }}\n\t\t\t\t\t\ttransition={{ delay: 0.1 }}\n\t\t\t\t\t\tclassName=\"aui-thread-welcome-message-motion-2 mt-2 text-lg text-muted-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\tHow can I help you today?\n\t\t\t\t\t</m.div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<ThreadSuggestions />\n\t\t</div>\n\t)\n}\n\nconst ThreadSuggestions: FC = () => {\n\treturn (\n\t\t<div className=\"aui-thread-welcome-suggestions grid w-full gap-2 pb-4 @md:grid-cols-2\">\n\t\t\t{[\n\t\t\t\t{\n\t\t\t\t\ttitle: \"What's the weather\",\n\t\t\t\t\tlabel: 'in San Francisco?',\n\t\t\t\t\taction: \"What's the weather in San Francisco?\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttitle: 'Explain React hooks',\n\t\t\t\t\tlabel: 'like useState and useEffect',\n\t\t\t\t\taction: 'Explain React hooks like useState and useEffect',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttitle: 'Write a SQL query',\n\t\t\t\t\tlabel: 'to find top customers',\n\t\t\t\t\taction: 'Write a SQL query to find top customers',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttitle: 'Create a meal plan',\n\t\t\t\t\tlabel: 'for healthy weight loss',\n\t\t\t\t\taction: 'Create a meal plan for healthy weight loss',\n\t\t\t\t},\n\t\t\t].map((suggestedAction, index) => (\n\t\t\t\t<m.div\n\t\t\t\t\tinitial={{ opacity: 0, y: 20 }}\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\texit={{ opacity: 0, y: 20 }}\n\t\t\t\t\ttransition={{ delay: 0.05 * index }}\n\t\t\t\t\tkey={`suggested-action-${suggestedAction.title}-${index}`}\n\t\t\t\t\tclassName=\"aui-thread-welcome-suggestion-display [&:nth-child(n+3)]:hidden @md:[&:nth-child(n+3)]:block\"\n\t\t\t\t>\n\t\t\t\t\t<ThreadPrimitive.Suggestion prompt={suggestedAction.action} send asChild>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\tclassName=\"aui-thread-welcome-suggestion h-auto w-full flex-1 flex-wrap items-start justify-start gap-1 rounded-xl border-border/50 bg-background/50 px-4 py-3 text-left text-sm transition-colors hover:bg-accent/50 hover:border-accent @md:flex-col\"\n\t\t\t\t\t\t\taria-label={suggestedAction.action}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"aui-thread-welcome-suggestion-text-1 font-medium text-foreground\">\n\t\t\t\t\t\t\t\t{suggestedAction.title}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span className=\"aui-thread-welcome-suggestion-text-2 text-muted-foreground text-xs\">\n\t\t\t\t\t\t\t\t{suggestedAction.label}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</ThreadPrimitive.Suggestion>\n\t\t\t\t</m.div>\n\t\t\t))}\n\t\t</div>\n\t)\n}\n\nconst MessageError: FC = () => {\n\treturn (\n\t\t<MessagePrimitive.Error>\n\t\t\t<ErrorPrimitive.Root className=\"aui-message-error-root mt-2 rounded-md border border-destructive bg-destructive/10 p-3 text-sm text-destructive dark:bg-destructive/5 dark:text-red-200\">\n\t\t\t\t<ErrorPrimitive.Message className=\"aui-message-error-message line-clamp-2\" />\n\t\t\t</ErrorPrimitive.Root>\n\t\t</MessagePrimitive.Error>\n\t)\n}\n\nconst AssistantMessage: FC = () => {\n\treturn (\n\t\t<MessagePrimitive.Root asChild>\n\t\t\t<div\n\t\t\t\tclassName=\"aui-assistant-message-root relative mx-auto w-full max-w-[var(--thread-max-width)] animate-in py-4 duration-200 fade-in slide-in-from-bottom-1 last:mb-24\"\n\t\t\t\tdata-role=\"assistant\"\n\t\t\t>\n\t\t\t\t<div className=\"aui-assistant-message-content mx-2 leading-7 break-words text-foreground\">\n\t\t\t\t\t<MessagePrimitive.Parts\n\t\t\t\t\t\tcomponents={{\n\t\t\t\t\t\t\tText: MarkdownText,\n\t\t\t\t\t\t\ttools: { Fallback: ToolFallback },\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t<MessageError />\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"aui-assistant-message-footer mt-2 ml-2 flex\">\n\t\t\t\t\t<BranchPicker />\n\t\t\t\t\t<AssistantActionBar />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</MessagePrimitive.Root>\n\t)\n}\n\nconst AssistantActionBar: FC = () => {\n\treturn (\n\t\t<ActionBarPrimitive.Root\n\t\t\thideWhenRunning\n\t\t\tautohide=\"not-last\"\n\t\t\tautohideFloat=\"single-branch\"\n\t\t\tclassName=\"aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex gap-1 text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm\"\n\t\t>\n\t\t\t<ActionBarPrimitive.Copy asChild>\n\t\t\t\t<TooltipIconButton tooltip=\"Copy\">\n\t\t\t\t\t<MessagePrimitive.If copied>\n\t\t\t\t\t\t<CheckIcon />\n\t\t\t\t\t</MessagePrimitive.If>\n\t\t\t\t\t<MessagePrimitive.If copied={false}>\n\t\t\t\t\t\t<CopyIcon />\n\t\t\t\t\t</MessagePrimitive.If>\n\t\t\t\t</TooltipIconButton>\n\t\t\t</ActionBarPrimitive.Copy>\n\t\t\t<ActionBarPrimitive.Reload asChild>\n\t\t\t\t<TooltipIconButton tooltip=\"Refresh\">\n\t\t\t\t\t<RefreshCwIcon />\n\t\t\t\t</TooltipIconButton>\n\t\t\t</ActionBarPrimitive.Reload>\n\t\t</ActionBarPrimitive.Root>\n\t)\n}\n\nconst UserMessage: FC = () => {\n\treturn (\n\t\t<MessagePrimitive.Root asChild>\n\t\t\t<div\n\t\t\t\tclassName=\"aui-user-message-root mx-auto grid w-full max-w-[var(--thread-max-width)] animate-in auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] gap-y-2 px-2 py-4 duration-200 fade-in slide-in-from-bottom-1 first:mt-3 last:mb-5 [&:where(>*)]:col-start-2\"\n\t\t\t\tdata-role=\"user\"\n\t\t\t>\n\t\t\t\t<UserMessageAttachments />\n\n\t\t\t\t<div className=\"aui-user-message-content-wrapper relative col-start-2 min-w-0 max-w-[85%]\">\n\t\t\t\t\t<div className=\"aui-user-message-content rounded-2xl rounded-tr-sm bg-primary text-primary-foreground px-4 py-3 text-sm leading-relaxed shadow-sm\">\n\t\t\t\t\t\t<MessagePrimitive.Parts />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"aui-user-action-bar-wrapper absolute top-1/2 left-0 -translate-x-full -translate-y-1/2 pr-2\">\n\t\t\t\t\t\t<UserActionBar />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<BranchPicker className=\"aui-user-branch-picker col-span-full col-start-1 row-start-3 -mr-1 justify-end\" />\n\t\t\t</div>\n\t\t</MessagePrimitive.Root>\n\t)\n}\n\nconst UserActionBar: FC = () => {\n\treturn (\n\t\t<ActionBarPrimitive.Root\n\t\t\thideWhenRunning\n\t\t\tautohide=\"not-last\"\n\t\t\tclassName=\"aui-user-action-bar-root flex flex-col items-end\"\n\t\t>\n\t\t\t<ActionBarPrimitive.Edit asChild>\n\t\t\t\t<TooltipIconButton tooltip=\"Edit\" className=\"aui-user-action-edit p-4\">\n\t\t\t\t\t<PencilIcon />\n\t\t\t\t</TooltipIconButton>\n\t\t\t</ActionBarPrimitive.Edit>\n\t\t</ActionBarPrimitive.Root>\n\t)\n}\n\nconst EditComposer: FC = () => {\n\treturn (\n\t\t<div className=\"aui-edit-composer-wrapper mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 px-2 first:mt-4\">\n\t\t\t<ComposerPrimitive.Root className=\"aui-edit-composer-root ml-auto flex w-full max-w-7/8 flex-col rounded-xl bg-muted\">\n\t\t\t\t<ComposerPrimitive.Input\n\t\t\t\t\tclassName=\"aui-edit-composer-input flex min-h-[60px] w-full resize-none bg-transparent p-4 text-foreground outline-none\"\n\t\t\t\t\tautoFocus\n\t\t\t\t/>\n\n\t\t\t\t<div className=\"aui-edit-composer-footer mx-3 mb-3 flex items-center justify-center gap-2 self-end\">\n\t\t\t\t\t<ComposerPrimitive.Cancel asChild>\n\t\t\t\t\t\t<Button variant=\"ghost\" size=\"sm\" aria-label=\"Cancel edit\">\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</ComposerPrimitive.Cancel>\n\t\t\t\t\t<ComposerPrimitive.Send asChild>\n\t\t\t\t\t\t<Button size=\"sm\" aria-label=\"Update message\">\n\t\t\t\t\t\t\tUpdate\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</ComposerPrimitive.Send>\n\t\t\t\t</div>\n\t\t\t</ComposerPrimitive.Root>\n\t\t</div>\n\t)\n}\n\nconst BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({ className, ...rest }) => {\n\treturn (\n\t\t<BranchPickerPrimitive.Root\n\t\t\thideWhenSingleBranch\n\t\t\tclassName={cn(\n\t\t\t\t'aui-branch-picker-root mr-2 -ml-2 inline-flex items-center text-xs text-muted-foreground',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...rest}\n\t\t>\n\t\t\t<BranchPickerPrimitive.Previous asChild>\n\t\t\t\t<TooltipIconButton tooltip=\"Previous\">\n\t\t\t\t\t<ChevronLeftIcon />\n\t\t\t\t</TooltipIconButton>\n\t\t\t</BranchPickerPrimitive.Previous>\n\t\t\t<span className=\"aui-branch-picker-state font-medium\">\n\t\t\t\t<BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />\n\t\t\t</span>\n\t\t\t<BranchPickerPrimitive.Next asChild>\n\t\t\t\t<TooltipIconButton tooltip=\"Next\">\n\t\t\t\t\t<ChevronRightIcon />\n\t\t\t\t</TooltipIconButton>\n\t\t\t</BranchPickerPrimitive.Next>\n\t\t</BranchPickerPrimitive.Root>\n\t)\n}\n","'use client'\n\nimport { AssistantModalPrimitive } from '@assistant-ui/react'\nimport { ChevronDownIcon } from 'lucide-react'\nimport { forwardRef } from 'react'\n\nimport { ThreadWithVoice } from './thread-with-voice'\nimport { TooltipIconButton } from './tooltip-icon-button'\n\nimport type { FC } from 'react'\n\nexport const AssistantModal: FC = () => {\n\treturn (\n\t\t<AssistantModalPrimitive.Root>\n\t\t\t<AssistantModalPrimitive.Anchor className=\"aui-root aui-modal-anchor fixed right-6 bottom-6 size-14\">\n\t\t\t\t<AssistantModalPrimitive.Trigger asChild>\n\t\t\t\t\t<AssistantModalButton />\n\t\t\t\t</AssistantModalPrimitive.Trigger>\n\t\t\t</AssistantModalPrimitive.Anchor>\n\t\t\t<AssistantModalPrimitive.Content\n\t\t\t\tsideOffset={16}\n\t\t\t\tclassName=\"aui-root aui-modal-content z-50 h-[600px] w-[500px] overflow-clip overscroll-contain rounded-2xl border border-border/50 bg-popover/95 backdrop-blur-xl p-0 text-popover-foreground shadow-2xl outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-bottom-1/2 data-[state=closed]:slide-out-to-right-1/2 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:slide-in-from-bottom-1/2 data-[state=open]:slide-in-from-right-1/2 data-[state=open]:zoom-in-95 [&>.aui-thread-root]:bg-inherit\"\n\t\t\t>\n\t\t\t\t<ThreadWithVoice />\n\t\t\t</AssistantModalPrimitive.Content>\n\t\t</AssistantModalPrimitive.Root>\n\t)\n}\n\ntype AssistantModalButtonProps = { 'data-state'?: 'open' | 'closed' }\n\nconst AssistantModalButton = forwardRef<HTMLButtonElement, AssistantModalButtonProps>(\n\t({ 'data-state': state, ...rest }, ref) => {\n\t\tconst tooltip = state === 'open' ? 'Close Assistant' : 'Open Assistant'\n\n\t\treturn (\n\t\t\t<TooltipIconButton\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\ttooltip={tooltip}\n\t\t\t\tside=\"left\"\n\t\t\t\t{...rest}\n\t\t\t\tclassName=\"aui-modal-button size-full rounded-full transition-all hover:scale-105 hover:bg-transparent active:scale-95\"\n\t\t\t\tref={ref}\n\t\t\t>\n\t\t\t\t<img\n\t\t\t\t\tsrc=\"/logo.png\"\n\t\t\t\t\talt=\"Assistant\"\n\t\t\t\t\tdata-state={state}\n\t\t\t\t\tclassName=\"aui-modal-button-closed-icon absolute size-full object-contain drop-shadow-xl transition-all duration-300 ease-in-out hover:drop-shadow-2xl data-[state=closed]:scale-100 data-[state=closed]:rotate-0 data-[state=open]:scale-0 data-[state=open]:rotate-90\"\n\t\t\t\t/>\n\n\t\t\t\t<ChevronDownIcon\n\t\t\t\t\tdata-state={state}\n\t\t\t\t\tclassName=\"aui-modal-button-open-icon absolute size-full rounded-full bg-primary p-3 text-primary-foreground shadow-xl transition-all duration-300 ease-in-out hover:shadow-2xl data-[state=closed]:scale-0 data-[state=closed]:-rotate-90 data-[state=open]:scale-100 data-[state=open]:rotate-0\"\n\t\t\t\t/>\n\t\t\t\t<span className=\"aui-sr-only sr-only\">{tooltip}</span>\n\t\t\t</TooltipIconButton>\n\t\t)\n\t}\n)\n\nAssistantModalButton.displayName = 'AssistantModalButton'\n","/**\n * MCP Tool Registry Component\n *\n * Registers all MCP tools with the assistant-ui runtime.\n * Uses the unified callTool function which auto-routes based on tool source.\n *\n * Usage:\n * <MCPToolRegistry />\n *\n * This component should be placed inside both MCPToolsProvider and AssistantRuntimeProvider.\n */\nimport { useAssistantTool } from '@assistant-ui/react'\n\nimport { useMCPTools } from '../providers/MCPToolsProvider'\n\nimport type { CallToolResult, ToolWithSource } from '@mcp-b/cloud-mirror-types'\nimport type { FC } from 'react'\n\n/**\n * Bridge component that registers a single tool with assistant-ui\n */\nconst ToolBridge: FC<{\n\ttool: ToolWithSource\n\tcallTool: (name: string, args: Record<string, unknown>) => Promise<CallToolResult>\n}> = ({ tool, callTool }) => {\n\tuseAssistantTool({\n\t\ttoolName: tool.name,\n\t\tdescription: tool.description ?? '',\n\t\tparameters: (tool.inputSchema ?? {}) as Record<string, unknown>,\n\t\texecute: async (args) => {\n\t\t\ttry {\n\t\t\t\tconst result = await callTool(tool.name, args)\n\n\t\t\t\t// Return a formatted response for the assistant\n\t\t\t\tconst textContent = result.content\n\t\t\t\t\t.map((c) => {\n\t\t\t\t\t\tif ('text' in c && typeof c.text === 'string') {\n\t\t\t\t\t\t\treturn c.text\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn JSON.stringify(c)\n\t\t\t\t\t})\n\t\t\t\t\t.join('\\n')\n\n\t\t\t\treturn textContent || 'Tool executed successfully'\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`[ToolBridge] Tool '${tool.name}' execution failed:`, error)\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t})\n\n\treturn null\n}\n\n/**\n * Tool registry that registers all MCP tools with assistant-ui.\n * Routes tool calls automatically based on _sourceId.\n */\nexport const MCPToolRegistry: FC = () => {\n\tconst { tools, callTool } = useMCPTools()\n\n\treturn (\n\t\t<>\n\t\t\t{tools.map((tool) => (\n\t\t\t\t<ToolBridge key={`${tool._sourceId}-${tool.name}`} tool={tool} callTool={callTool} />\n\t\t\t))}\n\t\t</>\n\t)\n}\n\n/**\n * Debug component to display registered tools and sources\n */\nexport const MCPToolsDebug: FC = () => {\n\tconst { tools, sources } = useMCPTools()\n\n\treturn (\n\t\t<div className=\"rounded border border-border bg-muted p-3 text-xs\">\n\t\t\t<div className=\"mb-2 font-medium\">MCP Tools Debug</div>\n\t\t\t<div className=\"mb-2\">\n\t\t\t\t<div className=\"font-medium\">Sources:</div>\n\t\t\t\t{Array.from(sources.values()).map((source) => (\n\t\t\t\t\t<div key={source.id} className=\"ml-2\">\n\t\t\t\t\t\t{source.id}: {source.state}\n\t\t\t\t\t\t{source.error && <span className=\"text-destructive\"> ({source.error.message})</span>}\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t<div className=\"mb-1\">Total tools: {tools.length}</div>\n\t\t\t<ul className=\"list-disc space-y-1 pl-4\">\n\t\t\t\t{tools.map((tool) => (\n\t\t\t\t\t<li key={`${tool._sourceId}-${tool.name}`}>\n\t\t\t\t\t\t<span className=\"font-mono\">{tool.name}</span>\n\t\t\t\t\t\t<span className=\"ml-1 text-muted-foreground\">({tool._sourceId})</span>\n\t\t\t\t\t</li>\n\t\t\t\t))}\n\t\t\t</ul>\n\t\t</div>\n\t)\n}\n","/**\n * Auto-generated file - DO NOT EDIT\n * Generated by scripts/generate-inline-styles.js\n *\n * Contains the compiled CSS for the web component standalone build.\n */\n\nexport const WEBMCP_STYLES = \"/*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */\\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\",\\\"Segoe UI Symbol\\\",\\\"Noto Color Emoji\\\";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\\\"Liberation Mono\\\",\\\"Courier New\\\",monospace;--color-red-200:oklch(88.5% .062 18.334);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-amber-500:oklch(76.9% .188 70.08);--color-yellow-500:oklch(79.5% .184 86.047);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-emerald-500:oklch(69.6% .17 162.48);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-relaxed:1.625;--radius-xs:.125rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--drop-shadow-xl:0 9px 7px #0000001a;--drop-shadow-2xl:0 25px 25px #00000026;--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--blur-md:12px;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\",\\\"Segoe UI Symbol\\\",\\\"Noto Color Emoji\\\");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\\\"Liberation Mono\\\",\\\"Courier New\\\",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root{--radius:.75rem;--background:oklch(100% 0 0);--foreground:oklch(14.1% .005 285.823);--card:oklch(100% 0 0);--card-foreground:oklch(14.1% .005 285.823);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.1% .005 285.823);--primary:oklch(21% .006 285.885);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(96.7% .001 286.375);--secondary-foreground:oklch(21% .006 285.885);--muted:oklch(96.7% .001 286.375);--muted-foreground:oklch(55.2% .016 285.938);--accent:oklch(96.7% .001 286.375);--accent-foreground:oklch(21% .006 285.885);--destructive:oklch(57.7% .245 27.325);--destructive-foreground:oklch(98.5% 0 0);--border:oklch(92% .004 286.32);--input:oklch(92% .004 286.32);--ring:oklch(70.5% .015 286.067)}.dark{--background:oklch(14.1% .005 285.823);--foreground:oklch(98.5% 0 0);--card:oklch(21% .006 285.885);--card-foreground:oklch(98.5% 0 0);--popover:oklch(21% .006 285.885);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92% .004 286.32);--primary-foreground:oklch(21% .006 285.885);--secondary:oklch(27.4% .006 286.033);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(27.4% .006 286.033);--muted-foreground:oklch(70.5% .015 286.067);--accent:oklch(27.4% .006 286.033);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--destructive-foreground:oklch(98.5% 0 0);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.2% .016 285.938)}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklch,var(--ring),transparent 50%)}}body{background-color:var(--background);color:var(--foreground)}}@layer components{.app-shell{z-index:0;background-color:var(--background);background-image:radial-gradient(80% 60% at -10% -10%,oklch(82% .15 270/.15),#0000),radial-gradient(60% 50% at 110% 10%,oklch(85% .1 220/.12),#0000),radial-gradient(50% 45% at 50% 120%,oklch(95% .02 250/.08),#0000);position:relative}.dark .app-shell{background-image:radial-gradient(80% 60% at -10% -10%,oklch(55% .14 270/.25),#0000),radial-gradient(60% 50% at 110% 15%,oklch(60% .12 220/.22),#0000),radial-gradient(50% 45% at 50% 120%,oklch(35% .04 250/.16),#0000)}.app-shell:before,.app-shell:after{content:\\\"\\\";pointer-events:none;filter:blur(32px);opacity:.6;z-index:-1;border-radius:9999px;position:absolute;inset:auto}.app-shell:before{background:radial-gradient(60% 60% at 40% 40%,oklch(80% .12 270/.3),#0000);width:260px;height:260px;top:-60px;left:-80px}.app-shell:after{background:radial-gradient(60% 60% at 60% 60%,oklch(84% .1 220/.25),#0000);width:300px;height:300px;bottom:-80px;right:-60px}.toolbar-surface{border-top:1px solid var(--border);background:linear-gradient(to right,var(--background),var(--background),var(--background))}@supports (color:color-mix(in lab, red, red)){.toolbar-surface{background:linear-gradient(to right,var(--background),color-mix(in oklch,var(--background),transparent 5%),var(--background))}}.toolbar-surface{-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}@supports ((-webkit-backdrop-filter:blur(12px)) or (backdrop-filter:blur(12px))){.toolbar-surface{background:var(--background)}@supports (color:color-mix(in lab, red, red)){.toolbar-surface{background:color-mix(in oklch,var(--background),transparent 20%)}}}.toolbar-surface-top{border-bottom:1px solid var(--border);background:linear-gradient(to right,var(--background),var(--background),var(--background))}@supports (color:color-mix(in lab, red, red)){.toolbar-surface-top{background:linear-gradient(to right,var(--background),color-mix(in oklch,var(--background),transparent 5%),var(--background))}}.toolbar-surface-top{-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}@supports ((-webkit-backdrop-filter:blur(12px)) or (backdrop-filter:blur(12px))){.toolbar-surface-top{background:var(--background)}@supports (color:color-mix(in lab, red, red)){.toolbar-surface-top{background:color-mix(in oklch,var(--background),transparent 20%)}}}.toolbar-inner{justify-content:space-between;align-items:center;padding:.5rem .75rem;display:flex}.toolbar-card{background:var(--card);justify-content:space-between;align-items:center;gap:.5rem;display:flex}@supports (color:color-mix(in lab, red, red)){.toolbar-card{background:color-mix(in oklch,var(--card),transparent 60%)}}.toolbar-card{border:1px solid var(--border);border-radius:.75rem;padding:.5rem .75rem}.toolbar-group{align-items:center;gap:.25rem;display:flex}.btn-toolbar-primary{background:linear-gradient(to right,var(--primary),var(--primary));border-radius:.75rem;align-items:center;gap:.5rem;height:2.25rem;padding:0 .75rem;display:flex}@supports (color:color-mix(in lab, red, red)){.btn-toolbar-primary{background:linear-gradient(to right,color-mix(in oklch,var(--primary),transparent 95%),color-mix(in oklch,var(--primary),transparent 90%))}}.btn-toolbar-primary{border:1px solid var(--primary)}@supports (color:color-mix(in lab, red, red)){.btn-toolbar-primary{border:1px solid color-mix(in oklch,var(--primary),transparent 80%)}}.btn-toolbar-primary{transition:all .2s}.btn-toolbar-primary:hover{background:linear-gradient(to right,var(--primary),var(--primary))}@supports (color:color-mix(in lab, red, red)){.btn-toolbar-primary:hover{background:linear-gradient(to right,color-mix(in oklch,var(--primary),transparent 90%),color-mix(in oklch,var(--primary),transparent 80%))}}.btn-toolbar-icon-primary{background:linear-gradient(to bottom right,var(--primary),var(--primary));border-radius:9999px;width:2rem;height:2rem;padding:0}@supports (color:color-mix(in lab, red, red)){.btn-toolbar-icon-primary{background:linear-gradient(to bottom right,color-mix(in oklch,var(--primary),transparent 90%),color-mix(in oklch,var(--primary),transparent 80%))}}.btn-toolbar-icon-primary{border:1px solid var(--primary)}@supports (color:color-mix(in lab, red, red)){.btn-toolbar-icon-primary{border:1px solid color-mix(in oklch,var(--primary),transparent 70%)}}.btn-toolbar-icon-primary{transition:all .2s;box-shadow:0 1px 2px #0000000d}.btn-toolbar-icon-primary:hover{background:linear-gradient(to bottom right,var(--primary),var(--primary))}@supports (color:color-mix(in lab, red, red)){.btn-toolbar-icon-primary:hover{background:linear-gradient(to bottom right,color-mix(in oklch,var(--primary),transparent 80%),color-mix(in oklch,var(--primary),transparent 70%))}}.btn-toolbar-icon-secondary{background:linear-gradient(to bottom right,var(--secondary),var(--secondary));border-radius:9999px;width:2rem;height:2rem;padding:0}@supports (color:color-mix(in lab, red, red)){.btn-toolbar-icon-secondary{background:linear-gradient(to bottom right,color-mix(in oklch,var(--secondary),transparent 90%),color-mix(in oklch,var(--secondary),transparent 80%))}}.btn-toolbar-icon-secondary{border:1px solid var(--secondary)}@supports (color:color-mix(in lab, red, red)){.btn-toolbar-icon-secondary{border:1px solid color-mix(in oklch,var(--secondary),transparent 70%)}}.btn-toolbar-icon-secondary{transition:all .2s;box-shadow:0 1px 2px #0000000d}.btn-toolbar-icon-secondary:hover{background:linear-gradient(to bottom right,var(--secondary),var(--secondary))}@supports (color:color-mix(in lab, red, red)){.btn-toolbar-icon-secondary:hover{background:linear-gradient(to bottom right,color-mix(in oklch,var(--secondary),transparent 80%),color-mix(in oklch,var(--secondary),transparent 70%))}}.badge-compact{height:1.25rem;padding:0 .5rem;font-size:10px}.badge-mini{height:1rem;padding:0 .375rem;font-size:10px}@keyframes shimmer-bg{0%{background-position:-1000px 0}to{background-position:1000px 0}}.shimmer{background:linear-gradient(90deg,#0000,#ffffff1a,#0000) 0 0/1000px 100%;animation:3s linear infinite shimmer-bg}.animate-shimmer{animation:2s linear infinite shimmer}@keyframes pulse-glow{0%,to{box-shadow:0 0 20px rgba(var(--primary),.1)}50%{box-shadow:0 0 30px rgba(var(--primary),.2)}}.pulse-glow{animation:2s ease-in-out infinite pulse-glow}@keyframes gradient-x{0%,to{background-position:0%}50%{background-position:100%}}.animate-gradient-x{animation:8s ease-in-out infinite gradient-x}.gradient-text{background:linear-gradient(to right,var(--foreground),var(--foreground))}@supports (color:color-mix(in lab, red, red)){.gradient-text{background:linear-gradient(to right,var(--foreground),color-mix(in oklch,var(--foreground),transparent 30%))}}.gradient-text{-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text}.glass{background:var(--background)}@supports (color:color-mix(in lab, red, red)){.glass{background:color-mix(in oklch,var(--background),transparent 50%)}}.glass{-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid var(--border)}@supports (color:color-mix(in lab, red, red)){.glass{border:1px solid color-mix(in oklch,var(--border),transparent 50%)}}.tool-card{transition:all .3s ease-out}.tool-card:hover{transform:scale(1.02);box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d}.scrollbar-thin{scrollbar-width:thin}.scrollbar-thin::-webkit-scrollbar{width:6px;height:6px}.scrollbar-thin::-webkit-scrollbar-track{background:0 0}.scrollbar-thin::-webkit-scrollbar-thumb{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.scrollbar-thin::-webkit-scrollbar-thumb{background-color:color-mix(in oklch,var(--primary),transparent 80%)}}.scrollbar-thin::-webkit-scrollbar-thumb{border-radius:3px}.scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:color-mix(in oklch,var(--primary),transparent 70%)}}}@layer utilities{.\\\\@container{container-type:inline-size}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.-top-12{top:calc(var(--spacing)*-12)}.top-1\\\\.5{top:calc(var(--spacing)*1.5)}.top-1\\\\/2{top:50%}.top-4{top:calc(var(--spacing)*4)}.top-\\\\[50\\\\%\\\\]{top:50%}.right-0{right:calc(var(--spacing)*0)}.right-1\\\\.5{right:calc(var(--spacing)*1.5)}.right-4{right:calc(var(--spacing)*4)}.right-6{right:calc(var(--spacing)*6)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-6{bottom:calc(var(--spacing)*6)}.left-0{left:calc(var(--spacing)*0)}.left-\\\\[50\\\\%\\\\]{left:50%}.z-10{z-index:10}.z-50{z-index:50}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.row-start-1{grid-row-start:1}.row-start-2{grid-row-start:2}.row-start-3{grid-row-start:3}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing)*0)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing)*2)}.my-auto{margin-block:auto}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.-mr-1{margin-right:calc(var(--spacing)*-1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.-ml-2{margin-left:calc(var(--spacing)*-2)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.size-2\\\\.5{width:calc(var(--spacing)*2.5);height:calc(var(--spacing)*2.5)}.size-3{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.size-3\\\\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-8{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.size-9{width:calc(var(--spacing)*9);height:calc(var(--spacing)*9)}.size-10{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.size-14{width:calc(var(--spacing)*14);height:calc(var(--spacing)*14)}.size-\\\\[34px\\\\]{width:34px;height:34px}.size-full{width:100%;height:100%}.h-1\\\\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-2\\\\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\\\\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-\\\\[600px\\\\]{height:600px}.h-auto{height:auto}.h-full{height:100%}.max-h-24{max-height:calc(var(--spacing)*24)}.max-h-40{max-height:calc(var(--spacing)*40)}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-\\\\[80dvh\\\\]{max-height:80dvh}.max-h-\\\\[80vh\\\\]{max-height:80vh}.min-h-8{min-height:calc(var(--spacing)*8)}.min-h-\\\\[60px\\\\]{min-height:60px}.w-1\\\\.5{width:calc(var(--spacing)*1.5)}.w-2{width:calc(var(--spacing)*2)}.w-2\\\\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\\\\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-16{width:calc(var(--spacing)*16)}.w-\\\\[500px\\\\]{width:500px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-7\\\\/8{max-width:87.5%}.max-w-\\\\[80\\\\%\\\\]{max-width:80%}.max-w-\\\\[80px\\\\]{max-width:80px}.max-w-\\\\[85\\\\%\\\\]{max-width:85%}.max-w-\\\\[calc\\\\(100\\\\%-2rem\\\\)\\\\]{max-width:calc(100% - 2rem)}.max-w-\\\\[var\\\\(--thread-max-width\\\\)\\\\]{max-width:var(--thread-max-width)}.max-w-full{max-width:100%}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.border-separate{border-collapse:separate}.border-spacing-0{--tw-border-spacing-x:calc(var(--spacing)*0);--tw-border-spacing-y:calc(var(--spacing)*0);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.origin-\\\\(--radix-tooltip-content-transform-origin\\\\){transform-origin:var(--radix-tooltip-content-transform-origin)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-\\\\[-50\\\\%\\\\]{--tw-translate-x:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\\\\/2{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\\\\[-50\\\\%\\\\]{--tw-translate-y:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\\\\[calc\\\\(-50\\\\%_-_2px\\\\)\\\\]{--tw-translate-y:calc(-50% - 2px);translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-45{rotate:45deg}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize-none{resize:none}.scroll-m-20{scroll-margin:calc(var(--spacing)*20)}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.auto-rows-auto{grid-auto-rows:auto}.grid-cols-\\\\[minmax\\\\(72px\\\\,1fr\\\\)_auto\\\\]{grid-template-columns:minmax(72px,1fr) auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\\\\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\\\\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.gap-y-2{row-gap:calc(var(--spacing)*2)}.self-center{align-self:center}.self-end{align-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-clip{overflow:clip}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-scroll{overflow-y:scroll}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-\\\\[2px\\\\]{border-radius:2px}.rounded-\\\\[14px\\\\]{border-radius:14px}.rounded-\\\\[inherit\\\\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-xs{border-radius:var(--radius-xs)}.\\\\!rounded-t-none{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-t-3xl{border-top-left-radius:var(--radius-3xl);border-top-right-radius:var(--radius-3xl)}.rounded-t-lg{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.rounded-tr-sm{border-top-right-radius:calc(var(--radius) - 4px)}.rounded-b-lg{border-bottom-right-radius:var(--radius);border-bottom-left-radius:var(--radius)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-blue-500\\\\/40{border-color:#3080ff66}@supports (color:color-mix(in lab, red, red)){.border-blue-500\\\\/40{border-color:color-mix(in oklab,var(--color-blue-500)40%,transparent)}}.border-blue-500\\\\/60{border-color:#3080ff99}@supports (color:color-mix(in lab, red, red)){.border-blue-500\\\\/60{border-color:color-mix(in oklab,var(--color-blue-500)60%,transparent)}}.border-border,.border-border\\\\/20{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\\\\/20{border-color:color-mix(in oklab,var(--border)20%,transparent)}}.border-border\\\\/40{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\\\\/40{border-color:color-mix(in oklab,var(--border)40%,transparent)}}.border-border\\\\/50{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\\\\/50{border-color:color-mix(in oklab,var(--border)50%,transparent)}}.border-destructive,.border-destructive\\\\/60{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\\\\/60{border-color:color-mix(in oklab,var(--destructive)60%,transparent)}}.border-foreground\\\\/20{border-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.border-foreground\\\\/20{border-color:color-mix(in oklab,var(--foreground)20%,transparent)}}.border-green-500\\\\/40{border-color:#00c75866}@supports (color:color-mix(in lab, red, red)){.border-green-500\\\\/40{border-color:color-mix(in oklab,var(--color-green-500)40%,transparent)}}.border-green-500\\\\/60{border-color:#00c75899}@supports (color:color-mix(in lab, red, red)){.border-green-500\\\\/60{border-color:color-mix(in oklab,var(--color-green-500)60%,transparent)}}.border-input{border-color:var(--input)}.border-muted-foreground\\\\/20{border-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.border-muted-foreground\\\\/20{border-color:color-mix(in oklab,var(--muted-foreground)20%,transparent)}}.border-primary\\\\/60{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\\\\/60{border-color:color-mix(in oklab,var(--primary)60%,transparent)}}.border-red-500\\\\/40{border-color:#fb2c3666}@supports (color:color-mix(in lab, red, red)){.border-red-500\\\\/40{border-color:color-mix(in oklab,var(--color-red-500)40%,transparent)}}.border-red-500\\\\/60{border-color:#fb2c3699}@supports (color:color-mix(in lab, red, red)){.border-red-500\\\\/60{border-color:color-mix(in oklab,var(--color-red-500)60%,transparent)}}.border-transparent{border-color:#0000}.border-white\\\\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.border-white\\\\/10{border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.border-t-transparent{border-top-color:#0000}.border-l-transparent{border-left-color:#0000}.bg-\\\\[color-mix\\\\(in_oklab\\\\,rgb\\\\(var\\\\(--background\\\\)\\\\)_20\\\\%\\\\,transparent\\\\)\\\\]{background-color:rgb(var(--background))}@supports (color:color-mix(in lab, red, red)){.bg-\\\\[color-mix\\\\(in_oklab\\\\,rgb\\\\(var\\\\(--background\\\\)\\\\)_20\\\\%\\\\,transparent\\\\)\\\\]{background-color:color-mix(in oklab,rgb(var(--background))20%,transparent)}}.bg-amber-500{background-color:var(--color-amber-500)}.bg-background,.bg-background\\\\/50{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.bg-background\\\\/50{background-color:color-mix(in oklab,var(--background)50%,transparent)}}.bg-background\\\\/80{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.bg-background\\\\/80{background-color:color-mix(in oklab,var(--background)80%,transparent)}}.bg-background\\\\/95{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.bg-background\\\\/95{background-color:color-mix(in oklab,var(--background)95%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\\\\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\\\\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\\\\/5{background-color:#3080ff0d}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\\\\/5{background-color:color-mix(in oklab,var(--color-blue-500)5%,transparent)}}.bg-blue-500\\\\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\\\\/10{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.bg-border{background-color:var(--border)}.bg-destructive,.bg-destructive\\\\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\\\\/10{background-color:color-mix(in oklab,var(--destructive)10%,transparent)}}.bg-foreground{background-color:var(--foreground)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\\\\/5{background-color:#00c7580d}@supports (color:color-mix(in lab, red, red)){.bg-green-500\\\\/5{background-color:color-mix(in oklab,var(--color-green-500)5%,transparent)}}.bg-green-500\\\\/10{background-color:#00c7581a}@supports (color:color-mix(in lab, red, red)){.bg-green-500\\\\/10{background-color:color-mix(in oklab,var(--color-green-500)10%,transparent)}}.bg-muted{background-color:var(--muted)}.bg-muted-foreground\\\\/15{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\\\\/15{background-color:color-mix(in oklab,var(--muted-foreground)15%,transparent)}}.bg-muted\\\\/5{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\\\\/5{background-color:color-mix(in oklab,var(--muted)5%,transparent)}}.bg-muted\\\\/30{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\\\\/30{background-color:color-mix(in oklab,var(--muted)30%,transparent)}}.bg-muted\\\\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\\\\/50{background-color:color-mix(in oklab,var(--muted)50%,transparent)}}.bg-popover\\\\/95{background-color:var(--popover)}@supports (color:color-mix(in lab, red, red)){.bg-popover\\\\/95{background-color:color-mix(in oklab,var(--popover)95%,transparent)}}.bg-primary,.bg-primary\\\\/10{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\\\\/10{background-color:color-mix(in oklab,var(--primary)10%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\\\\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab, red, red)){.bg-red-500\\\\/5{background-color:color-mix(in oklab,var(--color-red-500)5%,transparent)}}.bg-red-500\\\\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.bg-red-500\\\\/10{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-yellow-500{background-color:var(--color-yellow-500)}.fill-foreground{fill:var(--foreground)}.stroke-\\\\[1\\\\.5px\\\\]{stroke-width:1.5px}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-px{padding:1px}.px-0{padding-inline:calc(var(--spacing)*0)}.px-1\\\\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\\\\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0\\\\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\\\\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\\\\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.pt-0\\\\.5{padding-top:calc(var(--spacing)*.5)}.pt-2{padding-top:calc(var(--spacing)*2)}.pr-2{padding-right:calc(var(--spacing)*2)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-4{padding-left:calc(var(--spacing)*4)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\\\[10px\\\\]{font-size:10px}.text-\\\\[11px\\\\]{font-size:11px}.text-\\\\[13px\\\\]{font-size:13px}.text-\\\\[15px\\\\]{font-size:15px}.text-\\\\[17px\\\\]{font-size:17px}.text-\\\\[19px\\\\]{font-size:19px}.text-\\\\[21px\\\\]{font-size:21px}.text-\\\\[25px\\\\]{font-size:25px}.leading-7{--tw-leading:calc(var(--spacing)*7);line-height:calc(var(--spacing)*7)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-balance{text-wrap:balance}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-background{color:var(--background)}.text-blue-600{color:var(--color-blue-600)}.text-destructive{color:var(--destructive)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-emerald-500{color:var(--color-emerald-500)}.text-foreground,.text-foreground\\\\/80{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.text-foreground\\\\/80{color:color-mix(in oklab,var(--foreground)80%,transparent)}}.text-green-600{color:var(--color-green-600)}.text-muted-foreground,.text-muted-foreground\\\\/65{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\\\\/65{color:color-mix(in oklab,var(--muted-foreground)65%,transparent)}}.text-muted-foreground\\\\/70{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\\\\/70{color:color-mix(in oklab,var(--muted-foreground)70%,transparent)}}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-600{color:var(--color-red-600)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-70{opacity:.7}.opacity-100{opacity:1}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\\\[0_0_12px_rgba\\\\(34\\\\,197\\\\,94\\\\,0\\\\.3\\\\)\\\\]{--tw-shadow:0 0 12px var(--tw-shadow-color,#22c55e4d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\\\[0_0_12px_rgba\\\\(59\\\\,130\\\\,246\\\\,0\\\\.3\\\\)\\\\]{--tw-shadow:0 0 12px var(--tw-shadow-color,#3b82f64d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\\\[0_0_12px_rgba\\\\(239\\\\,68\\\\,68\\\\,0\\\\.3\\\\)\\\\]{--tw-shadow:0 0 12px var(--tw-shadow-color,#ef44444d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\\\[0_12px_24px_-16px_rgba\\\\(37\\\\,99\\\\,235\\\\,0\\\\.55\\\\)\\\\]{--tw-shadow:0 12px 24px -16px var(--tw-shadow-color,#2563eb8c);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\\\[0_12px_24px_-18px_rgba\\\\(220\\\\,38\\\\,38\\\\,0\\\\.55\\\\)\\\\]{--tw-shadow:0 12px 24px -18px var(--tw-shadow-color,#dc26268c);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.\\\\[box-shadow\\\\:inset_0_1px_2px_0_rgba\\\\(255\\\\,255\\\\,255\\\\,0\\\\.15\\\\)\\\\]{box-shadow:inset 0 1px 2px #ffffff26}.shadow-black\\\\/20{--tw-shadow-color:#0003}@supports (color:color-mix(in lab, red, red)){.shadow-black\\\\/20{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-black)20%,transparent)var(--tw-shadow-alpha),transparent)}}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.drop-shadow-xl{--tw-drop-shadow-size:drop-shadow(0 9px 7px var(--tw-drop-shadow-color,#0000001a));--tw-drop-shadow:drop-shadow(var(--drop-shadow-xl));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\\\[color\\\\,box-shadow\\\\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.placeholder\\\\:text-muted-foreground::placeholder,.placeholder\\\\:text-muted-foreground\\\\/70::placeholder{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.placeholder\\\\:text-muted-foreground\\\\/70::placeholder{color:color-mix(in oklab,var(--muted-foreground)70%,transparent)}}.first\\\\:mt-0:first-child{margin-top:calc(var(--spacing)*0)}.first\\\\:mt-3:first-child{margin-top:calc(var(--spacing)*3)}.first\\\\:mt-4:first-child{margin-top:calc(var(--spacing)*4)}.first\\\\:rounded-tl-lg:first-child{border-top-left-radius:var(--radius)}.first\\\\:border-t:first-child{border-top-style:var(--tw-border-style);border-top-width:1px}.last\\\\:mb-0:last-child{margin-bottom:calc(var(--spacing)*0)}.last\\\\:mb-5:last-child{margin-bottom:calc(var(--spacing)*5)}.last\\\\:mb-24:last-child{margin-bottom:calc(var(--spacing)*24)}.last\\\\:rounded-tr-lg:last-child{border-top-right-radius:var(--radius)}.last\\\\:border-r:last-child{border-right-style:var(--tw-border-style);border-right-width:1px}.empty\\\\:hidden:empty{display:none}.focus-within\\\\:border-ring\\\\/50:focus-within{border-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-within\\\\:border-ring\\\\/50:focus-within{border-color:color-mix(in oklab,var(--ring)50%,transparent)}}.focus-within\\\\:border-white\\\\/20:focus-within{border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.focus-within\\\\:border-white\\\\/20:focus-within{border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.focus-within\\\\:shadow-2xl:focus-within{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\\\\:shadow-md:focus-within{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\\\\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\\\\:shadow-black\\\\/30:focus-within{--tw-shadow-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.focus-within\\\\:shadow-black\\\\/30:focus-within{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-black)30%,transparent)var(--tw-shadow-alpha),transparent)}}.focus-within\\\\:ring-ring:focus-within{--tw-ring-color:var(--ring)}.focus-within\\\\:ring-offset-2:focus-within{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}@media (hover:hover){.hover\\\\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\\\\:border-accent:hover{border-color:var(--accent)}.hover\\\\:border-border\\\\/60:hover{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.hover\\\\:border-border\\\\/60:hover{border-color:color-mix(in oklab,var(--border)60%,transparent)}}.hover\\\\:border-white\\\\/15:hover{border-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.hover\\\\:border-white\\\\/15:hover{border-color:color-mix(in oklab,var(--color-white)15%,transparent)}}.hover\\\\:\\\\!bg-white:hover{background-color:var(--color-white)!important}.hover\\\\:bg-accent:hover,.hover\\\\:bg-accent\\\\/50:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\\\\:bg-accent\\\\/50:hover{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.hover\\\\:bg-destructive\\\\/10:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\\\\:bg-destructive\\\\/10:hover{background-color:color-mix(in oklab,var(--destructive)10%,transparent)}}.hover\\\\:bg-destructive\\\\/80:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\\\\:bg-destructive\\\\/80:hover{background-color:color-mix(in oklab,var(--destructive)80%,transparent)}}.hover\\\\:bg-destructive\\\\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\\\\:bg-destructive\\\\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}.hover\\\\:bg-muted-foreground\\\\/15:hover{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.hover\\\\:bg-muted-foreground\\\\/15:hover{background-color:color-mix(in oklab,var(--muted-foreground)15%,transparent)}}.hover\\\\:bg-primary\\\\/80:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\\\\:bg-primary\\\\/80:hover{background-color:color-mix(in oklab,var(--primary)80%,transparent)}}.hover\\\\:bg-primary\\\\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\\\\:bg-primary\\\\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}.hover\\\\:bg-secondary\\\\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\\\\:bg-secondary\\\\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)}}.hover\\\\:bg-transparent:hover{background-color:#0000}.hover\\\\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\\\\:text-destructive:hover{color:var(--destructive)}.hover\\\\:text-foreground:hover{color:var(--foreground)}.hover\\\\:underline:hover{text-decoration-line:underline}.hover\\\\:opacity-75:hover{opacity:.75}.hover\\\\:opacity-100:hover{opacity:1}.hover\\\\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\\\\:shadow-\\\\[0_14px_24px_-14px_rgba\\\\(37\\\\,99\\\\,235\\\\,0\\\\.6\\\\)\\\\]:hover{--tw-shadow:0 14px 24px -14px var(--tw-shadow-color,#2563eb99);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\\\\:shadow-\\\\[0_14px_24px_-16px_rgba\\\\(220\\\\,38\\\\,38\\\\,0\\\\.6\\\\)\\\\]:hover{--tw-shadow:0 14px 24px -16px var(--tw-shadow-color,#dc262699);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\\\\:drop-shadow-2xl:hover{--tw-drop-shadow-size:drop-shadow(0 25px 25px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-2xl));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}.focus\\\\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\\\\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\\\\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\\\\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\\\\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus\\\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\\\\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\\\\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\\\\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\\\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\\\\:ring-\\\\[3px\\\\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\\\\:ring-destructive\\\\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\\\:ring-destructive\\\\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.focus-visible\\\\:ring-destructive\\\\/40:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\\\:ring-destructive\\\\/40:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.focus-visible\\\\:ring-primary\\\\/40:focus-visible{--tw-ring-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\\\:ring-primary\\\\/40:focus-visible{--tw-ring-color:color-mix(in oklab,var(--primary)40%,transparent)}}.focus-visible\\\\:ring-ring:focus-visible,.focus-visible\\\\:ring-ring\\\\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\\\:ring-ring\\\\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.focus-visible\\\\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\\\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\\\\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.disabled\\\\:pointer-events-none:disabled{pointer-events:none}.disabled\\\\:invisible:disabled{visibility:hidden}.disabled\\\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\\\:opacity-50:disabled{opacity:.5}.has-\\\\[\\\\>svg\\\\]\\\\:px-2\\\\.5:has(>svg){padding-inline:calc(var(--spacing)*2.5)}.has-\\\\[\\\\>svg\\\\]\\\\:px-3:has(>svg){padding-inline:calc(var(--spacing)*3)}.has-\\\\[\\\\>svg\\\\]\\\\:px-4:has(>svg){padding-inline:calc(var(--spacing)*4)}.aria-invalid\\\\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\\\\:ring-destructive\\\\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\\\\:ring-destructive\\\\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.data-floating\\\\:absolute[data-floating]{position:absolute}.data-floating\\\\:rounded-md[data-floating]{border-radius:calc(var(--radius) - 2px)}.data-floating\\\\:border[data-floating]{border-style:var(--tw-border-style);border-width:1px}.data-floating\\\\:bg-background[data-floating]{background-color:var(--background)}.data-floating\\\\:p-1[data-floating]{padding:calc(var(--spacing)*1)}.data-floating\\\\:shadow-sm[data-floating]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-\\\\[orientation\\\\=horizontal\\\\]\\\\:h-px[data-orientation=horizontal]{height:1px}.data-\\\\[orientation\\\\=horizontal\\\\]\\\\:w-full[data-orientation=horizontal]{width:100%}.data-\\\\[orientation\\\\=vertical\\\\]\\\\:h-full[data-orientation=vertical]{height:100%}.data-\\\\[orientation\\\\=vertical\\\\]\\\\:w-px[data-orientation=vertical]{width:1px}.data-\\\\[state\\\\=closed\\\\]\\\\:scale-0[data-state=closed]{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-\\\\[state\\\\=closed\\\\]\\\\:scale-100[data-state=closed]{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-\\\\[state\\\\=closed\\\\]\\\\:-rotate-90[data-state=closed]{rotate:-90deg}.data-\\\\[state\\\\=closed\\\\]\\\\:rotate-0[data-state=closed]{rotate:none}.data-\\\\[state\\\\=open\\\\]\\\\:scale-0[data-state=open]{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-\\\\[state\\\\=open\\\\]\\\\:scale-100[data-state=open]{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-\\\\[state\\\\=open\\\\]\\\\:rotate-0[data-state=open]{rotate:none}.data-\\\\[state\\\\=open\\\\]\\\\:rotate-90[data-state=open]{rotate:90deg}.data-\\\\[state\\\\=open\\\\]\\\\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\\\\[state\\\\=open\\\\]\\\\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}@media (min-width:40rem){.sm\\\\:max-w-3xl{max-width:var(--container-3xl)}.sm\\\\:max-w-lg{max-width:var(--container-lg)}.sm\\\\:max-w-md{max-width:var(--container-md)}.sm\\\\:flex-row{flex-direction:row}.sm\\\\:justify-end{justify-content:flex-end}.sm\\\\:text-left{text-align:left}}@media (min-width:48rem){.md\\\\:pb-6{padding-bottom:calc(var(--spacing)*6)}}@container (min-width:28rem){.\\\\@md\\\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.\\\\@md\\\\:flex-col{flex-direction:column}}.dark\\\\:border-input:is(.dark *){border-color:var(--input)}.dark\\\\:border-muted-foreground\\\\/15:is(.dark *){border-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.dark\\\\:border-muted-foreground\\\\/15:is(.dark *){border-color:color-mix(in oklab,var(--muted-foreground)15%,transparent)}}.dark\\\\:bg-background:is(.dark *){background-color:var(--background)}.dark\\\\:bg-destructive\\\\/5:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\\\:bg-destructive\\\\/5:is(.dark *){background-color:color-mix(in oklab,var(--destructive)5%,transparent)}}.dark\\\\:bg-destructive\\\\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\\\:bg-destructive\\\\/60:is(.dark *){background-color:color-mix(in oklab,var(--destructive)60%,transparent)}}.dark\\\\:bg-input\\\\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\\\\:bg-input\\\\/30:is(.dark *){background-color:color-mix(in oklab,var(--input)30%,transparent)}}.dark\\\\:bg-muted-foreground\\\\/20:is(.dark *){background-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.dark\\\\:bg-muted-foreground\\\\/20:is(.dark *){background-color:color-mix(in oklab,var(--muted-foreground)20%,transparent)}}.dark\\\\:stroke-\\\\[2\\\\.5px\\\\]:is(.dark *){stroke-width:2.5px}.dark\\\\:text-green-400:is(.dark *){color:var(--color-green-400)}.dark\\\\:text-red-200:is(.dark *){color:var(--color-red-200)}@media (hover:hover){.dark\\\\:hover\\\\:bg-accent:is(.dark *):hover,.dark\\\\:hover\\\\:bg-accent\\\\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.dark\\\\:hover\\\\:bg-accent\\\\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.dark\\\\:hover\\\\:bg-accent\\\\/60:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.dark\\\\:hover\\\\:bg-accent\\\\/60:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent)60%,transparent)}}.dark\\\\:hover\\\\:bg-input\\\\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\\\\:hover\\\\:bg-input\\\\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input)50%,transparent)}}.dark\\\\:hover\\\\:bg-muted-foreground\\\\/30:is(.dark *):hover{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.dark\\\\:hover\\\\:bg-muted-foreground\\\\/30:is(.dark *):hover{background-color:color-mix(in oklab,var(--muted-foreground)30%,transparent)}}}.dark\\\\:focus-visible\\\\:ring-destructive\\\\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\\\:focus-visible\\\\:ring-destructive\\\\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\\\\:aria-invalid\\\\:ring-destructive\\\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\\\:aria-invalid\\\\:ring-destructive\\\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.\\\\[\\\\&_svg\\\\]\\\\:pointer-events-none svg{pointer-events:none}.\\\\[\\\\&_svg\\\\]\\\\:shrink-0 svg{flex-shrink:0}.\\\\[\\\\&_svg\\\\]\\\\:text-background svg{color:var(--background)}.\\\\[\\\\&_svg\\\\]\\\\:text-black svg{color:var(--color-black)}@media (hover:hover){.hover\\\\:\\\\[\\\\&_svg\\\\]\\\\:text-destructive:hover svg{color:var(--destructive)}}.\\\\[\\\\&_svg\\\\:not\\\\(\\\\[class\\\\*\\\\=\\\\'size-\\\\'\\\\]\\\\)\\\\]\\\\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\\\\[\\\\&\\\\:last-child\\\\>td\\\\:first-child\\\\]\\\\:rounded-bl-lg:last-child>td:first-child{border-bottom-left-radius:var(--radius)}.\\\\[\\\\&\\\\:last-child\\\\>td\\\\:last-child\\\\]\\\\:rounded-br-lg:last-child>td:last-child{border-bottom-right-radius:var(--radius)}.\\\\[\\\\&\\\\:nth-child\\\\(n\\\\+3\\\\)\\\\]\\\\:hidden:nth-child(n+3){display:none}@container (min-width:28rem){.\\\\@md\\\\:\\\\[\\\\&\\\\:nth-child\\\\(n\\\\+3\\\\)\\\\]\\\\:block:nth-child(n+3){display:block}}.\\\\[\\\\&\\\\:where\\\\(\\\\>\\\\*\\\\)\\\\]\\\\:col-start-2:where(){grid-column-start:2}.only\\\\:\\\\[\\\\&\\\\>\\\\#attachment-tile\\\\]\\\\:size-24:only-child>#attachment-tile{width:calc(var(--spacing)*24);height:calc(var(--spacing)*24)}.\\\\[\\\\&\\\\>\\\\.aui-thread-root\\\\]\\\\:bg-inherit>.aui-thread-root{background-color:inherit}.\\\\[\\\\&\\\\>a\\\\]\\\\:text-xs>a{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\\\\[\\\\&\\\\>a\\\\]\\\\:no-underline>a{text-decoration-line:none}.\\\\[\\\\&\\\\>button\\\\]\\\\:rounded-full>button{border-radius:3.40282e38px}.\\\\[\\\\&\\\\>button\\\\]\\\\:bg-foreground\\\\/60>button{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.\\\\[\\\\&\\\\>button\\\\]\\\\:bg-foreground\\\\/60>button{background-color:color-mix(in oklab,var(--foreground)60%,transparent)}}.\\\\[\\\\&\\\\>button\\\\]\\\\:p-1>button{padding:calc(var(--spacing)*1)}.\\\\[\\\\&\\\\>button\\\\]\\\\:opacity-100>button{opacity:1}.\\\\[\\\\&\\\\>button\\\\]\\\\:\\\\!ring-0>button{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}@media (hover:hover){.\\\\[\\\\&\\\\>button\\\\]\\\\:hover\\\\:\\\\[\\\\&_svg\\\\]\\\\:text-destructive>button:hover svg{color:var(--destructive)}}.\\\\[\\\\&\\\\>li\\\\]\\\\:mt-1>li{margin-top:calc(var(--spacing)*1)}.\\\\[\\\\&\\\\>span\\\\]\\\\:text-xs>span{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\\\\[\\\\&\\\\[align\\\\=center\\\\]\\\\]\\\\:text-center[align=center]{text-align:center}.\\\\[\\\\&\\\\[align\\\\=right\\\\]\\\\]\\\\:text-right[align=right]{text-align:right}}@keyframes shimmer{0%{transform:translate(-100%)}to{transform:translate(200%)}}@keyframes subtle-pulse{0%,to{opacity:1}50%{opacity:.85}}@keyframes smooth-slide-down{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes gradient-shift{0%,to{transform:translate(0%)translateY(0%)}25%{transform:translate(100%)translateY(100%)}50%{transform:translate(100%)translateY(0%)}75%{transform:translate(0%)translateY(100%)}}@keyframes float{0%,to{transform:translateY(0)translate(0)}33%{transform:translateY(-30px)translate(20px)}66%{transform:translateY(20px)translate(-20px)}}@keyframes float-delayed{0%,to{transform:translateY(0)translate(0)}33%{transform:translateY(30px)translate(-30px)}66%{transform:translateY(-20px)translate(20px)}}.tool-card-transition{transition:all .4s cubic-bezier(.34,1.56,.64,1)}.tool-card-smooth{transition:all .35s cubic-bezier(.4,0,.2,1)}.animate-fadeInUp{opacity:0;animation:.5s ease-out forwards fadeInUp}.animate-gradient-shift{background-size:200% 200%;animation:20s ease-in-out infinite gradient-shift}.animate-float-slow{animation:20s ease-in-out infinite float}.animate-float-delayed{animation:25s ease-in-out 5s infinite float-delayed}.no-scrollbar::-webkit-scrollbar{display:none}.no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}@keyframes aui-pulse{50%{opacity:.5}}:where(.aui-md[data-status=running]):empty:after,:where(.aui-md[data-status=running])>:where(:not(ol):not(ul):not(pre)):last-child:after,:where(.aui-md[data-status=running])>pre:last-child code:after,:where(.aui-md[data-status=running])>:where(:is(ol,ul):last-child)>:where(li:last-child:not(:has(*>li))):after,:where(.aui-md[data-status=running])>:where(:is(ol,ul):last-child)>:where(li:last-child)>:where(:is(ol,ul):last-child)>:where(li:last-child:not(:has(*>li))):after,:where(.aui-md[data-status=running])>:where(:is(ol,ul):last-child)>:where(li:last-child)>:where(:is(ol,ul):last-child)>:where(li:last-child)>:where(:is(ol,ul):last-child)>:where(li:last-child):after{--aui-content:\\\"●\\\";content:var(--aui-content);margin-left:.25rem;margin-right:.25rem;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;animation:2s cubic-bezier(.4,0,.6,1) infinite aui-pulse}@property --tw-border-spacing-x{syntax:\\\"<length>\\\";inherits:false;initial-value:0}@property --tw-border-spacing-y{syntax:\\\"<length>\\\";inherits:false;initial-value:0}@property --tw-translate-x{syntax:\\\"*\\\";inherits:false;initial-value:0}@property --tw-translate-y{syntax:\\\"*\\\";inherits:false;initial-value:0}@property --tw-translate-z{syntax:\\\"*\\\";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:\\\"*\\\";inherits:false;initial-value:0}@property --tw-border-style{syntax:\\\"*\\\";inherits:false;initial-value:solid}@property --tw-leading{syntax:\\\"*\\\";inherits:false}@property --tw-font-weight{syntax:\\\"*\\\";inherits:false}@property --tw-tracking{syntax:\\\"*\\\";inherits:false}@property --tw-shadow{syntax:\\\"*\\\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\\\"*\\\";inherits:false}@property --tw-shadow-alpha{syntax:\\\"<percentage>\\\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\\\"*\\\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\\\"*\\\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\\\"<percentage>\\\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\\\"*\\\";inherits:false}@property --tw-ring-shadow{syntax:\\\"*\\\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\\\"*\\\";inherits:false}@property --tw-inset-ring-shadow{syntax:\\\"*\\\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\\\"*\\\";inherits:false}@property --tw-ring-offset-width{syntax:\\\"<length>\\\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\\\"*\\\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\\\"*\\\";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:\\\"*\\\";inherits:false;initial-value:solid}@property --tw-blur{syntax:\\\"*\\\";inherits:false}@property --tw-brightness{syntax:\\\"*\\\";inherits:false}@property --tw-contrast{syntax:\\\"*\\\";inherits:false}@property --tw-grayscale{syntax:\\\"*\\\";inherits:false}@property --tw-hue-rotate{syntax:\\\"*\\\";inherits:false}@property --tw-invert{syntax:\\\"*\\\";inherits:false}@property --tw-opacity{syntax:\\\"*\\\";inherits:false}@property --tw-saturate{syntax:\\\"*\\\";inherits:false}@property --tw-sepia{syntax:\\\"*\\\";inherits:false}@property --tw-drop-shadow{syntax:\\\"*\\\";inherits:false}@property --tw-drop-shadow-color{syntax:\\\"*\\\";inherits:false}@property --tw-drop-shadow-alpha{syntax:\\\"<percentage>\\\";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-blur{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-brightness{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-contrast{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-grayscale{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-hue-rotate{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-invert{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-opacity{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-saturate{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-sepia{syntax:\\\"*\\\";inherits:false}@property --tw-duration{syntax:\\\"*\\\";inherits:false}@property --tw-ease{syntax:\\\"*\\\";inherits:false}@property --tw-scale-x{syntax:\\\"*\\\";inherits:false;initial-value:1}@property --tw-scale-y{syntax:\\\"*\\\";inherits:false;initial-value:1}@property --tw-scale-z{syntax:\\\"*\\\";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}\";\n\n/**\n * Inject the WebMCP styles into the document head.\n * This is called automatically when registering the web component.\n */\nexport function injectStyles(): void {\n\tif (typeof document === 'undefined') return\n\n\tconst styleId = 'webmcp-agent-styles'\n\tif (document.getElementById(styleId)) return\n\n\tconst style = document.createElement('style')\n\tstyle.id = styleId\n\tstyle.textContent = WEBMCP_STYLES\n\tdocument.head.appendChild(style)\n}\n","/**\n * WebMCP Agent Web Component\n *\n * A custom element wrapper for the EmbeddedAgent React component.\n * Uses @r2wc/react-to-web-component to convert React to a native web component.\n *\n * @example Usage as a custom element (standalone - styles auto-injected)\n * ```html\n * <script src=\"@mcp-b/embedded-agent/web-component/standalone\"></script>\n * <webmcp-agent\n * app-id=\"your-app-id\"\n * api-base=\"https://your-worker.workers.dev\"\n * ></webmcp-agent>\n * ```\n *\n * @example React usage (import the component directly)\n * ```tsx\n * import { EmbeddedAgent } from '@mcp-b/embedded-agent'\n * import '@mcp-b/embedded-agent/styles'\n *\n * function App() {\n * return (\n * <EmbeddedAgent\n * appId=\"your-app-id\"\n * apiBase=\"https://your-worker.workers.dev\"\n * />\n * )\n * }\n * ```\n */\n\nimport { AssistantRuntimeProvider } from '@assistant-ui/react'\nimport { useChatRuntime } from '@assistant-ui/react-ai-sdk'\nimport r2wc from '@r2wc/react-to-web-component'\nimport { lastAssistantMessageIsCompleteWithToolCalls } from 'ai'\n\nimport { AssistantModal } from './components/assistant-modal'\nimport { MCPToolRegistry } from './components/MCPToolRegistry'\nimport { injectStyles } from './generated/inline-styles'\nimport { MCPToolsProvider } from './providers/MCPToolsProvider'\nimport { VoiceModeProvider } from './providers/VoiceModeProvider'\n\nimport type { FC } from 'react'\n\n/**\n * Props for the EmbeddedAgent React component\n *\n * These props map to HTML attributes in kebab-case when used as a web component:\n * - appId -> app-id\n * - apiBase -> api-base\n * - tokenEndpoint -> token-endpoint\n * - autoConnectLocal -> auto-connect-local\n */\nexport interface EmbeddedAgentProps {\n\t/** Your app/workspace ID */\n\tappId: string\n\t/** API base URL for your WebMCP worker */\n\tapiBase?: string\n\t/** Voice mode token endpoint (defaults to {apiBase}/api/realtime/session) */\n\ttokenEndpoint?: string\n\t/** Auto-connect to local MCP source (default: true) */\n\tautoConnectLocal?: boolean\n\t/** Callback when tools are updated */\n\tonToolsChange?: (tools: unknown[]) => void\n\t/** Callback when voice mode errors */\n\tonVoiceError?: (error: string) => void\n\t/** Callback when voice mode connects */\n\tonVoiceConnect?: () => void\n\t/** Callback when voice mode disconnects */\n\tonVoiceDisconnect?: (duration: number) => void\n}\n\n/**\n * EmbeddedAgent React Component\n *\n * A fully self-contained chat widget with MCP tool support and optional voice mode.\n * Can be used as a React component or converted to a web component.\n */\nexport const EmbeddedAgent: FC<EmbeddedAgentProps> = ({\n\tappId,\n\tapiBase,\n\ttokenEndpoint,\n\tautoConnectLocal = true,\n\tonToolsChange,\n\tonVoiceError,\n\tonVoiceConnect,\n\tonVoiceDisconnect,\n}) => {\n\tconst runtime = useChatRuntime({\n\t\tsendAutomaticallyWhen: (messages) => {\n\t\t\treturn lastAssistantMessageIsCompleteWithToolCalls(messages)\n\t\t},\n\t})\n\n\t// Compute token endpoint from apiBase if not explicitly provided\n\tconst resolvedTokenEndpoint =\n\t\ttokenEndpoint || (apiBase ? `${apiBase}/api/realtime/session` : undefined)\n\n\t// Log appId for debugging (to be used for API calls in future)\n\tif (appId && typeof window !== 'undefined') {\n\t\tconsole.debug('[WebMCP] Initialized with app_id:', appId)\n\t}\n\n\treturn (\n\t\t<MCPToolsProvider autoConnectLocal={autoConnectLocal} onToolsChange={onToolsChange}>\n\t\t\t{resolvedTokenEndpoint ? (\n\t\t\t\t<VoiceModeProvider\n\t\t\t\t\ttokenEndpoint={resolvedTokenEndpoint}\n\t\t\t\t\tonError={onVoiceError}\n\t\t\t\t\tonConnect={onVoiceConnect}\n\t\t\t\t\tonDisconnect={onVoiceDisconnect}\n\t\t\t\t>\n\t\t\t\t\t<AssistantRuntimeProvider runtime={runtime}>\n\t\t\t\t\t\t<MCPToolRegistry />\n\t\t\t\t\t\t<AssistantModal />\n\t\t\t\t\t</AssistantRuntimeProvider>\n\t\t\t\t</VoiceModeProvider>\n\t\t\t) : (\n\t\t\t\t<AssistantRuntimeProvider runtime={runtime}>\n\t\t\t\t\t<MCPToolRegistry />\n\t\t\t\t\t<AssistantModal />\n\t\t\t\t</AssistantRuntimeProvider>\n\t\t\t)}\n\t\t</MCPToolsProvider>\n\t)\n}\n\n/**\n * Web Component Definition\n *\n * Converts EmbeddedAgent to a custom element that can be used in any HTML page.\n * Attributes are automatically converted from kebab-case to camelCase props.\n */\n// Cast needed for React 19 compatibility - FC return type changed to ReactNode | Promise<ReactNode>\n// but @r2wc expects the older ComponentType signature. Using double assertion to bridge\n// the incompatible React type definitions between our project and @r2wc's dependencies.\nexport const WebMCPAgentElement = r2wc(EmbeddedAgent as unknown as Parameters<typeof r2wc>[0], {\n\tprops: {\n\t\tappId: 'string',\n\t\tapiBase: 'string',\n\t\ttokenEndpoint: 'string',\n\t\tautoConnectLocal: 'boolean',\n\t},\n})\n\n/**\n * Register the custom element\n *\n * Call this function to register the <webmcp-agent> custom element.\n * This is automatically called when importing the web-component entry point.\n * Styles are automatically injected into the document head.\n */\nexport function registerWebMCPAgent(tagName = 'webmcp-agent'): void {\n\tif (typeof window === 'undefined') return\n\n\t// Inject styles into the document head\n\tinjectStyles()\n\n\t// Register the custom element if not already registered\n\tif (!customElements.get(tagName)) {\n\t\tcustomElements.define(tagName, WebMCPAgentElement)\n\t}\n}\n\n// Auto-register when this module is imported\nregisterWebMCPAgent()\n","import {\n\tActionBarPrimitive,\n\tBranchPickerPrimitive,\n\tComposerPrimitive,\n\tErrorPrimitive,\n\tMessagePrimitive,\n\tThreadPrimitive,\n} from '@assistant-ui/react'\nimport {\n\tArrowDownIcon,\n\tArrowUpIcon,\n\tCheckIcon,\n\tChevronLeftIcon,\n\tChevronRightIcon,\n\tCopyIcon,\n\tPencilIcon,\n\tRefreshCwIcon,\n\tSquare,\n} from 'lucide-react'\nimport { domAnimation, LazyMotion, MotionConfig } from 'motion/react'\nimport * as m from 'motion/react-m'\n\nimport { cn } from '../lib/utils'\nimport { ComposerAddAttachment, ComposerAttachments, UserMessageAttachments } from './attachment'\nimport { Button } from './button'\nimport { MarkdownText } from './markdown-text'\nimport { ToolFallback } from './tool-fallback'\nimport { TooltipIconButton } from './tooltip-icon-button'\n\nimport type { FC } from 'react'\n\nexport const Thread: FC = () => {\n\treturn (\n\t\t<LazyMotion features={domAnimation}>\n\t\t\t<MotionConfig reducedMotion=\"user\">\n\t\t\t\t<ThreadPrimitive.Root\n\t\t\t\t\tclassName=\"aui-root aui-thread-root app-shell @container flex h-full flex-col relative\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t['--thread-max-width' as string]: '44rem',\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll px-4\">\n\t\t\t\t\t\t<ThreadPrimitive.If empty>\n\t\t\t\t\t\t\t<ThreadWelcome />\n\t\t\t\t\t\t</ThreadPrimitive.If>\n\n\t\t\t\t\t\t<ThreadPrimitive.Messages\n\t\t\t\t\t\t\tcomponents={{\n\t\t\t\t\t\t\t\tUserMessage,\n\t\t\t\t\t\t\t\tEditComposer,\n\t\t\t\t\t\t\t\tAssistantMessage,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<ThreadPrimitive.If empty={false}>\n\t\t\t\t\t\t\t<div className=\"aui-thread-viewport-spacer min-h-8 grow\" />\n\t\t\t\t\t\t</ThreadPrimitive.If>\n\n\t\t\t\t\t\t<Composer />\n\t\t\t\t\t</ThreadPrimitive.Viewport>\n\t\t\t\t</ThreadPrimitive.Root>\n\t\t\t</MotionConfig>\n\t\t</LazyMotion>\n\t)\n}\n\nconst ThreadScrollToBottom: FC = () => {\n\treturn (\n\t\t<ThreadPrimitive.ScrollToBottom asChild>\n\t\t\t<TooltipIconButton\n\t\t\t\ttooltip=\"Scroll to bottom\"\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tclassName=\"aui-thread-scroll-to-bottom absolute -top-12 z-10 self-center rounded-full p-4 disabled:invisible dark:bg-background dark:hover:bg-accent\"\n\t\t\t>\n\t\t\t\t<ArrowDownIcon />\n\t\t\t</TooltipIconButton>\n\t\t</ThreadPrimitive.ScrollToBottom>\n\t)\n}\n\nconst ThreadWelcome: FC = () => {\n\treturn (\n\t\t<div className=\"aui-thread-welcome-root mx-auto my-auto flex w-full max-w-[var(--thread-max-width)] flex-grow flex-col\">\n\t\t\t<div className=\"aui-thread-welcome-center flex w-full flex-grow flex-col items-center justify-center\">\n\t\t\t\t<div className=\"aui-thread-welcome-message flex size-full flex-col justify-center px-8\">\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tinitial={{ opacity: 0, y: 10 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\texit={{ opacity: 0, y: 10 }}\n\t\t\t\t\t\tclassName=\"aui-thread-welcome-message-motion-1 text-2xl font-semibold\"\n\t\t\t\t\t>\n\t\t\t\t\t\tHello there!\n\t\t\t\t\t</m.div>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tinitial={{ opacity: 0, y: 10 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\texit={{ opacity: 0, y: 10 }}\n\t\t\t\t\t\ttransition={{ delay: 0.1 }}\n\t\t\t\t\t\tclassName=\"aui-thread-welcome-message-motion-2 text-2xl text-muted-foreground/65\"\n\t\t\t\t\t>\n\t\t\t\t\t\tHow can I help you today?\n\t\t\t\t\t</m.div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<ThreadSuggestions />\n\t\t</div>\n\t)\n}\n\nconst ThreadSuggestions: FC = () => {\n\treturn (\n\t\t<div className=\"aui-thread-welcome-suggestions grid w-full gap-2 pb-4 @md:grid-cols-2\">\n\t\t\t{[\n\t\t\t\t{\n\t\t\t\t\ttitle: \"What's the weather\",\n\t\t\t\t\tlabel: 'in San Francisco?',\n\t\t\t\t\taction: \"What's the weather in San Francisco?\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttitle: 'Explain React hooks',\n\t\t\t\t\tlabel: 'like useState and useEffect',\n\t\t\t\t\taction: 'Explain React hooks like useState and useEffect',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttitle: 'Write a SQL query',\n\t\t\t\t\tlabel: 'to find top customers',\n\t\t\t\t\taction: 'Write a SQL query to find top customers',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttitle: 'Create a meal plan',\n\t\t\t\t\tlabel: 'for healthy weight loss',\n\t\t\t\t\taction: 'Create a meal plan for healthy weight loss',\n\t\t\t\t},\n\t\t\t].map((suggestedAction, index) => (\n\t\t\t\t<m.div\n\t\t\t\t\tinitial={{ opacity: 0, y: 20 }}\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\texit={{ opacity: 0, y: 20 }}\n\t\t\t\t\ttransition={{ delay: 0.05 * index }}\n\t\t\t\t\tkey={`suggested-action-${suggestedAction.title}-${index}`}\n\t\t\t\t\tclassName=\"aui-thread-welcome-suggestion-display [&:nth-child(n+3)]:hidden @md:[&:nth-child(n+3)]:block\"\n\t\t\t\t>\n\t\t\t\t\t<ThreadPrimitive.Suggestion prompt={suggestedAction.action} send asChild>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tclassName=\"aui-thread-welcome-suggestion h-auto w-full flex-1 flex-wrap items-start justify-start gap-1 rounded-3xl border px-5 py-4 text-left text-sm @md:flex-col dark:hover:bg-accent/60\"\n\t\t\t\t\t\t\taria-label={suggestedAction.action}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"aui-thread-welcome-suggestion-text-1 font-medium\">\n\t\t\t\t\t\t\t\t{suggestedAction.title}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span className=\"aui-thread-welcome-suggestion-text-2 text-muted-foreground\">\n\t\t\t\t\t\t\t\t{suggestedAction.label}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</ThreadPrimitive.Suggestion>\n\t\t\t\t</m.div>\n\t\t\t))}\n\t\t</div>\n\t)\n}\n\nconst Composer: FC = () => {\n\treturn (\n\t\t<div className=\"aui-composer-wrapper sticky bottom-0 mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 overflow-visible rounded-t-3xl pb-4 md:pb-6\">\n\t\t\t<ThreadScrollToBottom />\n\t\t\t<ComposerPrimitive.Root\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'aui-composer-root group/composer flex w-full flex-col overflow-hidden rounded-2xl px-3 py-1.5',\n\t\t\t\t\t'border border-white/10 backdrop-blur-sm shadow-2xl shadow-black/20',\n\t\t\t\t\t'bg-[color-mix(in_oklab,rgb(var(--background))_20%,transparent)]',\n\t\t\t\t\t'[box-shadow:inset_0_1px_2px_0_rgba(255,255,255,0.15)]',\n\t\t\t\t\t'transition-all duration-200',\n\t\t\t\t\t'focus-within:border-white/20 focus-within:shadow-2xl focus-within:shadow-black/30',\n\t\t\t\t\t'hover:border-white/15'\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<ComposerAttachments />\n\t\t\t\t<ComposerPrimitive.Input\n\t\t\t\t\tplaceholder=\"Send a message...\"\n\t\t\t\t\tclassName=\"aui-composer-input mt-2 w-full resize-none bg-transparent px-0 py-2 text-sm leading-relaxed text-foreground placeholder:text-muted-foreground/70 focus-visible:outline-none focus-visible:ring-0 max-h-24\"\n\t\t\t\t\trows={1}\n\t\t\t\t\tautoFocus\n\t\t\t\t\taria-label=\"Message input\"\n\t\t\t\t/>\n\t\t\t\t<ComposerAction />\n\t\t\t</ComposerPrimitive.Root>\n\t\t</div>\n\t)\n}\n\nconst ComposerAction: FC = () => {\n\treturn (\n\t\t<div className=\"aui-composer-action-wrapper mt-2 flex items-center justify-between text-muted-foreground\">\n\t\t\t<ComposerAddAttachment />\n\n\t\t\t<div className=\"flex items-center gap-1.5\">\n\t\t\t\t<ThreadPrimitive.If running={false}>\n\t\t\t\t\t<ComposerPrimitive.Send asChild>\n\t\t\t\t\t\t<TooltipIconButton\n\t\t\t\t\t\t\ttooltip=\"Send message\"\n\t\t\t\t\t\t\tside=\"top\"\n\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tclassName=\"aui-composer-send size-8 shrink-0 rounded-full border border-primary/60 bg-primary px-0 text-primary-foreground shadow-[0_12px_24px_-16px_rgba(37,99,235,0.55)] transition-shadow hover:shadow-[0_14px_24px_-14px_rgba(37,99,235,0.6)] focus-visible:ring-2 focus-visible:ring-primary/40\"\n\t\t\t\t\t\t\taria-label=\"Send message\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ArrowUpIcon className=\"aui-composer-send-icon size-4\" />\n\t\t\t\t\t\t</TooltipIconButton>\n\t\t\t\t\t</ComposerPrimitive.Send>\n\t\t\t\t</ThreadPrimitive.If>\n\n\t\t\t\t<ThreadPrimitive.If running>\n\t\t\t\t\t<ComposerPrimitive.Cancel asChild>\n\t\t\t\t\t\t<TooltipIconButton\n\t\t\t\t\t\t\ttooltip=\"Stop generating\"\n\t\t\t\t\t\t\tside=\"top\"\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tclassName=\"aui-composer-cancel size-8 shrink-0 rounded-full border border-destructive/60 bg-destructive px-0 text-destructive-foreground shadow-[0_12px_24px_-18px_rgba(220,38,38,0.55)] transition-shadow hover:shadow-[0_14px_24px_-16px_rgba(220,38,38,0.6)] focus-visible:ring-2 focus-visible:ring-destructive/40\"\n\t\t\t\t\t\t\taria-label=\"Stop generating\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Square className=\"aui-composer-cancel-icon size-3.5\" />\n\t\t\t\t\t\t</TooltipIconButton>\n\t\t\t\t\t</ComposerPrimitive.Cancel>\n\t\t\t\t</ThreadPrimitive.If>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nconst MessageError: FC = () => {\n\treturn (\n\t\t<MessagePrimitive.Error>\n\t\t\t<ErrorPrimitive.Root className=\"aui-message-error-root mt-2 rounded-md border border-destructive bg-destructive/10 p-3 text-sm text-destructive dark:bg-destructive/5 dark:text-red-200\">\n\t\t\t\t<ErrorPrimitive.Message className=\"aui-message-error-message line-clamp-2\" />\n\t\t\t</ErrorPrimitive.Root>\n\t\t</MessagePrimitive.Error>\n\t)\n}\n\nconst AssistantMessage: FC = () => {\n\treturn (\n\t\t<MessagePrimitive.Root asChild>\n\t\t\t<div\n\t\t\t\tclassName=\"aui-assistant-message-root relative mx-auto w-full max-w-[var(--thread-max-width)] animate-in py-4 duration-200 fade-in slide-in-from-bottom-1 last:mb-24\"\n\t\t\t\tdata-role=\"assistant\"\n\t\t\t>\n\t\t\t\t<div className=\"aui-assistant-message-content mx-2 leading-7 break-words text-foreground\">\n\t\t\t\t\t<MessagePrimitive.Parts\n\t\t\t\t\t\tcomponents={{\n\t\t\t\t\t\t\tText: MarkdownText,\n\t\t\t\t\t\t\ttools: { Fallback: ToolFallback },\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t<MessageError />\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"aui-assistant-message-footer mt-2 ml-2 flex\">\n\t\t\t\t\t<BranchPicker />\n\t\t\t\t\t<AssistantActionBar />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</MessagePrimitive.Root>\n\t)\n}\n\nconst AssistantActionBar: FC = () => {\n\treturn (\n\t\t<ActionBarPrimitive.Root\n\t\t\thideWhenRunning\n\t\t\tautohide=\"not-last\"\n\t\t\tautohideFloat=\"single-branch\"\n\t\t\tclassName=\"aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex gap-1 text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm\"\n\t\t>\n\t\t\t<ActionBarPrimitive.Copy asChild>\n\t\t\t\t<TooltipIconButton tooltip=\"Copy\">\n\t\t\t\t\t<MessagePrimitive.If copied>\n\t\t\t\t\t\t<CheckIcon />\n\t\t\t\t\t</MessagePrimitive.If>\n\t\t\t\t\t<MessagePrimitive.If copied={false}>\n\t\t\t\t\t\t<CopyIcon />\n\t\t\t\t\t</MessagePrimitive.If>\n\t\t\t\t</TooltipIconButton>\n\t\t\t</ActionBarPrimitive.Copy>\n\t\t\t<ActionBarPrimitive.Reload asChild>\n\t\t\t\t<TooltipIconButton tooltip=\"Refresh\">\n\t\t\t\t\t<RefreshCwIcon />\n\t\t\t\t</TooltipIconButton>\n\t\t\t</ActionBarPrimitive.Reload>\n\t\t</ActionBarPrimitive.Root>\n\t)\n}\n\nconst UserMessage: FC = () => {\n\treturn (\n\t\t<MessagePrimitive.Root asChild>\n\t\t\t<div\n\t\t\t\tclassName=\"aui-user-message-root mx-auto grid w-full max-w-[var(--thread-max-width)] animate-in auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] gap-y-2 px-2 py-4 duration-200 fade-in slide-in-from-bottom-1 first:mt-3 last:mb-5 [&:where(>*)]:col-start-2\"\n\t\t\t\tdata-role=\"user\"\n\t\t\t>\n\t\t\t\t<UserMessageAttachments />\n\n\t\t\t\t<div className=\"aui-user-message-content-wrapper relative col-start-2 min-w-0\">\n\t\t\t\t\t<div className=\"aui-user-message-content rounded-3xl bg-muted px-5 py-2.5 text-[13px] leading-relaxed break-words text-foreground\">\n\t\t\t\t\t\t<MessagePrimitive.Parts />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"aui-user-action-bar-wrapper absolute top-1/2 left-0 -translate-x-full -translate-y-1/2 pr-2\">\n\t\t\t\t\t\t<UserActionBar />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<BranchPicker className=\"aui-user-branch-picker col-span-full col-start-1 row-start-3 -mr-1 justify-end\" />\n\t\t\t</div>\n\t\t</MessagePrimitive.Root>\n\t)\n}\n\nconst UserActionBar: FC = () => {\n\treturn (\n\t\t<ActionBarPrimitive.Root\n\t\t\thideWhenRunning\n\t\t\tautohide=\"not-last\"\n\t\t\tclassName=\"aui-user-action-bar-root flex flex-col items-end\"\n\t\t>\n\t\t\t<ActionBarPrimitive.Edit asChild>\n\t\t\t\t<TooltipIconButton tooltip=\"Edit\" className=\"aui-user-action-edit p-4\">\n\t\t\t\t\t<PencilIcon />\n\t\t\t\t</TooltipIconButton>\n\t\t\t</ActionBarPrimitive.Edit>\n\t\t</ActionBarPrimitive.Root>\n\t)\n}\n\nconst EditComposer: FC = () => {\n\treturn (\n\t\t<div className=\"aui-edit-composer-wrapper mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 px-2 first:mt-4\">\n\t\t\t<ComposerPrimitive.Root className=\"aui-edit-composer-root ml-auto flex w-full max-w-7/8 flex-col rounded-xl bg-muted\">\n\t\t\t\t<ComposerPrimitive.Input\n\t\t\t\t\tclassName=\"aui-edit-composer-input flex min-h-[60px] w-full resize-none bg-transparent p-4 text-foreground outline-none\"\n\t\t\t\t\tautoFocus\n\t\t\t\t/>\n\n\t\t\t\t<div className=\"aui-edit-composer-footer mx-3 mb-3 flex items-center justify-center gap-2 self-end\">\n\t\t\t\t\t<ComposerPrimitive.Cancel asChild>\n\t\t\t\t\t\t<Button variant=\"ghost\" size=\"sm\" aria-label=\"Cancel edit\">\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</ComposerPrimitive.Cancel>\n\t\t\t\t\t<ComposerPrimitive.Send asChild>\n\t\t\t\t\t\t<Button size=\"sm\" aria-label=\"Update message\">\n\t\t\t\t\t\t\tUpdate\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</ComposerPrimitive.Send>\n\t\t\t\t</div>\n\t\t\t</ComposerPrimitive.Root>\n\t\t</div>\n\t)\n}\n\nconst BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({ className, ...rest }) => {\n\treturn (\n\t\t<BranchPickerPrimitive.Root\n\t\t\thideWhenSingleBranch\n\t\t\tclassName={cn(\n\t\t\t\t'aui-branch-picker-root mr-2 -ml-2 inline-flex items-center text-xs text-muted-foreground',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...rest}\n\t\t>\n\t\t\t<BranchPickerPrimitive.Previous asChild>\n\t\t\t\t<TooltipIconButton tooltip=\"Previous\">\n\t\t\t\t\t<ChevronLeftIcon />\n\t\t\t\t</TooltipIconButton>\n\t\t\t</BranchPickerPrimitive.Previous>\n\t\t\t<span className=\"aui-branch-picker-state font-medium\">\n\t\t\t\t<BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />\n\t\t\t</span>\n\t\t\t<BranchPickerPrimitive.Next asChild>\n\t\t\t\t<TooltipIconButton tooltip=\"Next\">\n\t\t\t\t\t<ChevronRightIcon />\n\t\t\t\t</TooltipIconButton>\n\t\t\t</BranchPickerPrimitive.Next>\n\t\t</BranchPickerPrimitive.Root>\n\t)\n}\n","'use client'\n\nimport { MessagePrimitive } from '@assistant-ui/react'\nimport { Bot } from 'lucide-react'\n\nimport { Avatar, AvatarFallback } from './avatar'\nimport { MarkdownText } from './markdown-text'\n\nimport type { FC } from 'react'\n\nexport const AssistantMessage: FC = () => {\n\treturn (\n\t\t<MessagePrimitive.Root asChild>\n\t\t\t<div\n\t\t\t\tclassName=\"aui-assistant-message-root mx-auto w-full max-w-2xl px-4 py-3\"\n\t\t\t\tdata-role=\"assistant\"\n\t\t\t>\n\t\t\t\t<div className=\"flex gap-3\">\n\t\t\t\t\t<Avatar>\n\t\t\t\t\t\t<AvatarFallback className=\"bg-primary/10\">\n\t\t\t\t\t\t\t<Bot className=\"h-4 w-4 text-primary\" />\n\t\t\t\t\t\t</AvatarFallback>\n\t\t\t\t\t</Avatar>\n\t\t\t\t\t<div className=\"aui-assistant-message-content flex-1 leading-7 text-foreground\">\n\t\t\t\t\t\t<MessagePrimitive.Parts\n\t\t\t\t\t\t\tcomponents={{\n\t\t\t\t\t\t\t\tText: MarkdownText,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</MessagePrimitive.Root>\n\t)\n}\n","'use client'\n\nimport { MessagePrimitive } from '@assistant-ui/react'\nimport { User } from 'lucide-react'\n\nimport { Avatar, AvatarFallback } from './avatar'\n\nimport type { FC } from 'react'\n\nexport const UserMessage: FC = () => {\n\treturn (\n\t\t<MessagePrimitive.Root asChild>\n\t\t\t<div className=\"aui-user-message-root mx-auto w-full max-w-2xl px-4 py-3\" data-role=\"user\">\n\t\t\t\t<div className=\"aui-user-message-content-wrapper flex items-start justify-end gap-3\">\n\t\t\t\t\t<div className=\"aui-user-message-content max-w-[80%] rounded-2xl bg-primary px-4 py-2.5 text-primary-foreground\">\n\t\t\t\t\t\t<MessagePrimitive.Parts />\n\t\t\t\t\t</div>\n\t\t\t\t\t<Avatar>\n\t\t\t\t\t\t<AvatarFallback className=\"bg-primary text-primary-foreground\">\n\t\t\t\t\t\t\t<User className=\"h-4 w-4\" />\n\t\t\t\t\t\t</AvatarFallback>\n\t\t\t\t\t</Avatar>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</MessagePrimitive.Root>\n\t)\n}\n","'use client'\n\nimport { ComposerPrimitive, ThreadPrimitive } from '@assistant-ui/react'\nimport { ArrowUpIcon, Square } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\n\nimport type { FC } from 'react'\n\nexport const Composer: FC = () => {\n\treturn (\n\t\t<ComposerPrimitive.Root\n\t\t\tclassName={cn(\n\t\t\t\t'aui-composer-root group/composer flex w-full flex-col rounded-2xl border border-border bg-background px-4 py-3 shadow-sm',\n\t\t\t\t'focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2'\n\t\t\t)}\n\t\t>\n\t\t\t<ComposerPrimitive.Input\n\t\t\t\tplaceholder=\"Send a message...\"\n\t\t\t\tclassName=\"aui-composer-input w-full resize-none bg-transparent text-sm leading-relaxed text-foreground placeholder:text-muted-foreground focus-visible:outline-none max-h-24\"\n\t\t\t\trows={1}\n\t\t\t\tautoFocus\n\t\t\t\taria-label=\"Message input\"\n\t\t\t/>\n\n\t\t\t<div className=\"aui-composer-footer mt-2 flex items-center justify-end\">\n\t\t\t\t<ThreadPrimitive.If running={false}>\n\t\t\t\t\t<ComposerPrimitive.Send asChild>\n\t\t\t\t\t\t<Button type=\"submit\" size=\"icon-sm\" className=\"rounded-full\" aria-label=\"Send message\">\n\t\t\t\t\t\t\t<ArrowUpIcon />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</ComposerPrimitive.Send>\n\t\t\t\t</ThreadPrimitive.If>\n\n\t\t\t\t<ThreadPrimitive.If running>\n\t\t\t\t\t<ComposerPrimitive.Cancel asChild>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\tvariant=\"destructive\"\n\t\t\t\t\t\t\tclassName=\"rounded-full\"\n\t\t\t\t\t\t\taria-label=\"Stop generating\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Square />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</ComposerPrimitive.Cancel>\n\t\t\t\t</ThreadPrimitive.If>\n\t\t\t</div>\n\t\t</ComposerPrimitive.Root>\n\t)\n}\n","import { AlertCircle, CheckCircle2, Loader2, Wrench } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\n\nimport type { ToolCallData } from '../services/realtime'\n\nexport interface RealtimeToolCardProps {\n\ttoolCall: ToolCallData\n\tclassName?: string\n}\n\n/**\n * Displays a tool call status card for voice mode.\n * Shows running, success, or error state with the tool name.\n */\nexport function RealtimeToolCard({ toolCall, className }: RealtimeToolCardProps) {\n\tconst { status, toolName, error } = toolCall\n\n\tconst isRunning = status === 'started'\n\tconst isSuccess = status === 'completed' && !error\n\tconst isError = status === 'completed' && !!error\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'flex items-center gap-3 rounded-lg border px-4 py-3 transition-all duration-300',\n\t\t\t\tisRunning && 'border-blue-500/40 bg-blue-500/5',\n\t\t\t\tisSuccess && 'border-green-500/40 bg-green-500/5',\n\t\t\t\tisError && 'border-red-500/40 bg-red-500/5',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t>\n\t\t\t{/* Status icon */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'flex h-8 w-8 shrink-0 items-center justify-center rounded-full',\n\t\t\t\t\tisRunning && 'bg-blue-500/10 text-blue-600',\n\t\t\t\t\tisSuccess && 'bg-green-500/10 text-green-600',\n\t\t\t\t\tisError && 'bg-red-500/10 text-red-600'\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{isRunning && <Loader2 className=\"h-4 w-4 animate-spin\" />}\n\t\t\t\t{isSuccess && <CheckCircle2 className=\"h-4 w-4\" />}\n\t\t\t\t{isError && <AlertCircle className=\"h-4 w-4\" />}\n\t\t\t</div>\n\n\t\t\t{/* Content */}\n\t\t\t<div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Wrench className=\"h-3.5 w-3.5 text-muted-foreground\" />\n\t\t\t\t\t<span className=\"truncate text-sm font-medium\">{toolName}</span>\n\t\t\t\t</div>\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'text-xs',\n\t\t\t\t\t\tisRunning && 'text-blue-600',\n\t\t\t\t\t\tisSuccess && 'text-green-600',\n\t\t\t\t\t\tisError && 'text-red-600'\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{isRunning && 'Executing...'}\n\t\t\t\t\t{isSuccess && 'Completed'}\n\t\t\t\t\t{isError && (error || 'Failed')}\n\t\t\t\t</span>\n\t\t\t</div>\n\n\t\t\t{/* Status badge */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'shrink-0 rounded-full px-2 py-0.5 text-xs font-medium',\n\t\t\t\t\tisRunning && 'bg-blue-500/10 text-blue-600',\n\t\t\t\t\tisSuccess && 'bg-green-500/10 text-green-600',\n\t\t\t\t\tisError && 'bg-red-500/10 text-red-600'\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{isRunning && 'Running'}\n\t\t\t\t{isSuccess && 'Success'}\n\t\t\t\t{isError && 'Error'}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n/**\n * Stack of tool call cards for multiple concurrent tool calls\n */\nexport interface RealtimeToolStackProps {\n\ttoolCalls: ToolCallData[]\n\tclassName?: string\n}\n\nexport function RealtimeToolStack({ toolCalls, className }: RealtimeToolStackProps) {\n\tif (toolCalls.length === 0) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<div className={cn('flex flex-col gap-2', className)}>\n\t\t\t{toolCalls.map((toolCall, index) => (\n\t\t\t\t<RealtimeToolCard key={`${toolCall.toolName}-${index}`} toolCall={toolCall} />\n\t\t\t))}\n\t\t</div>\n\t)\n}\n","import { cva } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nimport type { VariantProps } from 'class-variance-authority'\n\nconst badgeVariants = cva(\n\t'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\n\t\t\t\tsecondary:\n\t\t\t\t\t'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n\t\t\t\tdestructive:\n\t\t\t\t\t'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',\n\t\t\t\toutline: 'text-foreground',\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: 'default',\n\t\t},\n\t}\n)\n\nexport interface BadgeProps\n\textends React.HTMLAttributes<HTMLDivElement>,\n\t\tVariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n\treturn <div className={cn(badgeVariants({ variant }), className)} {...props} />\n}\n\nexport { Badge, badgeVariants }\n","'use client'\n\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nfunction ScrollArea({\n\tclassName,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n\treturn (\n\t\t<ScrollAreaPrimitive.Root\n\t\t\tdata-slot=\"scroll-area\"\n\t\t\tclassName={cn('relative', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ScrollAreaPrimitive.Viewport\n\t\t\t\tdata-slot=\"scroll-area-viewport\"\n\t\t\t\tclassName=\"focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</ScrollAreaPrimitive.Viewport>\n\t\t\t<ScrollBar />\n\t\t\t<ScrollAreaPrimitive.Corner />\n\t\t</ScrollAreaPrimitive.Root>\n\t)\n}\n\nfunction ScrollBar({\n\tclassName,\n\torientation = 'vertical',\n\t...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n\treturn (\n\t\t<ScrollAreaPrimitive.ScrollAreaScrollbar\n\t\t\tdata-slot=\"scroll-area-scrollbar\"\n\t\t\torientation={orientation}\n\t\t\tclassName={cn(\n\t\t\t\t'flex touch-none p-px transition-colors select-none',\n\t\t\t\torientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent',\n\t\t\t\torientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ScrollAreaPrimitive.ScrollAreaThumb\n\t\t\t\tdata-slot=\"scroll-area-thumb\"\n\t\t\t\tclassName=\"bg-border relative flex-1 rounded-full\"\n\t\t\t/>\n\t\t</ScrollAreaPrimitive.ScrollAreaScrollbar>\n\t)\n}\n\nexport { ScrollArea, ScrollBar }\n","'use client'\n\nimport * as SeparatorPrimitive from '@radix-ui/react-separator'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nfunction Separator({\n\tclassName,\n\torientation = 'horizontal',\n\tdecorative = true,\n\t...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n\treturn (\n\t\t<SeparatorPrimitive.Root\n\t\t\tdata-slot=\"separator\"\n\t\t\tdecorative={decorative}\n\t\t\torientation={orientation}\n\t\t\tclassName={cn(\n\t\t\t\t'bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nexport { Separator }\n","import type { ThreadMessageLike } from '@assistant-ui/react'\nimport type { UIDataTypes, UIMessage, UITools } from 'ai'\n\n/**\n * Converts an array of UI messages to the Assistant UI format used by the thread component.\n *\n * This function transforms messages from the Vercel/Cloudflare AI format to the format\n * expected by Assistant UI. Key transformations include:\n * - Maps the message role to the corresponding Assistant UI role\n * - Converts content parts, preserving text parts as-is\n * - Transforms tool invocations from Vercel's combined call/result format to Assistant UI's\n * distinct tool-call format, separating the execution state (PENDING vs COMPLETED)\n *\n * @param messages - Array of UI messages to convert\n * @returns Array of messages formatted for use in the Assistant UI thread component\n *\n * @example\n * ```ts\n * const messages = [{ role: 'user', parts: [{ type: 'text', text: 'Hello' }] }];\n * const threadMessages = convertToAssistantUiMessages(messages);\n * ```\n */\nexport const convertToAssistantUiMessages = (messages: UIMessage[]): ThreadMessageLike[] => {\n\treturn messages.map((msg): ThreadMessageLike => {\n\t\tconst role = msg.role as ThreadMessageLike['role']\n\n\t\tconst content =\n\t\t\tmsg.parts?.map((part) => {\n\t\t\t\tif (part.type === 'text') {\n\t\t\t\t\treturn { type: 'text', text: part.text }\n\t\t\t\t}\n\n\t\t\t\t// Vercel/Cloudflare bundles the Call AND the Result into one \"tool-invocation\" object.\n\t\t\t\t// Assistant-UI prefers them to be distinct parts or states.\n\t\t\t\tif (part.type === 'tool-invocation') {\n\t\t\t\t\tconst toolCall = {\n\t\t\t\t\t\ttype: 'tool-call' as const,\n\t\t\t\t\t\ttoolCallId: part.toolCallId,\n\t\t\t\t\t\ttoolName: String(part.input || ''),\n\t\t\t\t\t\targsText: JSON.stringify(part.input),\n\t\t\t\t\t\targs: part.input as Record<string, unknown>,\n\t\t\t\t\t}\n\n\t\t\t\t\tif ('result' in part && part.result !== undefined) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...toolCall,\n\t\t\t\t\t\t\tresult: part.result,\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn toolCall\n\t\t\t\t}\n\n\t\t\t\treturn { type: 'text' as const, text: '' }\n\t\t\t}) || []\n\n\t\treturn {\n\t\t\tid: msg.id,\n\t\t\trole,\n\t\t\tcontent: content as ThreadMessageLike['content'],\n\t\t\tcreatedAt: new Date(),\n\t\t}\n\t})\n}\n\n/**\n * Converts a single UI message to the Assistant UI format.\n *\n * This function performs the same transformation as convertToAssistantUiMessages but operates\n * on a single message. It's useful for converting individual messages from the Vercel/Cloudflare\n * AI format to the Assistant UI format, particularly for generic UI message types that need\n * advanced type parameters.\n *\n * @param msg - Single UI message to convert\n * @returns Message formatted for use in the Assistant UI thread component\n *\n * @example\n * ```ts\n * const msg: UIMessage = { role: 'assistant', parts: [{ type: 'text', text: 'Hello' }] };\n * const threadMsg = convertAssistantUIMessage(msg);\n * ```\n */\nexport const convertAssistantUIMessage = (\n\tmsg: UIMessage<unknown, UIDataTypes, UITools>\n): ThreadMessageLike => {\n\tconst role = msg.role as ThreadMessageLike['role']\n\n\tconst content =\n\t\tmsg.parts?.map((part) => {\n\t\t\tif (part.type === 'text') {\n\t\t\t\treturn { type: 'text', text: part.text }\n\t\t\t}\n\n\t\t\t// Vercel/Cloudflare bundles the Call AND the Result into one \"tool-invocation\" object.\n\t\t\t// Assistant-UI prefers them to be distinct parts or states.\n\t\t\tif (part.type === 'tool-invocation') {\n\t\t\t\tconst toolCall = {\n\t\t\t\t\ttype: 'tool-call' as const,\n\t\t\t\t\ttoolCallId: part.toolCallId,\n\t\t\t\t\ttoolName: String(part.input || ''),\n\t\t\t\t\targsText: JSON.stringify(part.input),\n\t\t\t\t\targs: part.input as Record<string, unknown>,\n\t\t\t\t}\n\n\t\t\t\tif ('result' in part && part.result !== undefined) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...toolCall,\n\t\t\t\t\t\tresult: part.result,\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn toolCall\n\t\t\t}\n\n\t\t\treturn { type: 'text' as const, text: '' }\n\t\t}) || []\n\n\treturn {\n\t\tid: msg.id,\n\t\trole,\n\t\tcontent: content as ThreadMessageLike['content'],\n\t\tcreatedAt: new Date(),\n\t}\n}\n","//#region src/ai-types.ts\n/**\n* Message types for DO-first streaming protocol.\n* Extends base Cloudflare Agents message types with tool execution support.\n*/\nlet MessageType = /* @__PURE__ */ function(MessageType$1) {\n\tMessageType$1[\"CF_AGENT_USE_CHAT_REQUEST\"] = \"cf_agent_use_chat_request\";\n\tMessageType$1[\"CF_AGENT_USE_CHAT_RESPONSE\"] = \"cf_agent_use_chat_response\";\n\tMessageType$1[\"CF_AGENT_CHAT_CLEAR\"] = \"cf_agent_chat_clear\";\n\tMessageType$1[\"CF_AGENT_CHAT_MESSAGES\"] = \"cf_agent_chat_messages\";\n\tMessageType$1[\"CF_AGENT_CHAT_REQUEST_CANCEL\"] = \"cf_agent_chat_request_cancel\";\n\tMessageType$1[\"CF_AGENT_TOOL_RESULTS\"] = \"cf_agent_tool_results\";\n\tMessageType$1[\"CF_AGENT_SYNC\"] = \"cf_agent_sync\";\n\tMessageType$1[\"CF_AGENT_TOOLS_NEEDED\"] = \"cf_agent_tools_needed\";\n\treturn MessageType$1;\n}({});\n/**\n* Type guard for SyncMessage\n*/\nfunction isSyncMessage(data) {\n\treturn typeof data === \"object\" && data !== null && \"type\" in data && data.type === MessageType.CF_AGENT_SYNC;\n}\n/**\n* Type guard for ToolsNeededMessage\n*/\nfunction isToolsNeededMessage(data) {\n\treturn typeof data === \"object\" && data !== null && \"type\" in data && data.type === MessageType.CF_AGENT_TOOLS_NEEDED;\n}\n/**\n* Type guard for ToolResultsMessage\n*/\nfunction isToolResultsMessage(data) {\n\treturn typeof data === \"object\" && data !== null && \"type\" in data && data.type === MessageType.CF_AGENT_TOOL_RESULTS;\n}\n\n//#endregion\nexport { MessageType, isSyncMessage, isToolResultsMessage, isToolsNeededMessage };\n//# sourceMappingURL=index.mjs.map","/**\n * DO-First Streaming React Hooks\n *\n * This module provides React hooks for integrating with DO-first streaming agents.\n * Key features:\n *\n * 1. Handles SYNC messages on reconnection - restores full UI state\n * 2. Handles TOOLS_NEEDED messages - triggers frontend tool execution\n * 3. Executes tools automatically or waits for confirmation\n * 4. Routes tool results back through server\n *\n * Usage:\n * const { messages, input, handleSubmit, addToolResult } = useAgentChat({\n * agent,\n * tools: { myTool: { execute: async (args) => result } }\n * })\n */\nimport { isSyncMessage, isToolsNeededMessage, MessageType } from '@mcp-b/agents'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport type {\n\tAgentChatState,\n\tPendingTool,\n\tSyncMessage,\n\tToolResultPayload,\n\tToolsNeededMessage,\n} from '@mcp-b/agents'\nimport type { UIMessage } from 'ai'\n\n/**\n * Tool definition for frontend execution.\n * Tools with execute function auto-execute.\n * Tools without execute require manual confirmation via addToolResult.\n */\nexport interface FrontendTool<TInput = unknown, TOutput = unknown> {\n\t/** Optional description for UI */\n\tdescription?: string\n\t/** If provided, tool auto-executes. If omitted, requires manual confirmation. */\n\texecute?: (input: TInput) => Promise<TOutput> | TOutput\n}\n\n/**\n * Map of tool names to tool definitions.\n */\nexport type FrontendTools = Record<string, FrontendTool>\n\n/**\n * Agent connection interface (WebSocket-like).\n */\nexport interface AgentConnection {\n\tsend: (data: string) => void\n\taddEventListener: (event: 'message', handler: (event: MessageEvent) => void) => void\n\tremoveEventListener: (event: 'message', handler: (event: MessageEvent) => void) => void\n\treadyState?: number\n}\n\n/**\n * Options for useAgentChat hook.\n */\nexport interface UseAgentChatOptions {\n\t/** WebSocket connection to the agent */\n\tagent: AgentConnection\n\t/** Frontend tools for execution */\n\ttools?: FrontendTools\n\t/** Initial messages (optional, typically restored from sync) */\n\tinitialMessages?: UIMessage[]\n\t/** Callback when tools need confirmation */\n\tonToolsNeedConfirmation?: (tools: PendingTool[]) => void\n\t/** Callback when agent state changes */\n\tonStateChange?: (state: AgentChatState) => void\n}\n\n/**\n * Return value from useAgentChat hook.\n */\nexport interface UseAgentChatReturn {\n\t/** Current messages */\n\tmessages: UIMessage[]\n\t/** Set messages manually */\n\tsetMessages: (messages: UIMessage[]) => void\n\t/** Current input value */\n\tinput: string\n\t/** Set input value */\n\tsetInput: (input: string) => void\n\t/** Handle input submission */\n\thandleSubmit: (e?: React.FormEvent) => void\n\t/** Send a message programmatically */\n\tsendMessage: (content: string) => void\n\t/** Add tool result (for confirmation flow) */\n\taddToolResult: (toolCallId: string, toolName: string, output: unknown) => void\n\t/** Current agent state */\n\tagentState: AgentChatState\n\t/** Whether currently streaming */\n\tisStreaming: boolean\n\t/** Tools awaiting confirmation */\n\tpendingConfirmationTools: PendingTool[]\n\t/** Clear chat history */\n\tclearHistory: () => void\n}\n\n/**\n * React hook for DO-first streaming chat.\n *\n * Handles:\n * - Message sending and receiving\n * - State synchronization on reconnect\n * - Automatic tool execution\n * - Confirmation-required tool flow\n */\nexport function useAgentChat(options: UseAgentChatOptions): UseAgentChatReturn {\n\tconst { agent, tools, initialMessages = [], onToolsNeedConfirmation, onStateChange } = options\n\n\t// State\n\tconst [messages, setMessages] = useState<UIMessage[]>(initialMessages)\n\tconst [input, setInput] = useState('')\n\tconst [agentState, setAgentState] = useState<AgentChatState>({ status: 'idle' })\n\tconst [pendingConfirmationTools, setPendingConfirmationTools] = useState<PendingTool[]>([])\n\n\t// Refs to avoid stale closures\n\tconst toolsRef = useRef(tools)\n\tconst messagesRef = useRef(messages)\n\n\tuseEffect(() => {\n\t\ttoolsRef.current = tools\n\t}, [tools])\n\n\tuseEffect(() => {\n\t\tmessagesRef.current = messages\n\t}, [messages])\n\n\t/**\n\t * Execute tools from state (auto-execute or queue for confirmation).\n\t */\n\tconst executeToolsFromState = useCallback(\n\t\tasync (pendingTools: PendingTool[]) => {\n\t\t\tconst currentTools = toolsRef.current\n\t\t\tif (!currentTools) {\n\t\t\t\t// No tools defined - queue all for confirmation\n\t\t\t\tsetPendingConfirmationTools(pendingTools)\n\t\t\t\tonToolsNeedConfirmation?.(pendingTools)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst results: ToolResultPayload[] = []\n\t\t\tconst confirmationRequired: PendingTool[] = []\n\n\t\t\tfor (const pendingTool of pendingTools) {\n\t\t\t\tconst tool = currentTools[pendingTool.toolName]\n\n\t\t\t\t// Check if tool requires confirmation (no execute function)\n\t\t\t\tif (!tool?.execute) {\n\t\t\t\t\tconfirmationRequired.push(pendingTool)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t// Execute auto-tools\n\t\t\t\ttry {\n\t\t\t\t\tconst output = await tool.execute(pendingTool.input)\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\ttoolCallId: pendingTool.toolCallId,\n\t\t\t\t\t\ttoolName: pendingTool.toolName,\n\t\t\t\t\t\toutput,\n\t\t\t\t\t})\n\t\t\t\t} catch (error) {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\ttoolCallId: pendingTool.toolCallId,\n\t\t\t\t\t\ttoolName: pendingTool.toolName,\n\t\t\t\t\t\toutput: `Error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If all tools auto-executed, send results\n\t\t\tif (results.length > 0 && confirmationRequired.length === 0) {\n\t\t\t\tagent.send(\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\ttype: MessageType.CF_AGENT_TOOL_RESULTS,\n\t\t\t\t\t\tresults,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t} else if (confirmationRequired.length > 0) {\n\t\t\t\t// Some tools require confirmation\n\t\t\t\tsetPendingConfirmationTools(confirmationRequired)\n\t\t\t\tonToolsNeedConfirmation?.(confirmationRequired)\n\n\t\t\t\t// If we have some auto-executed results, we need to wait for confirmations\n\t\t\t\t// before sending all results together\n\t\t\t\tif (results.length > 0) {\n\t\t\t\t\t// Store partial results for later combination\n\t\t\t\t\t// This is simplified - in production you'd want more sophisticated handling\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[agent, onToolsNeedConfirmation]\n\t)\n\n\t/**\n\t * Handle SYNC message on reconnection.\n\t */\n\tconst handleSyncMessage = useCallback(\n\t\t(syncData: SyncMessage) => {\n\t\t\t// Restore messages\n\t\t\tlet messagesToSet = syncData.messages\n\n\t\t\t// If there's a streaming message in progress, append it\n\t\t\tif (syncData.streamingMessage) {\n\t\t\t\tmessagesToSet = [...syncData.messages, syncData.streamingMessage]\n\t\t\t}\n\n\t\t\tsetMessages(messagesToSet)\n\t\t\tsetAgentState(syncData.state)\n\t\t\tonStateChange?.(syncData.state)\n\n\t\t\t// If awaiting tools, execute them\n\t\t\tif (syncData.state.status === 'awaiting-tools') {\n\t\t\t\tvoid executeToolsFromState(syncData.state.pendingTools)\n\t\t\t}\n\t\t},\n\t\t[executeToolsFromState, onStateChange]\n\t)\n\n\t/**\n\t * Handle TOOLS_NEEDED message.\n\t */\n\tconst handleToolsNeededMessage = useCallback(\n\t\t(toolsData: ToolsNeededMessage) => {\n\t\t\tsetAgentState({\n\t\t\t\tstatus: 'awaiting-tools',\n\t\t\t\tmessageId: toolsData.id,\n\t\t\t\tpendingTools: toolsData.tools,\n\t\t\t})\n\t\t\tvoid executeToolsFromState(toolsData.tools)\n\t\t},\n\t\t[executeToolsFromState]\n\t)\n\n\t// Set up message listeners\n\tuseEffect(() => {\n\t\tconst handleMessage = (event: MessageEvent) => {\n\t\t\tif (typeof event.data !== 'string') return\n\n\t\t\tlet data: unknown\n\t\t\ttry {\n\t\t\t\tdata = JSON.parse(event.data)\n\t\t\t} catch {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Handle SYNC message\n\t\t\tif (isSyncMessage(data)) {\n\t\t\t\thandleSyncMessage(data)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Handle TOOLS_NEEDED message\n\t\t\tif (isToolsNeededMessage(data)) {\n\t\t\t\thandleToolsNeededMessage(data)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Handle other message types (streaming, etc.)\n\t\t\t// These are typically handled by the base chat hooks\n\t\t}\n\n\t\tagent.addEventListener('message', handleMessage)\n\n\t\treturn () => {\n\t\t\tagent.removeEventListener('message', handleMessage)\n\t\t}\n\t}, [agent, handleSyncMessage, handleToolsNeededMessage])\n\n\t/**\n\t * Send a message to the agent.\n\t */\n\tconst sendMessage = useCallback(\n\t\t(content: string) => {\n\t\t\tif (!content.trim()) return\n\n\t\t\tconst userMessage: UIMessage = {\n\t\t\t\tid: `user_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`,\n\t\t\t\trole: 'user',\n\t\t\t\tparts: [{ type: 'text', text: content }],\n\t\t\t}\n\n\t\t\t// Optimistically add to messages\n\t\t\tsetMessages((prev) => [...prev, userMessage])\n\n\t\t\t// Send to agent\n\t\t\tagent.send(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\ttype: MessageType.CF_AGENT_USE_CHAT_REQUEST,\n\t\t\t\t\tid: userMessage.id,\n\t\t\t\t\tmessages: [...messagesRef.current, userMessage],\n\t\t\t\t})\n\t\t\t)\n\n\t\t\t// Update state to streaming\n\t\t\tsetAgentState({ status: 'streaming', messageId: userMessage.id })\n\t\t},\n\t\t[agent]\n\t)\n\n\t/**\n\t * Handle form submission.\n\t */\n\tconst handleSubmit = useCallback(\n\t\t(e?: React.FormEvent) => {\n\t\t\te?.preventDefault()\n\t\t\tsendMessage(input)\n\t\t\tsetInput('')\n\t\t},\n\t\t[input, sendMessage]\n\t)\n\n\t/**\n\t * Add tool result (for confirmation flow).\n\t * Routes result through server.\n\t */\n\tconst addToolResult = useCallback(\n\t\t(toolCallId: string, toolName: string, output: unknown) => {\n\t\t\t// Remove from pending confirmation\n\t\t\tsetPendingConfirmationTools((prev) => prev.filter((t) => t.toolCallId !== toolCallId))\n\n\t\t\t// Send result to server\n\t\t\tagent.send(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\ttype: MessageType.CF_AGENT_TOOL_RESULTS,\n\t\t\t\t\tresults: [{ toolCallId, toolName, output }],\n\t\t\t\t})\n\t\t\t)\n\t\t},\n\t\t[agent]\n\t)\n\n\t/**\n\t * Clear chat history.\n\t */\n\tconst clearHistory = useCallback(() => {\n\t\tsetMessages([])\n\t\tsetPendingConfirmationTools([])\n\t\tsetAgentState({ status: 'idle' })\n\n\t\tagent.send(\n\t\t\tJSON.stringify({\n\t\t\t\ttype: MessageType.CF_AGENT_CHAT_CLEAR,\n\t\t\t})\n\t\t)\n\t}, [agent])\n\n\treturn {\n\t\tmessages,\n\t\tsetMessages,\n\t\tinput,\n\t\tsetInput,\n\t\thandleSubmit,\n\t\tsendMessage,\n\t\taddToolResult,\n\t\tagentState,\n\t\tisStreaming: agentState.status === 'streaming',\n\t\tpendingConfirmationTools,\n\t\tclearHistory,\n\t}\n}\n\n/**\n * Hook for tracking agent connection state.\n */\nexport function useAgentConnection(agent: AgentConnection): {\n\tisConnected: boolean\n\treconnect: () => void\n} {\n\tconst [isConnected, setIsConnected] = useState(false)\n\n\tuseEffect(() => {\n\t\t// Check initial state\n\t\tsetIsConnected(agent.readyState === 1) // WebSocket.OPEN\n\n\t\t// Monitor for connection changes\n\t\tconst checkConnection = () => {\n\t\t\tsetIsConnected(agent.readyState === 1)\n\t\t}\n\n\t\t// Poll connection state (WebSocket doesn't have a state change event)\n\t\tconst interval = setInterval(checkConnection, 1000)\n\n\t\treturn () => clearInterval(interval)\n\t}, [agent])\n\n\tconst reconnect = useCallback(() => {\n\t\t// This would need to be implemented based on your connection strategy\n\t}, [])\n\n\treturn { isConnected, reconnect }\n}\n\n/**\n * Hook for tool confirmation UI.\n */\nexport function useToolConfirmation(\n\tpendingTools: PendingTool[],\n\taddToolResult: (toolCallId: string, toolName: string, output: unknown) => void\n): {\n\tconfirmTool: (toolCallId: string, output: unknown) => void\n\tdenyTool: (toolCallId: string) => void\n\tconfirmAll: (results: Map<string, unknown>) => void\n\tdenyAll: () => void\n} {\n\tconst confirmTool = useCallback(\n\t\t(toolCallId: string, output: unknown) => {\n\t\t\tconst tool = pendingTools.find((t) => t.toolCallId === toolCallId)\n\t\t\tif (tool) {\n\t\t\t\taddToolResult(toolCallId, tool.toolName, output)\n\t\t\t}\n\t\t},\n\t\t[pendingTools, addToolResult]\n\t)\n\n\tconst denyTool = useCallback(\n\t\t(toolCallId: string) => {\n\t\t\tconst tool = pendingTools.find((t) => t.toolCallId === toolCallId)\n\t\t\tif (tool) {\n\t\t\t\taddToolResult(toolCallId, tool.toolName, 'Error: User denied tool execution')\n\t\t\t}\n\t\t},\n\t\t[pendingTools, addToolResult]\n\t)\n\n\tconst confirmAll = useCallback(\n\t\t(results: Map<string, unknown>) => {\n\t\t\tfor (const tool of pendingTools) {\n\t\t\t\tconst output = results.get(tool.toolCallId) ?? tool.input\n\t\t\t\taddToolResult(tool.toolCallId, tool.toolName, output)\n\t\t\t}\n\t\t},\n\t\t[pendingTools, addToolResult]\n\t)\n\n\tconst denyAll = useCallback(() => {\n\t\tfor (const tool of pendingTools) {\n\t\t\taddToolResult(tool.toolCallId, tool.toolName, 'Error: User denied tool execution')\n\t\t}\n\t}, [pendingTools, addToolResult])\n\n\treturn { confirmTool, denyTool, confirmAll, denyAll }\n}\n","import { useExternalStoreRuntime } from '@assistant-ui/react'\nimport { useAgent } from 'agents/react'\n\nimport { convertAssistantUIMessage } from '../lib/converter'\nimport { useAgentChat } from './useAgentChat'\n\nimport type { AppendMessage, AssistantRuntime } from '@assistant-ui/react'\nimport type { PendingTool } from '@mcp-b/agents'\nimport type { UIDataTypes, UIMessage, UITools } from 'ai'\nimport type { FrontendTools } from './useAgentChat'\n\n/**\n * Options for the useCloudflareRuntime hook.\n */\nexport interface UseCloudflareRuntimeOptions {\n\t/**\n\t * The host for the Cloudflare Agent WebSocket connection.\n\t * @default 'localhost:8787'\n\t */\n\thost?: string\n\n\t/**\n\t * The agent binding name to connect to.\n\t * @default 'TOOL_HUB'\n\t */\n\tagent?: string\n\n\t/**\n\t * Frontend tools that can be executed by the client.\n\t * Tools with an `execute` function will auto-execute.\n\t * Tools without `execute` require manual confirmation via the UI.\n\t */\n\ttools?: FrontendTools\n\n\t/**\n\t * Callback when tools need user confirmation.\n\t * Called with the list of tools awaiting approval.\n\t */\n\tonToolsNeedConfirmation?: (\n\t\ttools: Array<{ toolCallId: string; toolName: string; input: unknown }>\n\t) => void\n}\n\n/**\n * Hook that provides Assistant UI runtime integration with Cloudflare Workers backend.\n *\n * This hook orchestrates the connection between the Assistant UI component library and\n * a Cloudflare Workers agent backend with DO-first streaming. It handles:\n *\n * 1. **Agent Connection**: Establishes WebSocket connection to the Cloudflare Agent\n * running on the local development server or Cloudflare Workers backend.\n *\n * 2. **DO-First Streaming**: Messages are accumulated on the Durable Object, making\n * streaming refresh-safe. On reconnection, the client receives a sync message\n * with the full state including any in-progress streaming message.\n *\n * 3. **Frontend Tool Execution**: When the LLM requests tool calls, the agent sends\n * a tools_needed message. Tools with `execute` functions auto-run, while others\n * require manual confirmation through the UI.\n *\n * 4. **User Input Handling**: Processes new user messages from the Assistant UI composer\n * and sends them to the Cloudflare Agent for processing.\n *\n * 5. **Message Conversion**: Converts messages between the Vercel AI SDK format\n * (used by Cloudflare Agents) and the Assistant UI format using the converter utility.\n *\n * @param options - Configuration options for the runtime\n * @returns Assistant UI runtime configured with Cloudflare Workers backend integration\n *\n * @example\n * ```tsx\n * function ChatApp() {\n * const runtime = useCloudflareRuntime({\n * host: 'localhost:8787',\n * tools: {\n * getWeather: {\n * execute: async (args) => {\n * const data = await fetchWeather(args.city);\n * return data;\n * }\n * }\n * }\n * });\n * return <Thread runtime={runtime} />;\n * }\n * ```\n */\nexport function useCloudflareRuntime(options: UseCloudflareRuntimeOptions = {}): AssistantRuntime {\n\tconst {\n\t\thost = 'localhost:8787',\n\t\tagent: agentName = 'TOOL_HUB',\n\t\ttools,\n\t\tonToolsNeedConfirmation,\n\t} = options\n\n\t// Establish WebSocket connection to the agent\n\tconst agent = useAgent({\n\t\tagent: agentName,\n\t\thost,\n\t})\n\n\t// Use DO-first streaming chat hook from @mcp-b/agents\n\tconst { messages, sendMessage, isStreaming } = useAgentChat({\n\t\tagent,\n\t\ttools,\n\t\tonToolsNeedConfirmation,\n\t})\n\n\t// Handle new messages from Assistant UI\n\tconst onNew = async (message: AppendMessage) => {\n\t\tconst firstContent = message.content[0]\n\t\tif (!firstContent || firstContent.type !== 'text') return\n\n\t\tsendMessage(firstContent.text)\n\t}\n\n\t// Create the external store runtime for Assistant UI\n\tconst runtime = useExternalStoreRuntime({\n\t\tmessages,\n\t\tisRunning: isStreaming,\n\t\tonNew,\n\t\tconvertMessage: (message) =>\n\t\t\tconvertAssistantUIMessage(message as UIMessage<unknown, UIDataTypes, UITools>),\n\t})\n\n\treturn runtime\n}\n\n/**\n * Return type for useCloudflareRuntimeWithTools hook.\n * Extends the base runtime with tool confirmation helpers.\n */\nexport interface CloudflareRuntimeWithTools {\n\truntime: AssistantRuntime\n\tpendingTools: Array<{ toolCallId: string; toolName: string; input: unknown }>\n\tconfirmTool: (toolCallId: string, output: unknown) => void\n\tdenyTool: (toolCallId: string) => void\n\tclearHistory: () => void\n}\n\n/**\n * Extended hook that exposes tool confirmation controls alongside the runtime.\n *\n * Use this hook when you need to render custom UI for tool confirmation dialogs.\n *\n * @param options - Configuration options for the runtime\n * @returns Object containing the runtime and tool confirmation helpers\n *\n * @example\n * ```tsx\n * function ChatWithTools() {\n * const { runtime, pendingTools, confirmTool, denyTool } = useCloudflareRuntimeWithTools({\n * host: 'localhost:8787'\n * });\n *\n * return (\n * <>\n * <Thread runtime={runtime} />\n * {pendingTools.map(tool => (\n * <ToolConfirmDialog\n * key={tool.toolCallId}\n * tool={tool}\n * onConfirm={(result) => confirmTool(tool.toolCallId, result)}\n * onDeny={() => denyTool(tool.toolCallId)}\n * />\n * ))}\n * </>\n * );\n * }\n * ```\n */\nexport function useCloudflareRuntimeWithTools(\n\toptions: UseCloudflareRuntimeOptions = {}\n): CloudflareRuntimeWithTools {\n\tconst {\n\t\thost = 'localhost:8787',\n\t\tagent: agentName = 'TOOL_HUB',\n\t\ttools,\n\t\tonToolsNeedConfirmation,\n\t} = options\n\n\t// Establish WebSocket connection to the agent\n\tconst agent = useAgent({\n\t\tagent: agentName,\n\t\thost,\n\t})\n\n\t// Use DO-first streaming chat hook from @mcp-b/agents\n\tconst {\n\t\tmessages,\n\t\tsendMessage,\n\t\tisStreaming,\n\t\tpendingConfirmationTools,\n\t\taddToolResult,\n\t\tclearHistory,\n\t} = useAgentChat({\n\t\tagent,\n\t\ttools,\n\t\tonToolsNeedConfirmation,\n\t})\n\n\t// Handle new messages from Assistant UI\n\tconst onNew = async (message: AppendMessage) => {\n\t\tconst firstContent = message.content[0]\n\t\tif (!firstContent || firstContent.type !== 'text') return\n\n\t\tsendMessage(firstContent.text)\n\t}\n\n\t// Create the external store runtime for Assistant UI\n\tconst runtime = useExternalStoreRuntime({\n\t\tmessages,\n\t\tisRunning: isStreaming,\n\t\tonNew,\n\t\tconvertMessage: (message) =>\n\t\t\tconvertAssistantUIMessage(message as UIMessage<unknown, UIDataTypes, UITools>),\n\t})\n\n\t// Tool confirmation helpers\n\tconst confirmTool = (toolCallId: string, output: unknown) => {\n\t\tconst tool = pendingConfirmationTools.find((t: PendingTool) => t.toolCallId === toolCallId)\n\t\tif (tool) {\n\t\t\taddToolResult(toolCallId, tool.toolName, output)\n\t\t}\n\t}\n\n\tconst denyTool = (toolCallId: string) => {\n\t\tconst tool = pendingConfirmationTools.find((t: PendingTool) => t.toolCallId === toolCallId)\n\t\tif (tool) {\n\t\t\taddToolResult(toolCallId, tool.toolName, 'Error: User denied tool execution')\n\t\t}\n\t}\n\n\treturn {\n\t\truntime,\n\t\tpendingTools: pendingConfirmationTools,\n\t\tconfirmTool,\n\t\tdenyTool,\n\t\tclearHistory,\n\t}\n}\n","'use client'\n\nimport { AssistantRuntimeProvider } from '@assistant-ui/react'\n\nimport { useCloudflareRuntime } from '../hooks/useCloudflareRuntime'\n\nimport type { FC, ReactNode } from 'react'\n\nexport interface ChatRuntimeProviderProps {\n\tchildren: ReactNode\n}\n\n/**\n * Provider that sets up the Assistant UI runtime with Cloudflare Workers backend.\n *\n * This component integrates the Cloudflare Agents SDK with Assistant UI,\n * handling message conversion, tool calls, and HITL (Human-in-the-Loop) approvals.\n *\n * @example\n * ```tsx\n * import { ChatRuntimeProvider, Thread } from '@mcp-b/webmcp-client';\n *\n * function App() {\n * return (\n * <ChatRuntimeProvider>\n * <Thread />\n * </ChatRuntimeProvider>\n * );\n * }\n * ```\n */\nexport const ChatRuntimeProvider: FC<ChatRuntimeProviderProps> = ({ children }) => {\n\tconst runtime = useCloudflareRuntime()\n\n\treturn <AssistantRuntimeProvider runtime={runtime}>{children}</AssistantRuntimeProvider>\n}\n","/**\n * Unified MCP Source Hook\n *\n * Connects to MCP servers using either Tab transport (same-tab, iframes) or\n * HTTP/SSE transport (remote servers). Supports the full MCP specification:\n * - Tools: Executable functions\n * - Resources: Contextual data sources\n * - Prompts: Server-defined prompt templates\n * - Sampling: Server-initiated LLM requests (optional)\n *\n * @example Same-tab connection\n * ```ts\n * const source = useMCPSource('local', { type: 'tab' })\n * ```\n *\n * @example Remote server with auto transport selection\n * ```ts\n * const source = useMCPSource('remote', {\n * type: 'http',\n * url: 'http://localhost:8888/mcp'\n * })\n * ```\n *\n * @example Remote server with SSE transport\n * ```ts\n * const source = useMCPSource('remote', {\n * type: 'http',\n * url: 'http://localhost:8888/sse',\n * transportType: 'sse'\n * })\n * ```\n */\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js'\nimport {\n\tCreateMessageRequestSchema,\n\tGetPromptResultSchema,\n\tListPromptsResultSchema,\n\tListResourcesResultSchema,\n\tPromptListChangedNotificationSchema,\n\tReadResourceResultSchema,\n\tResourceListChangedNotificationSchema,\n\tToolListChangedNotificationSchema,\n} from '@modelcontextprotocol/sdk/types.js'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport {\n\tMCP_BASE_RECONNECT_DELAY_MS,\n\tMCP_MAX_RECONNECT_ATTEMPTS,\n\tMCP_MAX_RECONNECT_DELAY_MS,\n\tMCP_TAB_CONNECT_DELAY_MS,\n} from '../lib/constants'\nimport {\n\tcalculateReconnectDelay,\n\tcreateMCPTransport,\n\tshouldFallbackToSSE,\n} from '../lib/mcp-transport'\n\nimport type {\n\tCallToolResult,\n\tCreateMessageResult,\n\tGetPromptResult,\n\tMCPConnectionState,\n\tMCPSourceConfig,\n\tPrompt,\n\tReadResourceResult,\n\tResource,\n\tResourceTemplate,\n\tSamplingHandler,\n\tTool,\n} from '@mcp-b/cloud-mirror-types'\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'\nimport type { TransportType } from '../lib/mcp-transport'\n\n/**\n * Options for the useMCPSource hook\n */\nexport interface UseMCPSourceOptions {\n\t/** Auto-connect on mount (default: true) */\n\tautoConnect?: boolean\n\t/** Callback when tools are updated */\n\tonToolsUpdate?: (tools: Tool[]) => void\n\t/** Callback when resources are updated */\n\tonResourcesUpdate?: (resources: Resource[], templates: ResourceTemplate[]) => void\n\t/** Callback when prompts are updated */\n\tonPromptsUpdate?: (prompts: Prompt[]) => void\n\t/** Callback when connection state changes */\n\tonStateChange?: (state: MCPConnectionState) => void\n\t/** Callback on connection error */\n\tonError?: (error: Error) => void\n\t/**\n\t * Handler for sampling requests from the server.\n\t * If provided, enables the sampling capability.\n\t * The handler should call an LLM and return the response.\n\t */\n\tsamplingHandler?: SamplingHandler\n}\n\n/**\n * Return value from the useMCPSource hook\n */\nexport interface UseMCPSourceReturn {\n\t/** MCP client instance */\n\tclient: Client | null\n\t/** Available tools from this source */\n\ttools: Tool[]\n\t/** Available resources from this source */\n\tresources: Resource[]\n\t/** Available resource templates from this source */\n\tresourceTemplates: ResourceTemplate[]\n\t/** Available prompts from this source */\n\tprompts: Prompt[]\n\t/** Connection state */\n\tstate: MCPConnectionState\n\t/** Whether connected and ready */\n\tisConnected: boolean\n\t/** Connection error (if any) */\n\terror: Error | null\n\t/** Connect to the MCP server */\n\tconnect: () => Promise<void>\n\t/** Disconnect from the MCP server */\n\tdisconnect: () => Promise<void>\n\t/** Call a tool on this source */\n\tcallTool: (name: string, args: Record<string, unknown>) => Promise<CallToolResult>\n\t/** Read a resource by URI */\n\treadResource: (uri: string) => Promise<ReadResourceResult>\n\t/** Get a prompt with optional arguments */\n\tgetPrompt: (name: string, args?: Record<string, string>) => Promise<GetPromptResult>\n\t/** Refresh the list of tools */\n\trefreshTools: () => Promise<void>\n\t/** Refresh the list of resources */\n\trefreshResources: () => Promise<void>\n\t/** Refresh the list of prompts */\n\trefreshPrompts: () => Promise<void>\n}\n\n/**\n * Unified hook for connecting to MCP sources.\n * Works with both tab-based (same-tab, iframe) and HTTP/SSE-based (remote) sources.\n * Supports the full MCP specification including tools, resources, prompts, and sampling.\n */\nexport function useMCPSource(\n\tid: string,\n\tconfig: MCPSourceConfig,\n\toptions: UseMCPSourceOptions = {}\n): UseMCPSourceReturn {\n\tconst {\n\t\tautoConnect = true,\n\t\tonToolsUpdate,\n\t\tonResourcesUpdate,\n\t\tonPromptsUpdate,\n\t\tonStateChange,\n\t\tonError,\n\t\tsamplingHandler,\n\t} = options\n\n\t// State\n\tconst [tools, setTools] = useState<Tool[]>([])\n\tconst [resources, setResources] = useState<Resource[]>([])\n\tconst [resourceTemplates, setResourceTemplates] = useState<ResourceTemplate[]>([])\n\tconst [prompts, setPrompts] = useState<Prompt[]>([])\n\tconst [state, setState] = useState<MCPConnectionState>('idle')\n\tconst [error, setError] = useState<Error | null>(null)\n\n\t// Refs\n\tconst clientRef = useRef<Client | null>(null)\n\tconst transportRef = useRef<Transport | null>(null)\n\tconst connectingRef = useRef(false)\n\tconst reconnectTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\tconst reconnectAttemptsRef = useRef(0)\n\tconst isMountedRef = useRef(true)\n\tconst successfulTransportRef = useRef<TransportType | null>(null)\n\n\t/**\n\t * Update state and notify callback\n\t */\n\tconst updateState = useCallback(\n\t\t(newState: MCPConnectionState) => {\n\t\t\tif (!isMountedRef.current) return\n\t\t\tsetState(newState)\n\t\t\tonStateChange?.(newState)\n\t\t},\n\t\t[onStateChange]\n\t)\n\n\t/**\n\t * Clear reconnect timeout\n\t */\n\tconst clearReconnectTimeout = useCallback(() => {\n\t\tif (reconnectTimeoutRef.current) {\n\t\t\tclearTimeout(reconnectTimeoutRef.current)\n\t\t\treconnectTimeoutRef.current = null\n\t\t}\n\t}, [])\n\n\t/**\n\t * Schedule a reconnection attempt (only for HTTP sources with autoReconnect)\n\t */\n\tconst scheduleReconnect = useCallback(() => {\n\t\tif (config.type !== 'http' || !config.autoReconnect) {\n\t\t\treturn\n\t\t}\n\n\t\tif (reconnectAttemptsRef.current >= MCP_MAX_RECONNECT_ATTEMPTS) {\n\t\t\tconsole.error(`[useMCPSource:${id}] Max reconnect attempts reached`)\n\t\t\treturn\n\t\t}\n\n\t\tconst delay = calculateReconnectDelay(\n\t\t\treconnectAttemptsRef.current,\n\t\t\tMCP_BASE_RECONNECT_DELAY_MS,\n\t\t\tMCP_MAX_RECONNECT_DELAY_MS\n\t\t)\n\n\t\tconsole.log(`[useMCPSource:${id}] Scheduling reconnect in ${delay}ms`)\n\n\t\treconnectTimeoutRef.current = setTimeout(() => {\n\t\t\treconnectAttemptsRef.current++\n\t\t\tvoid connectInternal()\n\t\t}, delay)\n\t}, [config, id])\n\n\t/**\n\t * Load all MCP capabilities (tools, resources, prompts)\n\t */\n\tconst loadCapabilities = useCallback(\n\t\tasync (client: Client) => {\n\t\t\t// Load tools\n\t\t\ttry {\n\t\t\t\tconst toolsResponse = await client.listTools()\n\t\t\t\tif (isMountedRef.current) {\n\t\t\t\t\tsetTools(toolsResponse.tools)\n\t\t\t\t\tonToolsUpdate?.(toolsResponse.tools)\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.warn(`[useMCPSource:${id}] Failed to load tools:`, err)\n\t\t\t}\n\n\t\t\t// Load resources (optional - not all servers support this)\n\t\t\ttry {\n\t\t\t\tconst resourcesResponse = await client.request(\n\t\t\t\t\t{ method: 'resources/list' },\n\t\t\t\t\tListResourcesResultSchema\n\t\t\t\t)\n\t\t\t\tif (isMountedRef.current) {\n\t\t\t\t\tsetResources(resourcesResponse.resources)\n\t\t\t\t\tconst templates = Array.isArray(resourcesResponse.resourceTemplates)\n\t\t\t\t\t\t? resourcesResponse.resourceTemplates\n\t\t\t\t\t\t: []\n\t\t\t\t\tsetResourceTemplates(templates)\n\t\t\t\t\tonResourcesUpdate?.(resourcesResponse.resources, templates)\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// Resources are optional, don't treat as error\n\t\t\t\tconsole.debug(`[useMCPSource:${id}] Server does not support resources:`, err)\n\t\t\t}\n\n\t\t\t// Load prompts (optional - not all servers support this)\n\t\t\ttry {\n\t\t\t\tconst promptsResponse = await client.request(\n\t\t\t\t\t{ method: 'prompts/list' },\n\t\t\t\t\tListPromptsResultSchema\n\t\t\t\t)\n\t\t\t\tif (isMountedRef.current) {\n\t\t\t\t\tsetPrompts(promptsResponse.prompts)\n\t\t\t\t\tonPromptsUpdate?.(promptsResponse.prompts)\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// Prompts are optional, don't treat as error\n\t\t\t\tconsole.debug(`[useMCPSource:${id}] Server does not support prompts:`, err)\n\t\t\t}\n\t\t},\n\t\t[id, onToolsUpdate, onResourcesUpdate, onPromptsUpdate]\n\t)\n\n\t/**\n\t * Set up notification handlers for real-time updates\n\t */\n\tconst setupNotificationHandlers = useCallback(\n\t\t(client: Client) => {\n\t\t\t// Tool list changes\n\t\t\tclient.setNotificationHandler(ToolListChangedNotificationSchema, async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst updated = await client.listTools()\n\t\t\t\t\tif (isMountedRef.current) {\n\t\t\t\t\t\tsetTools(updated.tools)\n\t\t\t\t\t\tonToolsUpdate?.(updated.tools)\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(`[useMCPSource:${id}] Failed to update tools:`, err)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// Resource list changes\n\t\t\tclient.setNotificationHandler(ResourceListChangedNotificationSchema, async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst updated = await client.request(\n\t\t\t\t\t\t{ method: 'resources/list' },\n\t\t\t\t\t\tListResourcesResultSchema\n\t\t\t\t\t)\n\t\t\t\t\tif (isMountedRef.current) {\n\t\t\t\t\t\tsetResources(updated.resources)\n\t\t\t\t\t\tconst templates = Array.isArray(updated.resourceTemplates)\n\t\t\t\t\t\t\t? updated.resourceTemplates\n\t\t\t\t\t\t\t: []\n\t\t\t\t\t\tsetResourceTemplates(templates)\n\t\t\t\t\t\tonResourcesUpdate?.(updated.resources, templates)\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(`[useMCPSource:${id}] Failed to update resources:`, err)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// Prompt list changes\n\t\t\tclient.setNotificationHandler(PromptListChangedNotificationSchema, async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst updated = await client.request({ method: 'prompts/list' }, ListPromptsResultSchema)\n\t\t\t\t\tif (isMountedRef.current) {\n\t\t\t\t\t\tsetPrompts(updated.prompts)\n\t\t\t\t\t\tonPromptsUpdate?.(updated.prompts)\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(`[useMCPSource:${id}] Failed to update prompts:`, err)\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\t[id, onToolsUpdate, onResourcesUpdate, onPromptsUpdate]\n\t)\n\n\t/**\n\t * Set up sampling request handler if provided\n\t */\n\tconst setupSamplingHandler = useCallback(\n\t\t(client: Client, handler: SamplingHandler) => {\n\t\t\tclient.setRequestHandler(\n\t\t\t\tCreateMessageRequestSchema,\n\t\t\t\tasync (request): Promise<CreateMessageResult> => {\n\t\t\t\t\tconsole.log(`[useMCPSource:${id}] Received sampling request`)\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// The request object from SDK has the params directly on it\n\t\t\t\t\t\tconst result = await handler(request.params)\n\t\t\t\t\t\treturn result\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconsole.error(`[useMCPSource:${id}] Sampling handler error:`, err)\n\t\t\t\t\t\tthrow err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t)\n\t\t},\n\t\t[id]\n\t)\n\n\t/**\n\t * Attempt connection with a specific transport type\n\t */\n\tconst tryConnectWithTransport = useCallback(\n\t\tasync (transportType: TransportType): Promise<'success' | 'fallback' | 'failed'> => {\n\t\t\tconsole.log(\n\t\t\t\t`[useMCPSource:${id}] Attempting connection with ${transportType.toUpperCase()} transport`\n\t\t\t)\n\n\t\t\ttry {\n\t\t\t\t// Close existing transport\n\t\t\t\tif (transportRef.current) {\n\t\t\t\t\tawait transportRef.current.close().catch(() => {})\n\t\t\t\t\ttransportRef.current = null\n\t\t\t\t}\n\n\t\t\t\t// Create client with capabilities\n\t\t\t\tconst capabilities: Record<string, unknown> = {}\n\t\t\t\tif (samplingHandler) {\n\t\t\t\t\tcapabilities.sampling = {}\n\t\t\t\t}\n\n\t\t\t\tconst client = new Client({ name: `MCP-Source-${id}`, version: '1.0.0' }, { capabilities })\n\n\t\t\t\t// Create transport using shared utility\n\t\t\t\tconst transport = createMCPTransport(config, transportType)\n\t\t\t\ttransportRef.current = transport\n\n\t\t\t\t// Set up transport event handlers\n\t\t\t\ttransport.onclose = () => {\n\t\t\t\t\tif (!isMountedRef.current || connectingRef.current) return\n\n\t\t\t\t\tconsole.log(`[useMCPSource:${id}] Transport closed`)\n\n\t\t\t\t\tif (state === 'ready' && config.type === 'http' && config.autoReconnect) {\n\t\t\t\t\t\tupdateState('connecting')\n\t\t\t\t\t\tscheduleReconnect()\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttransport.onerror = (err) => {\n\t\t\t\t\tconsole.error(`[useMCPSource:${id}] Transport error:`, err)\n\t\t\t\t}\n\n\t\t\t\t// Connect\n\t\t\t\tawait client.connect(transport)\n\n\t\t\t\tclientRef.current = client\n\t\t\t\tsuccessfulTransportRef.current = transportType\n\n\t\t\t\t// Set up handlers\n\t\t\t\tsetupNotificationHandlers(client)\n\t\t\t\tif (samplingHandler) {\n\t\t\t\t\tsetupSamplingHandler(client, samplingHandler)\n\t\t\t\t}\n\n\t\t\t\t// Load capabilities\n\t\t\t\tupdateState('loading')\n\t\t\t\tawait loadCapabilities(client)\n\n\t\t\t\t// Reset reconnect attempts on success\n\t\t\t\treconnectAttemptsRef.current = 0\n\n\t\t\t\tupdateState('ready')\n\t\t\t\treturn 'success'\n\t\t\t} catch (err) {\n\t\t\t\tconst connectionError = err instanceof Error ? err : new Error(String(err))\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[useMCPSource:${id}] Connection failed with ${transportType}:`,\n\t\t\t\t\tconnectionError\n\t\t\t\t)\n\n\t\t\t\t// Check if we should fallback to SSE\n\t\t\t\tif (transportType === 'http' && shouldFallbackToSSE(connectionError)) {\n\t\t\t\t\treturn 'fallback'\n\t\t\t\t}\n\n\t\t\t\tthrow connectionError\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tid,\n\t\t\tconfig,\n\t\t\tstate,\n\t\t\tsamplingHandler,\n\t\t\tupdateState,\n\t\t\tloadCapabilities,\n\t\t\tsetupNotificationHandlers,\n\t\t\tsetupSamplingHandler,\n\t\t\tscheduleReconnect,\n\t\t]\n\t)\n\n\t/**\n\t * Internal connect function\n\t */\n\tconst connectInternal = useCallback(async () => {\n\t\tif (connectingRef.current || state === 'ready') {\n\t\t\treturn\n\t\t}\n\n\t\tconnectingRef.current = true\n\t\tupdateState('discovering')\n\t\tsetError(null)\n\n\t\ttry {\n\t\t\t// Determine transport type preference\n\t\t\tconst preferredTransport = config.type === 'http' ? (config.transportType ?? 'auto') : 'http'\n\n\t\t\tlet result: 'success' | 'fallback' | 'failed' = 'failed'\n\n\t\t\tif (config.type === 'tab') {\n\t\t\t\t// Tab transport - no fallback needed\n\t\t\t\tupdateState('connecting')\n\t\t\t\tresult = await tryConnectWithTransport('http') // TabClientTransport ignores this\n\t\t\t} else if (preferredTransport === 'sse') {\n\t\t\t\t// SSE only\n\t\t\t\tupdateState('connecting')\n\t\t\t\tresult = await tryConnectWithTransport('sse')\n\t\t\t} else if (preferredTransport === 'http') {\n\t\t\t\t// HTTP only\n\t\t\t\tupdateState('connecting')\n\t\t\t\tresult = await tryConnectWithTransport('http')\n\t\t\t} else {\n\t\t\t\t// Auto mode - try HTTP first, fallback to SSE\n\t\t\t\tupdateState('connecting')\n\t\t\t\tresult = await tryConnectWithTransport('http')\n\n\t\t\t\tif (result === 'fallback' && isMountedRef.current) {\n\t\t\t\t\tconsole.log(`[useMCPSource:${id}] HTTP failed, falling back to SSE`)\n\t\t\t\t\tresult = await tryConnectWithTransport('sse')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (result !== 'success') {\n\t\t\t\tthrow new Error('Connection failed')\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst connectionError = err instanceof Error ? err : new Error(String(err))\n\t\t\tconsole.error(`[useMCPSource:${id}] Connection failed:`, connectionError)\n\n\t\t\tif (isMountedRef.current) {\n\t\t\t\tsetError(connectionError)\n\t\t\t\tupdateState('error')\n\t\t\t\tonError?.(connectionError)\n\t\t\t}\n\n\t\t\t// Clean up failed connection\n\t\t\tclientRef.current = null\n\t\t\ttransportRef.current = null\n\n\t\t\t// Schedule reconnect for HTTP sources\n\t\t\tscheduleReconnect()\n\t\t} finally {\n\t\t\tconnectingRef.current = false\n\t\t}\n\t}, [id, config, state, updateState, tryConnectWithTransport, onError, scheduleReconnect])\n\n\t/**\n\t * Connect to the MCP server\n\t */\n\tconst connect = useCallback(async () => {\n\t\tclearReconnectTimeout()\n\t\treconnectAttemptsRef.current = 0\n\t\tawait connectInternal()\n\t}, [clearReconnectTimeout, connectInternal])\n\n\t/**\n\t * Disconnect from the MCP server\n\t */\n\tconst disconnect = useCallback(async () => {\n\t\tclearReconnectTimeout()\n\n\t\tif (clientRef.current) {\n\t\t\ttry {\n\t\t\t\tawait clientRef.current.close()\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(`[useMCPSource:${id}] Error closing client:`, err)\n\t\t\t}\n\t\t\tclientRef.current = null\n\t\t}\n\n\t\tif (transportRef.current) {\n\t\t\ttry {\n\t\t\t\tawait transportRef.current.close()\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(`[useMCPSource:${id}] Error closing transport:`, err)\n\t\t\t}\n\t\t\ttransportRef.current = null\n\t\t}\n\n\t\tsetTools([])\n\t\tsetResources([])\n\t\tsetResourceTemplates([])\n\t\tsetPrompts([])\n\t\tsetError(null)\n\t\tupdateState('idle')\n\t}, [id, clearReconnectTimeout, updateState])\n\n\t/**\n\t * Call a tool on this source\n\t */\n\tconst callTool = useCallback(\n\t\tasync (name: string, args: Record<string, unknown>): Promise<CallToolResult> => {\n\t\t\tif (!clientRef.current) {\n\t\t\t\tthrow new Error(`MCP source '${id}' not connected`)\n\t\t\t}\n\n\t\t\treturn (await clientRef.current.callTool({\n\t\t\t\tname,\n\t\t\t\targuments: args,\n\t\t\t})) as CallToolResult\n\t\t},\n\t\t[id]\n\t)\n\n\t/**\n\t * Read a resource by URI\n\t */\n\tconst readResource = useCallback(\n\t\tasync (uri: string): Promise<ReadResourceResult> => {\n\t\t\tif (!clientRef.current) {\n\t\t\t\tthrow new Error(`MCP source '${id}' not connected`)\n\t\t\t}\n\n\t\t\treturn await clientRef.current.request(\n\t\t\t\t{ method: 'resources/read', params: { uri } },\n\t\t\t\tReadResourceResultSchema\n\t\t\t)\n\t\t},\n\t\t[id]\n\t)\n\n\t/**\n\t * Get a prompt with optional arguments\n\t */\n\tconst getPrompt = useCallback(\n\t\tasync (name: string, args?: Record<string, string>): Promise<GetPromptResult> => {\n\t\t\tif (!clientRef.current) {\n\t\t\t\tthrow new Error(`MCP source '${id}' not connected`)\n\t\t\t}\n\n\t\t\treturn await clientRef.current.request(\n\t\t\t\t{ method: 'prompts/get', params: { name, arguments: args } },\n\t\t\t\tGetPromptResultSchema\n\t\t\t)\n\t\t},\n\t\t[id]\n\t)\n\n\t/**\n\t * Refresh the list of tools\n\t */\n\tconst refreshTools = useCallback(async () => {\n\t\tif (!clientRef.current) {\n\t\t\tthrow new Error(`MCP source '${id}' not connected`)\n\t\t}\n\n\t\tconst response = await clientRef.current.listTools()\n\t\tif (isMountedRef.current) {\n\t\t\tsetTools(response.tools)\n\t\t\tonToolsUpdate?.(response.tools)\n\t\t}\n\t}, [id, onToolsUpdate])\n\n\t/**\n\t * Refresh the list of resources\n\t */\n\tconst refreshResources = useCallback(async () => {\n\t\tif (!clientRef.current) {\n\t\t\tthrow new Error(`MCP source '${id}' not connected`)\n\t\t}\n\n\t\tconst response = await clientRef.current.request(\n\t\t\t{ method: 'resources/list' },\n\t\t\tListResourcesResultSchema\n\t\t)\n\t\tif (isMountedRef.current) {\n\t\t\tsetResources(response.resources)\n\t\t\tconst templates = Array.isArray(response.resourceTemplates) ? response.resourceTemplates : []\n\t\t\tsetResourceTemplates(templates)\n\t\t\tonResourcesUpdate?.(response.resources, templates)\n\t\t}\n\t}, [id, onResourcesUpdate])\n\n\t/**\n\t * Refresh the list of prompts\n\t */\n\tconst refreshPrompts = useCallback(async () => {\n\t\tif (!clientRef.current) {\n\t\t\tthrow new Error(`MCP source '${id}' not connected`)\n\t\t}\n\n\t\tconst response = await clientRef.current.request(\n\t\t\t{ method: 'prompts/list' },\n\t\t\tListPromptsResultSchema\n\t\t)\n\t\tif (isMountedRef.current) {\n\t\t\tsetPrompts(response.prompts)\n\t\t\tonPromptsUpdate?.(response.prompts)\n\t\t}\n\t}, [id, onPromptsUpdate])\n\n\t// Auto-connect on mount if enabled\n\tuseEffect(() => {\n\t\tisMountedRef.current = true\n\n\t\tif (autoConnect && state === 'idle') {\n\t\t\t// Small delay for tab sources to ensure server is initialized\n\t\t\tconst delay = config.type === 'tab' ? MCP_TAB_CONNECT_DELAY_MS : 0\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tvoid connect()\n\t\t\t}, delay)\n\n\t\t\treturn () => clearTimeout(timer)\n\t\t}\n\t}, [autoConnect, state, config.type, connect])\n\n\t// Cleanup on unmount\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tisMountedRef.current = false\n\t\t\tclearReconnectTimeout()\n\t\t\tif (clientRef.current) {\n\t\t\t\tvoid clientRef.current.close().catch(console.error)\n\t\t\t}\n\t\t\tif (transportRef.current) {\n\t\t\t\tvoid transportRef.current.close().catch(console.error)\n\t\t\t}\n\t\t}\n\t}, [clearReconnectTimeout])\n\n\treturn {\n\t\tclient: clientRef.current,\n\t\ttools,\n\t\tresources,\n\t\tresourceTemplates,\n\t\tprompts,\n\t\tstate,\n\t\tisConnected: state === 'ready',\n\t\terror,\n\t\tconnect,\n\t\tdisconnect,\n\t\tcallTool,\n\t\treadResource,\n\t\tgetPrompt,\n\t\trefreshTools,\n\t\trefreshResources,\n\t\trefreshPrompts,\n\t}\n}\n","import { tool, useAssistantRuntime } from '@assistant-ui/react'\nimport { useEffect, useMemo } from 'react'\n\nimport type { Client } from '@modelcontextprotocol/sdk/client/index.js'\nimport type { Tool as McpTool } from '@modelcontextprotocol/sdk/types.js'\n\n/**\n * Strip null/undefined values from an object before passing to MCP.\n */\nconst stripNullish = (input: Record<string, unknown>): Record<string, unknown> =>\n\tObject.fromEntries(\n\t\tObject.entries(input).filter(([, value]) => value !== null && value !== undefined)\n\t)\n\n/**\n * Convert MCP tool inputSchema to JSON Schema format for Assistant UI.\n */\nconst mcpToolToJSONSchema = (inputSchema: McpTool['inputSchema']): Record<string, unknown> => {\n\tif (!inputSchema) {\n\t\treturn { type: 'object', properties: {} }\n\t}\n\treturn inputSchema as Record<string, unknown>\n}\n\nexport interface UseAssistantMCPOptions {\n\t/** MCP tools to register */\n\ttools: McpTool[]\n\t/** MCP client for executing tools */\n\tclient: Client\n\t/** Optional system prompt to inject */\n\tsystemPrompt?: string\n}\n\n/**\n * Registers MCP tools with the Assistant UI runtime so they can be invoked by the\n * assistant without any additional indirection.\n *\n * Tools are registered as frontend tools with execute functions that call the MCP client.\n *\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * function ChatThread() {\n * const { client, tools } = useMcpClient();\n *\n * useAssistantMCP({\n * tools,\n * client,\n * systemPrompt: 'You are a helpful assistant.',\n * });\n *\n * return <Thread />;\n * }\n * ```\n */\nexport function useAssistantMCP(options: UseAssistantMCPOptions): void {\n\tconst { tools: mcpTools, client, systemPrompt } = options\n\tconst runtime = useAssistantRuntime()\n\n\tconst toolsKey = useMemo(() => mcpTools.map((t) => t.name).join(','), [mcpTools])\n\n\tuseEffect(() => {\n\t\tif (!client || mcpTools.length === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst assistantTools = mcpTools.map((mcpTool) => {\n\t\t\treturn {\n\t\t\t\tname: mcpTool.name,\n\t\t\t\tassistantTool: tool({\n\t\t\t\t\ttype: 'frontend',\n\t\t\t\t\tdescription: mcpTool.description,\n\t\t\t\t\tparameters: mcpToolToJSONSchema(mcpTool.inputSchema),\n\t\t\t\t\texecute: async (args, { abortSignal }) => {\n\t\t\t\t\t\tconsole.log(`[useAssistantMCP] Executing tool ${mcpTool.name} with args:`, args)\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst cleanedArgs = stripNullish(args as Record<string, unknown>)\n\n\t\t\t\t\t\t\tconst result = await client.callTool(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: mcpTool.name,\n\t\t\t\t\t\t\t\t\targuments: cleanedArgs,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t{ signal: abortSignal }\n\t\t\t\t\t\t\t)\n\n\t\t\t\t\t\t\tconsole.log(`[useAssistantMCP] Tool ${mcpTool.name} returned result:`, result)\n\n\t\t\t\t\t\t\t// Transform MCP CallToolResult to Assistant UI format\n\t\t\t\t\t\t\tconst content = result.content as Array<{\n\t\t\t\t\t\t\t\ttype: string\n\t\t\t\t\t\t\t\ttext?: string\n\t\t\t\t\t\t\t\tdata?: string\n\t\t\t\t\t\t\t\tmimeType?: string\n\t\t\t\t\t\t\t}>\n\n\t\t\t\t\t\t\t// Check for images\n\t\t\t\t\t\t\tconst hasImages = content.some((item) => item.type === 'image')\n\n\t\t\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\t\t\tconst imageContent = content.filter((item) => item.type === 'image')\n\n\t\t\t\t\t\t\t\tif (imageContent.length === 1) {\n\t\t\t\t\t\t\t\t\tconst item = imageContent[0]\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\ttype: 'image' as const,\n\t\t\t\t\t\t\t\t\t\tdata: item.data,\n\t\t\t\t\t\t\t\t\t\tmimeType: item.mimeType,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn imageContent.map((item) => ({\n\t\t\t\t\t\t\t\t\ttype: 'image' as const,\n\t\t\t\t\t\t\t\t\tdata: item.data,\n\t\t\t\t\t\t\t\t\tmimeType: item.mimeType,\n\t\t\t\t\t\t\t\t}))\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// For single text result, return just the text string\n\t\t\t\t\t\t\tif (content.length === 1 && content[0].type === 'text') {\n\t\t\t\t\t\t\t\treturn content[0].text\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// For multiple content parts, return array\n\t\t\t\t\t\t\tconst transformedParts = content.map((item) => {\n\t\t\t\t\t\t\t\tif (item.type === 'text') {\n\t\t\t\t\t\t\t\t\treturn { type: 'text' as const, text: item.text }\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn item\n\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\treturn transformedParts.length === 1 && transformedParts[0].type === 'text'\n\t\t\t\t\t\t\t\t? transformedParts[0].text\n\t\t\t\t\t\t\t\t: transformedParts\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.error(`[useAssistantMCP] Tool ${mcpTool.name} failed:`, error)\n\t\t\t\t\t\t\tthrow error\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t}\n\t\t})\n\n\t\tconst unregister = runtime.registerModelContextProvider({\n\t\t\tgetModelContext: () => ({\n\t\t\t\tsystem: systemPrompt,\n\t\t\t\ttools: Object.fromEntries(assistantTools.map((t) => [t.name, t.assistantTool])),\n\t\t\t}),\n\t\t})\n\n\t\treturn () => {\n\t\t\tunregister()\n\t\t}\n\t}, [client, runtime, systemPrompt, toolsKey, mcpTools])\n}\n"],"mappings":"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"}
|