@surf-kit/agent 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +19 -1
  2. package/dist/agent-BNSmiexZ.d.cts +44 -0
  3. package/dist/agent-BNSmiexZ.d.ts +44 -0
  4. package/dist/agent-identity/index.cjs +157 -0
  5. package/dist/agent-identity/index.cjs.map +1 -0
  6. package/dist/agent-identity/index.d.cts +35 -0
  7. package/dist/agent-identity/index.d.ts +35 -0
  8. package/dist/agent-identity/index.js +127 -0
  9. package/dist/agent-identity/index.js.map +1 -0
  10. package/dist/chat/index.cjs +1281 -0
  11. package/dist/chat/index.cjs.map +1 -0
  12. package/dist/chat/index.d.cts +72 -0
  13. package/dist/chat/index.d.ts +72 -0
  14. package/dist/chat/index.js +1239 -0
  15. package/dist/chat/index.js.map +1 -0
  16. package/dist/chat--OifhIRe.d.ts +24 -0
  17. package/dist/chat-ChYl2XjV.d.cts +24 -0
  18. package/dist/confidence/index.cjs +253 -0
  19. package/dist/confidence/index.cjs.map +1 -0
  20. package/dist/confidence/index.d.cts +40 -0
  21. package/dist/confidence/index.d.ts +40 -0
  22. package/dist/confidence/index.js +222 -0
  23. package/dist/confidence/index.js.map +1 -0
  24. package/dist/feedback/index.cjs +186 -0
  25. package/dist/feedback/index.cjs.map +1 -0
  26. package/dist/feedback/index.d.cts +27 -0
  27. package/dist/feedback/index.d.ts +27 -0
  28. package/dist/feedback/index.js +157 -0
  29. package/dist/feedback/index.js.map +1 -0
  30. package/dist/{hooks-B8CSeOsn.d.cts → hooks-BGs8-4GK.d.ts} +4 -99
  31. package/dist/{hooks-B8CSeOsn.d.ts → hooks-DLfF18IU.d.cts} +4 -99
  32. package/dist/hooks.d.cts +4 -1
  33. package/dist/hooks.d.ts +4 -1
  34. package/dist/index-BazLnae1.d.cts +67 -0
  35. package/dist/index-BazLnae1.d.ts +67 -0
  36. package/dist/index.cjs +889 -144
  37. package/dist/index.cjs.map +1 -1
  38. package/dist/index.d.cts +15 -321
  39. package/dist/index.d.ts +15 -321
  40. package/dist/index.js +879 -142
  41. package/dist/index.js.map +1 -1
  42. package/dist/layouts/index.cjs +1588 -0
  43. package/dist/layouts/index.cjs.map +1 -0
  44. package/dist/layouts/index.d.cts +46 -0
  45. package/dist/layouts/index.d.ts +46 -0
  46. package/dist/layouts/index.js +1548 -0
  47. package/dist/layouts/index.js.map +1 -0
  48. package/dist/mcp/index.cjs +522 -0
  49. package/dist/mcp/index.cjs.map +1 -0
  50. package/dist/mcp/index.d.cts +2 -0
  51. package/dist/mcp/index.d.ts +2 -0
  52. package/dist/mcp/index.js +492 -0
  53. package/dist/mcp/index.js.map +1 -0
  54. package/dist/response/index.cjs +519 -0
  55. package/dist/response/index.cjs.map +1 -0
  56. package/dist/response/index.d.cts +44 -0
  57. package/dist/response/index.d.ts +44 -0
  58. package/dist/response/index.js +478 -0
  59. package/dist/response/index.js.map +1 -0
  60. package/dist/sources/index.cjs +243 -0
  61. package/dist/sources/index.cjs.map +1 -0
  62. package/dist/sources/index.d.cts +44 -0
  63. package/dist/sources/index.d.ts +44 -0
  64. package/dist/sources/index.js +212 -0
  65. package/dist/sources/index.js.map +1 -0
  66. package/dist/streaming/index.cjs +531 -0
  67. package/dist/streaming/index.cjs.map +1 -0
  68. package/dist/streaming/index.d.cts +81 -0
  69. package/dist/streaming/index.d.ts +81 -0
  70. package/dist/streaming/index.js +495 -0
  71. package/dist/streaming/index.js.map +1 -0
  72. package/dist/streaming-DbQxScpi.d.ts +39 -0
  73. package/dist/streaming-DfT22A0z.d.cts +39 -0
  74. package/package.json +62 -17
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/chat/AgentChat/AgentChat.tsx","../src/hooks/useAgentChat.ts","../src/chat/MessageThread/MessageThread.tsx","../src/chat/MessageBubble/MessageBubble.tsx","../src/response/AgentResponse/AgentResponse.tsx","../src/response/ResponseMessage/ResponseMessage.tsx","../src/response/StructuredResponse/StructuredResponse.tsx","../src/sources/SourceList/SourceList.tsx","../src/sources/SourceCard/SourceCard.tsx","../src/response/FollowUpChips/FollowUpChips.tsx","../src/chat/MessageComposer/MessageComposer.tsx","../src/chat/WelcomeScreen/WelcomeScreen.tsx","../src/streaming/StreamingMessage/StreamingMessage.tsx","../src/hooks/useCharacterDrain.ts","../src/response/ErrorResponse/ErrorResponse.tsx","../src/sources/SourceInline/SourceInline.tsx","../src/sources/SourceDrawer/SourceDrawer.tsx","../src/sources/SourceBadge/SourceBadge.tsx","../src/confidence/ConfidenceBadge/ConfidenceBadge.tsx","../src/confidence/ConfidenceBreakdown/ConfidenceBreakdown.tsx","../src/confidence/ConfidenceMeter/ConfidenceMeter.tsx","../src/confidence/VerificationBadge/VerificationBadge.tsx","../src/confidence/VerificationDetail/VerificationDetail.tsx","../src/hooks/useAgentTheme.ts","../src/agent-identity/AgentAvatar/AgentAvatar.tsx","../src/agent-identity/AgentLabel/AgentLabel.tsx","../src/agent-identity/AgentHandoff/AgentHandoff.tsx","../src/agent-identity/RoutingIndicator/RoutingIndicator.tsx","../src/streaming/ThinkingIndicator/ThinkingIndicator.tsx","../src/streaming/ToolExecution/ToolExecution.tsx","../src/streaming/RetrievalProgress/RetrievalProgress.tsx","../src/streaming/VerificationProgress/VerificationProgress.tsx","../src/streaming/TypewriterText/TypewriterText.tsx","../src/chat/ConversationList/ConversationList.tsx","../src/layouts/AgentFullPage/AgentFullPage.tsx","../src/layouts/AgentPanel/AgentPanel.tsx","../src/layouts/AgentWidget/AgentWidget.tsx","../src/layouts/AgentEmbed/AgentEmbed.tsx","../src/feedback/ThumbsFeedback/ThumbsFeedback.tsx","../src/feedback/FeedbackDialog/FeedbackDialog.tsx","../src/feedback/FeedbackConfirmation/FeedbackConfirmation.tsx"],"sourcesContent":["import { twMerge } from 'tailwind-merge'\nimport React from 'react'\nimport { useAgentChat } from '../../hooks/useAgentChat'\nimport { MessageThread } from '../MessageThread'\nimport { MessageComposer } from '../MessageComposer'\nimport { WelcomeScreen } from '../WelcomeScreen'\nimport { StreamingMessage } from '../../streaming/StreamingMessage'\nimport type { ChatMessage } from '../../types/chat'\n\nexport type AgentChatProps = {\n endpoint: string\n title?: string\n welcomeTitle?: string\n welcomeMessage?: string\n suggestedQuestions?: string[]\n showHeader?: boolean\n showWelcomeTitle?: boolean\n showSources?: boolean\n showConfidence?: boolean\n showVerification?: boolean\n enableFeedback?: boolean\n onMessage?: (message: ChatMessage) => void\n className?: string\n}\n\nfunction AgentChat({\n endpoint,\n title = 'Chat',\n welcomeTitle,\n welcomeMessage = 'How can I help you today?',\n suggestedQuestions = [],\n showHeader = true,\n showWelcomeTitle = true,\n showSources,\n showConfidence,\n showVerification,\n className,\n}: AgentChatProps) {\n const { state, actions } = useAgentChat({ apiUrl: endpoint })\n\n const hasMessages = state.messages.length > 0\n\n const handleSend = (content: string) => {\n void actions.sendMessage(content)\n }\n\n const handleQuestionSelect = (question: string) => {\n void actions.sendMessage(question)\n }\n\n return (\n <div\n className={twMerge(\n 'flex flex-col h-full bg-canvas border border-border rounded-xl overflow-hidden',\n className,\n )}\n >\n {showHeader && (\n <div className=\"flex items-center justify-between border-b border-border px-4 py-3 bg-surface-raised shrink-0\">\n <h1 className=\"text-base font-semibold text-text-primary\">{title}</h1>\n </div>\n )}\n\n {hasMessages ? (\n <MessageThread\n messages={state.messages}\n streamingSlot={\n state.isLoading ? (\n <StreamingMessage\n stream={{\n active: state.isLoading,\n phase: state.streamPhase,\n content: state.streamingContent,\n sources: [],\n agent: null,\n agentLabel: null,\n }}\n />\n ) : undefined\n }\n showSources={showSources}\n showConfidence={showConfidence}\n showVerification={showVerification}\n />\n ) : (\n <WelcomeScreen\n title={showWelcomeTitle ? (welcomeTitle ?? title) : ''}\n message={welcomeMessage}\n suggestedQuestions={suggestedQuestions}\n onQuestionSelect={handleQuestionSelect}\n />\n )}\n\n <MessageComposer onSend={handleSend} isLoading={state.isLoading} />\n </div>\n )\n}\n\nexport { AgentChat }\n","import { useReducer, useCallback, useRef } from 'react'\nimport type { ChatMessage, ChatError } from '../types/chat'\nimport type { AgentResponse } from '../types/agent'\nimport type { StreamState } from '../types/streaming'\nimport type { AgentChatConfig } from '../types/config'\n\n// ── State ──────────────────────────────────────────────────────────────\n\nexport interface AgentChatState {\n messages: ChatMessage[]\n conversationId: string | null\n isLoading: boolean\n error: ChatError | null\n inputValue: string\n streamPhase: StreamState['phase']\n streamingContent: string\n}\n\nconst initialState: AgentChatState = {\n messages: [],\n conversationId: null,\n isLoading: false,\n error: null,\n inputValue: '',\n streamPhase: 'idle',\n streamingContent: '',\n}\n\n// ── Actions ────────────────────────────────────────────────────────────\n\ntype Action =\n | { type: 'SET_INPUT'; value: string }\n | { type: 'SEND_START'; message: ChatMessage }\n | { type: 'STREAM_PHASE'; phase: StreamState['phase'] }\n | { type: 'STREAM_CONTENT'; content: string }\n | { type: 'SEND_SUCCESS'; message: ChatMessage; streamingContent: string; conversationId: string | null }\n | { type: 'SEND_ERROR'; error: ChatError }\n | { type: 'LOAD_CONVERSATION'; conversationId: string; messages: ChatMessage[] }\n | { type: 'RESET' }\n | { type: 'CLEAR_ERROR' }\n\nfunction reducer(state: AgentChatState, action: Action): AgentChatState {\n switch (action.type) {\n case 'SET_INPUT':\n return { ...state, inputValue: action.value }\n\n case 'SEND_START':\n return {\n ...state,\n messages: [...state.messages, action.message],\n isLoading: true,\n error: null,\n inputValue: '',\n streamPhase: 'thinking',\n streamingContent: '',\n }\n\n case 'STREAM_PHASE':\n return { ...state, streamPhase: action.phase }\n\n case 'STREAM_CONTENT':\n return { ...state, streamingContent: state.streamingContent + action.content }\n\n case 'SEND_SUCCESS':\n return {\n ...state,\n messages: [...state.messages, action.message],\n conversationId: action.conversationId ?? state.conversationId,\n isLoading: false,\n streamPhase: 'idle',\n streamingContent: '',\n }\n\n case 'SEND_ERROR':\n return {\n ...state,\n isLoading: false,\n error: action.error,\n streamPhase: 'idle',\n streamingContent: '',\n }\n\n case 'LOAD_CONVERSATION':\n return {\n ...state,\n conversationId: action.conversationId,\n messages: action.messages,\n error: null,\n }\n\n case 'RESET':\n return { ...initialState }\n\n case 'CLEAR_ERROR':\n return { ...state, error: null }\n\n default:\n return state\n }\n}\n\n// ── Hook ───────────────────────────────────────────────────────────────\n\nlet msgIdCounter = 0\nfunction generateMessageId(): string {\n return `msg-${Date.now()}-${++msgIdCounter}`\n}\n\nexport interface AgentChatActions {\n sendMessage: (content: string) => Promise<void>\n setInputValue: (value: string) => void\n loadConversation: (conversationId: string, messages: ChatMessage[]) => void\n submitFeedback: (messageId: string, rating: 'positive' | 'negative', comment?: string) => Promise<void>\n retry: () => Promise<void>\n reset: () => void\n}\n\nexport function useAgentChat(config: AgentChatConfig) {\n const [state, dispatch] = useReducer(reducer, initialState)\n const configRef = useRef(config)\n configRef.current = config\n const lastUserMessageRef = useRef<string | null>(null)\n\n const sendMessage = useCallback(\n async (content: string) => {\n const { apiUrl, streamPath = '/chat/stream', headers = {}, timeout = 30000 } = configRef.current\n\n lastUserMessageRef.current = content\n\n const userMessage: ChatMessage = {\n id: generateMessageId(),\n role: 'user',\n content,\n timestamp: new Date(),\n }\n\n dispatch({ type: 'SEND_START', message: userMessage })\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(`${apiUrl}${streamPath}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n ...headers,\n },\n body: JSON.stringify({\n message: content,\n conversation_id: state.conversationId,\n }),\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n dispatch({\n type: 'SEND_ERROR',\n error: {\n code: 'API_ERROR',\n message: `HTTP ${response.status}: ${response.statusText}`,\n retryable: response.status >= 500,\n },\n })\n return\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n dispatch({\n type: 'SEND_ERROR',\n error: { code: 'STREAM_ERROR', message: 'No response body', retryable: true },\n })\n return\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n let accumulatedContent = ''\n let agentResponse: AgentResponse | null = null\n let capturedAgent: string | null = null\n let capturedConversationId: string | null = null\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice(6).trim()\n if (data === '[DONE]') continue\n\n try {\n const event = JSON.parse(data)\n switch (event.type) {\n case 'agent':\n capturedAgent = event.agent as string\n break\n case 'phase':\n dispatch({ type: 'STREAM_PHASE', phase: event.phase })\n break\n case 'delta':\n accumulatedContent += event.content\n dispatch({ type: 'STREAM_CONTENT', content: event.content as string })\n break\n case 'done':\n agentResponse = event.response\n capturedConversationId = (event.conversation_id as string) ?? null\n break\n case 'error':\n dispatch({ type: 'SEND_ERROR', error: event.error })\n return\n }\n } catch {\n // Skip malformed events\n }\n }\n }\n\n const assistantMessage: ChatMessage = {\n id: generateMessageId(),\n role: 'assistant',\n content: agentResponse?.message ?? accumulatedContent,\n response: agentResponse ?? undefined,\n agent: capturedAgent ?? undefined,\n timestamp: new Date(),\n }\n\n dispatch({\n type: 'SEND_SUCCESS',\n message: assistantMessage,\n streamingContent: accumulatedContent,\n conversationId: capturedConversationId,\n })\n } catch (err: unknown) {\n clearTimeout(timeoutId)\n if ((err as Error).name === 'AbortError') {\n dispatch({\n type: 'SEND_ERROR',\n error: { code: 'TIMEOUT', message: 'Request timed out', retryable: true },\n })\n } else {\n dispatch({\n type: 'SEND_ERROR',\n error: {\n code: 'NETWORK_ERROR',\n message: (err as Error).message ?? 'Network error',\n retryable: true,\n },\n })\n }\n }\n },\n [state.conversationId],\n )\n\n const setInputValue = useCallback((value: string) => {\n dispatch({ type: 'SET_INPUT', value })\n }, [])\n\n const loadConversation = useCallback((conversationId: string, messages: ChatMessage[]) => {\n dispatch({ type: 'LOAD_CONVERSATION', conversationId, messages })\n }, [])\n\n const submitFeedback = useCallback(\n async (messageId: string, rating: 'positive' | 'negative', comment?: string) => {\n const { apiUrl, feedbackPath = '/feedback', headers = {} } = configRef.current\n await fetch(`${apiUrl}${feedbackPath}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify({ messageId, rating, comment }),\n })\n },\n [],\n )\n\n const retry = useCallback(async () => {\n if (lastUserMessageRef.current) {\n await sendMessage(lastUserMessageRef.current)\n }\n }, [sendMessage])\n\n const reset = useCallback(() => {\n dispatch({ type: 'RESET' })\n lastUserMessageRef.current = null\n }, [])\n\n const actions: AgentChatActions = {\n sendMessage,\n setInputValue,\n loadConversation,\n submitFeedback,\n retry,\n reset,\n }\n\n return { state, actions }\n}\n","import { twMerge } from 'tailwind-merge'\nimport React, { useEffect, useRef } from 'react'\nimport type { ChatMessage } from '../../types/chat'\nimport { MessageBubble } from '../MessageBubble'\n\nexport type MessageThreadProps = {\n messages: ChatMessage[]\n streamingSlot?: React.ReactNode\n showSources?: boolean\n showConfidence?: boolean\n showVerification?: boolean\n className?: string\n}\n\nfunction MessageThread({ messages, streamingSlot, showSources, showConfidence, showVerification, className }: MessageThreadProps) {\n const bottomRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n bottomRef.current?.scrollIntoView?.({ behavior: 'smooth' })\n }, [messages.length, streamingSlot])\n\n return (\n <div\n role=\"log\"\n aria-live=\"polite\"\n aria-label=\"Message thread\"\n className={twMerge(\n 'flex flex-col gap-4 overflow-y-auto flex-1 px-4 py-6',\n className,\n )}\n >\n {messages.map((message) => (\n <MessageBubble\n key={message.id}\n message={message}\n showSources={showSources}\n showConfidence={showConfidence}\n showVerification={showVerification}\n />\n ))}\n {streamingSlot}\n <div ref={bottomRef} />\n </div>\n )\n}\n\nexport { MessageThread }\n","import { twMerge } from 'tailwind-merge'\nimport React from 'react'\nimport type { ChatMessage } from '../../types/chat'\nimport { AgentResponse } from '../../response/AgentResponse'\nimport { ResponseMessage } from '../../response/ResponseMessage'\n\nexport type MessageBubbleProps = {\n message: ChatMessage\n showAgent?: boolean\n showSources?: boolean\n showConfidence?: boolean\n showVerification?: boolean\n className?: string\n}\n\nfunction MessageBubble({\n message,\n showAgent,\n showSources = true,\n showConfidence = true,\n showVerification = true,\n className,\n}: MessageBubbleProps) {\n const isUser = message.role === 'user'\n\n if (isUser) {\n return (\n <div\n data-message-id={message.id}\n className={twMerge('flex w-full justify-end', className)}\n >\n <div className=\"max-w-[75%] rounded-[18px] rounded-br-[4px] px-4 py-2.5 bg-accent text-white whitespace-pre-wrap text-sm leading-relaxed\">\n {message.content}\n </div>\n </div>\n )\n }\n\n return (\n <div\n data-message-id={message.id}\n className={twMerge('flex w-full flex-col items-start gap-1.5', className)}\n >\n {showAgent && message.agent && (\n <div className=\"text-[11px] font-medium uppercase tracking-[0.08em] text-text-secondary px-1\">\n {message.agent.replace('_agent', '').replace('_', ' ')}\n </div>\n )}\n <div className=\"max-w-[88%] rounded-[18px] rounded-tl-[4px] px-4 py-3 bg-surface-raised border border-border\">\n {message.response ? (\n <AgentResponse\n response={message.response}\n showSources={showSources}\n showConfidence={showConfidence}\n showVerification={showVerification}\n />\n ) : (\n <ResponseMessage content={message.content} />\n )}\n </div>\n </div>\n )\n}\n\nexport { MessageBubble }\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport type { AgentResponse as AgentResponseType } from '../../types/agent'\nimport { ResponseMessage } from '../ResponseMessage'\nimport { StructuredResponse } from '../StructuredResponse'\nimport { SourceList } from '../../sources/SourceList'\nimport { FollowUpChips } from '../FollowUpChips'\n\ntype AgentResponseProps = {\n response: AgentResponseType\n showSources?: boolean\n showConfidence?: boolean\n showVerification?: boolean\n onFollowUp?: (suggestion: string) => void\n onNavigateSource?: (source: AgentResponseType['sources'][number]) => void\n className?: string\n}\n\nfunction getConfidenceIntent(overall: 'high' | 'medium' | 'low') {\n if (overall === 'high') return 'success' as const\n if (overall === 'medium') return 'warning' as const\n return 'error' as const\n}\n\nfunction getVerificationIntent(status: 'passed' | 'flagged' | 'failed') {\n if (status === 'passed') return 'success' as const\n if (status === 'flagged') return 'warning' as const\n return 'error' as const\n}\n\nfunction getVerificationLabel(status: 'passed' | 'flagged' | 'failed') {\n if (status === 'passed') return 'Verified'\n if (status === 'flagged') return 'Flagged'\n return 'Failed'\n}\n\nfunction AgentResponse({\n response,\n showSources = true,\n showConfidence = false,\n showVerification = false,\n onFollowUp,\n onNavigateSource,\n className,\n}: AgentResponseProps) {\n return (\n <div className={`flex flex-col gap-4 ${className ?? ''}`} data-testid=\"agent-response\">\n {/* Lead message — always shown as a short 1-3 sentence summary */}\n <ResponseMessage content={response.message} />\n\n {/* Structured content — rendered when ui_hint is not plain text */}\n {response.ui_hint !== 'text' && response.structured_data && (\n <StructuredResponse\n uiHint={response.ui_hint}\n data={response.structured_data as Record<string, unknown>}\n />\n )}\n\n {/* Confidence & Verification badges */}\n {(showConfidence || showVerification) && (\n <div className=\"flex flex-wrap items-center gap-2 mt-1\" data-testid=\"response-meta\">\n {showConfidence && (\n <Badge\n intent={getConfidenceIntent(response.confidence.overall)}\n size=\"sm\"\n >\n {response.confidence.overall} confidence\n </Badge>\n )}\n {showVerification && (\n <Badge\n intent={getVerificationIntent(response.verification.status)}\n size=\"sm\"\n >\n {getVerificationLabel(response.verification.status)} ({response.verification.claims_verified}/{response.verification.claims_checked})\n </Badge>\n )}\n </div>\n )}\n\n {/* Sources */}\n {showSources && response.sources.length > 0 && (\n <SourceList\n sources={response.sources}\n variant=\"compact\"\n collapsible\n defaultExpanded={false}\n onNavigate={onNavigateSource}\n />\n )}\n\n {/* Follow-up suggestions */}\n {response.follow_up_suggestions.length > 0 && onFollowUp && (\n <FollowUpChips\n suggestions={response.follow_up_suggestions}\n onSelect={onFollowUp}\n />\n )}\n </div>\n )\n}\n\nexport { AgentResponse }\nexport type { AgentResponseProps }\n","import React from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport rehypeSanitize from 'rehype-sanitize'\nimport { twMerge } from 'tailwind-merge'\n\ntype ResponseMessageProps = {\n content: string\n className?: string\n}\n\nfunction normalizeMarkdownLists(content: string) {\n // Some providers emit compact list markdown like \"Intro: - item 1 - item 2\".\n // Insert a paragraph break before an inline list marker so markdown parses it as a list.\n return content.replace(/:\\s+-\\s+/g, ':\\n\\n- ')\n}\n\nfunction ResponseMessage({ content, className }: ResponseMessageProps) {\n return (\n <div\n className={twMerge(\n 'text-sm leading-relaxed text-text-primary',\n '[&_p]:my-2',\n '[&_ul]:my-2 [&_ul]:list-disc [&_ul]:pl-6',\n '[&_ol]:my-2 [&_ol]:list-decimal [&_ol]:pl-6',\n '[&_li]:my-1',\n '[&_strong]:text-text-primary [&_strong]:font-semibold',\n '[&_em]:text-text-secondary',\n '[&_h1]:text-lg [&_h1]:font-semibold [&_h1]:text-text-primary [&_h1]:mt-4 [&_h1]:mb-2',\n '[&_h2]:text-base [&_h2]:font-semibold [&_h2]:text-text-primary [&_h2]:mt-3 [&_h2]:mb-1.5',\n '[&_h3]:text-sm [&_h3]:font-semibold [&_h3]:text-accent [&_h3]:mt-2 [&_h3]:mb-1',\n '[&_code]:bg-surface-raised [&_code]:text-accent [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:rounded [&_code]:text-xs [&_code]:font-mono',\n '[&_pre]:bg-surface-raised [&_pre]:border [&_pre]:border-border [&_pre]:rounded-xl [&_pre]:p-4 [&_pre]:overflow-x-auto',\n '[&_blockquote]:border-l-2 [&_blockquote]:border-border-strong [&_blockquote]:pl-4 [&_blockquote]:text-text-secondary',\n '[&_a]:text-accent [&_a]:underline-offset-2 [&_a]:hover:text-accent/80',\n className,\n )}\n data-testid=\"response-message\"\n >\n <ReactMarkdown\n rehypePlugins={[rehypeSanitize]}\n components={{\n script: () => null,\n iframe: () => null,\n p: ({ children }) => <p className=\"my-2\">{children}</p>,\n ul: ({ children }) => <ul className=\"my-2 list-disc pl-6\">{children}</ul>,\n ol: ({ children }) => <ol className=\"my-2 list-decimal pl-6\">{children}</ol>,\n li: ({ children }) => <li className=\"my-1\">{children}</li>,\n strong: ({ children }) => <strong className=\"font-semibold\">{children}</strong>,\n h1: ({ children }) => <h1 className=\"text-base font-bold mt-4 mb-2\">{children}</h1>,\n h2: ({ children }) => <h2 className=\"text-sm font-bold mt-3 mb-1\">{children}</h2>,\n h3: ({ children }) => <h3 className=\"text-sm font-semibold mt-2 mb-1\">{children}</h3>,\n code: ({ children }) => <code className=\"bg-surface-sunken rounded px-1 py-0.5 text-xs font-mono\">{children}</code>,\n }}\n >\n {normalizeMarkdownLists(content)}\n </ReactMarkdown>\n </div>\n )\n}\n\nexport { ResponseMessage }\nexport type { ResponseMessageProps }\n","import React from 'react'\nimport type { AgentResponse } from '../../types/agent'\n\ntype StructuredResponseProps = {\n uiHint: AgentResponse['ui_hint']\n data: Record<string, unknown> | null\n className?: string\n}\n\n/** Parse a value that may be a JSON-encoded string or already parsed. */\nfunction tryParse<T>(value: unknown): T | null {\n if (value === undefined || value === null) return null\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as T\n } catch {\n return null\n }\n }\n return value as T\n}\n\nfunction renderSteps(data: Record<string, unknown>) {\n const steps = tryParse<string[]>(data.steps)\n if (!steps || !Array.isArray(steps)) return null\n return (\n <ol className=\"flex flex-col gap-2\" data-testid=\"structured-steps\">\n {steps.map((step, i) => (\n <li key={i} className=\"flex items-start gap-3\">\n <span\n className=\"mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-accent text-[11px] font-semibold text-white\"\n aria-hidden=\"true\"\n >\n {i + 1}\n </span>\n <span className=\"text-sm text-text-primary leading-relaxed\">{step}</span>\n </li>\n ))}\n </ol>\n )\n}\n\nfunction renderTable(data: Record<string, unknown>) {\n const columns = tryParse<string[]>(data.columns)\n // rows may be array-of-arrays or array-of-objects; normalise to array-of-arrays\n const rawRows = tryParse<unknown[]>(data.rows)\n\n if (columns && rawRows && Array.isArray(columns) && Array.isArray(rawRows)) {\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border\" data-testid=\"structured-table\">\n <table role=\"table\" className=\"w-full border-collapse text-sm\">\n <thead className=\"bg-surface-raised\">\n <tr>\n {columns.map((col) => (\n <th\n key={col}\n className=\"text-left px-4 py-2.5 font-semibold text-text-primary border-b border-border\"\n >\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rawRows.map((row, i) => {\n const cells = Array.isArray(row)\n ? row\n : columns.map((col) => (row as Record<string, unknown>)[col])\n return (\n <tr key={i} className=\"even:bg-surface-raised/40\">\n {cells.map((cell, j) => (\n <td key={j} className=\"px-4 py-2 text-text-secondary border-b border-border\">\n {String(cell ?? '')}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n )\n }\n\n // Fallback: key-value table\n const entries = Object.entries(data)\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border\" data-testid=\"structured-table\">\n <table role=\"table\" className=\"w-full border-collapse text-sm\">\n <tbody>\n {entries.map(([key, value]) => (\n <tr key={key} className=\"even:bg-surface-raised/40\">\n <td className=\"px-4 py-2 text-text-primary font-medium border-b border-border w-1/3\">\n {key}\n </td>\n <td className=\"px-4 py-2 text-text-secondary border-b border-border\">\n {typeof value === 'object' ? JSON.stringify(value) : String(value ?? '')}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction renderCard(data: Record<string, unknown>) {\n const title = typeof data.title === 'string' ? data.title : null\n const body = typeof data.body === 'string' ? data.body : null\n const link = typeof data.link === 'string' ? data.link : null\n const linkLabel = typeof data.link_label === 'string' ? data.link_label : 'Learn more'\n\n return (\n <div\n className=\"rounded-xl border border-border bg-surface-raised p-4 flex flex-col gap-2\"\n data-testid=\"structured-card\"\n >\n {title && <p className=\"text-sm font-semibold text-text-primary\">{title}</p>}\n {body && <p className=\"text-sm text-text-secondary leading-relaxed\">{body}</p>}\n {link && (\n <a\n href={link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-1 inline-flex items-center gap-1 text-xs font-medium text-accent hover:text-accent/80 underline-offset-2 hover:underline transition-colors\"\n >\n {linkLabel}\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n </a>\n )}\n </div>\n )\n}\n\nfunction renderList(data: Record<string, unknown>) {\n const items = tryParse<string[]>(data.items)\n const title = typeof data.title === 'string' ? data.title : null\n if (!items || !Array.isArray(items)) return null\n\n return (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"structured-list\">\n {title && (\n <p className=\"text-xs font-semibold uppercase tracking-wider text-text-secondary mb-1\">{title}</p>\n )}\n <ul className=\"flex flex-col gap-1.5\">\n {items.map((item, i) => (\n <li key={i} className=\"flex items-start gap-2.5\">\n <span className=\"mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full bg-accent\" aria-hidden=\"true\" />\n <span className=\"text-sm text-text-primary leading-relaxed\">{item}</span>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nfunction renderWarning(data: Record<string, unknown>) {\n const severity = typeof data.severity === 'string' ? data.severity : 'medium'\n const action = typeof data.action === 'string' ? data.action : null\n const details = typeof data.details === 'string' ? data.details : null\n const isHigh = severity === 'high'\n\n return (\n <div\n role=\"alert\"\n className={`rounded-xl border p-4 flex gap-3 ${\n isHigh\n ? 'border-red-200 bg-red-50 dark:border-red-900/50 dark:bg-red-950/30'\n : 'border-amber-200 bg-amber-50 dark:border-amber-900/50 dark:bg-amber-950/30'\n }`}\n data-testid=\"structured-warning\"\n >\n <svg\n className={`mt-0.5 h-5 w-5 shrink-0 ${isHigh ? 'text-red-500' : 'text-amber-500'}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n <div className=\"flex flex-col gap-1\">\n {action && (\n <p className={`text-sm font-semibold ${isHigh ? 'text-red-700 dark:text-red-300' : 'text-amber-700 dark:text-amber-300'}`}>\n {action}\n </p>\n )}\n {details && (\n <p className={`text-sm ${isHigh ? 'text-red-600 dark:text-red-400' : 'text-amber-600 dark:text-amber-400'}`}>\n {details}\n </p>\n )}\n </div>\n </div>\n )\n}\n\nfunction StructuredResponse({ uiHint, data, className }: StructuredResponseProps) {\n if (!data) return null\n\n let content: React.ReactNode\n\n switch (uiHint) {\n case 'steps':\n content = renderSteps(data)\n break\n case 'table':\n content = renderTable(data)\n break\n case 'card':\n content = renderCard(data)\n break\n case 'list':\n content = renderList(data)\n break\n case 'warning':\n content = renderWarning(data)\n break\n case 'text':\n content = typeof data.text === 'string'\n ? <p data-testid=\"structured-text\">{data.text}</p>\n : null\n break\n default:\n content = null\n }\n\n if (!content) return null\n\n return (\n <div className={className} data-testid=\"structured-response\">\n {content}\n </div>\n )\n}\n\nexport { StructuredResponse }\nexport type { StructuredResponseProps }\n","import React, { useState } from 'react'\nimport type { Source } from '../../types/agent'\nimport { SourceCard } from '../SourceCard'\n\ntype SourceListProps = {\n sources: Source[]\n variant?: 'compact' | 'expanded'\n collapsible?: boolean\n defaultExpanded?: boolean\n onNavigate?: (source: Source) => void\n className?: string\n}\n\nfunction SourceList({\n sources,\n variant = 'compact',\n collapsible = false,\n defaultExpanded = true,\n onNavigate,\n className,\n}: SourceListProps) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded)\n\n if (sources.length === 0) return null\n\n const content = (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"source-list-items\">\n {sources.map((source) => (\n <SourceCard\n key={source.document_id}\n source={source}\n variant={variant}\n onNavigate={onNavigate}\n />\n ))}\n </div>\n )\n\n if (!collapsible) {\n return (\n <div className={className} data-testid=\"source-list\">\n {content}\n </div>\n )\n }\n\n return (\n <div className={className} data-testid=\"source-list\">\n <button\n type=\"button\"\n onClick={() => setIsExpanded(prev => !prev)}\n aria-expanded={isExpanded}\n className=\"flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wider text-text-secondary hover:text-accent mb-2 transition-colors duration-200\"\n >\n <svg\n className={`w-4 h-4 transition-transform ${isExpanded ? 'rotate-180' : ''}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n Sources ({sources.length})\n </button>\n {isExpanded && content}\n </div>\n )\n}\n\nexport { SourceList }\nexport type { SourceListProps }\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport { twMerge } from 'tailwind-merge'\nimport type { Source } from '../../types/agent'\n\ntype SourceCardProps = {\n source: Source\n variant?: 'compact' | 'expanded'\n onNavigate?: (source: Source) => void\n className?: string\n}\n\nfunction getConfidenceIntent(confidence: number) {\n if (confidence >= 0.8) return 'success' as const\n if (confidence >= 0.5) return 'warning' as const\n return 'error' as const\n}\n\nfunction getConfidenceLabel(confidence: number) {\n if (confidence >= 0.8) return 'High'\n if (confidence >= 0.5) return 'Medium'\n return 'Low'\n}\n\nfunction SourceCard({ source, variant = 'compact', onNavigate, className }: SourceCardProps) {\n const handleClick = () => {\n if (onNavigate) {\n onNavigate(source)\n }\n }\n\n const isCompact = variant === 'compact'\n\n return (\n <div\n className={twMerge(\n 'rounded-xl border transition-all duration-200',\n 'bg-surface border-border',\n onNavigate && 'cursor-pointer hover:border-border-strong',\n className,\n )}\n data-document-id={source.document_id}\n data-testid=\"source-card\"\n >\n <div\n className={isCompact ? 'px-4 py-3' : 'px-6 py-4'}\n onClick={handleClick}\n role={onNavigate ? 'button' : undefined}\n tabIndex={onNavigate ? 0 : undefined}\n onKeyDown={\n onNavigate\n ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }\n : undefined\n }\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {source.title}\n </p>\n {source.section && (\n <p className=\"text-[11px] font-semibold uppercase tracking-wider text-text-secondary truncate mt-0.5\">\n {source.section}\n </p>\n )}\n </div>\n <Badge\n intent={getConfidenceIntent(source.confidence)}\n size=\"sm\"\n >\n {getConfidenceLabel(source.confidence)}\n </Badge>\n </div>\n {!isCompact && (\n <p className=\"text-xs text-text-secondary mt-2 line-clamp-3 leading-relaxed\">\n {source.snippet}\n </p>\n )}\n </div>\n </div>\n )\n}\n\nexport { SourceCard }\nexport type { SourceCardProps }\n","import React from 'react'\nimport { twMerge } from 'tailwind-merge'\n\ntype FollowUpChipsProps = {\n suggestions: string[]\n onSelect: (suggestion: string) => void\n className?: string\n}\n\nfunction FollowUpChips({ suggestions, onSelect, className }: FollowUpChipsProps) {\n if (suggestions.length === 0) return null\n\n return (\n <div\n className={`flex gap-2 overflow-x-auto py-1 ${className ?? ''}`}\n role=\"group\"\n aria-label=\"Follow-up suggestions\"\n data-testid=\"follow-up-chips\"\n >\n {suggestions.map(suggestion => (\n <button\n key={suggestion}\n type=\"button\"\n onClick={() => onSelect(suggestion)}\n className={twMerge(\n 'px-4 py-1.5 rounded-full text-sm shrink-0 whitespace-nowrap',\n 'border border-border bg-surface text-text-primary',\n 'hover:bg-surface-raised hover:border-interactive hover:text-text-primary',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent',\n 'transition-all duration-200',\n )}\n >\n {suggestion}\n </button>\n ))}\n </div>\n )\n}\n\nexport { FollowUpChips }\nexport type { FollowUpChipsProps }\n","import { twMerge } from 'tailwind-merge'\nimport React, { useState, useRef, useCallback } from 'react'\n\nexport type MessageComposerProps = {\n onSend: (content: string) => void\n isLoading?: boolean\n placeholder?: string\n className?: string\n}\n\nfunction MessageComposer({\n onSend,\n isLoading = false,\n placeholder = 'Type a message...',\n className,\n}: MessageComposerProps) {\n const [value, setValue] = useState('')\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n const canSend = value.trim().length > 0 && !isLoading\n\n const handleSend = useCallback(() => {\n if (!canSend) return\n onSend(value.trim())\n setValue('')\n textareaRef.current?.focus()\n }, [canSend, onSend, value])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSend()\n }\n },\n [handleSend],\n )\n\n return (\n <div\n className={twMerge(\n 'flex items-end gap-3 border-t border-border px-4 py-3 bg-canvas',\n className,\n )}\n >\n <textarea\n ref={textareaRef}\n value={value}\n onChange={e => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n rows={1}\n disabled={isLoading}\n className={twMerge(\n 'flex-1 resize-none rounded-xl border border-border bg-surface',\n 'px-4 py-2.5 text-sm text-text-primary placeholder:text-text-muted',\n 'focus:border-transparent focus:ring-2 focus:ring-accent/40 focus:outline-none',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'transition-all duration-200',\n )}\n style={{ colorScheme: 'dark' }}\n aria-label=\"Message input\"\n />\n <button\n type=\"button\"\n onClick={handleSend}\n disabled={!value.trim() || isLoading}\n aria-label=\"Send message\"\n className={twMerge(\n 'inline-flex items-center justify-center rounded-xl px-5 py-2.5',\n 'text-sm font-semibold text-white shrink-0',\n 'transition-all duration-200',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent',\n value.trim() && !isLoading\n ? 'bg-accent hover:bg-accent-hover hover:scale-[1.02] active:scale-[0.98]'\n : 'bg-accent/30 text-text-muted cursor-not-allowed',\n )}\n >\n Send\n </button>\n </div>\n )\n}\n\nexport { MessageComposer }\n","import { twMerge } from 'tailwind-merge'\nimport React from 'react'\n\nexport type WelcomeScreenProps = {\n title?: string\n message?: string\n suggestedQuestions?: string[]\n onQuestionSelect?: (question: string) => void\n className?: string\n}\n\nfunction WelcomeScreen({\n title = 'Welcome',\n message = 'How can I help you today?',\n suggestedQuestions = [],\n onQuestionSelect,\n className,\n}: WelcomeScreenProps) {\n return (\n <div\n className={twMerge(\n 'flex flex-1 flex-col items-center justify-center gap-8 p-8 text-center',\n className,\n )}\n >\n {/* Pulsing icon */}\n <div\n className=\"w-14 h-14 rounded-2xl bg-accent/10 border border-border flex items-center justify-center pulse-glow\"\n aria-hidden=\"true\"\n >\n <span className=\"text-2xl\">✦</span>\n </div>\n\n {/* Text */}\n <div className=\"flex flex-col gap-2\">\n {title && (\n <h2 className=\"text-2xl font-semibold text-text-primary\">{title}</h2>\n )}\n <p className=\"text-text-secondary text-base leading-relaxed max-w-sm\">{message}</p>\n </div>\n\n {/* Suggested question chips */}\n {suggestedQuestions.length > 0 && (\n <div\n className=\"flex flex-wrap justify-center gap-2 max-w-md\"\n role=\"group\"\n aria-label=\"Suggested questions\"\n >\n {suggestedQuestions.map(question => (\n <button\n key={question}\n type=\"button\"\n onClick={() => onQuestionSelect?.(question)}\n className={twMerge(\n 'px-4 py-2 rounded-full text-sm',\n 'border border-border bg-surface text-text-primary',\n 'hover:bg-surface-raised hover:border-interactive hover:text-text-primary',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent',\n 'transition-colors duration-200',\n )}\n >\n {question}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport { WelcomeScreen }\n","import React, { useEffect, useRef } from 'react'\nimport { Spinner } from '@surf-kit/core'\nimport type { StreamState } from '../../types/streaming'\nimport { useCharacterDrain } from '../../hooks/useCharacterDrain'\n\ntype StreamingMessageProps = {\n stream: StreamState\n onComplete?: () => void\n showPhases?: boolean\n className?: string\n}\n\nconst phaseLabels: Record<StreamState['phase'], string> = {\n idle: '',\n waiting: 'Waiting',\n thinking: 'Thinking',\n retrieving: 'Searching',\n generating: 'Writing',\n verifying: 'Verifying',\n}\n\nfunction StreamingMessage({\n stream,\n onComplete,\n showPhases = true,\n className,\n}: StreamingMessageProps) {\n const onCompleteRef = useRef(onComplete)\n onCompleteRef.current = onComplete\n const wasActiveRef = useRef(stream.active)\n\n useEffect(() => {\n if (wasActiveRef.current && !stream.active) {\n onCompleteRef.current?.()\n }\n wasActiveRef.current = stream.active\n }, [stream.active])\n\n const phaseLabel = phaseLabels[stream.phase]\n const { displayed: displayedContent } = useCharacterDrain(stream.content)\n\n return (\n <div className={className} data-testid=\"streaming-message\">\n {/* Screen reader announcements */}\n <div aria-live=\"assertive\" className=\"sr-only\">\n {stream.active && stream.phase !== 'idle' && 'Response started'}\n {!stream.active && stream.content && 'Response complete'}\n </div>\n\n {showPhases && stream.active && stream.phase !== 'idle' && (\n <div\n className=\"flex items-center gap-2 mb-2 text-sm text-text-secondary\"\n data-testid=\"phase-indicator\"\n >\n <span aria-hidden=\"true\">\n <Spinner size=\"sm\" />\n </span>\n <span>{phaseLabel}</span>\n </div>\n )}\n\n <div className=\"text-text-primary whitespace-pre-wrap\">\n {displayedContent}\n {stream.active && (\n <span\n className=\"inline-block w-0.5 h-4 bg-accent align-text-bottom animate-pulse ml-0.5\"\n aria-hidden=\"true\"\n data-testid=\"streaming-cursor\"\n />\n )}\n </div>\n </div>\n )\n}\n\nexport { StreamingMessage }\nexport type { StreamingMessageProps }\n","import { useState, useRef, useEffect } from 'react'\n\nexport interface CharacterDrainResult {\n displayed: string\n isDraining: boolean\n}\n\n/**\n * Smoothly drains a growing `target` string character-by-character using\n * `requestAnimationFrame`, decoupling visual rendering from network packet\n * timing so text appears to type out instead of arriving in chunks.\n *\n * When `target` resets to empty (e.g. stream finished), the hook continues\n * draining the previous content to completion before resetting, so the\n * typing animation isn't cut short.\n *\n * Design: the RAF loop is long-lived — it does NOT restart on every delta.\n * The tick function is stored in a ref (updated each render) so the loop\n * always reads the latest drainTarget without being cancelled/restarted.\n * A separate kick-start effect re-fires the loop when it was idle and new\n * content arrives.\n */\nexport function useCharacterDrain(target: string, msPerChar = 15): CharacterDrainResult {\n const [displayed, setDisplayed] = useState('')\n const indexRef = useRef(0)\n const lastTimeRef = useRef(0)\n const rafRef = useRef<number | null>(null)\n // Holds the last non-empty target so we can finish draining after source resets\n const drainTargetRef = useRef('')\n const msPerCharRef = useRef(msPerChar)\n\n msPerCharRef.current = msPerChar\n\n // Update drain target when new content arrives; preserve old value on reset\n if (target !== '') {\n drainTargetRef.current = target\n }\n\n const drainTarget = drainTargetRef.current\n const isDraining = displayed.length < drainTarget.length\n\n // Tick function stored in ref so the long-lived RAF loop always reads the\n // latest drainTarget and msPerChar without being cancelled/recreated.\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const tickRef = useRef<(now: number) => void>(() => {})\n tickRef.current = (now: number) => {\n const currentTarget = drainTargetRef.current\n if (currentTarget === '') {\n rafRef.current = null\n return\n }\n\n if (lastTimeRef.current === 0) lastTimeRef.current = now\n const elapsed = now - lastTimeRef.current\n const charsToAdvance = Math.floor(elapsed / msPerCharRef.current)\n\n if (charsToAdvance > 0 && indexRef.current < currentTarget.length) {\n const nextIndex = Math.min(indexRef.current + charsToAdvance, currentTarget.length)\n indexRef.current = nextIndex\n lastTimeRef.current = now\n setDisplayed(currentTarget.slice(0, nextIndex))\n }\n\n if (indexRef.current < currentTarget.length) {\n rafRef.current = requestAnimationFrame((t) => tickRef.current(t))\n } else {\n rafRef.current = null\n }\n }\n\n // Kick-start the RAF loop when new content arrives and the loop is idle.\n // No cleanup here — we intentionally do NOT cancel the running loop when\n // drainTarget grows; the long-lived tick will pick up new chars automatically.\n useEffect(() => {\n if (\n drainTargetRef.current !== '' &&\n indexRef.current < drainTargetRef.current.length &&\n rafRef.current === null\n ) {\n rafRef.current = requestAnimationFrame((t) => tickRef.current(t))\n }\n }, [drainTarget]) // drainTarget change = new content; check if loop needs kicking\n\n // Once drain completes and source stream is already done, reset all state\n useEffect(() => {\n if (target === '' && !isDraining && displayed !== '') {\n indexRef.current = 0\n lastTimeRef.current = 0\n drainTargetRef.current = ''\n setDisplayed('')\n }\n }, [target, isDraining, displayed])\n\n // Cancel any pending RAF on unmount\n useEffect(() => {\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current)\n rafRef.current = null\n }\n }\n }, [])\n\n return { displayed, isDraining }\n}\n","import React from 'react'\nimport { Alert, Button } from '@surf-kit/core'\nimport type { ChatError } from '../../types/chat'\n\ntype ErrorResponseProps = {\n error: ChatError\n onRetry?: () => void\n className?: string\n}\n\nfunction ErrorResponse({ error, onRetry, className }: ErrorResponseProps) {\n return (\n <div role=\"alert\" className={className} data-testid=\"error-response\">\n <Alert intent=\"error\" title=\"Error\">\n <p>{error.message}</p>\n {error.retryable && onRetry && (\n <div className=\"mt-3\">\n <Button\n intent=\"secondary\"\n size=\"sm\"\n onPress={onRetry}\n aria-label=\"Retry\"\n >\n Retry\n </Button>\n </div>\n )}\n </Alert>\n </div>\n )\n}\n\nexport { ErrorResponse }\nexport type { ErrorResponseProps }\n","import React from 'react'\nimport { Tooltip } from '@surf-kit/core'\n\nimport type { Source } from '../../types/agent'\n\ntype SourceInlineProps = {\n source: Source\n index: number\n className?: string\n}\n\nfunction SourceInline({ source, index, className }: SourceInlineProps) {\n const tooltipContent = `${source.title}${source.section ? ` - ${source.section}` : ''}: ${source.snippet.slice(0, 120)}${source.snippet.length > 120 ? '...' : ''}`\n\n return (\n <Tooltip content={tooltipContent} placement=\"top\">\n <span\n className={`inline-flex items-center justify-center text-xs text-accent font-medium cursor-help ${className ?? ''}`}\n data-testid=\"source-inline\"\n data-document-id={source.document_id}\n aria-label={`Source ${index}: ${source.title}`}\n >\n [{index}]\n </span>\n </Tooltip>\n )\n}\n\nexport { SourceInline }\nexport type { SourceInlineProps }\n","import React from 'react'\nimport { Sheet, Badge } from '@surf-kit/core'\nimport type { Source } from '../../types/agent'\n\ntype SourceDrawerProps = {\n source: Source | null\n isOpen: boolean\n onClose: () => void\n className?: string\n}\n\nfunction getConfidenceIntent(confidence: number) {\n if (confidence >= 0.8) return 'success' as const\n if (confidence >= 0.5) return 'warning' as const\n return 'error' as const\n}\n\nfunction SourceDrawer({ source, isOpen, onClose, className }: SourceDrawerProps) {\n if (!source) return null\n\n return (\n <Sheet\n isOpen={isOpen}\n onClose={onClose}\n title={source.title}\n size=\"md\"\n className={className}\n >\n <div data-testid=\"source-drawer\" data-document-id={source.document_id}>\n {source.section && (\n <p className=\"text-sm text-text-secondary mb-4\">{source.section}</p>\n )}\n\n <div className=\"flex items-center gap-2 mb-4\">\n <span className=\"text-sm text-text-secondary\">Confidence:</span>\n <Badge intent={getConfidenceIntent(source.confidence)} size=\"sm\">\n {Math.round(source.confidence * 100)}%\n </Badge>\n </div>\n\n <div className=\"mb-4\">\n <h3 className=\"text-sm font-medium text-text-primary mb-2\">Snippet</h3>\n <p className=\"text-sm text-text-secondary bg-surface-raised p-4 rounded-lg\">\n {source.snippet}\n </p>\n </div>\n\n {source.url && (\n <div>\n <h3 className=\"text-sm font-medium text-text-primary mb-2\">Source URL</h3>\n <a\n href={source.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm text-accent hover:underline break-all\"\n >\n {source.url}\n </a>\n </div>\n )}\n </div>\n </Sheet>\n )\n}\n\nexport { SourceDrawer }\nexport type { SourceDrawerProps }\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\n\ntype SourceBadgeProps = {\n count: number\n className?: string\n}\n\nfunction SourceBadge({ count, className }: SourceBadgeProps) {\n if (count === 0) return null\n\n return (\n <Badge intent=\"info\" size=\"sm\" className={className} data-testid=\"source-badge\">\n {count} {count === 1 ? 'source' : 'sources'}\n </Badge>\n )\n}\n\nexport { SourceBadge }\nexport type { SourceBadgeProps }\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport type { ConfidenceBreakdown } from '../../types/agent'\n\nexport type ConfidenceBadgeProps = {\n confidence: ConfidenceBreakdown\n className?: string\n}\n\nconst intentMap = {\n high: 'success',\n medium: 'warning',\n low: 'error',\n} as const\n\nconst labelMap = {\n high: 'High confidence',\n medium: 'Medium confidence',\n low: 'Low confidence',\n} as const\n\nfunction ConfidenceBadge({ confidence, className }: ConfidenceBadgeProps) {\n const level = confidence.overall\n\n return (\n <Badge\n intent={intentMap[level]}\n size=\"sm\"\n role=\"status\"\n aria-label={labelMap[level]}\n className={className}\n >\n {level.charAt(0).toUpperCase() + level.slice(1)}\n </Badge>\n )\n}\n\nexport { ConfidenceBadge }\n","import React, { useState } from 'react'\nimport type { ConfidenceBreakdown as ConfidenceBreakdownType } from '../../types/agent'\nimport { ConfidenceBadge } from '../ConfidenceBadge'\nimport { ConfidenceMeter } from '../ConfidenceMeter'\n\nexport type ConfidenceBreakdownProps = {\n confidence: ConfidenceBreakdownType\n expandable?: boolean\n defaultExpanded?: boolean\n className?: string\n}\n\nconst dimensions: { key: keyof Pick<ConfidenceBreakdownType, 'retrieval_quality' | 'source_authority' | 'answer_groundedness' | 'recency'>; label: string }[] = [\n { key: 'retrieval_quality', label: 'Retrieval Quality' },\n { key: 'source_authority', label: 'Source Authority' },\n { key: 'answer_groundedness', label: 'Answer Groundedness' },\n { key: 'recency', label: 'Recency' },\n]\n\nfunction ConfidenceBreakdown({\n confidence,\n expandable = true,\n defaultExpanded = false,\n className,\n}: ConfidenceBreakdownProps) {\n const [expanded, setExpanded] = useState(defaultExpanded)\n\n const isExpanded = expandable ? expanded : true\n\n return (\n <div className={`rounded-xl border border-border bg-surface ${className ?? ''}`} data-testid=\"confidence-breakdown\">\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-between px-4 py-3 text-left\"\n onClick={() => expandable && setExpanded((prev) => !prev)}\n aria-expanded={isExpanded}\n disabled={!expandable}\n >\n <span className=\"text-sm font-medium text-text-primary\">Confidence</span>\n <ConfidenceBadge confidence={confidence} />\n </button>\n\n {isExpanded && (\n <div\n className=\"border-t border-border px-4 py-3 space-y-3 animate-in fade-in slide-in-from-top-1 duration-200\"\n data-testid=\"confidence-breakdown-details\"\n >\n {dimensions.map((dim) => (\n <ConfidenceMeter\n key={dim.key}\n value={confidence[dim.key]}\n label={dim.label}\n />\n ))}\n {confidence.reasoning && (\n <p className=\"text-xs text-text-secondary mt-2\">{confidence.reasoning}</p>\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport { ConfidenceBreakdown }\n","import React from 'react'\n\nexport type ConfidenceMeterProps = {\n value: number // 0-1\n label: string\n className?: string\n}\n\nfunction getBarColor(value: number): string {\n if (value >= 0.8) return 'bg-green-500'\n if (value >= 0.5) return 'bg-yellow-500'\n return 'bg-red-500'\n}\n\nfunction ConfidenceMeter({ value, label, className }: ConfidenceMeterProps) {\n const clamped = Math.max(0, Math.min(1, value))\n const pct = Math.round(clamped * 100)\n\n return (\n <div className={className} data-testid=\"confidence-meter\">\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-xs font-medium text-text-secondary\">{label}</span>\n <span className=\"text-xs text-text-secondary\">{pct}%</span>\n </div>\n <div\n className=\"h-2 w-full rounded-full bg-surface-secondary overflow-hidden\"\n role=\"progressbar\"\n aria-valuenow={pct}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`${label}: ${pct}%`}\n >\n <div\n className={`h-full rounded-full transition-all duration-300 ${getBarColor(clamped)}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n )\n}\n\nexport { ConfidenceMeter }\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport type { VerificationResult } from '../../types/agent'\n\nexport type VerificationBadgeProps = {\n verification: VerificationResult\n className?: string\n}\n\nconst config = {\n passed: {\n intent: 'success' as const,\n label: 'Verified',\n icon: '\\u2713',\n ariaLabel: 'Verification passed',\n },\n flagged: {\n intent: 'warning' as const,\n label: 'Flagged',\n icon: '\\u26A0',\n ariaLabel: 'Verification flagged',\n },\n failed: {\n intent: 'error' as const,\n label: 'Failed',\n icon: '\\u2717',\n ariaLabel: 'Verification failed',\n },\n} as const\n\nfunction VerificationBadge({ verification, className }: VerificationBadgeProps) {\n const { intent, label, icon, ariaLabel } = config[verification.status]\n\n return (\n <Badge\n intent={intent}\n size=\"sm\"\n role=\"status\"\n aria-label={ariaLabel}\n className={className}\n >\n <span aria-hidden=\"true\" className=\"mr-1\">{icon}</span>\n {label}\n </Badge>\n )\n}\n\nexport { VerificationBadge }\n","import React, { useState } from 'react'\nimport type { VerificationResult } from '../../types/agent'\nimport { VerificationBadge } from '../VerificationBadge'\n\nexport type VerificationDetailProps = {\n verification: VerificationResult\n expandable?: boolean\n defaultExpanded?: boolean\n className?: string\n}\n\nfunction VerificationDetail({\n verification,\n expandable = true,\n defaultExpanded = false,\n className,\n}: VerificationDetailProps) {\n const [expanded, setExpanded] = useState(defaultExpanded)\n\n const isExpanded = expandable ? expanded : true\n\n return (\n <div className={`rounded-xl border border-border bg-surface ${className ?? ''}`} data-testid=\"verification-detail\">\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-between px-4 py-3 text-left\"\n onClick={() => expandable && setExpanded((prev) => !prev)}\n aria-expanded={isExpanded}\n disabled={!expandable}\n >\n <span className=\"text-sm font-medium text-text-primary\">Verification</span>\n <VerificationBadge verification={verification} />\n </button>\n\n {isExpanded && (\n <div\n className=\"border-t border-border px-4 py-3 space-y-2 animate-in fade-in slide-in-from-top-1 duration-200\"\n data-testid=\"verification-detail-content\"\n >\n <div className=\"flex gap-4 text-xs text-text-secondary\">\n <span data-testid=\"claims-checked\">\n Claims checked: <strong className=\"text-text-primary\">{verification.claims_checked}</strong>\n </span>\n <span data-testid=\"claims-verified\">\n Claims verified: <strong className=\"text-text-primary\">{verification.claims_verified}</strong>\n </span>\n </div>\n\n {verification.flags.length > 0 && (\n <ul className=\"mt-2 space-y-1\" data-testid=\"verification-flags\">\n {verification.flags.map((flag, i) => (\n <li key={i} className=\"flex items-start gap-2 text-xs text-text-secondary\">\n <span className=\"text-yellow-500 shrink-0\" aria-hidden=\"true\">{'\\u26A0'}</span>\n {flag}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport { VerificationDetail }\n","import { useMemo } from 'react'\nimport type { AgentInfo } from '../types/agent'\n\nexport interface AgentThemeResult {\n accent: string\n icon: AgentInfo['icon'] | null\n label: string\n}\n\nconst DEFAULT_ACCENT = '#6366f1'\nconst DEFAULT_LABEL = 'Agent'\n\nexport function useAgentTheme(\n agentId: string | null | undefined,\n agentThemes?: Record<string, AgentInfo>,\n): AgentThemeResult {\n return useMemo(() => {\n if (!agentId) {\n return { accent: DEFAULT_ACCENT, icon: null, label: DEFAULT_LABEL }\n }\n\n const theme = agentThemes?.[agentId]\n if (!theme) {\n return { accent: DEFAULT_ACCENT, icon: null, label: agentId }\n }\n\n return {\n accent: theme.accent ?? DEFAULT_ACCENT,\n icon: theme.icon ?? null,\n label: theme.label,\n }\n }, [agentId, agentThemes])\n}\n","import React from 'react'\nimport type { AgentInfo } from '../../types/agent'\nimport { useAgentTheme } from '../../hooks/useAgentTheme'\n\nexport type AgentAvatarProps = {\n agentId?: string\n agent?: AgentInfo\n size?: 'sm' | 'md' | 'lg'\n agentThemes?: Record<string, AgentInfo>\n className?: string\n}\n\nconst sizeMap = {\n sm: 'h-6 w-6 text-xs',\n md: 'h-8 w-8 text-sm',\n lg: 'h-10 w-10 text-base',\n} as const\n\nconst iconSizeMap = {\n sm: 14,\n md: 18,\n lg: 22,\n} as const\n\nfunction AgentAvatar({ agentId, agent, size = 'md', agentThemes, className }: AgentAvatarProps) {\n const resolvedId = agent?.id ?? agentId ?? null\n const themes = agent ? { ...agentThemes, [agent.id]: agent } : agentThemes\n const { accent, icon: Icon, label } = useAgentTheme(resolvedId, themes)\n\n const initial = label.charAt(0).toUpperCase()\n\n return (\n <div\n className={`inline-flex items-center justify-center rounded-full shrink-0 font-medium text-white ${sizeMap[size]} ${className ?? ''}`}\n style={{ backgroundColor: accent }}\n role=\"img\"\n aria-label={`${label} avatar`}\n data-testid=\"agent-avatar\"\n >\n {Icon ? (\n <Icon size={iconSizeMap[size]} className=\"text-white\" />\n ) : (\n <span aria-hidden=\"true\">{initial}</span>\n )}\n </div>\n )\n}\n\nexport { AgentAvatar }\n","import React from 'react'\nimport type { AgentInfo } from '../../types/agent'\n\nexport type AgentLabelProps = {\n agent: AgentInfo\n className?: string\n}\n\nfunction AgentLabel({ agent, className }: AgentLabelProps) {\n const accent = agent.accent ?? '#6366f1'\n\n return (\n <span\n className={`text-xs font-medium ${className ?? ''}`}\n data-testid=\"agent-label\"\n >\n Answered by{' '}\n <span style={{ color: accent }}>{agent.label}</span>\n </span>\n )\n}\n\nexport { AgentLabel }\n","import React from 'react'\nimport type { AgentInfo } from '../../types/agent'\nimport { AgentAvatar } from '../AgentAvatar'\n\nexport type AgentHandoffProps = {\n from: AgentInfo\n to: AgentInfo\n className?: string\n}\n\nfunction AgentHandoff({ from, to, className }: AgentHandoffProps) {\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3 rounded-xl border border-border bg-surface ${className ?? ''}`}\n data-testid=\"agent-handoff\"\n >\n <div className=\"flex items-center gap-2 animate-in fade-in slide-in-from-left-2 duration-300\">\n <AgentAvatar agent={from} size=\"sm\" />\n <span className=\"text-xs text-text-secondary\">{from.label}</span>\n </div>\n\n <span className=\"text-text-secondary text-xs\" aria-hidden=\"true\">{'\\u2192'}</span>\n\n <div className=\"flex items-center gap-2 animate-in fade-in slide-in-from-right-2 duration-300\">\n <AgentAvatar agent={to} size=\"sm\" />\n <span className=\"text-xs text-text-secondary\">{to.label}</span>\n </div>\n\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n Handing off from {from.label} to {to.label}\n </div>\n </div>\n )\n}\n\nexport { AgentHandoff }\n","import React from 'react'\n\nexport type RoutingIndicatorProps = {\n from: string\n to: string\n reason?: string\n className?: string\n}\n\nfunction RoutingIndicator({ from, to, reason, className }: RoutingIndicatorProps) {\n return (\n <div\n className={`inline-flex items-center gap-1.5 rounded-md border border-border/50 bg-surface-secondary/50 px-2.5 py-1 font-mono text-[11px] text-text-secondary ${className ?? ''}`}\n data-testid=\"routing-indicator\"\n >\n <span className=\"opacity-60\">Routed:</span>\n <span>{from}</span>\n <span className=\"opacity-40\" aria-hidden=\"true\">{'\\u2192'}</span>\n <span>{to}</span>\n {reason && (\n <span className=\"opacity-50 ml-1\" title={reason}>\n ({reason})\n </span>\n )}\n </div>\n )\n}\n\nexport { RoutingIndicator }\n","import React from 'react'\nimport { useReducedMotion } from '@surf-kit/hooks'\n\ntype ThinkingIndicatorProps = {\n label?: string\n className?: string\n}\n\nfunction ThinkingIndicator({ label = 'Thinking...', className }: ThinkingIndicatorProps) {\n const reducedMotion = useReducedMotion()\n\n return (\n <span\n role=\"status\"\n className={`inline-flex items-center gap-2 text-sm ${className ?? ''}`}\n data-testid=\"thinking-indicator\"\n >\n <span className=\"text-text-secondary\">{label}</span>\n {!reducedMotion && (\n <span className=\"flex gap-1\" aria-hidden=\"true\" data-testid=\"animated-dots\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-current animate-bounce [animation-delay:0ms]\" />\n <span className=\"w-1.5 h-1.5 rounded-full bg-current animate-bounce [animation-delay:150ms]\" />\n <span className=\"w-1.5 h-1.5 rounded-full bg-current animate-bounce [animation-delay:300ms]\" />\n </span>\n )}\n </span>\n )\n}\n\nexport { ThinkingIndicator }\nexport type { ThinkingIndicatorProps }\n","import React from 'react'\nimport { Spinner } from '@surf-kit/core'\n\ntype ToolExecutionProps = {\n tool: string\n label?: string\n className?: string\n}\n\nconst defaultLabels: Record<string, string> = {\n search: 'Searching knowledge base...',\n retrieve: 'Retrieving documents...',\n calculate: 'Calculating...',\n}\n\nfunction ToolExecution({ tool, label, className }: ToolExecutionProps) {\n const displayLabel = label ?? defaultLabels[tool] ?? `Running ${tool}...`\n\n return (\n <div\n className={`flex items-center gap-2 text-sm text-text-secondary ${className ?? ''}`}\n role=\"status\"\n data-testid=\"tool-execution\"\n >\n <span aria-hidden=\"true\">\n <Spinner size=\"sm\" />\n </span>\n <span>{displayLabel}</span>\n </div>\n )\n}\n\nexport { ToolExecution }\nexport type { ToolExecutionProps }\n","import React from 'react'\nimport { Spinner } from '@surf-kit/core'\nimport type { Source } from '../../types/agent'\n\ntype RetrievalProgressProps = {\n sources: Source[]\n isActive: boolean\n className?: string\n}\n\nfunction RetrievalProgress({ sources, isActive, className }: RetrievalProgressProps) {\n return (\n <div\n className={`space-y-2 ${className ?? ''}`}\n role=\"status\"\n aria-label={\n isActive\n ? `Retrieving sources, ${sources.length} found so far`\n : `${sources.length} sources found`\n }\n data-testid=\"retrieval-progress\"\n >\n {isActive && (\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <span aria-hidden=\"true\">\n <Spinner size=\"sm\" />\n </span>\n <span>Retrieving sources...</span>\n </div>\n )}\n\n {sources.length > 0 && (\n <ul className=\"space-y-1\" data-testid=\"source-list\">\n {sources.map((source, index) => (\n <li\n key={source.document_id}\n className=\"text-sm text-text-secondary flex items-center gap-2 animate-in fade-in slide-in-from-left-2\"\n style={{ animationDelay: `${index * 100}ms`, animationFillMode: 'both' }}\n data-testid=\"retrieval-source-item\"\n >\n <span className=\"w-1.5 h-1.5 rounded-full bg-accent flex-shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate\">{source.title}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\nexport { RetrievalProgress }\nexport type { RetrievalProgressProps }\n","import React from 'react'\n\ntype VerificationProgressProps = {\n isActive: boolean\n label?: string\n className?: string\n}\n\nfunction VerificationProgress({\n isActive,\n label = 'Checking accuracy...',\n className,\n}: VerificationProgressProps) {\n if (!isActive) return null\n\n return (\n <div\n className={`flex items-center gap-2 text-sm ${className ?? ''}`}\n role=\"status\"\n data-testid=\"verification-progress\"\n >\n <svg\n className=\"w-4 h-4 animate-spin text-accent\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\n </svg>\n <span className=\"text-accent animate-pulse\">{label}</span>\n </div>\n )\n}\n\nexport { VerificationProgress }\nexport type { VerificationProgressProps }\n","import React, { useEffect, useState } from 'react'\n\nexport type TypewriterTextProps = {\n text: string\n speed?: number // ms per char, default 30\n delay?: number // ms to wait before starting, default 0\n onComplete?: () => void\n className?: string\n showCursor?: boolean // default true\n}\n\nexport function TypewriterText({\n text,\n speed = 30,\n delay = 0,\n onComplete,\n className = '',\n showCursor = true,\n}: TypewriterTextProps) {\n const [displayedText, setDisplayedText] = useState('')\n const [isComplete, setIsComplete] = useState(false)\n\n useEffect(() => {\n setDisplayedText('')\n setIsComplete(false)\n let index = 0\n let interval: ReturnType<typeof setInterval>\n const timeout = setTimeout(() => {\n interval = setInterval(() => {\n if (index < text.length) {\n setDisplayedText(text.slice(0, index + 1))\n index++\n } else {\n clearInterval(interval)\n setIsComplete(true)\n onComplete?.()\n }\n }, speed)\n }, delay)\n return () => {\n clearTimeout(timeout)\n clearInterval(interval)\n }\n }, [text, speed, delay, onComplete])\n\n return (\n <span className={className}>\n {displayedText}\n {showCursor && !isComplete && (\n <span className=\"typewriter-cursor\" aria-hidden=\"true\" />\n )}\n </span>\n )\n}\n","import { twMerge } from 'tailwind-merge'\nimport React from 'react'\nimport type { ConversationSummary } from '../../types/chat'\n\nexport type ConversationListProps = {\n conversations: ConversationSummary[]\n activeId?: string\n onSelect: (id: string) => void\n onDelete?: (id: string) => void\n onNew?: () => void\n className?: string\n}\n\nfunction ConversationList({\n conversations,\n activeId,\n onSelect,\n onDelete,\n onNew,\n className,\n}: ConversationListProps) {\n return (\n <nav\n aria-label=\"Conversation list\"\n className={twMerge('flex flex-col h-full bg-canvas', className)}\n >\n {onNew && (\n <div className=\"p-3 border-b border-border\">\n <button\n type=\"button\"\n onClick={onNew}\n className=\"w-full px-4 py-2.5 rounded-xl text-sm font-semibold bg-accent text-white hover:bg-accent-hover transition-all duration-200\"\n >\n New conversation\n </button>\n </div>\n )}\n\n <ul role=\"list\" className=\"flex-1 overflow-y-auto\">\n {conversations.map((conversation) => {\n const isActive = conversation.id === activeId\n return (\n <li\n key={conversation.id}\n className={twMerge(\n 'flex items-start border-b border-border transition-colors duration-200',\n 'hover:bg-surface',\n isActive && 'bg-surface-raised border-l-2 border-l-accent',\n )}\n >\n <button\n type=\"button\"\n onClick={() => onSelect(conversation.id)}\n aria-current={isActive ? 'true' : undefined}\n className=\"flex-1 min-w-0 text-left px-4 py-3\"\n >\n <div className=\"text-sm font-medium text-brand-cream truncate\">\n {conversation.title}\n </div>\n <div className=\"text-xs text-brand-cream/40 truncate mt-0.5 leading-relaxed\">\n {conversation.lastMessage}\n </div>\n </button>\n {onDelete && (\n <button\n type=\"button\"\n onClick={() => onDelete(conversation.id)}\n aria-label={`Delete ${conversation.title}`}\n className=\"shrink-0 p-1.5 m-2 rounded-lg text-brand-cream/25 hover:text-brand-watermelon hover:bg-brand-watermelon/10 transition-colors duration-200\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n </svg>\n </button>\n )}\n </li>\n )\n })}\n\n {conversations.length === 0 && (\n <li className=\"px-4 py-8 text-center\">\n <span className=\"text-sm text-brand-cream/30 font-body\">No conversations yet</span>\n </li>\n )}\n </ul>\n </nav>\n )\n}\n\nexport { ConversationList }\n","import { twMerge } from 'tailwind-merge'\nimport React, { useState, useCallback } from 'react'\nimport { AgentChat } from '../../chat/AgentChat'\nimport { ConversationList } from '../../chat/ConversationList'\nimport type { ConversationSummary } from '../../types/chat'\n\nexport type AgentFullPageProps = {\n endpoint: string\n title?: string\n showConversationList?: boolean\n conversations?: ConversationSummary[]\n activeConversationId?: string\n onConversationSelect?: (id: string) => void\n onConversationDelete?: (id: string) => void\n onNewConversation?: () => void\n className?: string\n}\n\nfunction AgentFullPage({\n endpoint,\n title = 'Chat',\n showConversationList = false,\n conversations = [],\n activeConversationId,\n onConversationSelect,\n onConversationDelete,\n onNewConversation,\n className,\n}: AgentFullPageProps) {\n const [sidebarOpen, setSidebarOpen] = useState(false)\n\n const handleSelect = useCallback(\n (id: string) => {\n onConversationSelect?.(id)\n setSidebarOpen(false)\n },\n [onConversationSelect],\n )\n\n return (\n <div\n className={twMerge('flex h-screen w-full overflow-hidden bg-brand-dark', className)}\n data-testid=\"agent-full-page\"\n >\n {/* Sidebar */}\n {showConversationList && (\n <>\n {/* Mobile overlay */}\n {sidebarOpen && (\n <div\n className=\"fixed inset-0 bg-brand-dark/80 backdrop-blur-sm z-30 md:hidden\"\n onClick={() => setSidebarOpen(false)}\n data-testid=\"sidebar-overlay\"\n />\n )}\n\n {/* Sidebar panel */}\n <aside\n className={twMerge(\n 'bg-brand-dark border-r border-brand-gold/15 w-72 shrink-0 flex-col z-40',\n // Desktop: always visible\n 'hidden md:flex',\n // Mobile: overlay when open\n sidebarOpen && 'fixed inset-y-0 left-0 flex md:relative',\n )}\n aria-label=\"Conversations sidebar\"\n >\n <ConversationList\n conversations={conversations}\n activeId={activeConversationId}\n onSelect={handleSelect}\n onDelete={onConversationDelete}\n onNew={onNewConversation}\n />\n </aside>\n </>\n )}\n\n {/* Main chat area */}\n <div className=\"flex-1 flex flex-col min-w-0 bg-brand-dark\">\n {/* Mobile sidebar toggle */}\n {showConversationList && (\n <div className=\"md:hidden flex items-center border-b border-brand-gold/15 px-3 py-2 bg-brand-dark-panel/60 backdrop-blur-sm\">\n <button\n type=\"button\"\n onClick={() => setSidebarOpen(true)}\n aria-label=\"Open conversations sidebar\"\n className=\"p-2 rounded-xl text-brand-cream/60 hover:text-brand-cream hover:bg-brand-dark-panel transition-colors duration-200\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\n </svg>\n </button>\n </div>\n )}\n\n <AgentChat\n endpoint={endpoint}\n title={title}\n className=\"flex-1 rounded-none border-0\"\n />\n </div>\n </div>\n )\n}\n\nexport { AgentFullPage }\n","import { twMerge } from 'tailwind-merge'\nimport React, { useRef, useEffect } from 'react'\nimport { AgentChat } from '../../chat/AgentChat'\n\nexport type AgentPanelProps = {\n endpoint: string\n isOpen: boolean\n onClose: () => void\n side?: 'left' | 'right'\n width?: string | number\n title?: string\n className?: string\n}\n\nfunction AgentPanel({\n endpoint,\n isOpen,\n onClose,\n side = 'right',\n width = 400,\n title = 'Chat',\n className,\n}: AgentPanelProps) {\n const panelRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!isOpen) return\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [isOpen, onClose])\n\n const widthStyle = typeof width === 'number' ? `${width}px` : width\n\n return (\n <div\n className={twMerge('fixed inset-0 z-50', !isOpen && 'pointer-events-none')}\n aria-hidden={!isOpen}\n >\n {/* Backdrop */}\n <div\n className={twMerge(\n 'fixed inset-0 transition-opacity duration-300',\n isOpen\n ? 'opacity-100 bg-brand-dark/70 backdrop-blur-sm pointer-events-auto'\n : 'opacity-0 pointer-events-none',\n )}\n onClick={isOpen ? onClose : undefined}\n data-testid=\"panel-backdrop\"\n />\n\n {/* Panel */}\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-label={title}\n aria-modal={isOpen ? 'true' : undefined}\n style={{ width: widthStyle, maxWidth: '100vw' }}\n className={twMerge(\n 'fixed top-0 h-full flex flex-col z-50 bg-brand-dark shadow-card',\n 'transition-transform duration-300 ease-in-out',\n side === 'left'\n ? `left-0 border-r border-brand-gold/15 ${isOpen ? 'translate-x-0' : '-translate-x-full'}`\n : `right-0 border-l border-brand-gold/15 ${isOpen ? 'translate-x-0' : 'translate-x-full'}`,\n className,\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-brand-gold/15 px-5 py-3.5 bg-brand-dark-panel/60 backdrop-blur-sm shrink-0\">\n <h2 className=\"text-base font-display font-semibold text-brand-cream\">{title}</h2>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close panel\"\n className=\"rounded-xl p-2 text-brand-cream/40 hover:text-brand-cream/80 hover:bg-brand-cream/5 transition-colors duration-200\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n\n {/* Chat */}\n <AgentChat\n endpoint={endpoint}\n title={title}\n showHeader={false}\n showWelcomeTitle={false}\n className=\"flex-1 rounded-none border-0\"\n />\n </div>\n </div>\n )\n}\n\nexport { AgentPanel }\n","import { twMerge } from 'tailwind-merge'\nimport React, { useState, useCallback } from 'react'\nimport { AgentChat } from '../../chat/AgentChat'\n\nexport type AgentWidgetProps = {\n endpoint: string\n position?: 'bottom-right' | 'bottom-left'\n triggerLabel?: string\n title?: string\n className?: string\n}\n\nfunction AgentWidget({\n endpoint,\n position = 'bottom-right',\n triggerLabel = 'Chat',\n title = 'Chat',\n className,\n}: AgentWidgetProps) {\n const [isOpen, setIsOpen] = useState(false)\n\n const toggle = useCallback(() => {\n setIsOpen((prev) => !prev)\n }, [])\n\n const positionClasses = position === 'bottom-left' ? 'left-4 bottom-4' : 'right-4 bottom-4'\n const popoverPositionClasses = position === 'bottom-left' ? 'left-4 bottom-20' : 'right-4 bottom-20'\n const popoverOrigin = position === 'bottom-left' ? 'origin-bottom-left' : 'origin-bottom-right'\n\n return (\n <div className={className}>\n {/* Popover — always rendered, animated with CSS */}\n <div\n role=\"dialog\"\n aria-label={title}\n aria-hidden={!isOpen}\n className={twMerge(\n 'fixed z-50 flex flex-col',\n 'w-[min(400px,calc(100vw-2rem))] h-[min(600px,calc(100vh-6rem))]',\n 'rounded-2xl overflow-hidden border border-brand-gold/15',\n 'bg-brand-dark/95 backdrop-blur-[12px] shadow-card',\n popoverPositionClasses,\n popoverOrigin,\n 'transition-all duration-200 ease-out',\n isOpen\n ? 'opacity-100 scale-100 pointer-events-auto translate-y-0'\n : 'opacity-0 scale-95 pointer-events-none translate-y-2',\n )}\n >\n {/* Popover header */}\n <div className=\"flex items-center justify-between px-4 py-2.5 bg-brand-dark-panel/80 border-b border-brand-gold/15 shrink-0\">\n <h2 className=\"text-sm font-display font-semibold text-brand-cream\">{title}</h2>\n <button\n type=\"button\"\n onClick={() => setIsOpen(false)}\n aria-label=\"Minimize chat\"\n className=\"rounded-lg p-1.5 text-brand-cream/40 hover:text-brand-cream/70 transition-colors duration-200\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n\n <AgentChat\n endpoint={endpoint}\n title={title}\n showHeader={false}\n showWelcomeTitle={false}\n className=\"flex-1 rounded-none border-0 min-h-0\"\n />\n </div>\n\n {/* FAB — gold glow */}\n <button\n type=\"button\"\n onClick={toggle}\n aria-label={isOpen ? 'Close chat' : triggerLabel}\n aria-expanded={isOpen}\n className={twMerge(\n 'fixed z-50 flex items-center justify-center w-14 h-14 rounded-full',\n 'bg-brand-blue text-brand-cream shadow-glow-cyan',\n 'hover:bg-brand-cyan hover:shadow-glow-cyan hover:scale-105',\n 'active:scale-95',\n 'transition-all duration-200',\n positionClasses,\n )}\n >\n {isOpen ? (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n ) : (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n )}\n </button>\n </div>\n )\n}\n\nexport { AgentWidget }\n","import { twMerge } from 'tailwind-merge'\nimport React from 'react'\nimport { AgentChat } from '../../chat/AgentChat'\n\nexport type AgentEmbedProps = {\n endpoint: string\n title?: string\n className?: string\n}\n\nfunction AgentEmbed({\n endpoint,\n title = 'Chat',\n className,\n}: AgentEmbedProps) {\n return (\n <div\n className={twMerge('w-full h-full min-h-0', className)}\n data-testid=\"agent-embed\"\n >\n <AgentChat\n endpoint={endpoint}\n title={title}\n className=\"h-full rounded-none border-0\"\n />\n </div>\n )\n}\n\nexport { AgentEmbed }\n","import React, { useState } from 'react'\n\ntype FeedbackRating = 'positive' | 'negative'\n\ntype ThumbsFeedbackProps = {\n messageId: string\n onFeedback: (messageId: string, rating: FeedbackRating, comment?: string) => void\n state?: FeedbackRating | null\n onNegative?: () => void\n className?: string\n}\n\nfunction ThumbsFeedback({\n messageId,\n onFeedback,\n state = null,\n onNegative,\n className,\n}: ThumbsFeedbackProps) {\n const [selected, setSelected] = useState<FeedbackRating | null>(state)\n\n const handleClick = (rating: FeedbackRating) => {\n setSelected(rating)\n onFeedback(messageId, rating)\n if (rating === 'negative' && onNegative) {\n onNegative()\n }\n }\n\n return (\n <div\n className={`inline-flex items-center gap-0.5 ${className ?? ''}`}\n role=\"group\"\n aria-label=\"Rate this response\"\n data-testid=\"thumbs-feedback\"\n >\n <button\n type=\"button\"\n onClick={() => handleClick('positive')}\n aria-label=\"Thumbs up\"\n aria-pressed={selected === 'positive'}\n className={`p-1.5 rounded-md transition-colors duration-200 ${\n selected === 'positive'\n ? 'text-brand-cyan bg-brand-cyan/15'\n : 'text-brand-cream/30 hover:text-brand-cyan hover:bg-brand-cyan/10'\n }`}\n data-testid=\"thumbs-up\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M7 10v12\" />\n <path d=\"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2h0a3.13 3.13 0 0 1 3 3.88Z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleClick('negative')}\n aria-label=\"Thumbs down\"\n aria-pressed={selected === 'negative'}\n className={`p-1.5 rounded-md transition-colors duration-200 ${\n selected === 'negative'\n ? 'text-brand-watermelon bg-brand-watermelon/15'\n : 'text-brand-cream/30 hover:text-brand-watermelon hover:bg-brand-watermelon/10'\n }`}\n data-testid=\"thumbs-down\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M17 14V2\" />\n <path d=\"M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22h0a3.13 3.13 0 0 1-3-3.88Z\" />\n </svg>\n </button>\n </div>\n )\n}\n\nexport { ThumbsFeedback }\nexport type { ThumbsFeedbackProps, FeedbackRating }\n","import React, { useState } from 'react'\nimport { Dialog, Button, TextArea } from '@surf-kit/core'\n\ntype FeedbackDialogProps = {\n isOpen: boolean\n onClose: () => void\n onSubmit: (comment: string) => void\n className?: string\n}\n\nfunction FeedbackDialog({ isOpen, onClose, onSubmit, className }: FeedbackDialogProps) {\n const [comment, setComment] = useState('')\n\n const handleSubmit = () => {\n onSubmit(comment)\n setComment('')\n onClose()\n }\n\n return (\n <Dialog\n isOpen={isOpen}\n onClose={onClose}\n title=\"Share your feedback\"\n size=\"sm\"\n className={className}\n footer={\n <>\n <Button intent=\"ghost\" onPress={onClose}>\n Cancel\n </Button>\n <Button intent=\"primary\" onPress={handleSubmit} isDisabled={comment.trim().length === 0}>\n Submit\n </Button>\n </>\n }\n >\n <TextArea\n label=\"What could be improved?\"\n value={comment}\n onChange={setComment}\n placeholder=\"Tell us what went wrong or how this response could be better...\"\n rows={4}\n data-testid=\"feedback-textarea\"\n />\n </Dialog>\n )\n}\n\nexport { FeedbackDialog }\nexport type { FeedbackDialogProps }\n","import React from 'react'\n\ntype FeedbackConfirmationProps = {\n variant?: 'inline' | 'toast'\n className?: string\n}\n\nfunction FeedbackConfirmation({ variant = 'inline', className }: FeedbackConfirmationProps) {\n if (variant === 'toast') {\n return (\n <div\n role=\"status\"\n className={`fixed bottom-4 right-4 bg-surface border border-border rounded-lg px-4 py-3 shadow-lg text-sm text-text-primary ${className ?? ''}`}\n data-testid=\"feedback-confirmation\"\n >\n Thanks for your feedback\n </div>\n )\n }\n\n return (\n <span\n role=\"status\"\n className={`text-sm text-text-secondary ${className ?? ''}`}\n data-testid=\"feedback-confirmation\"\n >\n Thanks for your feedback\n </span>\n )\n}\n\nexport { FeedbackConfirmation }\nexport type { FeedbackConfirmationProps }\n"],"mappings":"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","names":["twMerge","config","twMerge","useRef","twMerge","Badge","jsx","twMerge","jsx","jsxs","jsx","jsxs","twMerge","jsx","jsx","jsxs","getConfidenceIntent","Badge","jsx","jsxs","twMerge","jsx","jsxs","useRef","twMerge","twMerge","useState","useRef","useCallback","jsx","jsxs","twMerge","jsx","jsxs","useEffect","useRef","useState","useRef","useEffect","jsx","jsxs","useRef","useEffect","jsx","jsxs","twMerge","jsx","jsxs","jsx","jsxs","Badge","jsx","jsxs","getConfidenceIntent","Badge","jsxs","Badge","jsx","useState","jsx","jsxs","jsx","jsxs","useState","Badge","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","Spinner","jsx","jsxs","Spinner","jsx","jsxs","jsx","jsxs","useEffect","useState","jsx","jsxs","twMerge","jsx","jsxs","twMerge","useState","useCallback","jsx","jsxs","useState","useCallback","twMerge","twMerge","useRef","useEffect","jsx","jsxs","useRef","useEffect","twMerge","twMerge","useState","useCallback","jsx","jsxs","useState","useCallback","twMerge","twMerge","jsx","twMerge","useState","jsx","jsxs","useState","Button","Fragment","jsx","jsxs","jsx"]}
1
+ {"version":3,"sources":["../src/chat/AgentChat/AgentChat.tsx","../src/hooks/useAgentChat.ts","../src/chat/MessageThread/MessageThread.tsx","../src/chat/MessageBubble/MessageBubble.tsx","../src/response/AgentResponse/AgentResponse.tsx","../src/response/ResponseMessage/ResponseMessage.tsx","../src/response/StructuredResponse/StructuredResponse.tsx","../src/sources/SourceList/SourceList.tsx","../src/sources/SourceCard/SourceCard.tsx","../src/response/FollowUpChips/FollowUpChips.tsx","../src/chat/MessageComposer/MessageComposer.tsx","../src/chat/WelcomeScreen/WelcomeScreen.tsx","../src/streaming/StreamingMessage/StreamingMessage.tsx","../src/hooks/useCharacterDrain.ts","../src/response/ErrorResponse/ErrorResponse.tsx","../src/sources/SourceInline/SourceInline.tsx","../src/sources/SourceDrawer/SourceDrawer.tsx","../src/sources/SourceBadge/SourceBadge.tsx","../src/confidence/ConfidenceBadge/ConfidenceBadge.tsx","../src/confidence/ConfidenceBreakdown/ConfidenceBreakdown.tsx","../src/confidence/ConfidenceMeter/ConfidenceMeter.tsx","../src/confidence/VerificationBadge/VerificationBadge.tsx","../src/confidence/VerificationDetail/VerificationDetail.tsx","../src/hooks/useAgentTheme.ts","../src/agent-identity/AgentAvatar/AgentAvatar.tsx","../src/agent-identity/AgentLabel/AgentLabel.tsx","../src/agent-identity/AgentHandoff/AgentHandoff.tsx","../src/agent-identity/RoutingIndicator/RoutingIndicator.tsx","../src/streaming/ThinkingIndicator/ThinkingIndicator.tsx","../src/streaming/ToolExecution/ToolExecution.tsx","../src/streaming/RetrievalProgress/RetrievalProgress.tsx","../src/streaming/VerificationProgress/VerificationProgress.tsx","../src/streaming/TypewriterText/TypewriterText.tsx","../src/streaming/TypingIndicator/TypingIndicator.tsx","../src/streaming/TextGlimmer/TextGlimmer.tsx","../src/streaming/StreamingList/StreamingList.tsx","../src/streaming/StreamingStructure/StreamingStructure.tsx","../src/chat/ConversationList/ConversationList.tsx","../src/layouts/AgentFullPage/AgentFullPage.tsx","../src/layouts/AgentPanel/AgentPanel.tsx","../src/layouts/AgentWidget/AgentWidget.tsx","../src/layouts/AgentEmbed/AgentEmbed.tsx","../src/mcp/MCPToolCall/MCPToolCall.tsx","../src/mcp/MCPResourceView/MCPResourceView.tsx","../src/mcp/MCPServerStatus/MCPServerStatus.tsx","../src/mcp/MCPApprovalDialog/MCPApprovalDialog.tsx","../src/feedback/ThumbsFeedback/ThumbsFeedback.tsx","../src/feedback/FeedbackDialog/FeedbackDialog.tsx","../src/feedback/FeedbackConfirmation/FeedbackConfirmation.tsx"],"sourcesContent":["import { twMerge } from 'tailwind-merge'\nimport React from 'react'\nimport { useAgentChat } from '../../hooks/useAgentChat'\nimport { MessageThread } from '../MessageThread'\nimport { MessageComposer } from '../MessageComposer'\nimport { WelcomeScreen } from '../WelcomeScreen'\nimport { StreamingMessage } from '../../streaming/StreamingMessage'\nimport type { ChatMessage } from '../../types/chat'\n\nexport type AgentChatProps = {\n endpoint: string\n title?: string\n welcomeTitle?: string\n welcomeMessage?: string\n suggestedQuestions?: string[]\n showHeader?: boolean\n showWelcomeTitle?: boolean\n showSources?: boolean\n showConfidence?: boolean\n showVerification?: boolean\n enableFeedback?: boolean\n onMessage?: (message: ChatMessage) => void\n className?: string\n}\n\nfunction AgentChat({\n endpoint,\n title = 'Chat',\n welcomeTitle,\n welcomeMessage = 'How can I help you today?',\n suggestedQuestions = [],\n showHeader = true,\n showWelcomeTitle = true,\n showSources,\n showConfidence,\n showVerification,\n className,\n}: AgentChatProps) {\n const { state, actions } = useAgentChat({ apiUrl: endpoint })\n\n const hasMessages = state.messages.length > 0\n\n const handleSend = (content: string) => {\n void actions.sendMessage(content)\n }\n\n const handleQuestionSelect = (question: string) => {\n void actions.sendMessage(question)\n }\n\n return (\n <div\n className={twMerge(\n 'flex flex-col h-full bg-canvas border border-border rounded-xl overflow-hidden',\n className,\n )}\n >\n {showHeader && (\n <div className=\"flex items-center justify-between border-b border-border px-4 py-3 bg-surface-raised shrink-0\">\n <h1 className=\"text-base font-semibold text-text-primary\">{title}</h1>\n </div>\n )}\n\n {hasMessages ? (\n <MessageThread\n messages={state.messages}\n streamingSlot={\n state.isLoading ? (\n <StreamingMessage\n stream={{\n active: state.isLoading,\n phase: state.streamPhase,\n content: state.streamingContent,\n sources: [],\n agent: null,\n agentLabel: null,\n }}\n />\n ) : undefined\n }\n showSources={showSources}\n showConfidence={showConfidence}\n showVerification={showVerification}\n />\n ) : (\n <WelcomeScreen\n title={showWelcomeTitle ? (welcomeTitle ?? title) : ''}\n message={welcomeMessage}\n suggestedQuestions={suggestedQuestions}\n onQuestionSelect={handleQuestionSelect}\n />\n )}\n\n <MessageComposer onSend={handleSend} isLoading={state.isLoading} />\n </div>\n )\n}\n\nexport { AgentChat }\n","import { useReducer, useCallback, useRef } from 'react'\nimport type { ChatMessage, ChatError } from '../types/chat'\nimport type { AgentResponse } from '../types/agent'\nimport type { StreamState } from '../types/streaming'\nimport type { AgentChatConfig } from '../types/config'\n\n// ── State ──────────────────────────────────────────────────────────────\n\nexport interface AgentChatState {\n messages: ChatMessage[]\n conversationId: string | null\n isLoading: boolean\n error: ChatError | null\n inputValue: string\n streamPhase: StreamState['phase']\n streamingContent: string\n}\n\nconst initialState: AgentChatState = {\n messages: [],\n conversationId: null,\n isLoading: false,\n error: null,\n inputValue: '',\n streamPhase: 'idle',\n streamingContent: '',\n}\n\n// ── Actions ────────────────────────────────────────────────────────────\n\ntype Action =\n | { type: 'SET_INPUT'; value: string }\n | { type: 'SEND_START'; message: ChatMessage }\n | { type: 'STREAM_PHASE'; phase: StreamState['phase'] }\n | { type: 'STREAM_CONTENT'; content: string }\n | { type: 'SEND_SUCCESS'; message: ChatMessage; streamingContent: string; conversationId: string | null }\n | { type: 'SEND_ERROR'; error: ChatError }\n | { type: 'LOAD_CONVERSATION'; conversationId: string; messages: ChatMessage[] }\n | { type: 'RESET' }\n | { type: 'CLEAR_ERROR' }\n\nfunction reducer(state: AgentChatState, action: Action): AgentChatState {\n switch (action.type) {\n case 'SET_INPUT':\n return { ...state, inputValue: action.value }\n\n case 'SEND_START':\n return {\n ...state,\n messages: [...state.messages, action.message],\n isLoading: true,\n error: null,\n inputValue: '',\n streamPhase: 'thinking',\n streamingContent: '',\n }\n\n case 'STREAM_PHASE':\n return { ...state, streamPhase: action.phase }\n\n case 'STREAM_CONTENT':\n return { ...state, streamingContent: state.streamingContent + action.content }\n\n case 'SEND_SUCCESS':\n return {\n ...state,\n messages: [...state.messages, action.message],\n conversationId: action.conversationId ?? state.conversationId,\n isLoading: false,\n streamPhase: 'idle',\n streamingContent: '',\n }\n\n case 'SEND_ERROR':\n return {\n ...state,\n isLoading: false,\n error: action.error,\n streamPhase: 'idle',\n streamingContent: '',\n }\n\n case 'LOAD_CONVERSATION':\n return {\n ...state,\n conversationId: action.conversationId,\n messages: action.messages,\n error: null,\n }\n\n case 'RESET':\n return { ...initialState }\n\n case 'CLEAR_ERROR':\n return { ...state, error: null }\n\n default:\n return state\n }\n}\n\n// ── Hook ───────────────────────────────────────────────────────────────\n\nlet msgIdCounter = 0\nfunction generateMessageId(): string {\n return `msg-${Date.now()}-${++msgIdCounter}`\n}\n\nexport interface AgentChatActions {\n sendMessage: (content: string) => Promise<void>\n setInputValue: (value: string) => void\n loadConversation: (conversationId: string, messages: ChatMessage[]) => void\n submitFeedback: (messageId: string, rating: 'positive' | 'negative', comment?: string) => Promise<void>\n retry: () => Promise<void>\n reset: () => void\n}\n\nexport function useAgentChat(config: AgentChatConfig) {\n const [state, dispatch] = useReducer(reducer, initialState)\n const configRef = useRef(config)\n configRef.current = config\n const lastUserMessageRef = useRef<string | null>(null)\n\n const sendMessage = useCallback(\n async (content: string) => {\n const { apiUrl, streamPath = '/chat/stream', headers = {}, timeout = 30000 } = configRef.current\n\n lastUserMessageRef.current = content\n\n const userMessage: ChatMessage = {\n id: generateMessageId(),\n role: 'user',\n content,\n timestamp: new Date(),\n }\n\n dispatch({ type: 'SEND_START', message: userMessage })\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(`${apiUrl}${streamPath}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n ...headers,\n },\n body: JSON.stringify({\n message: content,\n conversation_id: state.conversationId,\n }),\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n dispatch({\n type: 'SEND_ERROR',\n error: {\n code: 'API_ERROR',\n message: `HTTP ${response.status}: ${response.statusText}`,\n retryable: response.status >= 500,\n },\n })\n return\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n dispatch({\n type: 'SEND_ERROR',\n error: { code: 'STREAM_ERROR', message: 'No response body', retryable: true },\n })\n return\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n let accumulatedContent = ''\n let agentResponse: AgentResponse | null = null\n let capturedAgent: string | null = null\n let capturedConversationId: string | null = null\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice(6).trim()\n if (data === '[DONE]') continue\n\n try {\n const event = JSON.parse(data)\n switch (event.type) {\n case 'agent':\n capturedAgent = event.agent as string\n break\n case 'phase':\n dispatch({ type: 'STREAM_PHASE', phase: event.phase })\n break\n case 'delta':\n accumulatedContent += event.content\n dispatch({ type: 'STREAM_CONTENT', content: event.content as string })\n break\n case 'done':\n agentResponse = event.response\n capturedConversationId = (event.conversation_id as string) ?? null\n break\n case 'error':\n dispatch({ type: 'SEND_ERROR', error: event.error })\n return\n }\n } catch {\n // Skip malformed events\n }\n }\n }\n\n const assistantMessage: ChatMessage = {\n id: generateMessageId(),\n role: 'assistant',\n content: agentResponse?.message ?? accumulatedContent,\n response: agentResponse ?? undefined,\n agent: capturedAgent ?? undefined,\n timestamp: new Date(),\n }\n\n dispatch({\n type: 'SEND_SUCCESS',\n message: assistantMessage,\n streamingContent: accumulatedContent,\n conversationId: capturedConversationId,\n })\n } catch (err: unknown) {\n clearTimeout(timeoutId)\n if ((err as Error).name === 'AbortError') {\n dispatch({\n type: 'SEND_ERROR',\n error: { code: 'TIMEOUT', message: 'Request timed out', retryable: true },\n })\n } else {\n dispatch({\n type: 'SEND_ERROR',\n error: {\n code: 'NETWORK_ERROR',\n message: (err as Error).message ?? 'Network error',\n retryable: true,\n },\n })\n }\n }\n },\n [state.conversationId],\n )\n\n const setInputValue = useCallback((value: string) => {\n dispatch({ type: 'SET_INPUT', value })\n }, [])\n\n const loadConversation = useCallback((conversationId: string, messages: ChatMessage[]) => {\n dispatch({ type: 'LOAD_CONVERSATION', conversationId, messages })\n }, [])\n\n const submitFeedback = useCallback(\n async (messageId: string, rating: 'positive' | 'negative', comment?: string) => {\n const { apiUrl, feedbackPath = '/feedback', headers = {} } = configRef.current\n await fetch(`${apiUrl}${feedbackPath}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify({ messageId, rating, comment }),\n })\n },\n [],\n )\n\n const retry = useCallback(async () => {\n if (lastUserMessageRef.current) {\n await sendMessage(lastUserMessageRef.current)\n }\n }, [sendMessage])\n\n const reset = useCallback(() => {\n dispatch({ type: 'RESET' })\n lastUserMessageRef.current = null\n }, [])\n\n const actions: AgentChatActions = {\n sendMessage,\n setInputValue,\n loadConversation,\n submitFeedback,\n retry,\n reset,\n }\n\n return { state, actions }\n}\n","import { twMerge } from 'tailwind-merge'\nimport React, { useEffect, useRef } from 'react'\nimport type { ChatMessage } from '../../types/chat'\nimport { MessageBubble } from '../MessageBubble'\n\nexport type MessageThreadProps = {\n messages: ChatMessage[]\n streamingSlot?: React.ReactNode\n showSources?: boolean\n showConfidence?: boolean\n showVerification?: boolean\n className?: string\n}\n\nfunction MessageThread({ messages, streamingSlot, showSources, showConfidence, showVerification, className }: MessageThreadProps) {\n const bottomRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n bottomRef.current?.scrollIntoView?.({ behavior: 'smooth' })\n }, [messages.length, streamingSlot])\n\n return (\n <div\n role=\"log\"\n aria-live=\"polite\"\n aria-label=\"Message thread\"\n className={twMerge(\n 'flex flex-col gap-4 overflow-y-auto flex-1 px-4 py-6',\n className,\n )}\n >\n {messages.map((message) => (\n <MessageBubble\n key={message.id}\n message={message}\n showSources={showSources}\n showConfidence={showConfidence}\n showVerification={showVerification}\n />\n ))}\n {streamingSlot}\n <div ref={bottomRef} />\n </div>\n )\n}\n\nexport { MessageThread }\n","import { twMerge } from 'tailwind-merge'\nimport React from 'react'\nimport type { ChatMessage } from '../../types/chat'\nimport { AgentResponse } from '../../response/AgentResponse'\nimport { ResponseMessage } from '../../response/ResponseMessage'\n\nexport type MessageBubbleProps = {\n message: ChatMessage\n showAgent?: boolean\n showSources?: boolean\n showConfidence?: boolean\n showVerification?: boolean\n animated?: boolean\n className?: string\n}\n\nfunction MessageBubble({\n message,\n showAgent,\n showSources = true,\n showConfidence = true,\n showVerification = true,\n animated = true,\n className,\n}: MessageBubbleProps) {\n const isUser = message.role === 'user'\n\n if (isUser) {\n return (\n <div\n data-message-id={message.id}\n className={twMerge('flex w-full justify-end', className)}\n >\n <div\n className={twMerge(\n 'max-w-[70%] rounded-[18px] rounded-br-[4px] px-4 py-2.5 bg-accent text-brand-cream break-words whitespace-pre-wrap text-sm leading-relaxed',\n animated && 'motion-safe:animate-slideFromRight',\n )}\n >\n {message.content}\n </div>\n </div>\n )\n }\n\n return (\n <div\n data-message-id={message.id}\n className={twMerge('flex w-full flex-col items-start gap-1.5', className)}\n >\n {showAgent && message.agent && (\n <div className=\"text-[11px] font-semibold uppercase tracking-[0.08em] text-text-muted px-1\">\n {message.agent.replace('_agent', '').replace('_', ' ')}\n </div>\n )}\n <div\n className={twMerge(\n 'max-w-[88%] rounded-[18px] rounded-tl-[4px] px-4 py-3 bg-surface border border-border',\n animated && 'motion-safe:animate-springFromLeft',\n )}\n >\n {message.response ? (\n <AgentResponse\n response={message.response}\n showSources={showSources}\n showConfidence={showConfidence}\n showVerification={showVerification}\n />\n ) : (\n <ResponseMessage content={message.content} />\n )}\n </div>\n </div>\n )\n}\n\nexport { MessageBubble }\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport type { AgentResponse as AgentResponseType } from '../../types/agent'\nimport { ResponseMessage } from '../ResponseMessage'\nimport { StructuredResponse } from '../StructuredResponse'\nimport { SourceList } from '../../sources/SourceList'\nimport { FollowUpChips } from '../FollowUpChips'\n\ntype AgentResponseProps = {\n response: AgentResponseType\n showSources?: boolean\n showConfidence?: boolean\n showVerification?: boolean\n onFollowUp?: (suggestion: string) => void\n onNavigateSource?: (source: AgentResponseType['sources'][number]) => void\n className?: string\n}\n\nfunction getConfidenceIntent(overall: 'high' | 'medium' | 'low') {\n if (overall === 'high') return 'success' as const\n if (overall === 'medium') return 'warning' as const\n return 'error' as const\n}\n\nfunction getVerificationIntent(status: 'passed' | 'flagged' | 'failed') {\n if (status === 'passed') return 'success' as const\n if (status === 'flagged') return 'warning' as const\n return 'error' as const\n}\n\nfunction getVerificationLabel(status: 'passed' | 'flagged' | 'failed') {\n if (status === 'passed') return 'Verified'\n if (status === 'flagged') return 'Flagged'\n return 'Failed'\n}\n\nfunction AgentResponse({\n response,\n showSources = true,\n showConfidence = false,\n showVerification = false,\n onFollowUp,\n onNavigateSource,\n className,\n}: AgentResponseProps) {\n return (\n <div className={`flex flex-col gap-4 ${className ?? ''}`} data-testid=\"agent-response\">\n {/* Lead message — always shown as a short 1-3 sentence summary */}\n <ResponseMessage content={response.message} />\n\n {/* Structured content — rendered when ui_hint is not plain text */}\n {response.ui_hint !== 'text' && response.structured_data && (\n <StructuredResponse\n uiHint={response.ui_hint}\n data={response.structured_data as Record<string, unknown>}\n />\n )}\n\n {/* Confidence & Verification badges */}\n {(showConfidence || showVerification) && (\n <div className=\"flex flex-wrap items-center gap-2 mt-1\" data-testid=\"response-meta\">\n {showConfidence && (\n <Badge\n intent={getConfidenceIntent(response.confidence.overall)}\n size=\"sm\"\n >\n {response.confidence.overall} confidence\n </Badge>\n )}\n {showVerification && (\n <Badge\n intent={getVerificationIntent(response.verification.status)}\n size=\"sm\"\n >\n {getVerificationLabel(response.verification.status)} ({response.verification.claims_verified}/{response.verification.claims_checked})\n </Badge>\n )}\n </div>\n )}\n\n {/* Sources */}\n {showSources && response.sources.length > 0 && (\n <SourceList\n sources={response.sources}\n variant=\"compact\"\n collapsible\n defaultExpanded={false}\n onNavigate={onNavigateSource}\n />\n )}\n\n {/* Follow-up suggestions */}\n {response.follow_up_suggestions.length > 0 && onFollowUp && (\n <FollowUpChips\n suggestions={response.follow_up_suggestions}\n onSelect={onFollowUp}\n />\n )}\n </div>\n )\n}\n\nexport { AgentResponse }\nexport type { AgentResponseProps }\n","import React from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport rehypeSanitize from 'rehype-sanitize'\nimport { twMerge } from 'tailwind-merge'\n\ntype ResponseMessageProps = {\n content: string\n className?: string\n}\n\nfunction normalizeMarkdownLists(content: string) {\n // Some providers emit compact list markdown like \"Intro: - item 1 - item 2\".\n // Insert a paragraph break before an inline list marker so markdown parses it as a list.\n return content.replace(/:\\s+-\\s+/g, ':\\n\\n- ')\n}\n\nfunction ResponseMessage({ content, className }: ResponseMessageProps) {\n return (\n <div\n className={twMerge(\n 'text-sm leading-relaxed text-text-primary',\n '[&_p]:my-2',\n '[&_ul]:my-2 [&_ul]:list-disc [&_ul]:pl-6',\n '[&_ol]:my-2 [&_ol]:list-decimal [&_ol]:pl-6',\n '[&_li]:my-1',\n '[&_strong]:text-text-primary [&_strong]:font-semibold',\n '[&_em]:text-text-secondary',\n '[&_h1]:text-lg [&_h1]:font-semibold [&_h1]:text-text-primary [&_h1]:mt-4 [&_h1]:mb-2',\n '[&_h2]:text-base [&_h2]:font-semibold [&_h2]:text-text-primary [&_h2]:mt-3 [&_h2]:mb-1.5',\n '[&_h3]:text-sm [&_h3]:font-semibold [&_h3]:text-accent [&_h3]:mt-2 [&_h3]:mb-1',\n '[&_code]:bg-surface-raised [&_code]:text-accent [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:rounded [&_code]:text-xs [&_code]:font-mono',\n '[&_pre]:bg-surface-raised [&_pre]:border [&_pre]:border-border [&_pre]:rounded-xl [&_pre]:p-4 [&_pre]:overflow-x-auto',\n '[&_blockquote]:border-l-2 [&_blockquote]:border-border-strong [&_blockquote]:pl-4 [&_blockquote]:text-text-secondary',\n '[&_a]:text-accent [&_a]:underline-offset-2 [&_a]:hover:text-accent/80',\n className,\n )}\n data-testid=\"response-message\"\n >\n <ReactMarkdown\n rehypePlugins={[rehypeSanitize]}\n components={{\n script: () => null,\n iframe: () => null,\n p: ({ children }) => <p className=\"my-2\">{children}</p>,\n ul: ({ children }) => <ul className=\"my-2 list-disc pl-6\">{children}</ul>,\n ol: ({ children }) => <ol className=\"my-2 list-decimal pl-6\">{children}</ol>,\n li: ({ children }) => <li className=\"my-1\">{children}</li>,\n strong: ({ children }) => <strong className=\"font-semibold\">{children}</strong>,\n h1: ({ children }) => <h1 className=\"text-base font-bold mt-4 mb-2\">{children}</h1>,\n h2: ({ children }) => <h2 className=\"text-sm font-bold mt-3 mb-1\">{children}</h2>,\n h3: ({ children }) => <h3 className=\"text-sm font-semibold mt-2 mb-1\">{children}</h3>,\n code: ({ children }) => <code className=\"bg-surface-sunken rounded px-1 py-0.5 text-xs font-mono\">{children}</code>,\n }}\n >\n {normalizeMarkdownLists(content)}\n </ReactMarkdown>\n </div>\n )\n}\n\nexport { ResponseMessage }\nexport type { ResponseMessageProps }\n","import React from 'react'\nimport type { AgentResponse } from '../../types/agent'\n\ntype StructuredResponseProps = {\n uiHint: AgentResponse['ui_hint']\n data: Record<string, unknown> | null\n className?: string\n}\n\n/** Parse a value that may be a JSON-encoded string or already parsed. */\nfunction tryParse<T>(value: unknown): T | null {\n if (value === undefined || value === null) return null\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as T\n } catch {\n return null\n }\n }\n return value as T\n}\n\nfunction renderSteps(data: Record<string, unknown>) {\n const steps = tryParse<string[]>(data.steps)\n if (!steps || !Array.isArray(steps)) return null\n return (\n <ol className=\"flex flex-col gap-2\" data-testid=\"structured-steps\">\n {steps.map((step, i) => (\n <li key={i} className=\"flex items-start gap-3\">\n <span\n className=\"mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-accent text-[11px] font-semibold text-white\"\n aria-hidden=\"true\"\n >\n {i + 1}\n </span>\n <span className=\"text-sm text-text-primary leading-relaxed\">{step}</span>\n </li>\n ))}\n </ol>\n )\n}\n\nfunction renderTable(data: Record<string, unknown>) {\n const columns = tryParse<string[]>(data.columns)\n // rows may be array-of-arrays or array-of-objects; normalise to array-of-arrays\n const rawRows = tryParse<unknown[]>(data.rows)\n\n if (columns && rawRows && Array.isArray(columns) && Array.isArray(rawRows)) {\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border\" data-testid=\"structured-table\">\n <table role=\"table\" className=\"w-full border-collapse text-sm\">\n <thead className=\"bg-surface-raised\">\n <tr>\n {columns.map((col) => (\n <th\n key={col}\n className=\"text-left px-4 py-2.5 font-semibold text-text-primary border-b border-border\"\n >\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rawRows.map((row, i) => {\n const cells = Array.isArray(row)\n ? row\n : columns.map((col) => (row as Record<string, unknown>)[col])\n return (\n <tr key={i} className=\"even:bg-surface-raised/40\">\n {cells.map((cell, j) => (\n <td key={j} className=\"px-4 py-2 text-text-secondary border-b border-border\">\n {String(cell ?? '')}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n )\n }\n\n // Fallback: key-value table\n const entries = Object.entries(data)\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border\" data-testid=\"structured-table\">\n <table role=\"table\" className=\"w-full border-collapse text-sm\">\n <tbody>\n {entries.map(([key, value]) => (\n <tr key={key} className=\"even:bg-surface-raised/40\">\n <td className=\"px-4 py-2 text-text-primary font-medium border-b border-border w-1/3\">\n {key}\n </td>\n <td className=\"px-4 py-2 text-text-secondary border-b border-border\">\n {typeof value === 'object' ? JSON.stringify(value) : String(value ?? '')}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction renderCard(data: Record<string, unknown>) {\n const title = typeof data.title === 'string' ? data.title : null\n const body = typeof data.body === 'string' ? data.body : null\n const link = typeof data.link === 'string' ? data.link : null\n const linkLabel = typeof data.link_label === 'string' ? data.link_label : 'Learn more'\n\n return (\n <div\n className=\"rounded-xl border border-border bg-surface-raised p-4 flex flex-col gap-2\"\n data-testid=\"structured-card\"\n >\n {title && <p className=\"text-sm font-semibold text-text-primary\">{title}</p>}\n {body && <p className=\"text-sm text-text-secondary leading-relaxed\">{body}</p>}\n {link && (\n <a\n href={link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-1 inline-flex items-center gap-1 text-xs font-medium text-accent hover:text-accent/80 underline-offset-2 hover:underline transition-colors\"\n >\n {linkLabel}\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n </a>\n )}\n </div>\n )\n}\n\nfunction renderList(data: Record<string, unknown>) {\n const items = tryParse<string[]>(data.items)\n const title = typeof data.title === 'string' ? data.title : null\n if (!items || !Array.isArray(items)) return null\n\n return (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"structured-list\">\n {title && (\n <p className=\"text-xs font-semibold uppercase tracking-wider text-text-secondary mb-1\">{title}</p>\n )}\n <ul className=\"flex flex-col gap-1.5\">\n {items.map((item, i) => (\n <li key={i} className=\"flex items-start gap-2.5\">\n <span className=\"mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full bg-accent\" aria-hidden=\"true\" />\n <span className=\"text-sm text-text-primary leading-relaxed\">{item}</span>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nfunction renderWarning(data: Record<string, unknown>) {\n const severity = typeof data.severity === 'string' ? data.severity : 'medium'\n const action = typeof data.action === 'string' ? data.action : null\n const details = typeof data.details === 'string' ? data.details : null\n const isHigh = severity === 'high'\n\n return (\n <div\n role=\"alert\"\n className={`rounded-xl border p-4 flex gap-3 ${\n isHigh\n ? 'border-red-200 bg-red-50 dark:border-red-900/50 dark:bg-red-950/30'\n : 'border-amber-200 bg-amber-50 dark:border-amber-900/50 dark:bg-amber-950/30'\n }`}\n data-testid=\"structured-warning\"\n >\n <svg\n className={`mt-0.5 h-5 w-5 shrink-0 ${isHigh ? 'text-red-500' : 'text-amber-500'}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n <div className=\"flex flex-col gap-1\">\n {action && (\n <p className={`text-sm font-semibold ${isHigh ? 'text-red-700 dark:text-red-300' : 'text-amber-700 dark:text-amber-300'}`}>\n {action}\n </p>\n )}\n {details && (\n <p className={`text-sm ${isHigh ? 'text-red-600 dark:text-red-400' : 'text-amber-600 dark:text-amber-400'}`}>\n {details}\n </p>\n )}\n </div>\n </div>\n )\n}\n\nfunction StructuredResponse({ uiHint, data, className }: StructuredResponseProps) {\n if (!data) return null\n\n let content: React.ReactNode\n\n switch (uiHint) {\n case 'steps':\n content = renderSteps(data)\n break\n case 'table':\n content = renderTable(data)\n break\n case 'card':\n content = renderCard(data)\n break\n case 'list':\n content = renderList(data)\n break\n case 'warning':\n content = renderWarning(data)\n break\n case 'text':\n content = typeof data.text === 'string'\n ? <p data-testid=\"structured-text\">{data.text}</p>\n : null\n break\n default:\n content = null\n }\n\n if (!content) return null\n\n return (\n <div className={className} data-testid=\"structured-response\">\n {content}\n </div>\n )\n}\n\nexport { StructuredResponse }\nexport type { StructuredResponseProps }\n","import React, { useState } from 'react'\nimport type { Source } from '../../types/agent'\nimport { SourceCard } from '../SourceCard'\n\ntype SourceListProps = {\n sources: Source[]\n variant?: 'compact' | 'expanded'\n collapsible?: boolean\n defaultExpanded?: boolean\n onNavigate?: (source: Source) => void\n className?: string\n}\n\nfunction SourceList({\n sources,\n variant = 'compact',\n collapsible = false,\n defaultExpanded = true,\n onNavigate,\n className,\n}: SourceListProps) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded)\n\n if (sources.length === 0) return null\n\n const content = (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"source-list-items\">\n {sources.map((source) => (\n <SourceCard\n key={source.document_id}\n source={source}\n variant={variant}\n onNavigate={onNavigate}\n />\n ))}\n </div>\n )\n\n if (!collapsible) {\n return (\n <div className={className} data-testid=\"source-list\">\n {content}\n </div>\n )\n }\n\n return (\n <div className={className} data-testid=\"source-list\">\n <button\n type=\"button\"\n onClick={() => setIsExpanded(prev => !prev)}\n aria-expanded={isExpanded}\n className=\"flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wider text-text-secondary hover:text-accent mb-2 transition-colors duration-200\"\n >\n <svg\n className={`w-4 h-4 transition-transform ${isExpanded ? 'rotate-180' : ''}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n Sources ({sources.length})\n </button>\n {isExpanded && content}\n </div>\n )\n}\n\nexport { SourceList }\nexport type { SourceListProps }\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport { twMerge } from 'tailwind-merge'\nimport type { Source } from '../../types/agent'\n\ntype SourceCardProps = {\n source: Source\n variant?: 'compact' | 'expanded'\n onNavigate?: (source: Source) => void\n className?: string\n}\n\nfunction getConfidenceIntent(confidence: number) {\n if (confidence >= 0.8) return 'success' as const\n if (confidence >= 0.5) return 'warning' as const\n return 'error' as const\n}\n\nfunction getConfidenceLabel(confidence: number) {\n if (confidence >= 0.8) return 'High'\n if (confidence >= 0.5) return 'Medium'\n return 'Low'\n}\n\nfunction SourceCard({ source, variant = 'compact', onNavigate, className }: SourceCardProps) {\n const handleClick = () => {\n if (onNavigate) {\n onNavigate(source)\n }\n }\n\n const isCompact = variant === 'compact'\n\n return (\n <div\n className={twMerge(\n 'rounded-xl border transition-all duration-200',\n 'bg-surface border-border',\n onNavigate && 'cursor-pointer hover:border-border-strong',\n className,\n )}\n data-document-id={source.document_id}\n data-testid=\"source-card\"\n >\n <div\n className={isCompact ? 'px-4 py-3' : 'px-6 py-4'}\n onClick={handleClick}\n role={onNavigate ? 'button' : undefined}\n tabIndex={onNavigate ? 0 : undefined}\n onKeyDown={\n onNavigate\n ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }\n : undefined\n }\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {source.title}\n </p>\n {source.section && (\n <p className=\"text-[11px] font-semibold uppercase tracking-wider text-text-secondary truncate mt-0.5\">\n {source.section}\n </p>\n )}\n </div>\n <Badge\n intent={getConfidenceIntent(source.confidence)}\n size=\"sm\"\n >\n {getConfidenceLabel(source.confidence)}\n </Badge>\n </div>\n {!isCompact && (\n <p className=\"text-xs text-text-secondary mt-2 line-clamp-3 leading-relaxed\">\n {source.snippet}\n </p>\n )}\n </div>\n </div>\n )\n}\n\nexport { SourceCard }\nexport type { SourceCardProps }\n","import React from 'react'\nimport { twMerge } from 'tailwind-merge'\n\ntype FollowUpChipsProps = {\n suggestions: string[]\n onSelect: (suggestion: string) => void\n className?: string\n}\n\nfunction FollowUpChips({ suggestions, onSelect, className }: FollowUpChipsProps) {\n if (suggestions.length === 0) return null\n\n return (\n <div\n className={twMerge('flex flex-wrap gap-2 py-1', className)}\n role=\"group\"\n aria-label=\"Follow-up suggestions\"\n data-testid=\"follow-up-chips\"\n >\n {suggestions.map(suggestion => (\n <button\n key={suggestion}\n type=\"button\"\n onClick={() => onSelect(suggestion)}\n className={twMerge(\n 'px-4 py-1.5 rounded-full text-sm whitespace-nowrap',\n 'border border-border bg-transparent text-text-secondary',\n 'hover:bg-accent/10 hover:border-interactive hover:text-text-primary',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent',\n 'transition-all duration-200',\n )}\n >\n {suggestion}\n </button>\n ))}\n </div>\n )\n}\n\nexport { FollowUpChips }\nexport type { FollowUpChipsProps }\n","import { twMerge } from 'tailwind-merge'\nimport React, { useState, useRef, useCallback } from 'react'\n\nexport type MessageComposerProps = {\n onSend: (content: string) => void\n isLoading?: boolean\n placeholder?: string\n className?: string\n}\n\nfunction MessageComposer({\n onSend,\n isLoading = false,\n placeholder = 'Type a message...',\n className,\n}: MessageComposerProps) {\n const [value, setValue] = useState('')\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n const canSend = value.trim().length > 0 && !isLoading\n\n const resetHeight = useCallback(() => {\n const el = textareaRef.current\n if (el) {\n el.style.height = 'auto'\n el.style.overflowY = 'hidden'\n }\n }, [])\n\n const handleSend = useCallback(() => {\n if (!canSend) return\n onSend(value.trim())\n setValue('')\n resetHeight()\n textareaRef.current?.focus()\n }, [canSend, onSend, value, resetHeight])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSend()\n }\n },\n [handleSend],\n )\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setValue(e.target.value)\n const el = e.target\n el.style.height = 'auto'\n const capped = Math.min(el.scrollHeight, 128)\n el.style.height = `${capped}px`\n el.style.overflowY = el.scrollHeight > 128 ? 'auto' : 'hidden'\n },\n [],\n )\n\n return (\n <div\n className={twMerge(\n 'flex items-end gap-3 shrink-0 border-t border-border px-4 py-3',\n className,\n )}\n >\n <textarea\n ref={textareaRef}\n value={value}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n rows={1}\n disabled={isLoading}\n className={twMerge(\n 'flex-1 resize-none rounded-xl border border-border bg-surface/80',\n 'px-4 py-2.5 text-sm text-text-primary placeholder:text-text-muted',\n 'focus:border-transparent focus:ring-2 focus:ring-accent/40 focus:outline-none',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'overflow-hidden',\n 'transition-all duration-200',\n )}\n style={{ colorScheme: 'dark' }}\n aria-label=\"Message input\"\n />\n <button\n type=\"button\"\n onClick={handleSend}\n disabled={!value.trim() || isLoading}\n aria-label=\"Send message\"\n className={twMerge(\n 'inline-flex items-center justify-center rounded-xl px-5 py-2.5',\n 'text-sm font-semibold text-white shrink-0',\n 'transition-all duration-200',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent',\n value.trim() && !isLoading\n ? 'bg-accent hover:bg-accent-hover hover:scale-[1.02] hover:shadow-glow-cyan active:scale-[0.98]'\n : 'bg-accent/30 text-text-muted cursor-not-allowed',\n )}\n >\n Send\n </button>\n </div>\n )\n}\n\nexport { MessageComposer }\n","import { twMerge } from 'tailwind-merge'\nimport React from 'react'\n\nexport type WelcomeScreenProps = {\n title?: string\n message?: string\n icon?: React.ReactNode\n suggestedQuestions?: string[]\n onQuestionSelect?: (question: string) => void\n className?: string\n}\n\nfunction WelcomeScreen({\n title = 'Welcome',\n message = 'How can I help you today?',\n icon,\n suggestedQuestions = [],\n onQuestionSelect,\n className,\n}: WelcomeScreenProps) {\n return (\n <div\n className={twMerge(\n 'flex flex-1 flex-col items-center justify-center gap-8 p-8 text-center motion-safe:animate-fadeUp',\n className,\n )}\n >\n {/* Icon */}\n <div\n className=\"w-14 h-14 rounded-2xl bg-accent/10 border border-border flex items-center justify-center pulse-glow\"\n aria-hidden=\"true\"\n >\n {icon ?? <span className=\"text-2xl\">✦</span>}\n </div>\n\n {/* Text */}\n <div className=\"flex flex-col gap-2\">\n {title && (\n <h2 className=\"text-3xl font-bold text-text-primary\">{title}</h2>\n )}\n <p className=\"text-text-secondary text-base leading-relaxed max-w-md\">{message}</p>\n </div>\n\n {/* Suggested question chips */}\n {suggestedQuestions.length > 0 && (\n <div\n className=\"flex flex-wrap justify-center gap-2 max-w-md\"\n role=\"group\"\n aria-label=\"Suggested questions\"\n >\n {suggestedQuestions.map(question => (\n <button\n key={question}\n type=\"button\"\n onClick={() => onQuestionSelect?.(question)}\n className={twMerge(\n 'px-4 py-2 rounded-full text-sm',\n 'border border-border bg-transparent text-text-secondary',\n 'hover:bg-accent/10 hover:border-interactive hover:text-text-primary',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent',\n 'transition-colors duration-200',\n )}\n >\n {question}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport { WelcomeScreen }\n","import React, { useEffect, useRef } from 'react'\nimport { Spinner } from '@surf-kit/core'\nimport type { StreamState } from '../../types/streaming'\nimport { useCharacterDrain } from '../../hooks/useCharacterDrain'\n\ntype StreamingMessageProps = {\n stream: StreamState\n onComplete?: () => void\n showPhases?: boolean\n className?: string\n}\n\nconst phaseLabels: Record<StreamState['phase'], string> = {\n idle: '',\n waiting: 'Waiting...',\n thinking: 'Thinking...',\n retrieving: 'Searching...',\n generating: 'Writing...',\n verifying: 'Verifying...',\n}\n\nfunction StreamingMessage({\n stream,\n onComplete,\n showPhases = true,\n className,\n}: StreamingMessageProps) {\n const onCompleteRef = useRef(onComplete)\n onCompleteRef.current = onComplete\n const wasActiveRef = useRef(stream.active)\n\n useEffect(() => {\n if (wasActiveRef.current && !stream.active) {\n onCompleteRef.current?.()\n }\n wasActiveRef.current = stream.active\n }, [stream.active])\n\n const phaseLabel = phaseLabels[stream.phase]\n const { displayed: displayedContent } = useCharacterDrain(stream.content)\n\n return (\n <div className={className} data-testid=\"streaming-message\">\n {/* Screen reader announcements */}\n <div aria-live=\"assertive\" className=\"sr-only\">\n {stream.active && stream.phase !== 'idle' && 'Response started'}\n {!stream.active && stream.content && 'Response complete'}\n </div>\n\n <div className=\"max-w-[88%] px-4 py-3 rounded-[18px] rounded-tl-[4px] bg-surface border border-border motion-safe:animate-springFromLeft\">\n {showPhases && stream.active && stream.phase !== 'idle' && (\n <div\n className=\"flex items-center gap-2 mb-2 text-sm text-text-secondary\"\n data-testid=\"phase-indicator\"\n >\n <span aria-hidden=\"true\">\n <Spinner size=\"sm\" />\n </span>\n <span>{phaseLabel}</span>\n </div>\n )}\n\n <div className=\"text-sm leading-relaxed text-text-primary whitespace-pre-wrap\">\n {displayedContent}\n {stream.active && (\n <span\n className=\"inline-block w-0.5 h-4 bg-accent align-text-bottom animate-pulse ml-0.5\"\n aria-hidden=\"true\"\n data-testid=\"streaming-cursor\"\n />\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport { StreamingMessage }\nexport type { StreamingMessageProps }\n","import { useState, useRef, useEffect } from 'react'\n\nexport interface CharacterDrainResult {\n displayed: string\n isDraining: boolean\n}\n\n/**\n * Smoothly drains a growing `target` string character-by-character using\n * `requestAnimationFrame`, decoupling visual rendering from network packet\n * timing so text appears to type out instead of arriving in chunks.\n *\n * When `target` resets to empty (e.g. stream finished), the hook continues\n * draining the previous content to completion before resetting, so the\n * typing animation isn't cut short.\n *\n * Design: the RAF loop is long-lived — it does NOT restart on every delta.\n * The tick function is stored in a ref (updated each render) so the loop\n * always reads the latest drainTarget without being cancelled/restarted.\n * A separate kick-start effect re-fires the loop when it was idle and new\n * content arrives.\n */\nexport function useCharacterDrain(target: string, msPerChar = 15): CharacterDrainResult {\n const [displayed, setDisplayed] = useState('')\n const indexRef = useRef(0)\n const lastTimeRef = useRef(0)\n const rafRef = useRef<number | null>(null)\n // Holds the last non-empty target so we can finish draining after source resets\n const drainTargetRef = useRef('')\n const msPerCharRef = useRef(msPerChar)\n\n msPerCharRef.current = msPerChar\n\n // Update drain target when new content arrives; preserve old value on reset\n if (target !== '') {\n drainTargetRef.current = target\n }\n\n const drainTarget = drainTargetRef.current\n const isDraining = displayed.length < drainTarget.length\n\n // Tick function stored in ref so the long-lived RAF loop always reads the\n // latest drainTarget and msPerChar without being cancelled/recreated.\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const tickRef = useRef<(now: number) => void>(() => {})\n tickRef.current = (now: number) => {\n const currentTarget = drainTargetRef.current\n if (currentTarget === '') {\n rafRef.current = null\n return\n }\n\n if (lastTimeRef.current === 0) lastTimeRef.current = now\n const elapsed = now - lastTimeRef.current\n const charsToAdvance = Math.floor(elapsed / msPerCharRef.current)\n\n if (charsToAdvance > 0 && indexRef.current < currentTarget.length) {\n const nextIndex = Math.min(indexRef.current + charsToAdvance, currentTarget.length)\n indexRef.current = nextIndex\n lastTimeRef.current = now\n setDisplayed(currentTarget.slice(0, nextIndex))\n }\n\n if (indexRef.current < currentTarget.length) {\n rafRef.current = requestAnimationFrame((t) => tickRef.current(t))\n } else {\n rafRef.current = null\n }\n }\n\n // Kick-start the RAF loop when new content arrives and the loop is idle.\n // No cleanup here — we intentionally do NOT cancel the running loop when\n // drainTarget grows; the long-lived tick will pick up new chars automatically.\n useEffect(() => {\n if (\n drainTargetRef.current !== '' &&\n indexRef.current < drainTargetRef.current.length &&\n rafRef.current === null\n ) {\n rafRef.current = requestAnimationFrame((t) => tickRef.current(t))\n }\n }, [drainTarget]) // drainTarget change = new content; check if loop needs kicking\n\n // Once drain completes and source stream is already done, reset all state\n useEffect(() => {\n if (target === '' && !isDraining && displayed !== '') {\n indexRef.current = 0\n lastTimeRef.current = 0\n drainTargetRef.current = ''\n setDisplayed('')\n }\n }, [target, isDraining, displayed])\n\n // Cancel any pending RAF on unmount\n useEffect(() => {\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current)\n rafRef.current = null\n }\n }\n }, [])\n\n return { displayed, isDraining }\n}\n","import React from 'react'\nimport { Alert, Button } from '@surf-kit/core'\nimport type { ChatError } from '../../types/chat'\n\ntype ErrorResponseProps = {\n error: ChatError\n onRetry?: () => void\n className?: string\n}\n\nfunction ErrorResponse({ error, onRetry, className }: ErrorResponseProps) {\n return (\n <div role=\"alert\" className={className} data-testid=\"error-response\">\n <Alert intent=\"error\" title=\"Error\">\n <p>{error.message}</p>\n {error.retryable && onRetry && (\n <div className=\"mt-3\">\n <Button\n intent=\"secondary\"\n size=\"sm\"\n onPress={onRetry}\n aria-label=\"Retry\"\n >\n Retry\n </Button>\n </div>\n )}\n </Alert>\n </div>\n )\n}\n\nexport { ErrorResponse }\nexport type { ErrorResponseProps }\n","import React from 'react'\nimport { Tooltip } from '@surf-kit/core'\n\nimport type { Source } from '../../types/agent'\n\ntype SourceInlineProps = {\n source: Source\n index: number\n className?: string\n}\n\nfunction SourceInline({ source, index, className }: SourceInlineProps) {\n const tooltipContent = `${source.title}${source.section ? ` - ${source.section}` : ''}: ${source.snippet.slice(0, 120)}${source.snippet.length > 120 ? '...' : ''}`\n\n return (\n <Tooltip content={tooltipContent} placement=\"top\">\n <span\n className={`inline-flex items-center justify-center text-xs text-accent font-medium cursor-help ${className ?? ''}`}\n data-testid=\"source-inline\"\n data-document-id={source.document_id}\n aria-label={`Source ${index}: ${source.title}`}\n >\n [{index}]\n </span>\n </Tooltip>\n )\n}\n\nexport { SourceInline }\nexport type { SourceInlineProps }\n","import React from 'react'\nimport { Sheet, Badge } from '@surf-kit/core'\nimport type { Source } from '../../types/agent'\n\ntype SourceDrawerProps = {\n source: Source | null\n isOpen: boolean\n onClose: () => void\n className?: string\n}\n\nfunction getConfidenceIntent(confidence: number) {\n if (confidence >= 0.8) return 'success' as const\n if (confidence >= 0.5) return 'warning' as const\n return 'error' as const\n}\n\nfunction SourceDrawer({ source, isOpen, onClose, className }: SourceDrawerProps) {\n if (!source) return null\n\n return (\n <Sheet\n isOpen={isOpen}\n onClose={onClose}\n title={source.title}\n size=\"md\"\n className={className}\n >\n <div data-testid=\"source-drawer\" data-document-id={source.document_id}>\n {source.section && (\n <p className=\"text-sm text-text-secondary mb-4\">{source.section}</p>\n )}\n\n <div className=\"flex items-center gap-2 mb-4\">\n <span className=\"text-sm text-text-secondary\">Confidence:</span>\n <Badge intent={getConfidenceIntent(source.confidence)} size=\"sm\">\n {Math.round(source.confidence * 100)}%\n </Badge>\n </div>\n\n <div className=\"mb-4\">\n <h3 className=\"text-sm font-medium text-text-primary mb-2\">Snippet</h3>\n <p className=\"text-sm text-text-secondary bg-surface-raised p-4 rounded-lg\">\n {source.snippet}\n </p>\n </div>\n\n {source.url && (\n <div>\n <h3 className=\"text-sm font-medium text-text-primary mb-2\">Source URL</h3>\n <a\n href={source.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm text-accent hover:underline break-all\"\n >\n {source.url}\n </a>\n </div>\n )}\n </div>\n </Sheet>\n )\n}\n\nexport { SourceDrawer }\nexport type { SourceDrawerProps }\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\n\ntype SourceBadgeProps = {\n count: number\n className?: string\n}\n\nfunction SourceBadge({ count, className }: SourceBadgeProps) {\n if (count === 0) return null\n\n return (\n <Badge intent=\"info\" size=\"sm\" className={className} data-testid=\"source-badge\">\n {count} {count === 1 ? 'source' : 'sources'}\n </Badge>\n )\n}\n\nexport { SourceBadge }\nexport type { SourceBadgeProps }\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport type { ConfidenceBreakdown } from '../../types/agent'\n\nexport type ConfidenceBadgeProps = {\n confidence: ConfidenceBreakdown\n className?: string\n}\n\nconst intentMap = {\n high: 'success',\n medium: 'warning',\n low: 'error',\n} as const\n\nconst labelMap = {\n high: 'High confidence',\n medium: 'Medium confidence',\n low: 'Low confidence',\n} as const\n\nfunction ConfidenceBadge({ confidence, className }: ConfidenceBadgeProps) {\n const level = confidence.overall\n\n return (\n <Badge\n intent={intentMap[level]}\n size=\"sm\"\n role=\"status\"\n aria-label={labelMap[level]}\n className={className}\n >\n {level.charAt(0).toUpperCase() + level.slice(1)}\n </Badge>\n )\n}\n\nexport { ConfidenceBadge }\n","import React, { useState } from 'react'\nimport type { ConfidenceBreakdown as ConfidenceBreakdownType } from '../../types/agent'\nimport { ConfidenceBadge } from '../ConfidenceBadge'\nimport { ConfidenceMeter } from '../ConfidenceMeter'\n\nexport type ConfidenceBreakdownProps = {\n confidence: ConfidenceBreakdownType\n expandable?: boolean\n defaultExpanded?: boolean\n className?: string\n}\n\nconst dimensions: { key: keyof Pick<ConfidenceBreakdownType, 'retrieval_quality' | 'source_authority' | 'answer_groundedness' | 'recency'>; label: string }[] = [\n { key: 'retrieval_quality', label: 'Retrieval Quality' },\n { key: 'source_authority', label: 'Source Authority' },\n { key: 'answer_groundedness', label: 'Answer Groundedness' },\n { key: 'recency', label: 'Recency' },\n]\n\nfunction ConfidenceBreakdown({\n confidence,\n expandable = true,\n defaultExpanded = false,\n className,\n}: ConfidenceBreakdownProps) {\n const [expanded, setExpanded] = useState(defaultExpanded)\n\n const isExpanded = expandable ? expanded : true\n\n return (\n <div className={`rounded-xl border border-border bg-surface ${className ?? ''}`} data-testid=\"confidence-breakdown\">\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-between px-4 py-3 text-left\"\n onClick={() => expandable && setExpanded((prev) => !prev)}\n aria-expanded={isExpanded}\n disabled={!expandable}\n >\n <span className=\"text-sm font-medium text-text-primary\">Confidence</span>\n <ConfidenceBadge confidence={confidence} />\n </button>\n\n {isExpanded && (\n <div\n className=\"border-t border-border px-4 py-3 space-y-3 animate-in fade-in slide-in-from-top-1 duration-200\"\n data-testid=\"confidence-breakdown-details\"\n >\n {dimensions.map((dim) => (\n <ConfidenceMeter\n key={dim.key}\n value={confidence[dim.key]}\n label={dim.label}\n />\n ))}\n {confidence.reasoning && (\n <p className=\"text-xs text-text-secondary mt-2\">{confidence.reasoning}</p>\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport { ConfidenceBreakdown }\n","import React from 'react'\n\nexport type ConfidenceMeterProps = {\n value: number // 0-1\n label: string\n className?: string\n}\n\nfunction getBarColor(value: number): string {\n if (value >= 0.8) return 'bg-green-500'\n if (value >= 0.5) return 'bg-yellow-500'\n return 'bg-red-500'\n}\n\nfunction ConfidenceMeter({ value, label, className }: ConfidenceMeterProps) {\n const clamped = Math.max(0, Math.min(1, value))\n const pct = Math.round(clamped * 100)\n\n return (\n <div className={className} data-testid=\"confidence-meter\">\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-xs font-medium text-text-secondary\">{label}</span>\n <span className=\"text-xs text-text-secondary\">{pct}%</span>\n </div>\n <div\n className=\"h-2 w-full rounded-full bg-surface-secondary overflow-hidden\"\n role=\"progressbar\"\n aria-valuenow={pct}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`${label}: ${pct}%`}\n >\n <div\n className={`h-full rounded-full transition-all duration-300 ${getBarColor(clamped)}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n )\n}\n\nexport { ConfidenceMeter }\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport type { VerificationResult } from '../../types/agent'\n\nexport type VerificationBadgeProps = {\n verification: VerificationResult\n className?: string\n}\n\nconst config = {\n passed: {\n intent: 'success' as const,\n label: 'Verified',\n icon: '\\u2713',\n ariaLabel: 'Verification passed',\n },\n flagged: {\n intent: 'warning' as const,\n label: 'Flagged',\n icon: '\\u26A0',\n ariaLabel: 'Verification flagged',\n },\n failed: {\n intent: 'error' as const,\n label: 'Failed',\n icon: '\\u2717',\n ariaLabel: 'Verification failed',\n },\n} as const\n\nfunction VerificationBadge({ verification, className }: VerificationBadgeProps) {\n const { intent, label, icon, ariaLabel } = config[verification.status]\n\n return (\n <Badge\n intent={intent}\n size=\"sm\"\n role=\"status\"\n aria-label={ariaLabel}\n className={className}\n >\n <span aria-hidden=\"true\" className=\"mr-1\">{icon}</span>\n {label}\n </Badge>\n )\n}\n\nexport { VerificationBadge }\n","import React, { useState } from 'react'\nimport type { VerificationResult } from '../../types/agent'\nimport { VerificationBadge } from '../VerificationBadge'\n\nexport type VerificationDetailProps = {\n verification: VerificationResult\n expandable?: boolean\n defaultExpanded?: boolean\n className?: string\n}\n\nfunction VerificationDetail({\n verification,\n expandable = true,\n defaultExpanded = false,\n className,\n}: VerificationDetailProps) {\n const [expanded, setExpanded] = useState(defaultExpanded)\n\n const isExpanded = expandable ? expanded : true\n\n return (\n <div className={`rounded-xl border border-border bg-surface ${className ?? ''}`} data-testid=\"verification-detail\">\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-between px-4 py-3 text-left\"\n onClick={() => expandable && setExpanded((prev) => !prev)}\n aria-expanded={isExpanded}\n disabled={!expandable}\n >\n <span className=\"text-sm font-medium text-text-primary\">Verification</span>\n <VerificationBadge verification={verification} />\n </button>\n\n {isExpanded && (\n <div\n className=\"border-t border-border px-4 py-3 space-y-2 animate-in fade-in slide-in-from-top-1 duration-200\"\n data-testid=\"verification-detail-content\"\n >\n <div className=\"flex gap-4 text-xs text-text-secondary\">\n <span data-testid=\"claims-checked\">\n Claims checked: <strong className=\"text-text-primary\">{verification.claims_checked}</strong>\n </span>\n <span data-testid=\"claims-verified\">\n Claims verified: <strong className=\"text-text-primary\">{verification.claims_verified}</strong>\n </span>\n </div>\n\n {verification.flags.length > 0 && (\n <ul className=\"mt-2 space-y-1\" data-testid=\"verification-flags\">\n {verification.flags.map((flag, i) => (\n <li key={i} className=\"flex items-start gap-2 text-xs text-text-secondary\">\n <span className=\"text-yellow-500 shrink-0\" aria-hidden=\"true\">{'\\u26A0'}</span>\n {flag}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport { VerificationDetail }\n","import { useMemo } from 'react'\nimport type { AgentInfo } from '../types/agent'\n\nexport interface AgentThemeResult {\n accent: string\n icon: AgentInfo['icon'] | null\n label: string\n}\n\nconst DEFAULT_ACCENT = '#6366f1'\nconst DEFAULT_LABEL = 'Agent'\n\nexport function useAgentTheme(\n agentId: string | null | undefined,\n agentThemes?: Record<string, AgentInfo>,\n): AgentThemeResult {\n return useMemo(() => {\n if (!agentId) {\n return { accent: DEFAULT_ACCENT, icon: null, label: DEFAULT_LABEL }\n }\n\n const theme = agentThemes?.[agentId]\n if (!theme) {\n return { accent: DEFAULT_ACCENT, icon: null, label: agentId }\n }\n\n return {\n accent: theme.accent ?? DEFAULT_ACCENT,\n icon: theme.icon ?? null,\n label: theme.label,\n }\n }, [agentId, agentThemes])\n}\n","import React from 'react'\nimport type { AgentInfo } from '../../types/agent'\nimport { useAgentTheme } from '../../hooks/useAgentTheme'\n\nexport type AgentAvatarProps = {\n agentId?: string\n agent?: AgentInfo\n size?: 'sm' | 'md' | 'lg'\n agentThemes?: Record<string, AgentInfo>\n className?: string\n}\n\nconst sizeMap = {\n sm: 'h-6 w-6 text-xs',\n md: 'h-8 w-8 text-sm',\n lg: 'h-10 w-10 text-base',\n} as const\n\nconst iconSizeMap = {\n sm: 14,\n md: 18,\n lg: 22,\n} as const\n\nfunction AgentAvatar({ agentId, agent, size = 'md', agentThemes, className }: AgentAvatarProps) {\n const resolvedId = agent?.id ?? agentId ?? null\n const themes = agent ? { ...agentThemes, [agent.id]: agent } : agentThemes\n const { accent, icon: Icon, label } = useAgentTheme(resolvedId, themes)\n\n const initial = label.charAt(0).toUpperCase()\n\n return (\n <div\n className={`inline-flex items-center justify-center rounded-full shrink-0 font-medium text-white ${sizeMap[size]} ${className ?? ''}`}\n style={{ backgroundColor: accent }}\n role=\"img\"\n aria-label={`${label} avatar`}\n data-testid=\"agent-avatar\"\n >\n {Icon ? (\n <Icon size={iconSizeMap[size]} className=\"text-white\" />\n ) : (\n <span aria-hidden=\"true\">{initial}</span>\n )}\n </div>\n )\n}\n\nexport { AgentAvatar }\n","import React from 'react'\nimport type { AgentInfo } from '../../types/agent'\n\nexport type AgentLabelProps = {\n agent: AgentInfo\n className?: string\n}\n\nfunction AgentLabel({ agent, className }: AgentLabelProps) {\n const accent = agent.accent ?? '#6366f1'\n\n return (\n <span\n className={`text-xs font-medium ${className ?? ''}`}\n data-testid=\"agent-label\"\n >\n Answered by{' '}\n <span style={{ color: accent }}>{agent.label}</span>\n </span>\n )\n}\n\nexport { AgentLabel }\n","import React from 'react'\nimport type { AgentInfo } from '../../types/agent'\nimport { AgentAvatar } from '../AgentAvatar'\n\nexport type AgentHandoffProps = {\n from: AgentInfo\n to: AgentInfo\n className?: string\n}\n\nfunction AgentHandoff({ from, to, className }: AgentHandoffProps) {\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3 rounded-xl border border-border bg-surface ${className ?? ''}`}\n data-testid=\"agent-handoff\"\n >\n <div className=\"flex items-center gap-2 animate-in fade-in slide-in-from-left-2 duration-300\">\n <AgentAvatar agent={from} size=\"sm\" />\n <span className=\"text-xs text-text-secondary\">{from.label}</span>\n </div>\n\n <span className=\"text-text-secondary text-xs\" aria-hidden=\"true\">{'\\u2192'}</span>\n\n <div className=\"flex items-center gap-2 animate-in fade-in slide-in-from-right-2 duration-300\">\n <AgentAvatar agent={to} size=\"sm\" />\n <span className=\"text-xs text-text-secondary\">{to.label}</span>\n </div>\n\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n Handing off from {from.label} to {to.label}\n </div>\n </div>\n )\n}\n\nexport { AgentHandoff }\n","import React from 'react'\n\nexport type RoutingIndicatorProps = {\n from: string\n to: string\n reason?: string\n className?: string\n}\n\nfunction RoutingIndicator({ from, to, reason, className }: RoutingIndicatorProps) {\n return (\n <div\n className={`inline-flex items-center gap-1.5 rounded-md border border-border/50 bg-surface-secondary/50 px-2.5 py-1 font-mono text-[11px] text-text-secondary ${className ?? ''}`}\n data-testid=\"routing-indicator\"\n >\n <span className=\"opacity-60\">Routed:</span>\n <span>{from}</span>\n <span className=\"opacity-40\" aria-hidden=\"true\">{'\\u2192'}</span>\n <span>{to}</span>\n {reason && (\n <span className=\"opacity-50 ml-1\" title={reason}>\n ({reason})\n </span>\n )}\n </div>\n )\n}\n\nexport { RoutingIndicator }\n","import React from 'react'\nimport { useReducedMotion } from '@surf-kit/hooks'\n\ntype ThinkingIndicatorProps = {\n label?: string\n className?: string\n}\n\nfunction ThinkingIndicator({ label = 'Thinking...', className }: ThinkingIndicatorProps) {\n const reducedMotion = useReducedMotion()\n\n return (\n <span\n role=\"status\"\n className={`inline-flex items-center gap-2 text-sm motion-safe:animate-fadeSlideUpSm ${className ?? ''}`}\n data-testid=\"thinking-indicator\"\n >\n <span className=\"text-text-secondary\">{label}</span>\n {!reducedMotion && (\n <span className=\"flex gap-1\" aria-hidden=\"true\" data-testid=\"animated-dots\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-current animate-bounce [animation-delay:0ms]\" />\n <span className=\"w-1.5 h-1.5 rounded-full bg-current animate-bounce [animation-delay:150ms]\" />\n <span className=\"w-1.5 h-1.5 rounded-full bg-current animate-bounce [animation-delay:300ms]\" />\n </span>\n )}\n </span>\n )\n}\n\nexport { ThinkingIndicator }\nexport type { ThinkingIndicatorProps }\n","import React from 'react'\nimport { Spinner } from '@surf-kit/core'\n\ntype ToolExecutionProps = {\n tool: string\n label?: string\n className?: string\n}\n\nconst defaultLabels: Record<string, string> = {\n search: 'Searching knowledge base...',\n retrieve: 'Retrieving documents...',\n calculate: 'Calculating...',\n}\n\nfunction ToolExecution({ tool, label, className }: ToolExecutionProps) {\n const displayLabel = label ?? defaultLabels[tool] ?? `Running ${tool}...`\n\n return (\n <div\n className={`flex items-center gap-2 text-sm text-text-secondary ${className ?? ''}`}\n role=\"status\"\n data-testid=\"tool-execution\"\n >\n <span aria-hidden=\"true\">\n <Spinner size=\"sm\" />\n </span>\n <span>{displayLabel}</span>\n </div>\n )\n}\n\nexport { ToolExecution }\nexport type { ToolExecutionProps }\n","import React from 'react'\nimport { Spinner } from '@surf-kit/core'\nimport type { Source } from '../../types/agent'\n\ntype RetrievalProgressProps = {\n sources: Source[]\n isActive: boolean\n className?: string\n}\n\nfunction RetrievalProgress({ sources, isActive, className }: RetrievalProgressProps) {\n return (\n <div\n className={`space-y-2 ${className ?? ''}`}\n role=\"status\"\n aria-label={\n isActive\n ? `Retrieving sources, ${sources.length} found so far`\n : `${sources.length} sources found`\n }\n data-testid=\"retrieval-progress\"\n >\n {isActive && (\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <span aria-hidden=\"true\">\n <Spinner size=\"sm\" />\n </span>\n <span>Retrieving sources...</span>\n </div>\n )}\n\n {sources.length > 0 && (\n <ul className=\"space-y-1\" data-testid=\"source-list\">\n {sources.map((source, index) => (\n <li\n key={source.document_id}\n className=\"text-sm text-text-secondary flex items-center gap-2 animate-in fade-in slide-in-from-left-2\"\n style={{ animationDelay: `${index * 100}ms`, animationFillMode: 'both' }}\n data-testid=\"retrieval-source-item\"\n >\n <span className=\"w-1.5 h-1.5 rounded-full bg-accent flex-shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate\">{source.title}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\nexport { RetrievalProgress }\nexport type { RetrievalProgressProps }\n","import React from 'react'\n\ntype VerificationProgressProps = {\n isActive: boolean\n label?: string\n className?: string\n}\n\nfunction VerificationProgress({\n isActive,\n label = 'Checking accuracy...',\n className,\n}: VerificationProgressProps) {\n if (!isActive) return null\n\n return (\n <div\n className={`flex items-center gap-2 text-sm ${className ?? ''}`}\n role=\"status\"\n data-testid=\"verification-progress\"\n >\n <svg\n className=\"w-4 h-4 animate-spin text-accent\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\n </svg>\n <span className=\"text-accent animate-pulse\">{label}</span>\n </div>\n )\n}\n\nexport { VerificationProgress }\nexport type { VerificationProgressProps }\n","import React, { useEffect, useState } from 'react'\n\nexport type TypewriterTextProps = {\n text: string\n speed?: number // ms per char, default 30\n delay?: number // ms to wait before starting, default 0\n onComplete?: () => void\n className?: string\n showCursor?: boolean // default true\n}\n\nexport function TypewriterText({\n text,\n speed = 30,\n delay = 0,\n onComplete,\n className = '',\n showCursor = true,\n}: TypewriterTextProps) {\n const [displayedText, setDisplayedText] = useState('')\n const [isComplete, setIsComplete] = useState(false)\n\n useEffect(() => {\n setDisplayedText('')\n setIsComplete(false)\n let index = 0\n let interval: ReturnType<typeof setInterval>\n const timeout = setTimeout(() => {\n interval = setInterval(() => {\n if (index < text.length) {\n setDisplayedText(text.slice(0, index + 1))\n index++\n } else {\n clearInterval(interval)\n setIsComplete(true)\n onComplete?.()\n }\n }, speed)\n }, delay)\n return () => {\n clearTimeout(timeout)\n clearInterval(interval)\n }\n }, [text, speed, delay, onComplete])\n\n return (\n <span className={className}>\n {displayedText}\n {showCursor && !isComplete && (\n <span className=\"typewriter-cursor\" aria-hidden=\"true\" />\n )}\n </span>\n )\n}\n","import React from 'react'\nimport { twMerge } from 'tailwind-merge'\nimport { useReducedMotion } from '@surf-kit/hooks'\n\ntype TypingIndicatorProps = {\n label?: string\n dotCount?: number\n className?: string\n}\n\nconst bounceKeyframes = `\n@keyframes typing-bounce {\n 0%, 80%, 100% { transform: translateY(0); }\n 40% { transform: translateY(-6px); }\n}\n`\n\nfunction TypingIndicator({\n label,\n dotCount = 3,\n className,\n}: TypingIndicatorProps) {\n const reducedMotion = useReducedMotion()\n\n return (\n <span\n role=\"status\"\n aria-label={label ?? 'typing'}\n className={twMerge('inline-flex items-center gap-2', className)}\n data-testid=\"typing-indicator\"\n >\n {!reducedMotion && <style>{bounceKeyframes}</style>}\n {label && (\n <span className=\"text-sm text-text-secondary\">{label}</span>\n )}\n <span className=\"flex gap-1\" data-testid=\"typing-dots\">\n {Array.from({ length: dotCount }, (_, i) => (\n <span\n key={i}\n className=\"w-2 h-2 rounded-full bg-text-secondary\"\n style={\n reducedMotion\n ? undefined\n : {\n animation: 'typing-bounce 1.4s infinite ease-in-out',\n animationDelay: `${i * 160}ms`,\n }\n }\n />\n ))}\n </span>\n </span>\n )\n}\n\nexport { TypingIndicator }\nexport type { TypingIndicatorProps }\n","import React from 'react'\nimport { twMerge } from 'tailwind-merge'\nimport { useReducedMotion } from '@surf-kit/hooks'\n\ntype TextGlimmerProps = {\n lines?: number\n className?: string\n}\n\nconst shimmerKeyframes = `\n@keyframes text-shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n}\n`\n\nconst widthPattern = ['100%', '90%', '60%']\n\nfunction TextGlimmer({ lines = 3, className }: TextGlimmerProps) {\n const reducedMotion = useReducedMotion()\n\n return (\n <div\n role=\"status\"\n aria-label=\"Loading\"\n className={twMerge('flex flex-col gap-2', className)}\n data-testid=\"text-glimmer\"\n >\n {!reducedMotion && <style>{shimmerKeyframes}</style>}\n {Array.from({ length: lines }, (_, i) => (\n <div\n key={i}\n className=\"h-3 rounded bg-surface-raised\"\n style={{\n width: widthPattern[i % widthPattern.length],\n ...(reducedMotion\n ? undefined\n : {\n backgroundImage:\n 'linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent)',\n backgroundSize: '200% 100%',\n animation: 'text-shimmer 1.5s infinite ease-in-out',\n }),\n }}\n data-testid=\"glimmer-line\"\n />\n ))}\n </div>\n )\n}\n\nexport { TextGlimmer }\nexport type { TextGlimmerProps }\n","import React from 'react'\nimport { twMerge } from 'tailwind-merge'\nimport { useReducedMotion } from '@surf-kit/hooks'\nimport { TypingIndicator } from '../TypingIndicator'\n\ntype StreamingListProps<T> = {\n items: T[]\n renderItem: (item: T, index: number) => React.ReactNode\n isStreaming?: boolean\n className?: string\n emptyMessage?: string\n}\n\nconst fadeSlideInKeyframes = `\n@keyframes fadeSlideIn {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n`\n\nfunction StreamingList<T>({\n items,\n renderItem,\n isStreaming = false,\n className,\n emptyMessage,\n}: StreamingListProps<T>) {\n const reducedMotion = useReducedMotion()\n\n if (items.length === 0 && !isStreaming) {\n return emptyMessage ? (\n <p className={twMerge('text-sm text-text-secondary', className)} data-testid=\"streaming-list-empty\">\n {emptyMessage}\n </p>\n ) : null\n }\n\n return (\n <ul\n aria-live=\"polite\"\n className={twMerge('list-none p-0 m-0', className)}\n data-testid=\"streaming-list\"\n >\n {!reducedMotion && <style>{fadeSlideInKeyframes}</style>}\n {items.map((item, index) => (\n <li\n key={index}\n style={\n reducedMotion\n ? undefined\n : { animation: 'fadeSlideIn 0.3s ease-out' }\n }\n data-testid=\"streaming-list-item\"\n >\n {renderItem(item, index)}\n </li>\n ))}\n {isStreaming && (\n <li data-testid=\"streaming-list-loading\">\n <TypingIndicator />\n </li>\n )}\n </ul>\n )\n}\n\nexport { StreamingList }\nexport type { StreamingListProps }\n","import React from 'react'\nimport { twMerge } from 'tailwind-merge'\nimport { useReducedMotion } from '@surf-kit/hooks'\nimport { TextGlimmer } from '../TextGlimmer'\n\ntype StreamingStructureProps = {\n data: Record<string, unknown>\n isStreaming?: boolean\n className?: string\n}\n\nconst fadeSlideInKeyframes = `\n@keyframes fadeSlideIn {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n`\n\nfunction renderValue(value: unknown, reducedMotion: boolean): React.ReactNode {\n if (value === null) {\n return <span className=\"italic text-text-secondary\">null</span>\n }\n if (value === undefined) {\n return <span className=\"italic text-text-secondary\">undefined</span>\n }\n if (Array.isArray(value)) {\n return (\n <ol className=\"list-decimal pl-4 m-0\">\n {value.map((item, i) => (\n <li key={i} className=\"text-text-secondary text-sm\">\n {renderValue(item, reducedMotion)}\n </li>\n ))}\n </ol>\n )\n }\n if (typeof value === 'object') {\n return renderNestedDl(value as Record<string, unknown>, reducedMotion)\n }\n return String(value)\n}\n\nfunction renderNestedDl(\n data: Record<string, unknown>,\n reducedMotion: boolean,\n): React.ReactNode {\n const entries = Object.entries(data)\n return (\n <dl className=\"pl-4 m-0\" data-testid=\"streaming-structure-nested\">\n {entries.map(([key, value]) => (\n <div\n key={key}\n style={\n reducedMotion\n ? undefined\n : { animation: 'fadeSlideIn 0.3s ease-out' }\n }\n >\n <dt className=\"font-medium text-text-primary text-sm\">{key}</dt>\n <dd className=\"text-text-secondary text-sm ml-0 mb-3\">\n {renderValue(value, reducedMotion)}\n </dd>\n </div>\n ))}\n </dl>\n )\n}\n\nfunction StreamingStructure({\n data,\n isStreaming = false,\n className,\n}: StreamingStructureProps) {\n const reducedMotion = useReducedMotion()\n const entries = Object.entries(data)\n\n return (\n <dl\n aria-live=\"polite\"\n className={twMerge('m-0', className)}\n data-testid=\"streaming-structure\"\n >\n {!reducedMotion && <style>{fadeSlideInKeyframes}</style>}\n {entries.map(([key, value]) => (\n <div\n key={key}\n style={\n reducedMotion\n ? undefined\n : { animation: 'fadeSlideIn 0.3s ease-out' }\n }\n data-testid=\"streaming-structure-entry\"\n >\n <dt className=\"font-medium text-text-primary text-sm\">{key}</dt>\n <dd className=\"text-text-secondary text-sm ml-0 mb-3\">\n {renderValue(value, reducedMotion)}\n </dd>\n </div>\n ))}\n {isStreaming && (\n <div data-testid=\"streaming-structure-loading\">\n <TextGlimmer lines={1} />\n </div>\n )}\n </dl>\n )\n}\n\nexport { StreamingStructure }\nexport type { StreamingStructureProps }\n","import { twMerge } from 'tailwind-merge'\nimport React from 'react'\nimport type { ConversationSummary } from '../../types/chat'\n\nexport type ConversationListProps = {\n conversations: ConversationSummary[]\n activeId?: string\n onSelect: (id: string) => void\n onDelete?: (id: string) => void\n onNew?: () => void\n className?: string\n}\n\nfunction ConversationList({\n conversations,\n activeId,\n onSelect,\n onDelete,\n onNew,\n className,\n}: ConversationListProps) {\n return (\n <nav\n aria-label=\"Conversation list\"\n className={twMerge('flex flex-col h-full bg-canvas', className)}\n >\n {onNew && (\n <div className=\"p-3 border-b border-border\">\n <button\n type=\"button\"\n onClick={onNew}\n className=\"w-full px-4 py-2.5 rounded-xl text-sm font-semibold bg-accent text-white hover:bg-accent-hover transition-all duration-200\"\n >\n New conversation\n </button>\n </div>\n )}\n\n <ul role=\"list\" className=\"flex-1 overflow-y-auto\">\n {conversations.map((conversation) => {\n const isActive = conversation.id === activeId\n return (\n <li\n key={conversation.id}\n className={twMerge(\n 'flex items-start border-b border-border transition-colors duration-200',\n 'hover:bg-surface',\n isActive && 'bg-surface-raised border-l-2 border-l-accent',\n )}\n >\n <button\n type=\"button\"\n onClick={() => onSelect(conversation.id)}\n aria-current={isActive ? 'true' : undefined}\n className=\"flex-1 min-w-0 text-left px-4 py-3\"\n >\n <div className=\"text-sm font-medium text-brand-cream truncate\">\n {conversation.title}\n </div>\n <div className=\"text-xs text-brand-cream/40 truncate mt-0.5 leading-relaxed\">\n {conversation.lastMessage}\n </div>\n </button>\n {onDelete && (\n <button\n type=\"button\"\n onClick={() => onDelete(conversation.id)}\n aria-label={`Delete ${conversation.title}`}\n className=\"shrink-0 p-1.5 m-2 rounded-lg text-brand-cream/25 hover:text-brand-watermelon hover:bg-brand-watermelon/10 transition-colors duration-200\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n </svg>\n </button>\n )}\n </li>\n )\n })}\n\n {conversations.length === 0 && (\n <li className=\"px-4 py-8 text-center\">\n <span className=\"text-sm text-brand-cream/30 font-body\">No conversations yet</span>\n </li>\n )}\n </ul>\n </nav>\n )\n}\n\nexport { ConversationList }\n","import { twMerge } from 'tailwind-merge'\nimport React, { useState, useCallback } from 'react'\nimport { AgentChat } from '../../chat/AgentChat'\nimport { ConversationList } from '../../chat/ConversationList'\nimport type { ConversationSummary } from '../../types/chat'\n\nexport type AgentFullPageProps = {\n endpoint: string\n title?: string\n showConversationList?: boolean\n conversations?: ConversationSummary[]\n activeConversationId?: string\n onConversationSelect?: (id: string) => void\n onConversationDelete?: (id: string) => void\n onNewConversation?: () => void\n className?: string\n}\n\nfunction AgentFullPage({\n endpoint,\n title = 'Chat',\n showConversationList = false,\n conversations = [],\n activeConversationId,\n onConversationSelect,\n onConversationDelete,\n onNewConversation,\n className,\n}: AgentFullPageProps) {\n const [sidebarOpen, setSidebarOpen] = useState(false)\n\n const handleSelect = useCallback(\n (id: string) => {\n onConversationSelect?.(id)\n setSidebarOpen(false)\n },\n [onConversationSelect],\n )\n\n return (\n <div\n className={twMerge('flex h-screen w-full overflow-hidden bg-brand-dark', className)}\n data-testid=\"agent-full-page\"\n >\n {/* Sidebar */}\n {showConversationList && (\n <>\n {/* Mobile overlay */}\n {sidebarOpen && (\n <div\n className=\"fixed inset-0 bg-brand-dark/80 backdrop-blur-sm z-30 md:hidden\"\n onClick={() => setSidebarOpen(false)}\n data-testid=\"sidebar-overlay\"\n />\n )}\n\n {/* Sidebar panel */}\n <aside\n className={twMerge(\n 'bg-brand-dark border-r border-brand-gold/15 w-72 shrink-0 flex-col z-40',\n // Desktop: always visible\n 'hidden md:flex',\n // Mobile: overlay when open\n sidebarOpen && 'fixed inset-y-0 left-0 flex md:relative',\n )}\n aria-label=\"Conversations sidebar\"\n >\n <ConversationList\n conversations={conversations}\n activeId={activeConversationId}\n onSelect={handleSelect}\n onDelete={onConversationDelete}\n onNew={onNewConversation}\n />\n </aside>\n </>\n )}\n\n {/* Main chat area */}\n <div className=\"flex-1 flex flex-col min-w-0 bg-brand-dark\">\n {/* Mobile sidebar toggle */}\n {showConversationList && (\n <div className=\"md:hidden flex items-center border-b border-brand-gold/15 px-3 py-2 bg-brand-dark-panel/60 backdrop-blur-sm\">\n <button\n type=\"button\"\n onClick={() => setSidebarOpen(true)}\n aria-label=\"Open conversations sidebar\"\n className=\"p-2 rounded-xl text-brand-cream/60 hover:text-brand-cream hover:bg-brand-dark-panel transition-colors duration-200\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\n </svg>\n </button>\n </div>\n )}\n\n <AgentChat\n endpoint={endpoint}\n title={title}\n className=\"flex-1 rounded-none border-0\"\n />\n </div>\n </div>\n )\n}\n\nexport { AgentFullPage }\n","import { twMerge } from 'tailwind-merge'\nimport React, { useRef, useEffect } from 'react'\nimport { AgentChat } from '../../chat/AgentChat'\n\nexport type AgentPanelProps = {\n endpoint: string\n isOpen: boolean\n onClose: () => void\n side?: 'left' | 'right'\n width?: string | number\n title?: string\n className?: string\n}\n\nfunction AgentPanel({\n endpoint,\n isOpen,\n onClose,\n side = 'right',\n width = 400,\n title = 'Chat',\n className,\n}: AgentPanelProps) {\n const panelRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!isOpen) return\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [isOpen, onClose])\n\n const widthStyle = typeof width === 'number' ? `${width}px` : width\n\n return (\n <div\n className={twMerge('fixed inset-0 z-50', !isOpen && 'pointer-events-none')}\n aria-hidden={!isOpen}\n >\n {/* Backdrop */}\n <div\n className={twMerge(\n 'fixed inset-0 transition-opacity duration-300',\n isOpen\n ? 'opacity-100 bg-brand-dark/70 backdrop-blur-sm pointer-events-auto'\n : 'opacity-0 pointer-events-none',\n )}\n onClick={isOpen ? onClose : undefined}\n data-testid=\"panel-backdrop\"\n />\n\n {/* Panel */}\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-label={title}\n aria-modal={isOpen ? 'true' : undefined}\n style={{ width: widthStyle, maxWidth: '100vw' }}\n className={twMerge(\n 'fixed top-0 h-full flex flex-col z-50 bg-brand-dark shadow-card',\n 'transition-transform duration-300 ease-in-out',\n side === 'left'\n ? `left-0 border-r border-brand-gold/15 ${isOpen ? 'translate-x-0' : '-translate-x-full'}`\n : `right-0 border-l border-brand-gold/15 ${isOpen ? 'translate-x-0' : 'translate-x-full'}`,\n className,\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-brand-gold/15 px-5 py-3.5 bg-brand-dark-panel/60 backdrop-blur-sm shrink-0\">\n <h2 className=\"text-base font-display font-semibold text-brand-cream\">{title}</h2>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close panel\"\n className=\"rounded-xl p-2 text-brand-cream/40 hover:text-brand-cream/80 hover:bg-brand-cream/5 transition-colors duration-200\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n\n {/* Chat */}\n <AgentChat\n endpoint={endpoint}\n title={title}\n showHeader={false}\n showWelcomeTitle={false}\n className=\"flex-1 rounded-none border-0\"\n />\n </div>\n </div>\n )\n}\n\nexport { AgentPanel }\n","import { twMerge } from 'tailwind-merge'\nimport React, { useState, useCallback } from 'react'\nimport { AgentChat } from '../../chat/AgentChat'\n\nexport type AgentWidgetProps = {\n endpoint: string\n position?: 'bottom-right' | 'bottom-left'\n triggerLabel?: string\n title?: string\n className?: string\n}\n\nfunction AgentWidget({\n endpoint,\n position = 'bottom-right',\n triggerLabel = 'Chat',\n title = 'Chat',\n className,\n}: AgentWidgetProps) {\n const [isOpen, setIsOpen] = useState(false)\n\n const toggle = useCallback(() => {\n setIsOpen((prev) => !prev)\n }, [])\n\n const positionClasses = position === 'bottom-left' ? 'left-4 bottom-4' : 'right-4 bottom-4'\n const popoverPositionClasses = position === 'bottom-left' ? 'left-4 bottom-20' : 'right-4 bottom-20'\n const popoverOrigin = position === 'bottom-left' ? 'origin-bottom-left' : 'origin-bottom-right'\n\n return (\n <div className={className}>\n {/* Popover — always rendered, animated with CSS */}\n <div\n role=\"dialog\"\n aria-label={title}\n aria-hidden={!isOpen}\n className={twMerge(\n 'fixed z-50 flex flex-col',\n 'w-[min(400px,calc(100vw-2rem))] h-[min(600px,calc(100vh-6rem))]',\n 'rounded-2xl overflow-hidden border border-brand-gold/15',\n 'bg-brand-dark/95 backdrop-blur-[12px] shadow-card',\n popoverPositionClasses,\n popoverOrigin,\n 'transition-all duration-200 ease-out',\n isOpen\n ? 'opacity-100 scale-100 pointer-events-auto translate-y-0'\n : 'opacity-0 scale-95 pointer-events-none translate-y-2',\n )}\n >\n {/* Popover header */}\n <div className=\"flex items-center justify-between px-4 py-2.5 bg-brand-dark-panel/80 border-b border-brand-gold/15 shrink-0\">\n <h2 className=\"text-sm font-display font-semibold text-brand-cream\">{title}</h2>\n <button\n type=\"button\"\n onClick={() => setIsOpen(false)}\n aria-label=\"Minimize chat\"\n className=\"rounded-lg p-1.5 text-brand-cream/40 hover:text-brand-cream/70 transition-colors duration-200\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n\n <AgentChat\n endpoint={endpoint}\n title={title}\n showHeader={false}\n showWelcomeTitle={false}\n className=\"flex-1 rounded-none border-0 min-h-0\"\n />\n </div>\n\n {/* FAB — gold glow */}\n <button\n type=\"button\"\n onClick={toggle}\n aria-label={isOpen ? 'Close chat' : triggerLabel}\n aria-expanded={isOpen}\n className={twMerge(\n 'fixed z-50 flex items-center justify-center w-14 h-14 rounded-full',\n 'bg-brand-blue text-brand-cream shadow-glow-cyan',\n 'hover:bg-brand-cyan hover:shadow-glow-cyan hover:scale-105',\n 'active:scale-95',\n 'transition-all duration-200',\n positionClasses,\n )}\n >\n {isOpen ? (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n ) : (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n )}\n </button>\n </div>\n )\n}\n\nexport { AgentWidget }\n","import { twMerge } from 'tailwind-merge'\nimport React from 'react'\nimport { AgentChat } from '../../chat/AgentChat'\n\nexport type AgentEmbedProps = {\n endpoint: string\n title?: string\n className?: string\n}\n\nfunction AgentEmbed({\n endpoint,\n title = 'Chat',\n className,\n}: AgentEmbedProps) {\n return (\n <div\n className={twMerge('w-full h-full min-h-0', className)}\n data-testid=\"agent-embed\"\n >\n <AgentChat\n endpoint={endpoint}\n title={title}\n className=\"h-full rounded-none border-0\"\n />\n </div>\n )\n}\n\nexport { AgentEmbed }\n","import React from 'react'\nimport { cva } from 'class-variance-authority'\nimport { twMerge } from 'tailwind-merge'\nimport { Badge, Spinner } from '@surf-kit/core'\nimport type { MCPToolCallData, MCPToolStatus } from '../../types/mcp'\n\nexport type MCPToolCallProps = {\n call: MCPToolCallData\n isExpanded?: boolean\n onToggleExpand?: () => void\n className?: string\n}\n\nconst statusBadgeIntent: Record<MCPToolStatus, 'default' | 'info' | 'success' | 'error'> = {\n pending: 'default',\n running: 'info',\n success: 'success',\n error: 'error',\n}\n\nconst statusLabel: Record<MCPToolStatus, string> = {\n pending: 'Pending',\n running: 'Running',\n success: 'Success',\n error: 'Error',\n}\n\nconst container = cva(\n 'rounded-lg border text-sm',\n {\n variants: {\n status: {\n pending: 'border-neutral-200 bg-neutral-50',\n running: 'border-sky-200 bg-sky-50',\n success: 'border-status-success-subtle bg-status-success-subtle/30',\n error: 'border-status-error-subtle bg-status-error-subtle/30',\n },\n },\n defaultVariants: { status: 'pending' },\n },\n)\n\nfunction formatDuration(start?: Date, end?: Date): string | null {\n if (!start || !end) return null\n const ms = end.getTime() - start.getTime()\n if (ms < 1000) return `${ms}ms`\n return `${(ms / 1000).toFixed(1)}s`\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === 'string') return value\n return JSON.stringify(value, null, 2)\n}\n\nfunction MCPToolCall({ call, isExpanded = false, onToggleExpand, className }: MCPToolCallProps) {\n const duration = formatDuration(call.startedAt, call.completedAt)\n\n return (\n <div\n className={twMerge(container({ status: call.status }), className)}\n data-testid=\"mcp-tool-call\"\n >\n {/* Header */}\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-between gap-2 px-3 py-2\"\n onClick={onToggleExpand}\n aria-expanded={isExpanded}\n data-testid=\"mcp-tool-call-header\"\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className=\"font-medium text-text-primary truncate\" data-testid=\"mcp-tool-name\">\n {call.name}\n </span>\n {call.serverName && (\n <span className=\"text-xs text-text-secondary truncate\">\n {call.serverName}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {call.status === 'running' && (\n <span aria-hidden=\"true\">\n <Spinner size=\"sm\" />\n </span>\n )}\n <Badge\n intent={statusBadgeIntent[call.status]}\n size=\"sm\"\n role=\"status\"\n aria-label={`Status: ${statusLabel[call.status]}`}\n data-testid=\"mcp-tool-status\"\n >\n {statusLabel[call.status]}\n </Badge>\n {duration && (\n <span className=\"text-xs text-text-secondary\" data-testid=\"mcp-tool-duration\">\n {duration}\n </span>\n )}\n <svg\n className={`h-4 w-4 text-text-secondary transition-transform ${isExpanded ? 'rotate-180' : ''}`}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n </button>\n\n {/* Expandable body */}\n {isExpanded && (\n <div className=\"border-t border-inherit px-3 py-2 space-y-3\" data-testid=\"mcp-tool-call-body\">\n {/* Arguments */}\n {Object.keys(call.arguments).length > 0 && (\n <div>\n <h4 className=\"text-xs font-medium text-text-secondary mb-1\">Arguments</h4>\n <dl className=\"space-y-1\" data-testid=\"mcp-tool-arguments\">\n {Object.entries(call.arguments).map(([key, value]) => (\n <div key={key} className=\"flex gap-2\">\n <dt className=\"text-xs font-mono text-text-secondary shrink-0\">{key}:</dt>\n <dd className=\"text-xs font-mono text-text-primary break-all\">\n {formatValue(value)}\n </dd>\n </div>\n ))}\n </dl>\n </div>\n )}\n\n {/* Result */}\n {call.result !== undefined && (\n <div>\n <h4 className=\"text-xs font-medium text-text-secondary mb-1\">Result</h4>\n <pre\n className=\"text-xs font-mono text-text-primary bg-neutral-100 rounded p-2 overflow-x-auto whitespace-pre-wrap\"\n data-testid=\"mcp-tool-result\"\n >\n {typeof call.result === 'string' ? call.result : JSON.stringify(call.result, null, 2)}\n </pre>\n </div>\n )}\n\n {/* Error */}\n {call.error && (\n <div>\n <h4 className=\"text-xs font-medium text-status-error mb-1\">Error</h4>\n <p\n className=\"text-xs text-status-error bg-status-error-subtle/30 rounded p-2\"\n data-testid=\"mcp-tool-error\"\n >\n {call.error}\n </p>\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport { MCPToolCall }\n","import React from 'react'\nimport { twMerge } from 'tailwind-merge'\nimport type { MCPResource } from '../../types/mcp'\n\nexport type MCPResourceViewProps = {\n resource: MCPResource\n className?: string\n}\n\nfunction isImageMime(mime?: string): boolean {\n return !!mime && mime.startsWith('image/')\n}\n\nfunction isTextMime(mime?: string): boolean {\n if (!mime) return true\n return (\n mime.startsWith('text/') ||\n mime === 'application/json' ||\n mime === 'application/xml' ||\n mime === 'application/javascript' ||\n mime === 'application/typescript'\n )\n}\n\nfunction isUrlContent(content?: string | Uint8Array): boolean {\n if (typeof content !== 'string') return false\n return /^https?:\\/\\//.test(content.trim())\n}\n\nfunction MCPResourceView({ resource, className }: MCPResourceViewProps) {\n const { uri, name, mimeType, description, content } = resource\n\n return (\n <div\n className={twMerge('rounded-lg border border-border bg-surface p-3 text-sm', className)}\n data-testid=\"mcp-resource-view\"\n >\n {/* Header */}\n <div className=\"mb-2\">\n <span className=\"font-medium text-text-primary\" data-testid=\"mcp-resource-name\">\n {name}\n </span>\n <span\n className=\"ml-2 text-xs text-text-secondary font-mono truncate\"\n data-testid=\"mcp-resource-uri\"\n >\n {uri}\n </span>\n </div>\n\n {description && (\n <p className=\"text-xs text-text-secondary mb-2\" data-testid=\"mcp-resource-description\">\n {description}\n </p>\n )}\n\n {/* Content rendering */}\n {content !== undefined && (\n <div data-testid=\"mcp-resource-content\">\n {isImageMime(mimeType) && typeof content === 'string' ? (\n <img\n src={content}\n alt={name}\n className=\"max-w-full rounded\"\n data-testid=\"mcp-resource-image\"\n />\n ) : isUrlContent(content) ? (\n <a\n href={typeof content === 'string' ? content.trim() : undefined}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm text-interactive-primary hover:underline break-all\"\n data-testid=\"mcp-resource-link\"\n >\n {typeof content === 'string' ? content.trim() : ''}\n </a>\n ) : isTextMime(mimeType) ? (\n <pre\n className=\"text-xs font-mono text-text-primary bg-neutral-100 rounded p-2 overflow-x-auto whitespace-pre-wrap\"\n data-testid=\"mcp-resource-code\"\n >\n {typeof content === 'string' ? content : '[Binary data]'}\n </pre>\n ) : (\n <p className=\"text-xs text-text-secondary italic\">\n Unsupported content type: {mimeType}\n </p>\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport { MCPResourceView }\n","import React, { useState } from 'react'\nimport { cva } from 'class-variance-authority'\nimport { twMerge } from 'tailwind-merge'\nimport type { MCPServerInfo } from '../../types/mcp'\n\nexport type MCPServerStatusProps = {\n server: MCPServerInfo\n className?: string\n}\n\nconst statusDot = cva('inline-block h-2 w-2 rounded-full shrink-0', {\n variants: {\n status: {\n connected: 'bg-status-success',\n disconnected: 'bg-neutral-400',\n error: 'bg-status-error',\n },\n },\n defaultVariants: { status: 'disconnected' },\n})\n\nconst statusLabel: Record<MCPServerInfo['status'], string> = {\n connected: 'Connected',\n disconnected: 'Disconnected',\n error: 'Error',\n}\n\nfunction formatLastPing(date?: Date): string | null {\n if (!date) return null\n return date.toLocaleTimeString()\n}\n\nfunction MCPServerStatus({ server, className }: MCPServerStatusProps) {\n const [showTools, setShowTools] = useState(false)\n const [showResources, setShowResources] = useState(false)\n const lastPing = formatLastPing(server.lastPing)\n\n return (\n <div\n className={twMerge('rounded-lg border border-border bg-surface p-3 text-sm', className)}\n data-testid=\"mcp-server-status\"\n >\n {/* Header */}\n <div className=\"flex items-center gap-2 mb-1\">\n <span\n className={statusDot({ status: server.status })}\n role=\"status\"\n aria-label={statusLabel[server.status]}\n data-testid=\"mcp-server-status-dot\"\n />\n <span className=\"font-medium text-text-primary\" data-testid=\"mcp-server-name\">\n {server.name}\n </span>\n {server.version && (\n <span className=\"text-xs text-text-secondary\" data-testid=\"mcp-server-version\">\n v{server.version}\n </span>\n )}\n </div>\n\n {lastPing && (\n <p className=\"text-xs text-text-secondary ml-4 mb-2\" data-testid=\"mcp-server-last-ping\">\n Last ping: {lastPing}\n </p>\n )}\n\n {/* Tools list */}\n {server.tools.length > 0 && (\n <div className=\"mt-2\">\n <button\n type=\"button\"\n className=\"flex items-center gap-1 text-xs font-medium text-text-secondary hover:text-text-primary w-full\"\n onClick={() => setShowTools((prev) => !prev)}\n aria-expanded={showTools}\n data-testid=\"mcp-server-tools-toggle\"\n >\n <svg\n className={`h-3 w-3 transition-transform ${showTools ? 'rotate-90' : ''}`}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z\"\n clipRule=\"evenodd\"\n />\n </svg>\n Tools ({server.tools.length})\n </button>\n {showTools && (\n <ul className=\"mt-1 ml-4 space-y-1\" data-testid=\"mcp-server-tools-list\">\n {server.tools.map((tool) => (\n <li key={tool.name} className=\"text-xs text-text-primary\">\n <span className=\"font-mono\">{tool.name}</span>\n {tool.description && (\n <span className=\"text-text-secondary ml-1\">— {tool.description}</span>\n )}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n\n {/* Resources list */}\n {server.resources.length > 0 && (\n <div className=\"mt-2\">\n <button\n type=\"button\"\n className=\"flex items-center gap-1 text-xs font-medium text-text-secondary hover:text-text-primary w-full\"\n onClick={() => setShowResources((prev) => !prev)}\n aria-expanded={showResources}\n data-testid=\"mcp-server-resources-toggle\"\n >\n <svg\n className={`h-3 w-3 transition-transform ${showResources ? 'rotate-90' : ''}`}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z\"\n clipRule=\"evenodd\"\n />\n </svg>\n Resources ({server.resources.length})\n </button>\n {showResources && (\n <ul className=\"mt-1 ml-4 space-y-1\" data-testid=\"mcp-server-resources-list\">\n {server.resources.map((res) => (\n <li key={res.uri} className=\"text-xs text-text-primary\">\n <span className=\"font-mono\">{res.name}</span>\n <span className=\"text-text-secondary ml-1\">({res.uri})</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport { MCPServerStatus }\n","import React, { useRef, useEffect } from 'react'\nimport { cva } from 'class-variance-authority'\nimport { twMerge } from 'tailwind-merge'\nimport { useDialog, FocusScope } from 'react-aria'\nimport { Button, Badge } from '@surf-kit/core'\nimport type { MCPToolCallData } from '../../types/mcp'\n\nexport type MCPApprovalDialogProps = {\n call: MCPToolCallData\n riskLevel?: 'low' | 'medium' | 'high'\n onApprove: () => void\n onDeny: () => void\n isOpen: boolean\n className?: string\n}\n\nconst riskBadgeIntent: Record<string, 'success' | 'warning' | 'error'> = {\n low: 'success',\n medium: 'warning',\n high: 'error',\n}\n\nconst riskLabel: Record<string, string> = {\n low: 'Low Risk',\n medium: 'Medium Risk',\n high: 'High Risk',\n}\n\nconst riskBorder = cva('relative bg-surface rounded-xl shadow-xl border p-6 outline-none w-full max-w-lg', {\n variants: {\n risk: {\n low: 'border-status-success-subtle',\n medium: 'border-status-warning-subtle',\n high: 'border-status-error-subtle',\n },\n },\n defaultVariants: { risk: 'low' },\n})\n\nfunction formatValue(value: unknown): string {\n if (typeof value === 'string') return value\n return JSON.stringify(value, null, 2)\n}\n\nfunction MCPApprovalDialog({\n call,\n riskLevel = 'low',\n onApprove,\n onDeny,\n isOpen,\n className,\n}: MCPApprovalDialogProps) {\n const ref = useRef<HTMLDivElement>(null)\n const { dialogProps, titleProps } = useDialog({ role: 'alertdialog' }, ref)\n\n // Block Escape key — user must explicitly approve or deny\n useEffect(() => {\n if (!isOpen) return\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n e.stopPropagation()\n }\n }\n document.addEventListener('keydown', handleKeyDown, true)\n return () => document.removeEventListener('keydown', handleKeyDown, true)\n }, [isOpen])\n\n if (!isOpen) return null\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\"\n data-testid=\"mcp-approval-overlay\"\n >\n <FocusScope contain restoreFocus autoFocus>\n <div\n {...dialogProps}\n ref={ref}\n className={twMerge(riskBorder({ risk: riskLevel }), className)}\n data-testid=\"mcp-approval-dialog\"\n >\n {/* Title */}\n <div className=\"flex items-center justify-between mb-4\">\n <h2\n {...titleProps}\n className=\"text-lg font-semibold text-text-primary\"\n data-testid=\"mcp-approval-title\"\n >\n Tool Approval Required\n </h2>\n <Badge\n intent={riskBadgeIntent[riskLevel]}\n size=\"sm\"\n data-testid=\"mcp-approval-risk-badge\"\n >\n {riskLabel[riskLevel]}\n </Badge>\n </div>\n\n {/* Tool info */}\n <div className=\"space-y-3 text-sm\">\n <div>\n <h3 className=\"text-xs font-medium text-text-secondary mb-1\">Tool</h3>\n <p className=\"font-mono text-text-primary\" data-testid=\"mcp-approval-tool-name\">\n {call.name}\n </p>\n {call.serverName && (\n <p className=\"text-xs text-text-secondary mt-0.5\" data-testid=\"mcp-approval-server\">\n Server: {call.serverName}\n </p>\n )}\n </div>\n\n {/* Arguments */}\n {Object.keys(call.arguments).length > 0 && (\n <div>\n <h3 className=\"text-xs font-medium text-text-secondary mb-1\">Arguments</h3>\n <dl\n className=\"space-y-1 bg-neutral-100 rounded p-2\"\n data-testid=\"mcp-approval-arguments\"\n >\n {Object.entries(call.arguments).map(([key, value]) => (\n <div key={key} className=\"flex gap-2\">\n <dt className=\"text-xs font-mono text-text-secondary shrink-0\">{key}:</dt>\n <dd className=\"text-xs font-mono text-text-primary break-all\">\n {formatValue(value)}\n </dd>\n </div>\n ))}\n </dl>\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"mt-6 flex justify-end gap-3\">\n <Button\n intent=\"secondary\"\n onPress={onDeny}\n aria-label=\"Deny tool execution\"\n >\n Deny\n </Button>\n <Button\n intent=\"primary\"\n onPress={onApprove}\n aria-label=\"Approve tool execution\"\n >\n Approve\n </Button>\n </div>\n </div>\n </FocusScope>\n </div>\n )\n}\n\nexport { MCPApprovalDialog }\n","import React, { useState } from 'react'\n\ntype FeedbackRating = 'positive' | 'negative'\n\ntype ThumbsFeedbackProps = {\n messageId: string\n onFeedback: (messageId: string, rating: FeedbackRating, comment?: string) => void\n state?: FeedbackRating | null\n onNegative?: () => void\n className?: string\n}\n\nfunction ThumbsFeedback({\n messageId,\n onFeedback,\n state = null,\n onNegative,\n className,\n}: ThumbsFeedbackProps) {\n const [selected, setSelected] = useState<FeedbackRating | null>(state)\n\n const handleClick = (rating: FeedbackRating) => {\n setSelected(rating)\n onFeedback(messageId, rating)\n if (rating === 'negative' && onNegative) {\n onNegative()\n }\n }\n\n return (\n <div\n className={`inline-flex items-center gap-0.5 ${className ?? ''}`}\n role=\"group\"\n aria-label=\"Rate this response\"\n data-testid=\"thumbs-feedback\"\n >\n <button\n type=\"button\"\n onClick={() => handleClick('positive')}\n aria-label=\"Thumbs up\"\n aria-pressed={selected === 'positive'}\n className={`p-1.5 rounded-md transition-colors duration-200 ${\n selected === 'positive'\n ? 'text-brand-cyan bg-brand-cyan/15'\n : 'text-brand-cream/30 hover:text-brand-cyan hover:bg-brand-cyan/10'\n }`}\n data-testid=\"thumbs-up\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M7 10v12\" />\n <path d=\"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2h0a3.13 3.13 0 0 1 3 3.88Z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleClick('negative')}\n aria-label=\"Thumbs down\"\n aria-pressed={selected === 'negative'}\n className={`p-1.5 rounded-md transition-colors duration-200 ${\n selected === 'negative'\n ? 'text-brand-watermelon bg-brand-watermelon/15'\n : 'text-brand-cream/30 hover:text-brand-watermelon hover:bg-brand-watermelon/10'\n }`}\n data-testid=\"thumbs-down\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M17 14V2\" />\n <path d=\"M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22h0a3.13 3.13 0 0 1-3-3.88Z\" />\n </svg>\n </button>\n </div>\n )\n}\n\nexport { ThumbsFeedback }\nexport type { ThumbsFeedbackProps, FeedbackRating }\n","import React, { useState } from 'react'\nimport { Dialog, Button, TextArea } from '@surf-kit/core'\n\ntype FeedbackDialogProps = {\n isOpen: boolean\n onClose: () => void\n onSubmit: (comment: string) => void\n className?: string\n}\n\nfunction FeedbackDialog({ isOpen, onClose, onSubmit, className }: FeedbackDialogProps) {\n const [comment, setComment] = useState('')\n\n const handleSubmit = () => {\n onSubmit(comment)\n setComment('')\n onClose()\n }\n\n return (\n <Dialog\n isOpen={isOpen}\n onClose={onClose}\n title=\"Share your feedback\"\n size=\"sm\"\n className={className}\n footer={\n <>\n <Button intent=\"ghost\" onPress={onClose}>\n Cancel\n </Button>\n <Button intent=\"primary\" onPress={handleSubmit} isDisabled={comment.trim().length === 0}>\n Submit\n </Button>\n </>\n }\n >\n <TextArea\n label=\"What could be improved?\"\n value={comment}\n onChange={setComment}\n placeholder=\"Tell us what went wrong or how this response could be better...\"\n rows={4}\n data-testid=\"feedback-textarea\"\n />\n </Dialog>\n )\n}\n\nexport { FeedbackDialog }\nexport type { FeedbackDialogProps }\n","import React from 'react'\n\ntype FeedbackConfirmationProps = {\n variant?: 'inline' | 'toast'\n className?: string\n}\n\nfunction FeedbackConfirmation({ variant = 'inline', className }: FeedbackConfirmationProps) {\n if (variant === 'toast') {\n return (\n <div\n role=\"status\"\n className={`fixed bottom-4 right-4 bg-surface border border-border rounded-lg px-4 py-3 shadow-lg text-sm text-text-primary ${className ?? ''}`}\n data-testid=\"feedback-confirmation\"\n >\n Thanks for your feedback\n </div>\n )\n }\n\n return (\n <span\n role=\"status\"\n className={`text-sm text-text-secondary ${className ?? ''}`}\n data-testid=\"feedback-confirmation\"\n >\n Thanks for your feedback\n </span>\n )\n}\n\nexport { FeedbackConfirmation }\nexport type { FeedbackConfirmationProps }\n"],"mappings":"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","names":["twMerge","config","twMerge","useRef","twMerge","Badge","jsx","twMerge","jsx","jsxs","jsx","jsxs","twMerge","jsx","jsx","jsxs","getConfidenceIntent","Badge","jsx","jsxs","twMerge","jsx","jsxs","useRef","twMerge","twMerge","useState","useRef","useCallback","jsx","jsxs","twMerge","jsx","jsxs","useEffect","useRef","useState","useRef","useEffect","jsx","jsxs","useRef","useEffect","jsx","jsxs","twMerge","jsx","jsxs","jsx","jsxs","Badge","jsx","jsxs","getConfidenceIntent","Badge","jsxs","Badge","jsx","useState","jsx","jsxs","jsx","jsxs","useState","Badge","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","Spinner","jsx","jsxs","Spinner","jsx","jsxs","jsx","jsxs","useEffect","useState","jsx","jsxs","twMerge","useReducedMotion","jsx","jsxs","twMerge","useReducedMotion","jsx","jsxs","twMerge","useReducedMotion","jsx","jsxs","useReducedMotion","twMerge","twMerge","useReducedMotion","jsx","jsxs","fadeSlideInKeyframes","useReducedMotion","twMerge","twMerge","jsx","jsxs","twMerge","useState","useCallback","jsx","jsxs","useState","useCallback","twMerge","twMerge","useRef","useEffect","jsx","jsxs","useRef","useEffect","twMerge","twMerge","useState","useCallback","jsx","jsxs","useState","useCallback","twMerge","twMerge","jsx","twMerge","twMerge","Badge","Spinner","jsx","jsxs","twMerge","jsx","jsxs","useState","cva","twMerge","jsx","jsxs","statusLabel","useRef","useEffect","cva","twMerge","Button","Badge","jsx","jsxs","formatValue","useState","jsx","jsxs","useState","Button","Fragment","jsx","jsxs","jsx"]}