ai-site-pilot 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +1 -1
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -29,6 +29,8 @@ npm install ai-site-pilot
|
|
|
29
29
|
|
|
30
30
|
Sign up at [openrouter.ai](https://openrouter.ai) and get your API key.
|
|
31
31
|
|
|
32
|
+
> **💡 Free tier:** Gemini 2.0 Flash (`google/gemini-2.0-flash-exp:free`) is completely free on OpenRouter—no credit card required. Perfect for getting started!
|
|
33
|
+
|
|
32
34
|
### 2. Create the API Route
|
|
33
35
|
|
|
34
36
|
```typescript
|
package/dist/hooks/index.js
CHANGED
|
@@ -141,7 +141,7 @@ function useChat(options) {
|
|
|
141
141
|
onStreamEnd?.();
|
|
142
142
|
}
|
|
143
143
|
},
|
|
144
|
-
[apiEndpoint, input, isLoading, messages, onToolCall, onStreamStart, onStreamEnd]
|
|
144
|
+
[apiEndpoint, input, isLoading, messages, onToolCall, onStreamStart, onStreamEnd, generateFallbackMessage]
|
|
145
145
|
);
|
|
146
146
|
return {
|
|
147
147
|
messages,
|
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/useChat.ts","../../src/hooks/useSpeech.ts"],"names":["useState","useRef","useCallback","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport { useState, useCallback, useRef } from 'react';\nimport type { ChatMessage, ToolExecution, StreamEvent } from '../types';\n\nexport interface UseChatOptions {\n /** API endpoint for chat */\n apiEndpoint: string;\n /** Initial messages */\n initialMessages?: ChatMessage[];\n /** Callback when a tool is called */\n onToolCall?: (toolName: string, args: Record<string, unknown>) => void | Promise<void>;\n /** Callback when streaming starts */\n onStreamStart?: () => void;\n /** Callback when streaming ends */\n onStreamEnd?: () => void;\n /** Generate a fallback message when AI uses tools but provides no text.\n * If not provided, uses a generic fallback message. */\n generateFallbackMessage?: (toolCalls: ToolExecution[]) => string;\n}\n\nexport interface UseChatReturn {\n /** All messages in the conversation */\n messages: ChatMessage[];\n /** Current input value */\n input: string;\n /** Set the input value */\n setInput: (value: string) => void;\n /** Whether the assistant is currently responding */\n isLoading: boolean;\n /** ID of the currently streaming message */\n streamingMessageId: string | null;\n /** Send a message */\n sendMessage: (content?: string) => Promise<void>;\n /** Clear all messages */\n clearMessages: () => void;\n /** Add a message manually */\n addMessage: (message: Omit<ChatMessage, 'id' | 'timestamp'>) => void;\n}\n\n/**\n * Hook for managing chat state and streaming\n */\nexport function useChat(options: UseChatOptions): UseChatReturn {\n const { apiEndpoint, initialMessages = [], onToolCall, onStreamStart, onStreamEnd, generateFallbackMessage } = options;\n\n const [messages, setMessages] = useState<ChatMessage[]>(initialMessages);\n const [input, setInput] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const addMessage = useCallback((message: Omit<ChatMessage, 'id' | 'timestamp'>) => {\n const newMessage: ChatMessage = {\n ...message,\n id: Date.now().toString(),\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, newMessage]);\n return newMessage;\n }, []);\n\n const clearMessages = useCallback(() => {\n setMessages(initialMessages);\n }, [initialMessages]);\n\n const sendMessage = useCallback(\n async (content?: string) => {\n const messageContent = content || input;\n if (!messageContent.trim() || isLoading) return;\n\n // Cancel any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n // Add user message\n const userMessage: ChatMessage = {\n id: Date.now().toString(),\n role: 'user',\n content: messageContent,\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, userMessage]);\n setInput('');\n setIsLoading(true);\n onStreamStart?.();\n\n // Add placeholder for assistant message\n const assistantMessageId = (Date.now() + 1).toString();\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n toolCalls: [],\n };\n setMessages((prev) => [...prev, assistantMessage]);\n setStreamingMessageId(assistantMessageId);\n\n let fullText = '';\n const toolCalls: ToolExecution[] = [];\n\n try {\n // Prepare messages for API (convert to format expected by API)\n const apiMessages = messages.concat(userMessage).map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ messages: apiMessages }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) {\n throw new Error('Failed to get response');\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No reader available');\n\n const decoder = new TextDecoder();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const text = decoder.decode(value);\n const lines = text.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const data = JSON.parse(line.slice(6)) as StreamEvent;\n\n if (data.type === 'text') {\n fullText += data.content;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId ? { ...m, content: fullText } : m\n )\n );\n } else if (data.type === 'tool') {\n const toolCall = { name: data.name, args: data.args };\n toolCalls.push(toolCall);\n\n // Execute tool call callback\n if (onToolCall) {\n try {\n await onToolCall(data.name, data.args);\n } catch (e) {\n console.error('Tool execution error:', e);\n }\n }\n } else if (data.type === 'done') {\n // Update message with tool calls\n if (toolCalls.length > 0) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId ? { ...m, toolCalls } : m\n )\n );\n }\n\n // If no text, generate contextual fallback based on tools used\n if (!fullText && toolCalls.length > 0 && generateFallbackMessage) {\n const fallbackMessage = generateFallbackMessage(toolCalls);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: fallbackMessage }\n : m\n )\n );\n } else if (!fullText) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: \"I've made some changes. Take a look!\" }\n : m\n )\n );\n }\n } else if (data.type === 'error') {\n throw new Error(data.message);\n }\n } catch {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n // Request was cancelled, ignore\n return;\n }\n\n console.error('Chat error:', error);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: 'Sorry, I encountered an error. Please try again.' }\n : m\n )\n );\n } finally {\n setIsLoading(false);\n setStreamingMessageId(null);\n onStreamEnd?.();\n }\n },\n [apiEndpoint, input, isLoading, messages, onToolCall, onStreamStart, onStreamEnd]\n );\n\n return {\n messages,\n input,\n setInput,\n isLoading,\n streamingMessageId,\n sendMessage,\n clearMessages,\n addMessage,\n };\n}\n","'use client';\n\nimport { useState, useRef, useEffect, useCallback } from 'react';\n\n// Web Speech API types\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n}\n\ninterface SpeechRecognitionInstance {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n start(): void;\n stop(): void;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onend: (() => void) | null;\n onerror: (() => void) | null;\n}\n\nexport interface UseSpeechOptions {\n /** Language for speech recognition */\n lang?: string;\n /** Callback when speech is recognized */\n onResult?: (transcript: string, isFinal: boolean) => void;\n}\n\nexport interface UseSpeechReturn {\n /** Whether speech recognition is supported */\n isSupported: boolean;\n /** Whether currently listening */\n isListening: boolean;\n /** Toggle listening on/off */\n toggleListening: () => void;\n /** Start listening */\n startListening: () => void;\n /** Stop listening */\n stopListening: () => void;\n /** Speak text using TTS */\n speak: (text: string) => void;\n /** Whether TTS is enabled */\n ttsEnabled: boolean;\n /** Toggle TTS on/off */\n setTtsEnabled: (enabled: boolean) => void;\n /** Cancel current speech */\n cancelSpeech: () => void;\n}\n\n/**\n * Hook for speech recognition and text-to-speech\n */\nexport function useSpeech(options: UseSpeechOptions = {}): UseSpeechReturn {\n const { lang = 'en-US', onResult } = options;\n\n const [isSupported, setIsSupported] = useState(false);\n const [isListening, setIsListening] = useState(false);\n const [ttsEnabled, setTtsEnabled] = useState(false);\n\n const recognitionRef = useRef<SpeechRecognitionInstance | null>(null);\n\n // Initialize speech recognition\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const windowWithSpeech = window as any;\n const SpeechRecognitionAPI =\n windowWithSpeech.SpeechRecognition || windowWithSpeech.webkitSpeechRecognition;\n\n if (SpeechRecognitionAPI) {\n setIsSupported(true);\n recognitionRef.current = new SpeechRecognitionAPI() as SpeechRecognitionInstance;\n recognitionRef.current.continuous = false;\n recognitionRef.current.interimResults = true;\n recognitionRef.current.lang = lang;\n\n recognitionRef.current.onresult = (event) => {\n const result = event.results[0];\n const transcript = result[0].transcript;\n onResult?.(transcript, result.isFinal);\n\n if (result.isFinal) {\n setIsListening(false);\n }\n };\n\n recognitionRef.current.onend = () => setIsListening(false);\n recognitionRef.current.onerror = () => setIsListening(false);\n }\n }, [lang, onResult]);\n\n const startListening = useCallback(() => {\n if (!recognitionRef.current) return;\n try {\n recognitionRef.current.start();\n setIsListening(true);\n } catch (e) {\n console.error('Speech recognition error:', e);\n }\n }, []);\n\n const stopListening = useCallback(() => {\n if (!recognitionRef.current) return;\n recognitionRef.current.stop();\n setIsListening(false);\n }, []);\n\n const toggleListening = useCallback(() => {\n if (isListening) {\n stopListening();\n } else {\n startListening();\n }\n }, [isListening, startListening, stopListening]);\n\n const speak = useCallback(\n (text: string) => {\n if (!ttsEnabled || typeof window === 'undefined' || !('speechSynthesis' in window)) {\n return;\n }\n\n speechSynthesis.cancel();\n const utterance = new SpeechSynthesisUtterance(text);\n utterance.rate = 1.0;\n utterance.pitch = 1.0;\n\n // Try to find a good voice\n const voices = speechSynthesis.getVoices();\n const preferredVoice = voices.find(\n (v) => v.name.includes('Google') || v.name.includes('Samantha') || v.name.includes('Alex')\n );\n if (preferredVoice) {\n utterance.voice = preferredVoice;\n }\n\n speechSynthesis.speak(utterance);\n },\n [ttsEnabled]\n );\n\n const cancelSpeech = useCallback(() => {\n if (typeof window !== 'undefined' && 'speechSynthesis' in window) {\n speechSynthesis.cancel();\n }\n }, []);\n\n return {\n isSupported,\n isListening,\n toggleListening,\n startListening,\n stopListening,\n speak,\n ttsEnabled,\n setTtsEnabled,\n cancelSpeech,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/useChat.ts","../../src/hooks/useSpeech.ts"],"names":["useState","useRef","useCallback","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport { useState, useCallback, useRef } from 'react';\nimport type { ChatMessage, ToolExecution, StreamEvent } from '../types';\n\nexport interface UseChatOptions {\n /** API endpoint for chat */\n apiEndpoint: string;\n /** Initial messages */\n initialMessages?: ChatMessage[];\n /** Callback when a tool is called */\n onToolCall?: (toolName: string, args: Record<string, unknown>) => void | Promise<void>;\n /** Callback when streaming starts */\n onStreamStart?: () => void;\n /** Callback when streaming ends */\n onStreamEnd?: () => void;\n /** Generate a fallback message when AI uses tools but provides no text.\n * If not provided, uses a generic fallback message. */\n generateFallbackMessage?: (toolCalls: ToolExecution[]) => string;\n}\n\nexport interface UseChatReturn {\n /** All messages in the conversation */\n messages: ChatMessage[];\n /** Current input value */\n input: string;\n /** Set the input value */\n setInput: (value: string) => void;\n /** Whether the assistant is currently responding */\n isLoading: boolean;\n /** ID of the currently streaming message */\n streamingMessageId: string | null;\n /** Send a message */\n sendMessage: (content?: string) => Promise<void>;\n /** Clear all messages */\n clearMessages: () => void;\n /** Add a message manually */\n addMessage: (message: Omit<ChatMessage, 'id' | 'timestamp'>) => void;\n}\n\n/**\n * Hook for managing chat state and streaming\n */\nexport function useChat(options: UseChatOptions): UseChatReturn {\n const { apiEndpoint, initialMessages = [], onToolCall, onStreamStart, onStreamEnd, generateFallbackMessage } = options;\n\n const [messages, setMessages] = useState<ChatMessage[]>(initialMessages);\n const [input, setInput] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const addMessage = useCallback((message: Omit<ChatMessage, 'id' | 'timestamp'>) => {\n const newMessage: ChatMessage = {\n ...message,\n id: Date.now().toString(),\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, newMessage]);\n return newMessage;\n }, []);\n\n const clearMessages = useCallback(() => {\n setMessages(initialMessages);\n }, [initialMessages]);\n\n const sendMessage = useCallback(\n async (content?: string) => {\n const messageContent = content || input;\n if (!messageContent.trim() || isLoading) return;\n\n // Cancel any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n // Add user message\n const userMessage: ChatMessage = {\n id: Date.now().toString(),\n role: 'user',\n content: messageContent,\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, userMessage]);\n setInput('');\n setIsLoading(true);\n onStreamStart?.();\n\n // Add placeholder for assistant message\n const assistantMessageId = (Date.now() + 1).toString();\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n toolCalls: [],\n };\n setMessages((prev) => [...prev, assistantMessage]);\n setStreamingMessageId(assistantMessageId);\n\n let fullText = '';\n const toolCalls: ToolExecution[] = [];\n\n try {\n // Prepare messages for API (convert to format expected by API)\n const apiMessages = messages.concat(userMessage).map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ messages: apiMessages }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) {\n throw new Error('Failed to get response');\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No reader available');\n\n const decoder = new TextDecoder();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const text = decoder.decode(value);\n const lines = text.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const data = JSON.parse(line.slice(6)) as StreamEvent;\n\n if (data.type === 'text') {\n fullText += data.content;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId ? { ...m, content: fullText } : m\n )\n );\n } else if (data.type === 'tool') {\n const toolCall = { name: data.name, args: data.args };\n toolCalls.push(toolCall);\n\n // Execute tool call callback\n if (onToolCall) {\n try {\n await onToolCall(data.name, data.args);\n } catch (e) {\n console.error('Tool execution error:', e);\n }\n }\n } else if (data.type === 'done') {\n // Update message with tool calls\n if (toolCalls.length > 0) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId ? { ...m, toolCalls } : m\n )\n );\n }\n\n // If no text, generate contextual fallback based on tools used\n if (!fullText && toolCalls.length > 0 && generateFallbackMessage) {\n const fallbackMessage = generateFallbackMessage(toolCalls);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: fallbackMessage }\n : m\n )\n );\n } else if (!fullText) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: \"I've made some changes. Take a look!\" }\n : m\n )\n );\n }\n } else if (data.type === 'error') {\n throw new Error(data.message);\n }\n } catch {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n // Request was cancelled, ignore\n return;\n }\n\n console.error('Chat error:', error);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: 'Sorry, I encountered an error. Please try again.' }\n : m\n )\n );\n } finally {\n setIsLoading(false);\n setStreamingMessageId(null);\n onStreamEnd?.();\n }\n },\n [apiEndpoint, input, isLoading, messages, onToolCall, onStreamStart, onStreamEnd, generateFallbackMessage]\n );\n\n return {\n messages,\n input,\n setInput,\n isLoading,\n streamingMessageId,\n sendMessage,\n clearMessages,\n addMessage,\n };\n}\n","'use client';\n\nimport { useState, useRef, useEffect, useCallback } from 'react';\n\n// Web Speech API types\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n}\n\ninterface SpeechRecognitionInstance {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n start(): void;\n stop(): void;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onend: (() => void) | null;\n onerror: (() => void) | null;\n}\n\nexport interface UseSpeechOptions {\n /** Language for speech recognition */\n lang?: string;\n /** Callback when speech is recognized */\n onResult?: (transcript: string, isFinal: boolean) => void;\n}\n\nexport interface UseSpeechReturn {\n /** Whether speech recognition is supported */\n isSupported: boolean;\n /** Whether currently listening */\n isListening: boolean;\n /** Toggle listening on/off */\n toggleListening: () => void;\n /** Start listening */\n startListening: () => void;\n /** Stop listening */\n stopListening: () => void;\n /** Speak text using TTS */\n speak: (text: string) => void;\n /** Whether TTS is enabled */\n ttsEnabled: boolean;\n /** Toggle TTS on/off */\n setTtsEnabled: (enabled: boolean) => void;\n /** Cancel current speech */\n cancelSpeech: () => void;\n}\n\n/**\n * Hook for speech recognition and text-to-speech\n */\nexport function useSpeech(options: UseSpeechOptions = {}): UseSpeechReturn {\n const { lang = 'en-US', onResult } = options;\n\n const [isSupported, setIsSupported] = useState(false);\n const [isListening, setIsListening] = useState(false);\n const [ttsEnabled, setTtsEnabled] = useState(false);\n\n const recognitionRef = useRef<SpeechRecognitionInstance | null>(null);\n\n // Initialize speech recognition\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const windowWithSpeech = window as any;\n const SpeechRecognitionAPI =\n windowWithSpeech.SpeechRecognition || windowWithSpeech.webkitSpeechRecognition;\n\n if (SpeechRecognitionAPI) {\n setIsSupported(true);\n recognitionRef.current = new SpeechRecognitionAPI() as SpeechRecognitionInstance;\n recognitionRef.current.continuous = false;\n recognitionRef.current.interimResults = true;\n recognitionRef.current.lang = lang;\n\n recognitionRef.current.onresult = (event) => {\n const result = event.results[0];\n const transcript = result[0].transcript;\n onResult?.(transcript, result.isFinal);\n\n if (result.isFinal) {\n setIsListening(false);\n }\n };\n\n recognitionRef.current.onend = () => setIsListening(false);\n recognitionRef.current.onerror = () => setIsListening(false);\n }\n }, [lang, onResult]);\n\n const startListening = useCallback(() => {\n if (!recognitionRef.current) return;\n try {\n recognitionRef.current.start();\n setIsListening(true);\n } catch (e) {\n console.error('Speech recognition error:', e);\n }\n }, []);\n\n const stopListening = useCallback(() => {\n if (!recognitionRef.current) return;\n recognitionRef.current.stop();\n setIsListening(false);\n }, []);\n\n const toggleListening = useCallback(() => {\n if (isListening) {\n stopListening();\n } else {\n startListening();\n }\n }, [isListening, startListening, stopListening]);\n\n const speak = useCallback(\n (text: string) => {\n if (!ttsEnabled || typeof window === 'undefined' || !('speechSynthesis' in window)) {\n return;\n }\n\n speechSynthesis.cancel();\n const utterance = new SpeechSynthesisUtterance(text);\n utterance.rate = 1.0;\n utterance.pitch = 1.0;\n\n // Try to find a good voice\n const voices = speechSynthesis.getVoices();\n const preferredVoice = voices.find(\n (v) => v.name.includes('Google') || v.name.includes('Samantha') || v.name.includes('Alex')\n );\n if (preferredVoice) {\n utterance.voice = preferredVoice;\n }\n\n speechSynthesis.speak(utterance);\n },\n [ttsEnabled]\n );\n\n const cancelSpeech = useCallback(() => {\n if (typeof window !== 'undefined' && 'speechSynthesis' in window) {\n speechSynthesis.cancel();\n }\n }, []);\n\n return {\n isSupported,\n isListening,\n toggleListening,\n startListening,\n stopListening,\n speak,\n ttsEnabled,\n setTtsEnabled,\n cancelSpeech,\n };\n}\n"]}
|
package/dist/hooks/index.mjs
CHANGED
|
@@ -139,7 +139,7 @@ function useChat(options) {
|
|
|
139
139
|
onStreamEnd?.();
|
|
140
140
|
}
|
|
141
141
|
},
|
|
142
|
-
[apiEndpoint, input, isLoading, messages, onToolCall, onStreamStart, onStreamEnd]
|
|
142
|
+
[apiEndpoint, input, isLoading, messages, onToolCall, onStreamStart, onStreamEnd, generateFallbackMessage]
|
|
143
143
|
);
|
|
144
144
|
return {
|
|
145
145
|
messages,
|
package/dist/hooks/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/useChat.ts","../../src/hooks/useSpeech.ts"],"names":["useState","useRef","useCallback"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\nimport { useState, useCallback, useRef } from 'react';\nimport type { ChatMessage, ToolExecution, StreamEvent } from '../types';\n\nexport interface UseChatOptions {\n /** API endpoint for chat */\n apiEndpoint: string;\n /** Initial messages */\n initialMessages?: ChatMessage[];\n /** Callback when a tool is called */\n onToolCall?: (toolName: string, args: Record<string, unknown>) => void | Promise<void>;\n /** Callback when streaming starts */\n onStreamStart?: () => void;\n /** Callback when streaming ends */\n onStreamEnd?: () => void;\n /** Generate a fallback message when AI uses tools but provides no text.\n * If not provided, uses a generic fallback message. */\n generateFallbackMessage?: (toolCalls: ToolExecution[]) => string;\n}\n\nexport interface UseChatReturn {\n /** All messages in the conversation */\n messages: ChatMessage[];\n /** Current input value */\n input: string;\n /** Set the input value */\n setInput: (value: string) => void;\n /** Whether the assistant is currently responding */\n isLoading: boolean;\n /** ID of the currently streaming message */\n streamingMessageId: string | null;\n /** Send a message */\n sendMessage: (content?: string) => Promise<void>;\n /** Clear all messages */\n clearMessages: () => void;\n /** Add a message manually */\n addMessage: (message: Omit<ChatMessage, 'id' | 'timestamp'>) => void;\n}\n\n/**\n * Hook for managing chat state and streaming\n */\nexport function useChat(options: UseChatOptions): UseChatReturn {\n const { apiEndpoint, initialMessages = [], onToolCall, onStreamStart, onStreamEnd, generateFallbackMessage } = options;\n\n const [messages, setMessages] = useState<ChatMessage[]>(initialMessages);\n const [input, setInput] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const addMessage = useCallback((message: Omit<ChatMessage, 'id' | 'timestamp'>) => {\n const newMessage: ChatMessage = {\n ...message,\n id: Date.now().toString(),\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, newMessage]);\n return newMessage;\n }, []);\n\n const clearMessages = useCallback(() => {\n setMessages(initialMessages);\n }, [initialMessages]);\n\n const sendMessage = useCallback(\n async (content?: string) => {\n const messageContent = content || input;\n if (!messageContent.trim() || isLoading) return;\n\n // Cancel any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n // Add user message\n const userMessage: ChatMessage = {\n id: Date.now().toString(),\n role: 'user',\n content: messageContent,\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, userMessage]);\n setInput('');\n setIsLoading(true);\n onStreamStart?.();\n\n // Add placeholder for assistant message\n const assistantMessageId = (Date.now() + 1).toString();\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n toolCalls: [],\n };\n setMessages((prev) => [...prev, assistantMessage]);\n setStreamingMessageId(assistantMessageId);\n\n let fullText = '';\n const toolCalls: ToolExecution[] = [];\n\n try {\n // Prepare messages for API (convert to format expected by API)\n const apiMessages = messages.concat(userMessage).map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ messages: apiMessages }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) {\n throw new Error('Failed to get response');\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No reader available');\n\n const decoder = new TextDecoder();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const text = decoder.decode(value);\n const lines = text.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const data = JSON.parse(line.slice(6)) as StreamEvent;\n\n if (data.type === 'text') {\n fullText += data.content;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId ? { ...m, content: fullText } : m\n )\n );\n } else if (data.type === 'tool') {\n const toolCall = { name: data.name, args: data.args };\n toolCalls.push(toolCall);\n\n // Execute tool call callback\n if (onToolCall) {\n try {\n await onToolCall(data.name, data.args);\n } catch (e) {\n console.error('Tool execution error:', e);\n }\n }\n } else if (data.type === 'done') {\n // Update message with tool calls\n if (toolCalls.length > 0) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId ? { ...m, toolCalls } : m\n )\n );\n }\n\n // If no text, generate contextual fallback based on tools used\n if (!fullText && toolCalls.length > 0 && generateFallbackMessage) {\n const fallbackMessage = generateFallbackMessage(toolCalls);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: fallbackMessage }\n : m\n )\n );\n } else if (!fullText) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: \"I've made some changes. Take a look!\" }\n : m\n )\n );\n }\n } else if (data.type === 'error') {\n throw new Error(data.message);\n }\n } catch {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n // Request was cancelled, ignore\n return;\n }\n\n console.error('Chat error:', error);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: 'Sorry, I encountered an error. Please try again.' }\n : m\n )\n );\n } finally {\n setIsLoading(false);\n setStreamingMessageId(null);\n onStreamEnd?.();\n }\n },\n [apiEndpoint, input, isLoading, messages, onToolCall, onStreamStart, onStreamEnd]\n );\n\n return {\n messages,\n input,\n setInput,\n isLoading,\n streamingMessageId,\n sendMessage,\n clearMessages,\n addMessage,\n };\n}\n","'use client';\n\nimport { useState, useRef, useEffect, useCallback } from 'react';\n\n// Web Speech API types\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n}\n\ninterface SpeechRecognitionInstance {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n start(): void;\n stop(): void;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onend: (() => void) | null;\n onerror: (() => void) | null;\n}\n\nexport interface UseSpeechOptions {\n /** Language for speech recognition */\n lang?: string;\n /** Callback when speech is recognized */\n onResult?: (transcript: string, isFinal: boolean) => void;\n}\n\nexport interface UseSpeechReturn {\n /** Whether speech recognition is supported */\n isSupported: boolean;\n /** Whether currently listening */\n isListening: boolean;\n /** Toggle listening on/off */\n toggleListening: () => void;\n /** Start listening */\n startListening: () => void;\n /** Stop listening */\n stopListening: () => void;\n /** Speak text using TTS */\n speak: (text: string) => void;\n /** Whether TTS is enabled */\n ttsEnabled: boolean;\n /** Toggle TTS on/off */\n setTtsEnabled: (enabled: boolean) => void;\n /** Cancel current speech */\n cancelSpeech: () => void;\n}\n\n/**\n * Hook for speech recognition and text-to-speech\n */\nexport function useSpeech(options: UseSpeechOptions = {}): UseSpeechReturn {\n const { lang = 'en-US', onResult } = options;\n\n const [isSupported, setIsSupported] = useState(false);\n const [isListening, setIsListening] = useState(false);\n const [ttsEnabled, setTtsEnabled] = useState(false);\n\n const recognitionRef = useRef<SpeechRecognitionInstance | null>(null);\n\n // Initialize speech recognition\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const windowWithSpeech = window as any;\n const SpeechRecognitionAPI =\n windowWithSpeech.SpeechRecognition || windowWithSpeech.webkitSpeechRecognition;\n\n if (SpeechRecognitionAPI) {\n setIsSupported(true);\n recognitionRef.current = new SpeechRecognitionAPI() as SpeechRecognitionInstance;\n recognitionRef.current.continuous = false;\n recognitionRef.current.interimResults = true;\n recognitionRef.current.lang = lang;\n\n recognitionRef.current.onresult = (event) => {\n const result = event.results[0];\n const transcript = result[0].transcript;\n onResult?.(transcript, result.isFinal);\n\n if (result.isFinal) {\n setIsListening(false);\n }\n };\n\n recognitionRef.current.onend = () => setIsListening(false);\n recognitionRef.current.onerror = () => setIsListening(false);\n }\n }, [lang, onResult]);\n\n const startListening = useCallback(() => {\n if (!recognitionRef.current) return;\n try {\n recognitionRef.current.start();\n setIsListening(true);\n } catch (e) {\n console.error('Speech recognition error:', e);\n }\n }, []);\n\n const stopListening = useCallback(() => {\n if (!recognitionRef.current) return;\n recognitionRef.current.stop();\n setIsListening(false);\n }, []);\n\n const toggleListening = useCallback(() => {\n if (isListening) {\n stopListening();\n } else {\n startListening();\n }\n }, [isListening, startListening, stopListening]);\n\n const speak = useCallback(\n (text: string) => {\n if (!ttsEnabled || typeof window === 'undefined' || !('speechSynthesis' in window)) {\n return;\n }\n\n speechSynthesis.cancel();\n const utterance = new SpeechSynthesisUtterance(text);\n utterance.rate = 1.0;\n utterance.pitch = 1.0;\n\n // Try to find a good voice\n const voices = speechSynthesis.getVoices();\n const preferredVoice = voices.find(\n (v) => v.name.includes('Google') || v.name.includes('Samantha') || v.name.includes('Alex')\n );\n if (preferredVoice) {\n utterance.voice = preferredVoice;\n }\n\n speechSynthesis.speak(utterance);\n },\n [ttsEnabled]\n );\n\n const cancelSpeech = useCallback(() => {\n if (typeof window !== 'undefined' && 'speechSynthesis' in window) {\n speechSynthesis.cancel();\n }\n }, []);\n\n return {\n isSupported,\n isListening,\n toggleListening,\n startListening,\n stopListening,\n speak,\n ttsEnabled,\n setTtsEnabled,\n cancelSpeech,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/useChat.ts","../../src/hooks/useSpeech.ts"],"names":["useState","useRef","useCallback"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\nimport { useState, useCallback, useRef } from 'react';\nimport type { ChatMessage, ToolExecution, StreamEvent } from '../types';\n\nexport interface UseChatOptions {\n /** API endpoint for chat */\n apiEndpoint: string;\n /** Initial messages */\n initialMessages?: ChatMessage[];\n /** Callback when a tool is called */\n onToolCall?: (toolName: string, args: Record<string, unknown>) => void | Promise<void>;\n /** Callback when streaming starts */\n onStreamStart?: () => void;\n /** Callback when streaming ends */\n onStreamEnd?: () => void;\n /** Generate a fallback message when AI uses tools but provides no text.\n * If not provided, uses a generic fallback message. */\n generateFallbackMessage?: (toolCalls: ToolExecution[]) => string;\n}\n\nexport interface UseChatReturn {\n /** All messages in the conversation */\n messages: ChatMessage[];\n /** Current input value */\n input: string;\n /** Set the input value */\n setInput: (value: string) => void;\n /** Whether the assistant is currently responding */\n isLoading: boolean;\n /** ID of the currently streaming message */\n streamingMessageId: string | null;\n /** Send a message */\n sendMessage: (content?: string) => Promise<void>;\n /** Clear all messages */\n clearMessages: () => void;\n /** Add a message manually */\n addMessage: (message: Omit<ChatMessage, 'id' | 'timestamp'>) => void;\n}\n\n/**\n * Hook for managing chat state and streaming\n */\nexport function useChat(options: UseChatOptions): UseChatReturn {\n const { apiEndpoint, initialMessages = [], onToolCall, onStreamStart, onStreamEnd, generateFallbackMessage } = options;\n\n const [messages, setMessages] = useState<ChatMessage[]>(initialMessages);\n const [input, setInput] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const addMessage = useCallback((message: Omit<ChatMessage, 'id' | 'timestamp'>) => {\n const newMessage: ChatMessage = {\n ...message,\n id: Date.now().toString(),\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, newMessage]);\n return newMessage;\n }, []);\n\n const clearMessages = useCallback(() => {\n setMessages(initialMessages);\n }, [initialMessages]);\n\n const sendMessage = useCallback(\n async (content?: string) => {\n const messageContent = content || input;\n if (!messageContent.trim() || isLoading) return;\n\n // Cancel any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n // Add user message\n const userMessage: ChatMessage = {\n id: Date.now().toString(),\n role: 'user',\n content: messageContent,\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, userMessage]);\n setInput('');\n setIsLoading(true);\n onStreamStart?.();\n\n // Add placeholder for assistant message\n const assistantMessageId = (Date.now() + 1).toString();\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n toolCalls: [],\n };\n setMessages((prev) => [...prev, assistantMessage]);\n setStreamingMessageId(assistantMessageId);\n\n let fullText = '';\n const toolCalls: ToolExecution[] = [];\n\n try {\n // Prepare messages for API (convert to format expected by API)\n const apiMessages = messages.concat(userMessage).map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ messages: apiMessages }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) {\n throw new Error('Failed to get response');\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No reader available');\n\n const decoder = new TextDecoder();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const text = decoder.decode(value);\n const lines = text.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const data = JSON.parse(line.slice(6)) as StreamEvent;\n\n if (data.type === 'text') {\n fullText += data.content;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId ? { ...m, content: fullText } : m\n )\n );\n } else if (data.type === 'tool') {\n const toolCall = { name: data.name, args: data.args };\n toolCalls.push(toolCall);\n\n // Execute tool call callback\n if (onToolCall) {\n try {\n await onToolCall(data.name, data.args);\n } catch (e) {\n console.error('Tool execution error:', e);\n }\n }\n } else if (data.type === 'done') {\n // Update message with tool calls\n if (toolCalls.length > 0) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId ? { ...m, toolCalls } : m\n )\n );\n }\n\n // If no text, generate contextual fallback based on tools used\n if (!fullText && toolCalls.length > 0 && generateFallbackMessage) {\n const fallbackMessage = generateFallbackMessage(toolCalls);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: fallbackMessage }\n : m\n )\n );\n } else if (!fullText) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: \"I've made some changes. Take a look!\" }\n : m\n )\n );\n }\n } else if (data.type === 'error') {\n throw new Error(data.message);\n }\n } catch {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n // Request was cancelled, ignore\n return;\n }\n\n console.error('Chat error:', error);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: 'Sorry, I encountered an error. Please try again.' }\n : m\n )\n );\n } finally {\n setIsLoading(false);\n setStreamingMessageId(null);\n onStreamEnd?.();\n }\n },\n [apiEndpoint, input, isLoading, messages, onToolCall, onStreamStart, onStreamEnd, generateFallbackMessage]\n );\n\n return {\n messages,\n input,\n setInput,\n isLoading,\n streamingMessageId,\n sendMessage,\n clearMessages,\n addMessage,\n };\n}\n","'use client';\n\nimport { useState, useRef, useEffect, useCallback } from 'react';\n\n// Web Speech API types\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n}\n\ninterface SpeechRecognitionInstance {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n start(): void;\n stop(): void;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onend: (() => void) | null;\n onerror: (() => void) | null;\n}\n\nexport interface UseSpeechOptions {\n /** Language for speech recognition */\n lang?: string;\n /** Callback when speech is recognized */\n onResult?: (transcript: string, isFinal: boolean) => void;\n}\n\nexport interface UseSpeechReturn {\n /** Whether speech recognition is supported */\n isSupported: boolean;\n /** Whether currently listening */\n isListening: boolean;\n /** Toggle listening on/off */\n toggleListening: () => void;\n /** Start listening */\n startListening: () => void;\n /** Stop listening */\n stopListening: () => void;\n /** Speak text using TTS */\n speak: (text: string) => void;\n /** Whether TTS is enabled */\n ttsEnabled: boolean;\n /** Toggle TTS on/off */\n setTtsEnabled: (enabled: boolean) => void;\n /** Cancel current speech */\n cancelSpeech: () => void;\n}\n\n/**\n * Hook for speech recognition and text-to-speech\n */\nexport function useSpeech(options: UseSpeechOptions = {}): UseSpeechReturn {\n const { lang = 'en-US', onResult } = options;\n\n const [isSupported, setIsSupported] = useState(false);\n const [isListening, setIsListening] = useState(false);\n const [ttsEnabled, setTtsEnabled] = useState(false);\n\n const recognitionRef = useRef<SpeechRecognitionInstance | null>(null);\n\n // Initialize speech recognition\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const windowWithSpeech = window as any;\n const SpeechRecognitionAPI =\n windowWithSpeech.SpeechRecognition || windowWithSpeech.webkitSpeechRecognition;\n\n if (SpeechRecognitionAPI) {\n setIsSupported(true);\n recognitionRef.current = new SpeechRecognitionAPI() as SpeechRecognitionInstance;\n recognitionRef.current.continuous = false;\n recognitionRef.current.interimResults = true;\n recognitionRef.current.lang = lang;\n\n recognitionRef.current.onresult = (event) => {\n const result = event.results[0];\n const transcript = result[0].transcript;\n onResult?.(transcript, result.isFinal);\n\n if (result.isFinal) {\n setIsListening(false);\n }\n };\n\n recognitionRef.current.onend = () => setIsListening(false);\n recognitionRef.current.onerror = () => setIsListening(false);\n }\n }, [lang, onResult]);\n\n const startListening = useCallback(() => {\n if (!recognitionRef.current) return;\n try {\n recognitionRef.current.start();\n setIsListening(true);\n } catch (e) {\n console.error('Speech recognition error:', e);\n }\n }, []);\n\n const stopListening = useCallback(() => {\n if (!recognitionRef.current) return;\n recognitionRef.current.stop();\n setIsListening(false);\n }, []);\n\n const toggleListening = useCallback(() => {\n if (isListening) {\n stopListening();\n } else {\n startListening();\n }\n }, [isListening, startListening, stopListening]);\n\n const speak = useCallback(\n (text: string) => {\n if (!ttsEnabled || typeof window === 'undefined' || !('speechSynthesis' in window)) {\n return;\n }\n\n speechSynthesis.cancel();\n const utterance = new SpeechSynthesisUtterance(text);\n utterance.rate = 1.0;\n utterance.pitch = 1.0;\n\n // Try to find a good voice\n const voices = speechSynthesis.getVoices();\n const preferredVoice = voices.find(\n (v) => v.name.includes('Google') || v.name.includes('Samantha') || v.name.includes('Alex')\n );\n if (preferredVoice) {\n utterance.voice = preferredVoice;\n }\n\n speechSynthesis.speak(utterance);\n },\n [ttsEnabled]\n );\n\n const cancelSpeech = useCallback(() => {\n if (typeof window !== 'undefined' && 'speechSynthesis' in window) {\n speechSynthesis.cancel();\n }\n }, []);\n\n return {\n isSupported,\n isListening,\n toggleListening,\n startListening,\n stopListening,\n speak,\n ttsEnabled,\n setTtsEnabled,\n cancelSpeech,\n };\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -151,7 +151,7 @@ function useChat(options) {
|
|
|
151
151
|
onStreamEnd?.();
|
|
152
152
|
}
|
|
153
153
|
},
|
|
154
|
-
[apiEndpoint, input, isLoading, messages, onToolCall, onStreamStart, onStreamEnd]
|
|
154
|
+
[apiEndpoint, input, isLoading, messages, onToolCall, onStreamStart, onStreamEnd, generateFallbackMessage]
|
|
155
155
|
);
|
|
156
156
|
return {
|
|
157
157
|
messages,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useChat.ts","../src/hooks/useSpeech.ts","../src/components/ChatMessage.tsx","../src/components/ChatInput.tsx","../src/components/Suggestions.tsx","../src/components/SitePilot.tsx","../src/tools/registry.ts"],"names":["useState","useRef","useCallback","useEffect","jsx","motion","jsxs","ReactMarkdown","MicOff","Mic","Send","AnimatePresence","Zap","Sparkles","Volume2","VolumeX","Minimize2","Maximize2","X","MessageCircle"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport { useState, useCallback, useRef } from 'react';\nimport type { ChatMessage, ToolExecution, StreamEvent } from '../types';\n\nexport interface UseChatOptions {\n /** API endpoint for chat */\n apiEndpoint: string;\n /** Initial messages */\n initialMessages?: ChatMessage[];\n /** Callback when a tool is called */\n onToolCall?: (toolName: string, args: Record<string, unknown>) => void | Promise<void>;\n /** Callback when streaming starts */\n onStreamStart?: () => void;\n /** Callback when streaming ends */\n onStreamEnd?: () => void;\n /** Generate a fallback message when AI uses tools but provides no text.\n * If not provided, uses a generic fallback message. */\n generateFallbackMessage?: (toolCalls: ToolExecution[]) => string;\n}\n\nexport interface UseChatReturn {\n /** All messages in the conversation */\n messages: ChatMessage[];\n /** Current input value */\n input: string;\n /** Set the input value */\n setInput: (value: string) => void;\n /** Whether the assistant is currently responding */\n isLoading: boolean;\n /** ID of the currently streaming message */\n streamingMessageId: string | null;\n /** Send a message */\n sendMessage: (content?: string) => Promise<void>;\n /** Clear all messages */\n clearMessages: () => void;\n /** Add a message manually */\n addMessage: (message: Omit<ChatMessage, 'id' | 'timestamp'>) => void;\n}\n\n/**\n * Hook for managing chat state and streaming\n */\nexport function useChat(options: UseChatOptions): UseChatReturn {\n const { apiEndpoint, initialMessages = [], onToolCall, onStreamStart, onStreamEnd, generateFallbackMessage } = options;\n\n const [messages, setMessages] = useState<ChatMessage[]>(initialMessages);\n const [input, setInput] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const addMessage = useCallback((message: Omit<ChatMessage, 'id' | 'timestamp'>) => {\n const newMessage: ChatMessage = {\n ...message,\n id: Date.now().toString(),\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, newMessage]);\n return newMessage;\n }, []);\n\n const clearMessages = useCallback(() => {\n setMessages(initialMessages);\n }, [initialMessages]);\n\n const sendMessage = useCallback(\n async (content?: string) => {\n const messageContent = content || input;\n if (!messageContent.trim() || isLoading) return;\n\n // Cancel any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n // Add user message\n const userMessage: ChatMessage = {\n id: Date.now().toString(),\n role: 'user',\n content: messageContent,\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, userMessage]);\n setInput('');\n setIsLoading(true);\n onStreamStart?.();\n\n // Add placeholder for assistant message\n const assistantMessageId = (Date.now() + 1).toString();\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n toolCalls: [],\n };\n setMessages((prev) => [...prev, assistantMessage]);\n setStreamingMessageId(assistantMessageId);\n\n let fullText = '';\n const toolCalls: ToolExecution[] = [];\n\n try {\n // Prepare messages for API (convert to format expected by API)\n const apiMessages = messages.concat(userMessage).map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ messages: apiMessages }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) {\n throw new Error('Failed to get response');\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No reader available');\n\n const decoder = new TextDecoder();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const text = decoder.decode(value);\n const lines = text.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const data = JSON.parse(line.slice(6)) as StreamEvent;\n\n if (data.type === 'text') {\n fullText += data.content;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId ? { ...m, content: fullText } : m\n )\n );\n } else if (data.type === 'tool') {\n const toolCall = { name: data.name, args: data.args };\n toolCalls.push(toolCall);\n\n // Execute tool call callback\n if (onToolCall) {\n try {\n await onToolCall(data.name, data.args);\n } catch (e) {\n console.error('Tool execution error:', e);\n }\n }\n } else if (data.type === 'done') {\n // Update message with tool calls\n if (toolCalls.length > 0) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId ? { ...m, toolCalls } : m\n )\n );\n }\n\n // If no text, generate contextual fallback based on tools used\n if (!fullText && toolCalls.length > 0 && generateFallbackMessage) {\n const fallbackMessage = generateFallbackMessage(toolCalls);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: fallbackMessage }\n : m\n )\n );\n } else if (!fullText) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: \"I've made some changes. Take a look!\" }\n : m\n )\n );\n }\n } else if (data.type === 'error') {\n throw new Error(data.message);\n }\n } catch {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n // Request was cancelled, ignore\n return;\n }\n\n console.error('Chat error:', error);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: 'Sorry, I encountered an error. Please try again.' }\n : m\n )\n );\n } finally {\n setIsLoading(false);\n setStreamingMessageId(null);\n onStreamEnd?.();\n }\n },\n [apiEndpoint, input, isLoading, messages, onToolCall, onStreamStart, onStreamEnd]\n );\n\n return {\n messages,\n input,\n setInput,\n isLoading,\n streamingMessageId,\n sendMessage,\n clearMessages,\n addMessage,\n };\n}\n","'use client';\n\nimport { useState, useRef, useEffect, useCallback } from 'react';\n\n// Web Speech API types\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n}\n\ninterface SpeechRecognitionInstance {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n start(): void;\n stop(): void;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onend: (() => void) | null;\n onerror: (() => void) | null;\n}\n\nexport interface UseSpeechOptions {\n /** Language for speech recognition */\n lang?: string;\n /** Callback when speech is recognized */\n onResult?: (transcript: string, isFinal: boolean) => void;\n}\n\nexport interface UseSpeechReturn {\n /** Whether speech recognition is supported */\n isSupported: boolean;\n /** Whether currently listening */\n isListening: boolean;\n /** Toggle listening on/off */\n toggleListening: () => void;\n /** Start listening */\n startListening: () => void;\n /** Stop listening */\n stopListening: () => void;\n /** Speak text using TTS */\n speak: (text: string) => void;\n /** Whether TTS is enabled */\n ttsEnabled: boolean;\n /** Toggle TTS on/off */\n setTtsEnabled: (enabled: boolean) => void;\n /** Cancel current speech */\n cancelSpeech: () => void;\n}\n\n/**\n * Hook for speech recognition and text-to-speech\n */\nexport function useSpeech(options: UseSpeechOptions = {}): UseSpeechReturn {\n const { lang = 'en-US', onResult } = options;\n\n const [isSupported, setIsSupported] = useState(false);\n const [isListening, setIsListening] = useState(false);\n const [ttsEnabled, setTtsEnabled] = useState(false);\n\n const recognitionRef = useRef<SpeechRecognitionInstance | null>(null);\n\n // Initialize speech recognition\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const windowWithSpeech = window as any;\n const SpeechRecognitionAPI =\n windowWithSpeech.SpeechRecognition || windowWithSpeech.webkitSpeechRecognition;\n\n if (SpeechRecognitionAPI) {\n setIsSupported(true);\n recognitionRef.current = new SpeechRecognitionAPI() as SpeechRecognitionInstance;\n recognitionRef.current.continuous = false;\n recognitionRef.current.interimResults = true;\n recognitionRef.current.lang = lang;\n\n recognitionRef.current.onresult = (event) => {\n const result = event.results[0];\n const transcript = result[0].transcript;\n onResult?.(transcript, result.isFinal);\n\n if (result.isFinal) {\n setIsListening(false);\n }\n };\n\n recognitionRef.current.onend = () => setIsListening(false);\n recognitionRef.current.onerror = () => setIsListening(false);\n }\n }, [lang, onResult]);\n\n const startListening = useCallback(() => {\n if (!recognitionRef.current) return;\n try {\n recognitionRef.current.start();\n setIsListening(true);\n } catch (e) {\n console.error('Speech recognition error:', e);\n }\n }, []);\n\n const stopListening = useCallback(() => {\n if (!recognitionRef.current) return;\n recognitionRef.current.stop();\n setIsListening(false);\n }, []);\n\n const toggleListening = useCallback(() => {\n if (isListening) {\n stopListening();\n } else {\n startListening();\n }\n }, [isListening, startListening, stopListening]);\n\n const speak = useCallback(\n (text: string) => {\n if (!ttsEnabled || typeof window === 'undefined' || !('speechSynthesis' in window)) {\n return;\n }\n\n speechSynthesis.cancel();\n const utterance = new SpeechSynthesisUtterance(text);\n utterance.rate = 1.0;\n utterance.pitch = 1.0;\n\n // Try to find a good voice\n const voices = speechSynthesis.getVoices();\n const preferredVoice = voices.find(\n (v) => v.name.includes('Google') || v.name.includes('Samantha') || v.name.includes('Alex')\n );\n if (preferredVoice) {\n utterance.voice = preferredVoice;\n }\n\n speechSynthesis.speak(utterance);\n },\n [ttsEnabled]\n );\n\n const cancelSpeech = useCallback(() => {\n if (typeof window !== 'undefined' && 'speechSynthesis' in window) {\n speechSynthesis.cancel();\n }\n }, []);\n\n return {\n isSupported,\n isListening,\n toggleListening,\n startListening,\n stopListening,\n speak,\n ttsEnabled,\n setTtsEnabled,\n cancelSpeech,\n };\n}\n","'use client';\n\nimport React from 'react';\nimport { motion } from 'framer-motion';\nimport ReactMarkdown from 'react-markdown';\nimport type { ChatMessage as ChatMessageType } from '../types';\n\nexport interface ChatMessageProps {\n message: ChatMessageType;\n isStreaming?: boolean;\n isFullscreen?: boolean;\n}\n\nexport function ChatMessage({ message, isStreaming, isFullscreen }: ChatMessageProps) {\n const isUser = message.role === 'user';\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className={`flex ${isUser ? 'justify-end' : 'justify-start'}`}\n >\n <div\n className={`px-4 py-3 rounded-2xl text-sm leading-relaxed ${\n isFullscreen ? 'max-w-[70%]' : 'max-w-[85%]'\n } ${\n isUser\n ? 'pilot-message-user rounded-br-md'\n : 'pilot-message-assistant rounded-bl-md'\n }`}\n >\n {isUser ? (\n message.content\n ) : (\n <div className=\"pilot-prose\">\n <ReactMarkdown>{message.content}</ReactMarkdown>\n {isStreaming && (\n <span className=\"inline-block w-2 h-4 pilot-cursor ml-0.5 animate-pulse\" />\n )}\n </div>\n )}\n </div>\n </motion.div>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { Send, Mic, MicOff } from 'lucide-react';\n\nexport interface ChatInputProps {\n value: string;\n onChange: (value: string) => void;\n onSubmit: () => void;\n disabled?: boolean;\n placeholder?: string;\n isListening?: boolean;\n onToggleListening?: () => void;\n showMic?: boolean;\n}\n\nexport function ChatInput({\n value,\n onChange,\n onSubmit,\n disabled = false,\n placeholder = 'Type a message...',\n isListening = false,\n onToggleListening,\n showMic = false,\n}: ChatInputProps) {\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (value.trim() && !disabled) {\n onSubmit();\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"p-4 pilot-border-top\">\n <div className=\"flex items-center gap-2 pilot-input-container px-4 py-3 transition-colors\">\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"bg-transparent flex-1 outline-none text-sm pilot-input\"\n placeholder={isListening ? 'Listening...' : placeholder}\n disabled={disabled}\n />\n {showMic && onToggleListening && (\n <button\n type=\"button\"\n onClick={onToggleListening}\n disabled={disabled}\n className={`p-2 rounded-xl transition-all ${\n isListening ? 'pilot-mic-active' : 'pilot-mic-inactive'\n }`}\n >\n {isListening ? <MicOff className=\"w-4 h-4\" /> : <Mic className=\"w-4 h-4\" />}\n </button>\n )}\n <button\n type=\"submit\"\n disabled={!value.trim() || disabled}\n className={`p-2 rounded-xl transition-all ${\n value.trim() && !disabled ? 'pilot-send-active' : 'pilot-send-inactive'\n }`}\n >\n <Send className=\"w-4 h-4\" />\n </button>\n </div>\n </form>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { Zap } from 'lucide-react';\nimport type { Suggestion } from '../types';\n\nexport interface SuggestionsProps {\n suggestions: Suggestion[];\n onSelect: (text: string) => void;\n isVisible?: boolean;\n isFullscreen?: boolean;\n suggestionsToShow?: number;\n rotationInterval?: number;\n}\n\nexport function Suggestions({\n suggestions,\n onSelect,\n isVisible = true,\n isFullscreen = false,\n suggestionsToShow = 3,\n rotationInterval = 5000,\n}: SuggestionsProps) {\n const [currentIndex, setCurrentIndex] = useState(0);\n\n // Rotate suggestions\n useEffect(() => {\n if (!isVisible || suggestions.length <= suggestionsToShow) return;\n\n const interval = setInterval(() => {\n setCurrentIndex((prev) => (prev + 1) % Math.ceil(suggestions.length / suggestionsToShow));\n }, rotationInterval);\n\n return () => clearInterval(interval);\n }, [isVisible, suggestions.length, suggestionsToShow, rotationInterval]);\n\n // Get current suggestions to display\n const currentSuggestions = suggestions.slice(\n currentIndex * suggestionsToShow,\n currentIndex * suggestionsToShow + suggestionsToShow\n );\n\n const totalPages = Math.ceil(suggestions.length / suggestionsToShow);\n\n if (!isVisible || suggestions.length === 0) return null;\n\n return (\n <AnimatePresence>\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n transition={{ duration: 0.3 }}\n className=\"pt-2\"\n >\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-1.5 pilot-text-muted\">\n <Zap className=\"w-3 h-3\" />\n <span className=\"text-[10px] uppercase tracking-wider font-medium\">Try asking</span>\n </div>\n {/* Pagination dots */}\n {totalPages > 1 && (\n <div className=\"flex gap-1\">\n {Array.from({ length: totalPages }).map((_, i) => (\n <button\n key={i}\n onClick={() => setCurrentIndex(i)}\n className={`h-1.5 rounded-full transition-all ${\n i === currentIndex\n ? 'pilot-dot-active w-3'\n : 'pilot-dot-inactive w-1.5 hover:opacity-75'\n }`}\n />\n ))}\n </div>\n )}\n </div>\n <AnimatePresence mode=\"wait\">\n <motion.div\n key={currentIndex}\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n transition={{ duration: 0.3 }}\n className={`flex gap-2 ${isFullscreen ? 'flex-row flex-wrap' : 'flex-col'}`}\n >\n {currentSuggestions.map((suggestion, index) => (\n <motion.button\n key={suggestion.text}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: index * 0.1 }}\n onClick={() => onSelect(suggestion.text)}\n className=\"pilot-suggestion group flex items-center gap-2 px-3 py-2 rounded-xl text-xs text-left transition-all duration-200\"\n >\n {suggestion.icon && <span className=\"text-base\">{suggestion.icon}</span>}\n <span>{suggestion.text}</span>\n </motion.button>\n ))}\n </motion.div>\n </AnimatePresence>\n </motion.div>\n </AnimatePresence>\n );\n}\n","'use client';\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { X, MessageCircle, Sparkles, Volume2, VolumeX, Maximize2, Minimize2 } from 'lucide-react';\nimport { useChat } from '../hooks/useChat';\nimport { useSpeech } from '../hooks/useSpeech';\nimport { ChatMessage } from './ChatMessage';\nimport { ChatInput } from './ChatInput';\nimport { Suggestions } from './Suggestions';\nimport type { SitePilotProps, ChatMessage as ChatMessageType, AccentPreset } from '../types';\n\n// Accent color presets (HSL values)\nconst ACCENT_PRESETS: Record<AccentPreset, { h: number; s: number; l: number }> = {\n amber: { h: 38, s: 92, l: 50 },\n pink: { h: 330, s: 100, l: 71 },\n blue: { h: 210, s: 100, l: 50 },\n green: { h: 142, s: 71, l: 45 },\n purple: { h: 270, s: 100, l: 60 },\n red: { h: 0, s: 84, l: 60 },\n cyan: { h: 180, s: 100, l: 45 },\n orange: { h: 25, s: 95, l: 53 },\n};\n\n// Convert hex color to HSL\nfunction hexToHSL(hex: string): { h: number; s: number; l: number } | null {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return null;\n\n let r = parseInt(result[1], 16) / 255;\n let g = parseInt(result[2], 16) / 255;\n let b = parseInt(result[3], 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n }\n\n return { h: Math.round(h * 360), s: Math.round(s * 100), l: Math.round(l * 100) };\n}\n\n/**\n * SitePilot - AI chat widget that can control and navigate your website\n *\n * @example\n * ```tsx\n * import { SitePilot } from 'ai-site-pilot';\n *\n * <SitePilot\n * apiEndpoint=\"/api/chat\"\n * suggestions={[\n * { text: 'Show me products', icon: '🛍️' },\n * { text: 'Help me find...', icon: '🔍' },\n * ]}\n * onToolCall={(name, args) => {\n * // Handle tool execution\n * }}\n * />\n * ```\n */\nexport function SitePilot({\n apiEndpoint,\n theme = {},\n suggestions = [],\n features = {},\n onToolCall,\n generateFallbackMessage,\n defaultOpen = false,\n placeholder = 'Type a message...',\n welcomeMessage = \"Hi! I'm here to help you navigate and explore. What would you like to know?\",\n className = '',\n}: SitePilotProps) {\n const {\n position = 'bottom-right',\n borderRadius = 24,\n accent,\n accentColor,\n accentColorDark,\n backgroundColor,\n textColor,\n textMutedColor,\n borderColor,\n userMessageBg,\n assistantMessageBg,\n } = theme;\n\n // Resolve accent color to HSL values\n const resolveAccentHSL = (): { h: number; s: number; l: number } | null => {\n // Priority: accentColor (custom) > accent (preset)\n if (accentColor) {\n return hexToHSL(accentColor);\n }\n if (accent && ACCENT_PRESETS[accent]) {\n return ACCENT_PRESETS[accent];\n }\n return null;\n };\n\n const accentHSL = resolveAccentHSL();\n\n const {\n speech = true,\n tts = true,\n fullscreen = true,\n suggestions: showSuggestionsFeature = true,\n } = features;\n\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [showSuggestions, setShowSuggestions] = useState(true);\n\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n // Initial welcome message\n const initialMessages: ChatMessageType[] = welcomeMessage\n ? [\n {\n id: 'init',\n role: 'assistant',\n content: welcomeMessage,\n timestamp: new Date(),\n },\n ]\n : [];\n\n const {\n messages,\n input,\n setInput,\n isLoading,\n streamingMessageId,\n sendMessage,\n } = useChat({\n apiEndpoint,\n initialMessages,\n onToolCall,\n generateFallbackMessage,\n onStreamStart: () => setShowSuggestions(false),\n });\n\n const {\n isSupported: speechSupported,\n isListening,\n toggleListening,\n speak,\n ttsEnabled,\n setTtsEnabled,\n } = useSpeech({\n onResult: (transcript, isFinal) => {\n setInput(transcript);\n if (isFinal) {\n // Could auto-submit here if desired\n }\n },\n });\n\n // Scroll to bottom when messages change\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages, isOpen]);\n\n // Speak assistant messages when TTS is enabled\n useEffect(() => {\n if (!ttsEnabled) return;\n\n const lastMessage = messages[messages.length - 1];\n if (\n lastMessage?.role === 'assistant' &&\n lastMessage.id !== streamingMessageId &&\n lastMessage.content\n ) {\n speak(lastMessage.content);\n }\n }, [messages, streamingMessageId, ttsEnabled, speak]);\n\n const handleSuggestionSelect = useCallback(\n (text: string) => {\n sendMessage(text);\n },\n [sendMessage]\n );\n\n const handleSubmit = useCallback(() => {\n sendMessage();\n }, [sendMessage]);\n\n // Position classes\n const positionClasses = {\n 'bottom-right': 'bottom-24 right-6 md:right-8',\n 'bottom-left': 'bottom-24 left-6 md:left-8',\n 'top-right': 'top-24 right-6 md:right-8',\n 'top-left': 'top-24 left-6 md:left-8',\n };\n\n const buttonPositionClasses = {\n 'bottom-right': 'bottom-6 right-6 md:right-8',\n 'bottom-left': 'bottom-6 left-6 md:left-8',\n 'top-right': 'top-6 right-6 md:right-8',\n 'top-left': 'top-6 left-6 md:left-8',\n };\n\n // CSS custom properties for theming\n const cssVars = {\n '--pilot-radius': `${borderRadius}px`,\n // Set HSL components for accent color (this is what the CSS uses)\n ...(accentHSL && {\n '--pilot-accent-h': accentHSL.h,\n '--pilot-accent-s': `${accentHSL.s}%`,\n '--pilot-accent-l': `${accentHSL.l}%`,\n }),\n ...(accentColorDark && { '--pilot-accent-dark': accentColorDark }),\n ...(backgroundColor && { '--pilot-bg': backgroundColor, '--pilot-bg-95': `${backgroundColor}f2` }),\n ...(textColor && { '--pilot-text': textColor }),\n ...(textMutedColor && { '--pilot-text-muted': textMutedColor }),\n ...(borderColor && { '--pilot-border': borderColor }),\n ...(userMessageBg && { '--pilot-user-bg': userMessageBg }),\n ...(assistantMessageBg && { '--pilot-assistant-bg': assistantMessageBg }),\n } as React.CSSProperties;\n\n return (\n <div className={`pilot-container ${className}`} style={cssVars}>\n {/* Chat Panel */}\n <AnimatePresence>\n {isOpen && (\n <motion.div\n initial={{ opacity: 0, y: 20, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 20, scale: 0.95 }}\n transition={{ type: 'spring', stiffness: 400, damping: 30 }}\n layout\n className={`fixed pilot-panel flex flex-col shadow-2xl z-[200] transition-all duration-300 ${\n isFullscreen\n ? 'inset-4 md:inset-8'\n : `${positionClasses[position]} w-[calc(100%-48px)] md:w-[400px] h-[520px]`\n }`}\n style={{ borderRadius: `${borderRadius}px` }}\n >\n {/* Header */}\n <div className=\"px-5 py-4 pilot-border-bottom flex justify-between items-center\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 pilot-avatar rounded-xl flex items-center justify-center shadow-lg\">\n <Sparkles className=\"w-5 h-5 text-white\" />\n </div>\n <div>\n <div className=\"font-semibold pilot-text text-sm\">AI Assistant</div>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"w-1.5 h-1.5 pilot-status-dot rounded-full animate-pulse\" />\n <span className=\"text-[10px] pilot-text-muted\">Ready to help</span>\n </div>\n </div>\n </div>\n <div className=\"flex items-center gap-1\">\n {tts && (\n <button\n onClick={() => setTtsEnabled(!ttsEnabled)}\n className={`p-2 rounded-lg transition-colors ${\n ttsEnabled ? 'pilot-button-active' : 'pilot-button-inactive'\n }`}\n title={ttsEnabled ? 'Disable voice' : 'Enable voice'}\n >\n {ttsEnabled ? (\n <Volume2 className=\"w-4 h-4\" />\n ) : (\n <VolumeX className=\"w-4 h-4\" />\n )}\n </button>\n )}\n {fullscreen && (\n <button\n onClick={() => setIsFullscreen(!isFullscreen)}\n className=\"p-2 rounded-lg transition-colors pilot-button-inactive\"\n title={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}\n >\n {isFullscreen ? (\n <Minimize2 className=\"w-4 h-4\" />\n ) : (\n <Maximize2 className=\"w-4 h-4\" />\n )}\n </button>\n )}\n <button\n onClick={() => setIsOpen(false)}\n className=\"p-2 hover:bg-white/5 rounded-lg transition-colors\"\n >\n <X className=\"w-4 h-4 pilot-text-muted\" />\n </button>\n </div>\n </div>\n\n {/* Messages Area */}\n <div className=\"flex-1 overflow-y-auto p-4 space-y-4 scrollbar-thin scrollbar-thumb-white/10 scrollbar-track-transparent\">\n {messages.map((msg) => (\n <ChatMessage\n key={msg.id}\n message={msg}\n isStreaming={streamingMessageId === msg.id}\n isFullscreen={isFullscreen}\n />\n ))}\n\n {/* Loading indicator */}\n {isLoading && !streamingMessageId && (\n <div className=\"flex justify-start\">\n <div className=\"pilot-loading px-4 py-3 rounded-2xl rounded-bl-md\">\n <div className=\"flex gap-1.5\">\n {[0, 0.15, 0.3].map((delay, i) => (\n <motion.span\n key={i}\n className=\"w-2 h-2 pilot-loading-dot rounded-full\"\n animate={{ y: [0, -4, 0] }}\n transition={{ duration: 0.6, repeat: Infinity, delay }}\n />\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Suggestions */}\n {showSuggestionsFeature && suggestions.length > 0 && (\n <Suggestions\n suggestions={suggestions}\n onSelect={handleSuggestionSelect}\n isVisible={showSuggestions && !isLoading}\n isFullscreen={isFullscreen}\n />\n )}\n\n <div ref={messagesEndRef} />\n </div>\n\n {/* Input Area */}\n <ChatInput\n value={input}\n onChange={setInput}\n onSubmit={handleSubmit}\n disabled={isLoading}\n placeholder={placeholder}\n isListening={isListening}\n onToggleListening={toggleListening}\n showMic={speech && speechSupported}\n />\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Toggle Button */}\n {!isOpen && (\n <motion.button\n onClick={() => setIsOpen(true)}\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n whileHover={{ scale: 1.05 }}\n whileTap={{ scale: 0.95 }}\n className={`fixed ${buttonPositionClasses[position]} flex items-center gap-2 pilot-toggle-button px-5 py-3.5 rounded-2xl font-medium shadow-xl transition-shadow z-[200]`}\n >\n <MessageCircle className=\"w-5 h-5\" />\n <span className=\"text-sm hidden sm:inline\">Ask AI</span>\n <span className=\"w-2 h-2 bg-white/80 rounded-full animate-pulse\" />\n </motion.button>\n )}\n </div>\n );\n}\n\nexport default SitePilot;\n","/**\n * Tool registry for managing and converting tool definitions\n */\n\nimport type { ToolDefinition, ToolParameters, ToolExecution } from './types';\n\n/**\n * Helper to create a fallback message generator based on tool name mappings\n *\n * @example\n * ```ts\n * const generateFallback = createFallbackMessageGenerator({\n * filter_by_category: (args) => `Filtered to show **${args.category}** projects.`,\n * open_project: (args) => `Opened **${args.projectId}** for you to explore.`,\n * navigate: (args) => `Scrolled to the **${args.section}** section.`,\n * });\n * ```\n */\nexport function createFallbackMessageGenerator(\n toolMessages: Record<string, (args: Record<string, unknown>) => string>,\n defaultMessage = \"I've made some changes. Take a look!\"\n): (toolCalls: ToolExecution[]) => string {\n return (toolCalls: ToolExecution[]) => {\n if (toolCalls.length === 0) return defaultMessage;\n\n const messages: string[] = [];\n\n for (const tool of toolCalls) {\n const generator = toolMessages[tool.name];\n if (generator) {\n messages.push(generator(tool.args));\n } else {\n messages.push(defaultMessage);\n }\n }\n\n return messages.join(' ');\n };\n}\n\n/**\n * Helper function to define a tool with type safety\n */\nexport function defineTool<TParams extends Record<string, unknown>>(\n config: ToolDefinition<TParams>\n): ToolDefinition<TParams> {\n return config;\n}\n\n/**\n * Create a simple tool with no parameters\n */\nexport function defineSimpleTool(\n name: string,\n description: string,\n handler?: () => void | Promise<void>\n): ToolDefinition {\n return {\n name,\n description,\n parameters: {\n type: 'object',\n properties: {},\n required: [],\n },\n handler,\n };\n}\n\n/**\n * Tool registry for managing multiple tools\n */\nexport class ToolRegistry {\n private tools: Map<string, ToolDefinition> = new Map();\n\n constructor(tools: ToolDefinition[] = []) {\n for (const tool of tools) {\n this.register(tool);\n }\n }\n\n /**\n * Register a tool\n */\n register(tool: ToolDefinition): void {\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Unregister a tool\n */\n unregister(name: string): void {\n this.tools.delete(name);\n }\n\n /**\n * Get a tool by name\n */\n get(name: string): ToolDefinition | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Get all tools\n */\n getAll(): ToolDefinition[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * Execute a tool by name with given arguments\n */\n async execute(execution: ToolExecution): Promise<void> {\n const tool = this.tools.get(execution.name);\n if (!tool) {\n console.warn(`Tool not found: ${execution.name}`);\n return;\n }\n if (tool.handler) {\n await tool.handler(execution.args);\n }\n }\n\n /**\n * Execute multiple tools in sequence\n */\n async executeAll(executions: ToolExecution[], delayMs = 300): Promise<void> {\n for (const execution of executions) {\n await this.execute(execution);\n if (delayMs > 0 && executions.indexOf(execution) < executions.length - 1) {\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n }\n\n /**\n * Convert to Vercel AI SDK tool format\n */\n toVercelAITools(): Record<string, { description: string; parameters: unknown }> {\n const result: Record<string, { description: string; parameters: unknown }> = {};\n\n for (const tool of this.tools.values()) {\n result[tool.name] = {\n description: tool.description,\n parameters: {\n type: 'object',\n properties: tool.parameters.properties,\n required: tool.parameters.required,\n },\n };\n }\n\n return result;\n }\n\n /**\n * Convert to Gemini function declarations format\n */\n toGeminiFunctionDeclarations(): Array<{\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, unknown>;\n required: string[];\n };\n }> {\n return this.getAll().map(tool => ({\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object' as const,\n properties: Object.fromEntries(\n Object.entries(tool.parameters.properties).map(([key, value]) => [\n key,\n {\n type: value.type,\n description: value.description,\n enum: value.enum,\n },\n ])\n ),\n required: tool.parameters.required,\n },\n }));\n }\n}\n\n/**\n * Create a tool registry from an array of tools\n */\nexport function createToolRegistry(tools: ToolDefinition[]): ToolRegistry {\n return new ToolRegistry(tools);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useChat.ts","../src/hooks/useSpeech.ts","../src/components/ChatMessage.tsx","../src/components/ChatInput.tsx","../src/components/Suggestions.tsx","../src/components/SitePilot.tsx","../src/tools/registry.ts"],"names":["useState","useRef","useCallback","useEffect","jsx","motion","jsxs","ReactMarkdown","MicOff","Mic","Send","AnimatePresence","Zap","Sparkles","Volume2","VolumeX","Minimize2","Maximize2","X","MessageCircle"],"mappings":";;;;;;;;;;;;;;;AA2CO,SAAS,QAAQ,OAAA,EAAwC;AAC9D,EAAA,MAAM,EAAE,aAAa,eAAA,GAAkB,IAAI,UAAA,EAAY,aAAA,EAAe,WAAA,EAAa,uBAAA,EAAwB,GAAI,OAAA;AAE/G,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAwB,eAAe,CAAA;AACvE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEhF,EAAA,MAAM,kBAAA,GAAqBC,aAA+B,IAAI,CAAA;AAE9D,EAAA,MAAM,UAAA,GAAaC,iBAAA,CAAY,CAAC,OAAA,KAAmD;AACjF,IAAA,MAAM,UAAA,GAA0B;AAAA,MAC9B,GAAG,OAAA;AAAA,MACH,EAAA,EAAI,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,MACxB,SAAA,sBAAe,IAAA;AAAK,KACtB;AACA,IAAA,WAAA,CAAY,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,UAAU,CAAC,CAAA;AAC3C,IAAA,OAAO,UAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,kBAAY,MAAM;AACtC,IAAA,WAAA,CAAY,eAAe,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAA,MAAM,WAAA,GAAcA,iBAAA;AAAA,IAClB,OAAO,OAAA,KAAqB;AAC1B,MAAA,MAAM,iBAAiB,OAAA,IAAW,KAAA;AAClC,MAAA,IAAI,CAAC,cAAA,CAAe,IAAA,EAAK,IAAK,SAAA,EAAW;AAGzC,MAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,QAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AAAA,MACnC;AACA,MAAA,kBAAA,CAAmB,OAAA,GAAU,IAAI,eAAA,EAAgB;AAGjD,MAAA,MAAM,WAAA,GAA2B;AAAA,QAC/B,EAAA,EAAI,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,QACxB,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,cAAA;AAAA,QACT,SAAA,sBAAe,IAAA;AAAK,OACtB;AACA,MAAA,WAAA,CAAY,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,WAAW,CAAC,CAAA;AAC5C,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,aAAA,IAAgB;AAGhB,MAAA,MAAM,kBAAA,GAAA,CAAsB,IAAA,CAAK,GAAA,EAAI,GAAI,GAAG,QAAA,EAAS;AACrD,MAAA,MAAM,gBAAA,GAAgC;AAAA,QACpC,EAAA,EAAI,kBAAA;AAAA,QACJ,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,EAAA;AAAA,QACT,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,WAAW;AAAC,OACd;AACA,MAAA,WAAA,CAAY,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,gBAAgB,CAAC,CAAA;AACjD,MAAA,qBAAA,CAAsB,kBAAkB,CAAA;AAExC,MAAA,IAAI,QAAA,GAAW,EAAA;AACf,MAAA,MAAM,YAA6B,EAAC;AAEpC,MAAA,IAAI;AAEF,QAAA,MAAM,cAAc,QAAA,CAAS,MAAA,CAAO,WAAW,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC3D,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,SAAS,CAAA,CAAE;AAAA,SACb,CAAE,CAAA;AAEF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,WAAA,EAAa;AAAA,UACxC,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,UAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,aAAa,CAAA;AAAA,UAC9C,MAAA,EAAQ,mBAAmB,OAAA,CAAQ;AAAA,SACpC,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,QAC1C;AAEA,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,QAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAElD,QAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAEhC,QAAA,OAAO,IAAA,EAAM;AACX,UAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,UAAA,IAAI,IAAA,EAAM;AAEV,UAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AACjC,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE7B,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,YAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7B,cAAA,IAAI;AACF,gBAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAErC,gBAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,kBAAA,QAAA,IAAY,IAAA,CAAK,OAAA;AACjB,kBAAA,WAAA;AAAA,oBAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,sBAAI,CAAC,CAAA,KACR,CAAA,CAAE,EAAA,KAAO,kBAAA,GAAqB,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,QAAA,EAAS,GAAI;AAAA;AAC9D,mBACF;AAAA,gBACF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC/B,kBAAA,MAAM,WAAW,EAAE,IAAA,EAAM,KAAK,IAAA,EAAM,IAAA,EAAM,KAAK,IAAA,EAAK;AACpD,kBAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AAGvB,kBAAA,IAAI,UAAA,EAAY;AACd,oBAAA,IAAI;AACF,sBAAA,MAAM,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AAAA,oBACvC,SAAS,CAAA,EAAG;AACV,sBAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,CAAC,CAAA;AAAA,oBAC1C;AAAA,kBACF;AAAA,gBACF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAE/B,kBAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,oBAAA,WAAA;AAAA,sBAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,wBAAI,CAAC,MACR,CAAA,CAAE,EAAA,KAAO,qBAAqB,EAAE,GAAG,CAAA,EAAG,SAAA,EAAU,GAAI;AAAA;AACtD,qBACF;AAAA,kBACF;AAGA,kBAAA,IAAI,CAAC,QAAA,IAAY,SAAA,CAAU,MAAA,GAAS,KAAK,uBAAA,EAAyB;AAChE,oBAAA,MAAM,eAAA,GAAkB,wBAAwB,SAAS,CAAA;AACzD,oBAAA,WAAA;AAAA,sBAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,wBAAI,CAAC,CAAA,KACR,CAAA,CAAE,EAAA,KAAO,kBAAA,GACL,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,eAAA,EAAgB,GACjC;AAAA;AACN,qBACF;AAAA,kBACF,CAAA,MAAA,IAAW,CAAC,QAAA,EAAU;AACpB,oBAAA,WAAA;AAAA,sBAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,wBAAI,CAAC,CAAA,KACR,CAAA,CAAE,EAAA,KAAO,kBAAA,GACL,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,sCAAA,EAAuC,GACxD;AAAA;AACN,qBACF;AAAA,kBACF;AAAA,gBACF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,kBAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAAA,gBAC9B;AAAA,cACF,CAAA,CAAA,MAAQ;AAAA,cAER;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AAEzD,UAAA;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,KAAA,CAAM,eAAe,KAAK,CAAA;AAClC,QAAA,WAAA;AAAA,UAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,YAAI,CAAC,CAAA,KACR,CAAA,CAAE,EAAA,KAAO,kBAAA,GACL,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,kDAAA,EAAmD,GACpE;AAAA;AACN,SACF;AAAA,MACF,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,qBAAA,CAAsB,IAAI,CAAA;AAC1B,QAAA,WAAA,IAAc;AAAA,MAChB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAa,KAAA,EAAO,SAAA,EAAW,UAAU,UAAA,EAAY,aAAA,EAAe,aAAa,uBAAuB;AAAA,GAC3G;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,kBAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;ACnLO,SAAS,SAAA,CAAU,OAAA,GAA4B,EAAC,EAAoB;AACzE,EAAA,MAAM,EAAE,IAAA,GAAO,OAAA,EAAS,QAAA,EAAS,GAAI,OAAA;AAErC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIF,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAElD,EAAA,MAAM,cAAA,GAAiBC,aAAyC,IAAI,CAAA;AAGpE,EAAAE,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAGnC,IAAA,MAAM,gBAAA,GAAmB,MAAA;AACzB,IAAA,MAAM,oBAAA,GACJ,gBAAA,CAAiB,iBAAA,IAAqB,gBAAA,CAAiB,uBAAA;AAEzD,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,cAAA,CAAe,OAAA,GAAU,IAAI,oBAAA,EAAqB;AAClD,MAAA,cAAA,CAAe,QAAQ,UAAA,GAAa,KAAA;AACpC,MAAA,cAAA,CAAe,QAAQ,cAAA,GAAiB,IAAA;AACxC,MAAA,cAAA,CAAe,QAAQ,IAAA,GAAO,IAAA;AAE9B,MAAA,cAAA,CAAe,OAAA,CAAQ,QAAA,GAAW,CAAC,KAAA,KAAU;AAC3C,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAC9B,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,CAAC,CAAA,CAAE,UAAA;AAC7B,QAAA,QAAA,GAAW,UAAA,EAAY,OAAO,OAAO,CAAA;AAErC,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,cAAA,CAAe,KAAK,CAAA;AAAA,QACtB;AAAA,MACF,CAAA;AAEA,MAAA,cAAA,CAAe,OAAA,CAAQ,KAAA,GAAQ,MAAM,cAAA,CAAe,KAAK,CAAA;AACzD,MAAA,cAAA,CAAe,OAAA,CAAQ,OAAA,GAAU,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,IAC7D;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,QAAQ,CAAC,CAAA;AAEnB,EAAA,MAAM,cAAA,GAAiBD,kBAAY,MAAM;AACvC,IAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AAC7B,IAAA,IAAI;AACF,MAAA,cAAA,CAAe,QAAQ,KAAA,EAAM;AAC7B,MAAA,cAAA,CAAe,IAAI,CAAA;AAAA,IACrB,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAC,CAAA;AAAA,IAC9C;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,kBAAY,MAAM;AACtC,IAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AAC7B,IAAA,cAAA,CAAe,QAAQ,IAAA,EAAK;AAC5B,IAAA,cAAA,CAAe,KAAK,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBA,kBAAY,MAAM;AACxC,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,aAAA,EAAc;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,cAAA,EAAe;AAAA,IACjB;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,cAAA,EAAgB,aAAa,CAAC,CAAA;AAE/C,EAAA,MAAM,KAAA,GAAQA,iBAAAA;AAAA,IACZ,CAAC,IAAA,KAAiB;AAChB,MAAA,IAAI,CAAC,UAAA,IAAc,OAAO,WAAW,WAAA,IAAe,EAAE,qBAAqB,MAAA,CAAA,EAAS;AAClF,QAAA;AAAA,MACF;AAEA,MAAA,eAAA,CAAgB,MAAA,EAAO;AACvB,MAAA,MAAM,SAAA,GAAY,IAAI,wBAAA,CAAyB,IAAI,CAAA;AACnD,MAAA,SAAA,CAAU,IAAA,GAAO,CAAA;AACjB,MAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAGlB,MAAA,MAAM,MAAA,GAAS,gBAAgB,SAAA,EAAU;AACzC,MAAA,MAAM,iBAAiB,MAAA,CAAO,IAAA;AAAA,QAC5B,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,SAAS,QAAQ,CAAA,IAAK,CAAA,CAAE,IAAA,CAAK,SAAS,UAAU,CAAA,IAAK,CAAA,CAAE,IAAA,CAAK,SAAS,MAAM;AAAA,OAC3F;AACA,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,SAAA,CAAU,KAAA,GAAQ,cAAA;AAAA,MACpB;AAEA,MAAA,eAAA,CAAgB,MAAM,SAAS,CAAA;AAAA,IACjC,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACrC,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,iBAAA,IAAqB,MAAA,EAAQ;AAChE,MAAA,eAAA,CAAgB,MAAA,EAAO;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;AChJO,SAAS,WAAA,CAAY,EAAE,OAAA,EAAS,WAAA,EAAa,cAAa,EAAqB;AACpF,EAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,KAAS,MAAA;AAEhC,EAAA,uBACEE,cAAA;AAAA,IAACC,mBAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,SAAA,EAAW,CAAA,KAAA,EAAQ,MAAA,GAAS,aAAA,GAAgB,eAAe,CAAA,CAAA;AAAA,MAE3D,QAAA,kBAAAD,cAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,iDACT,YAAA,GAAe,aAAA,GAAgB,aACjC,CAAA,CAAA,EACE,MAAA,GACI,qCACA,uCACN,CAAA,CAAA;AAAA,UAEC,mBACC,OAAA,CAAQ,OAAA,mBAERE,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EACb,QAAA,EAAA;AAAA,4BAAAF,cAAA,CAACG,8BAAA,EAAA,EAAe,kBAAQ,OAAA,EAAQ,CAAA;AAAA,YAC/B,WAAA,oBACCH,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wDAAA,EAAyD;AAAA,WAAA,EAE7E;AAAA;AAAA;AAEJ;AAAA,GACF;AAEJ;AC5BO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,WAAA,GAAc,mBAAA;AAAA,EACd,WAAA,GAAc,KAAA;AAAA,EACd,iBAAA;AAAA,EACA,OAAA,GAAU;AACZ,CAAA,EAAmB;AACjB,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAuB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,IAAI,KAAA,CAAM,IAAA,EAAK,IAAK,CAAC,QAAA,EAAU;AAC7B,MAAA,QAAA,EAAS;AAAA,IACX;AAAA,EACF,CAAA;AAEA,EAAA,uBACEA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EAAc,SAAA,EAAU,sBAAA,EACtC,QAAA,kBAAAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EACb,QAAA,EAAA;AAAA,oBAAAF,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,KAAA;AAAA,QACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACxC,SAAA,EAAU,wDAAA;AAAA,QACV,WAAA,EAAa,cAAc,cAAA,GAAiB,WAAA;AAAA,QAC5C;AAAA;AAAA,KACF;AAAA,IACC,OAAA,IAAW,qCACVA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,iBAAA;AAAA,QACT,QAAA;AAAA,QACA,SAAA,EAAW,CAAA,8BAAA,EACT,WAAA,GAAc,kBAAA,GAAqB,oBACrC,CAAA,CAAA;AAAA,QAEC,QAAA,EAAA,WAAA,mBAAcA,cAAAA,CAACI,kBAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU,CAAA,mBAAKJ,cAAAA,CAACK,eAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,KAC3E;AAAA,oBAEFL,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,QAAA,EAAU,CAAC,KAAA,CAAM,IAAA,EAAK,IAAK,QAAA;AAAA,QAC3B,SAAA,EAAW,iCACT,KAAA,CAAM,IAAA,MAAU,CAAC,QAAA,GAAW,sBAAsB,qBACpD,CAAA,CAAA;AAAA,QAEA,QAAA,kBAAAA,cAAAA,CAACM,gBAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AAC5B,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;ACpDO,SAAS,WAAA,CAAY;AAAA,EAC1B,WAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,YAAA,GAAe,KAAA;AAAA,EACf,iBAAA,GAAoB,CAAA;AAAA,EACpB,gBAAA,GAAmB;AACrB,CAAA,EAAqB;AACnB,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIV,eAAS,CAAC,CAAA;AAGlD,EAAAG,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,WAAA,CAAY,MAAA,IAAU,iBAAA,EAAmB;AAE3D,IAAA,MAAM,QAAA,GAAW,YAAY,MAAM;AACjC,MAAA,eAAA,CAAgB,CAAC,UAAU,IAAA,GAAO,CAAA,IAAK,KAAK,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,iBAAiB,CAAC,CAAA;AAAA,IAC1F,GAAG,gBAAgB,CAAA;AAEnB,IAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,EACrC,GAAG,CAAC,SAAA,EAAW,YAAY,MAAA,EAAQ,iBAAA,EAAmB,gBAAgB,CAAC,CAAA;AAGvE,EAAA,MAAM,qBAAqB,WAAA,CAAY,KAAA;AAAA,IACrC,YAAA,GAAe,iBAAA;AAAA,IACf,eAAe,iBAAA,GAAoB;AAAA,GACrC;AAEA,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,SAAS,iBAAiB,CAAA;AAEnE,EAAA,IAAI,CAAC,SAAA,IAAa,WAAA,CAAY,MAAA,KAAW,GAAG,OAAO,IAAA;AAEnD,EAAA,uBACEC,cAAAA,CAACO,4BAAA,EAAA,EACC,QAAA,kBAAAL,eAAAA;AAAA,IAACD,mBAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MAC3B,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAI;AAAA,MAC5B,SAAA,EAAU,MAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA;AAAA,4BAAAF,cAAAA,CAACQ,eAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,4BACzBR,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oDAAmD,QAAA,EAAA,YAAA,EAAU;AAAA,WAAA,EAC/E,CAAA;AAAA,UAEC,aAAa,CAAA,oBACZA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cACZ,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,YAAY,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,sBAC1CA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,OAAA,EAAS,MAAM,eAAA,CAAgB,CAAC,CAAA;AAAA,cAChC,SAAA,EAAW,CAAA,kCAAA,EACT,CAAA,KAAM,YAAA,GACF,yBACA,2CACN,CAAA;AAAA,aAAA;AAAA,YANK;AAAA,WAQR,CAAA,EACH;AAAA,SAAA,EAEJ,CAAA;AAAA,wBACAA,cAAAA,CAACO,4BAAA,EAAA,EAAgB,IAAA,EAAK,QACpB,QAAA,kBAAAP,cAAAA;AAAA,UAACC,mBAAAA,CAAO,GAAA;AAAA,UAAP;AAAA,YAEC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,YAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,YAC5B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,YAC3B,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAI;AAAA,YAC5B,SAAA,EAAW,CAAA,WAAA,EAAc,YAAA,GAAe,oBAAA,GAAuB,UAAU,CAAA,CAAA;AAAA,YAExE,QAAA,EAAA,kBAAA,CAAmB,GAAA,CAAI,CAAC,UAAA,EAAY,0BACnCC,eAAAA;AAAA,cAACD,mBAAAA,CAAO,MAAA;AAAA,cAAP;AAAA,gBAEC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,gBAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,gBAC5B,UAAA,EAAY,EAAE,KAAA,EAAO,KAAA,GAAQ,GAAA,EAAI;AAAA,gBACjC,OAAA,EAAS,MAAM,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AAAA,gBACvC,SAAA,EAAU,mHAAA;AAAA,gBAET,QAAA,EAAA;AAAA,kBAAA,UAAA,CAAW,wBAAQD,cAAAA,CAAC,UAAK,SAAA,EAAU,WAAA,EAAa,qBAAW,IAAA,EAAK,CAAA;AAAA,kCACjEA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,UAAA,CAAW,IAAA,EAAK;AAAA;AAAA,eAAA;AAAA,cARlB,UAAA,CAAW;AAAA,aAUnB;AAAA,WAAA;AAAA,UAnBI;AAAA,SAoBP,EACF;AAAA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;AC5FA,IAAM,cAAA,GAA4E;AAAA,EAChF,OAAO,EAAE,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,EAC7B,MAAM,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,GAAG,EAAA,EAAG;AAAA,EAC9B,MAAM,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,GAAG,EAAA,EAAG;AAAA,EAC9B,OAAO,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,EAC9B,QAAQ,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,GAAG,EAAA,EAAG;AAAA,EAChC,KAAK,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,EAC1B,MAAM,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,GAAG,EAAA,EAAG;AAAA,EAC9B,QAAQ,EAAE,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA;AAC7B,CAAA;AAGA,SAAS,SAAS,GAAA,EAAyD;AACzE,EAAA,MAAM,MAAA,GAAS,2CAAA,CAA4C,IAAA,CAAK,GAAG,CAAA;AACnE,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,IAAI,IAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAClC,EAAA,IAAI,IAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAClC,EAAA,IAAI,IAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAElC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5B,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,MAAM,CAAA,GAAA,CAAK,MAAM,GAAA,IAAO,CAAA;AAExB,EAAA,IAAI,QAAQ,GAAA,EAAK;AACf,IAAA,MAAM,IAAI,GAAA,GAAM,GAAA;AAChB,IAAA,CAAA,GAAI,IAAI,GAAA,GAAM,CAAA,IAAK,IAAI,GAAA,GAAM,GAAA,CAAA,GAAO,KAAK,GAAA,GAAM,GAAA,CAAA;AAE/C,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,CAAA;AACH,QAAA,CAAA,GAAA,CAAA,CAAM,IAAI,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,CAAA,IAAM,CAAA;AACtC,QAAA;AAAA,MACF,KAAK,CAAA;AACH,QAAA,CAAA,GAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,IAAK,CAAA;AACxB,QAAA;AAAA,MACF,KAAK,CAAA;AACH,QAAA,CAAA,GAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,IAAK,CAAA;AACxB,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,OAAO,EAAE,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,GAAI,GAAG,GAAG,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,EAAG,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,EAAE;AAClF;AAqBO,SAAS,SAAA,CAAU;AAAA,EACxB,WAAA;AAAA,EACA,QAAQ,EAAC;AAAA,EACT,cAAc,EAAC;AAAA,EACf,WAAW,EAAC;AAAA,EACZ,UAAA;AAAA,EACA,uBAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,WAAA,GAAc,mBAAA;AAAA,EACd,cAAA,GAAiB,6EAAA;AAAA,EACjB,SAAA,GAAY;AACd,CAAA,EAAmB;AACjB,EAAA,MAAM;AAAA,IACJ,QAAA,GAAW,cAAA;AAAA,IACX,YAAA,GAAe,EAAA;AAAA,IACf,MAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAGJ,EAAA,MAAM,mBAAmB,MAAkD;AAEzE,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,SAAS,WAAW,CAAA;AAAA,IAC7B;AACA,IAAA,IAAI,MAAA,IAAU,cAAA,CAAe,MAAM,CAAA,EAAG;AACpC,MAAA,OAAO,eAAe,MAAM,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,YAAY,gBAAA,EAAiB;AAEnC,EAAA,MAAM;AAAA,IACJ,MAAA,GAAS,IAAA;AAAA,IACT,GAAA,GAAM,IAAA;AAAA,IACN,UAAA,GAAa,IAAA;AAAA,IACb,aAAa,sBAAA,GAAyB;AAAA,GACxC,GAAI,QAAA;AAEJ,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIJ,eAAS,WAAW,CAAA;AAChD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,eAAS,IAAI,CAAA;AAE3D,EAAA,MAAM,cAAA,GAAiBC,aAAuB,IAAI,CAAA;AAGlD,EAAA,MAAM,kBAAqC,cAAA,GACvC;AAAA,IACE;AAAA,MACE,EAAA,EAAI,MAAA;AAAA,MACJ,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,cAAA;AAAA,MACT,SAAA,sBAAe,IAAA;AAAK;AACtB,MAEF,EAAC;AAEL,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,MACE,OAAA,CAAQ;AAAA,IACV,WAAA;AAAA,IACA,eAAA;AAAA,IACA,UAAA;AAAA,IACA,uBAAA;AAAA,IACA,aAAA,EAAe,MAAM,kBAAA,CAAmB,KAAK;AAAA,GAC9C,CAAA;AAED,EAAA,MAAM;AAAA,IACJ,WAAA,EAAa,eAAA;AAAA,IACb,WAAA;AAAA,IACA,eAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,MACE,SAAA,CAAU;AAAA,IACZ,QAAA,EAAU,CAAC,UAAA,EAAY,OAAA,KAAY;AACjC,MAAA,QAAA,CAAS,UAAU,CAAA;AAGnB,IACF;AAAA,GACD,CAAA;AAGD,EAAAE,gBAAU,MAAM;AACd,IAAA,cAAA,CAAe,OAAA,EAAS,cAAA,CAAe,EAAE,QAAA,EAAU,UAAU,CAAA;AAAA,EAC/D,CAAA,EAAG,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA;AAGrB,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAChD,IAAA,IACE,aAAa,IAAA,KAAS,WAAA,IACtB,YAAY,EAAA,KAAO,kBAAA,IACnB,YAAY,OAAA,EACZ;AACA,MAAA,KAAA,CAAM,YAAY,OAAO,CAAA;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,kBAAA,EAAoB,UAAA,EAAY,KAAK,CAAC,CAAA;AAEpD,EAAA,MAAM,sBAAA,GAAyBD,iBAAAA;AAAA,IAC7B,CAAC,IAAA,KAAiB;AAChB,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACrC,IAAA,WAAA,EAAY;AAAA,EACd,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAGhB,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,cAAA,EAAgB,8BAAA;AAAA,IAChB,aAAA,EAAe,4BAAA;AAAA,IACf,WAAA,EAAa,2BAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,MAAM,qBAAA,GAAwB;AAAA,IAC5B,cAAA,EAAgB,6BAAA;AAAA,IAChB,aAAA,EAAe,2BAAA;AAAA,IACf,WAAA,EAAa,0BAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAGA,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,gBAAA,EAAkB,GAAG,YAAY,CAAA,EAAA,CAAA;AAAA;AAAA,IAEjC,GAAI,SAAA,IAAa;AAAA,MACf,oBAAoB,SAAA,CAAU,CAAA;AAAA,MAC9B,kBAAA,EAAoB,CAAA,EAAG,SAAA,CAAU,CAAC,CAAA,CAAA,CAAA;AAAA,MAClC,kBAAA,EAAoB,CAAA,EAAG,SAAA,CAAU,CAAC,CAAA,CAAA;AAAA,KACpC;AAAA,IACA,GAAI,eAAA,IAAmB,EAAE,qBAAA,EAAuB,eAAA,EAAgB;AAAA,IAChE,GAAI,mBAAmB,EAAE,YAAA,EAAc,iBAAiB,eAAA,EAAiB,CAAA,EAAG,eAAe,CAAA,EAAA,CAAA,EAAK;AAAA,IAChG,GAAI,SAAA,IAAa,EAAE,cAAA,EAAgB,SAAA,EAAU;AAAA,IAC7C,GAAI,cAAA,IAAkB,EAAE,oBAAA,EAAsB,cAAA,EAAe;AAAA,IAC7D,GAAI,WAAA,IAAe,EAAE,gBAAA,EAAkB,WAAA,EAAY;AAAA,IACnD,GAAI,aAAA,IAAiB,EAAE,iBAAA,EAAmB,aAAA,EAAc;AAAA,IACxD,GAAI,kBAAA,IAAsB,EAAE,sBAAA,EAAwB,kBAAA;AAAmB,GACzE;AAEA,EAAA,uBACEI,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAW,mBAAmB,SAAS,CAAA,CAAA,EAAI,OAAO,OAAA,EAErD,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAACO,4BAAAA,EAAA,EACE,QAAA,EAAA,MAAA,oBACCL,eAAAA;AAAA,MAACD,mBAAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,SAAS,EAAE,OAAA,EAAS,GAAG,CAAA,EAAG,EAAA,EAAI,OAAO,IAAA,EAAK;AAAA,QAC1C,SAAS,EAAE,OAAA,EAAS,GAAG,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,QACtC,MAAM,EAAE,OAAA,EAAS,GAAG,CAAA,EAAG,EAAA,EAAI,OAAO,IAAA,EAAK;AAAA,QACvC,YAAY,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,GAAA,EAAK,SAAS,EAAA,EAAG;AAAA,QAC1D,MAAA,EAAM,IAAA;AAAA,QACN,SAAA,EAAW,kFACT,YAAA,GACI,oBAAA,GACA,GAAG,eAAA,CAAgB,QAAQ,CAAC,CAAA,2CAAA,CAClC,CAAA,CAAA;AAAA,QACA,KAAA,EAAO,EAAE,YAAA,EAAc,CAAA,EAAG,YAAY,CAAA,EAAA,CAAA,EAAK;AAAA,QAG3C,QAAA,EAAA;AAAA,0BAAAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAF,cAAAA,CAAC,SAAI,SAAA,EAAU,8EAAA,EACb,0BAAAA,cAAAA,CAACS,oBAAA,EAAA,EAAS,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAC3C,CAAA;AAAA,8BACAP,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAF,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAAmC,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,gCAC9DE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,kCAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDAAA,EAA0D,CAAA;AAAA,kCAC1EA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAA+B,QAAA,EAAA,eAAA,EAAa;AAAA,iBAAA,EAC9D;AAAA,eAAA,EACF;AAAA,aAAA,EACF,CAAA;AAAA,4BACAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,cAAA,GAAA,oBACCF,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,MAAM,aAAA,CAAc,CAAC,UAAU,CAAA;AAAA,kBACxC,SAAA,EAAW,CAAA,iCAAA,EACT,UAAA,GAAa,qBAAA,GAAwB,uBACvC,CAAA,CAAA;AAAA,kBACA,KAAA,EAAO,aAAa,eAAA,GAAkB,cAAA;AAAA,kBAErC,QAAA,EAAA,UAAA,mBACCA,cAAAA,CAACU,mBAAA,EAAA,EAAQ,SAAA,EAAU,SAAA,EAAU,CAAA,mBAE7BV,cAAAA,CAACW,mBAAA,EAAA,EAAQ,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,eAEjC;AAAA,cAED,8BACCX,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,MAAM,eAAA,CAAgB,CAAC,YAAY,CAAA;AAAA,kBAC5C,SAAA,EAAU,wDAAA;AAAA,kBACV,KAAA,EAAO,eAAe,iBAAA,GAAoB,YAAA;AAAA,kBAEzC,QAAA,EAAA,YAAA,mBACCA,cAAAA,CAACY,qBAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU,CAAA,mBAE/BZ,cAAAA,CAACa,qBAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,eAEnC;AAAA,8BAEFb,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,MAAM,SAAA,CAAU,KAAK,CAAA;AAAA,kBAC9B,SAAA,EAAU,mDAAA;AAAA,kBAEV,QAAA,kBAAAA,cAAAA,CAACc,aAAA,EAAA,EAAE,SAAA,EAAU,0BAAA,EAA2B;AAAA;AAAA;AAC1C,aAAA,EACF;AAAA,WAAA,EACF,CAAA;AAAA,0BAGAZ,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0GAAA,EACZ,QAAA,EAAA;AAAA,YAAA,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,qBACbF,cAAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBAEC,OAAA,EAAS,GAAA;AAAA,gBACT,WAAA,EAAa,uBAAuB,GAAA,CAAI,EAAA;AAAA,gBACxC;AAAA,eAAA;AAAA,cAHK,GAAA,CAAI;AAAA,aAKZ,CAAA;AAAA,YAGA,SAAA,IAAa,CAAC,kBAAA,oBACbA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACZ,QAAA,EAAA,CAAC,CAAA,EAAG,IAAA,EAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,qBAC1BA,cAAAA;AAAA,cAACC,mBAAAA,CAAO,IAAA;AAAA,cAAP;AAAA,gBAEC,SAAA,EAAU,wCAAA;AAAA,gBACV,SAAS,EAAE,CAAA,EAAG,CAAC,CAAA,EAAG,EAAA,EAAI,CAAC,CAAA,EAAE;AAAA,gBACzB,YAAY,EAAE,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQ,UAAU,KAAA;AAAM,eAAA;AAAA,cAHhD;AAAA,aAKR,CAAA,EACH,CAAA,EACF,CAAA,EACF,CAAA;AAAA,YAID,sBAAA,IAA0B,WAAA,CAAY,MAAA,GAAS,CAAA,oBAC9CD,cAAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,WAAA;AAAA,gBACA,QAAA,EAAU,sBAAA;AAAA,gBACV,SAAA,EAAW,mBAAmB,CAAC,SAAA;AAAA,gBAC/B;AAAA;AAAA,aACF;AAAA,4BAGFA,cAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,cAAA,EAAgB;AAAA,WAAA,EAC5B,CAAA;AAAA,0BAGAA,cAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,KAAA;AAAA,cACP,QAAA,EAAU,QAAA;AAAA,cACV,QAAA,EAAU,YAAA;AAAA,cACV,QAAA,EAAU,SAAA;AAAA,cACV,WAAA;AAAA,cACA,WAAA;AAAA,cACA,iBAAA,EAAmB,eAAA;AAAA,cACnB,SAAS,MAAA,IAAU;AAAA;AAAA;AACrB;AAAA;AAAA,KACF,EAEJ,CAAA;AAAA,IAGC,CAAC,0BACAE,eAAAA;AAAA,MAACD,mBAAAA,CAAO,MAAA;AAAA,MAAP;AAAA,QACC,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,QAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,GAAA,EAAI;AAAA,QAClC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,QAChC,UAAA,EAAY,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,QAC1B,QAAA,EAAU,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,QACxB,SAAA,EAAW,CAAA,MAAA,EAAS,qBAAA,CAAsB,QAAQ,CAAC,CAAA,oHAAA,CAAA;AAAA,QAEnD,QAAA,EAAA;AAAA,0BAAAD,cAAAA,CAACe,yBAAA,EAAA,EAAc,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,0BACnCf,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAA2B,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BACjDA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EAAiD;AAAA;AAAA;AAAA;AACnE,GAAA,EAEJ,CAAA;AAEJ;AAEA,IAAO,iBAAA,GAAQ;;;AC7WR,SAAS,8BAAA,CACd,YAAA,EACA,cAAA,GAAiB,sCAAA,EACuB;AACxC,EAAA,OAAO,CAAC,SAAA,KAA+B;AACrC,IAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,cAAA;AAEnC,IAAA,MAAM,WAAqB,EAAC;AAE5B,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACxC,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MACpC,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,KAAK,cAAc,CAAA;AAAA,MAC9B;AAAA,IACF;AAEA,IAAA,OAAO,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,EAC1B,CAAA;AACF;AAKO,SAAS,WACd,MAAA,EACyB;AACzB,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,gBAAA,CACd,IAAA,EACA,WAAA,EACA,OAAA,EACgB;AAChB,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,YAAY,EAAC;AAAA,MACb,UAAU;AAAC,KACb;AAAA,IACA;AAAA,GACF;AACF;AAKO,IAAM,eAAN,MAAmB;AAAA,EAGxB,WAAA,CAAY,KAAA,GAA0B,EAAC,EAAG;AAF1C,IAAA,IAAA,CAAQ,KAAA,uBAAyC,GAAA,EAAI;AAGnD,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,IAAA,EAA4B;AACnC,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,IAAA,EAAoB;AAC7B,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,EAA0C;AAC5C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAA2B;AACzB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,SAAA,EAAyC;AACrD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,UAAU,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gBAAA,EAAmB,SAAA,CAAU,IAAI,CAAA,CAAE,CAAA;AAChD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAA;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,UAAA,EAA6B,OAAA,GAAU,GAAA,EAAoB;AAC1E,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,MAAM,IAAA,CAAK,QAAQ,SAAS,CAAA;AAC5B,MAAA,IAAI,OAAA,GAAU,KAAK,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA,GAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACxE,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAgF;AAC9E,IAAA,MAAM,SAAuE,EAAC;AAE9E,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACtC,MAAA,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI;AAAA,QAClB,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY,KAAK,UAAA,CAAW,UAAA;AAAA,UAC5B,QAAA,EAAU,KAAK,UAAA,CAAW;AAAA;AAC5B,OACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,4BAAA,GAQG;AACD,IAAA,OAAO,IAAA,CAAK,MAAA,EAAO,CAAE,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,MAChC,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,YAAY,MAAA,CAAO,WAAA;AAAA,UACjB,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAAA,YAC/D,GAAA;AAAA,YACA;AAAA,cACE,MAAM,KAAA,CAAM,IAAA;AAAA,cACZ,aAAa,KAAA,CAAM,WAAA;AAAA,cACnB,MAAM,KAAA,CAAM;AAAA;AACd,WACD;AAAA,SACH;AAAA,QACA,QAAA,EAAU,KAAK,UAAA,CAAW;AAAA;AAC5B,KACF,CAAE,CAAA;AAAA,EACJ;AACF;AAKO,SAAS,mBAAmB,KAAA,EAAuC;AACxE,EAAA,OAAO,IAAI,aAAa,KAAK,CAAA;AAC/B","file":"index.js","sourcesContent":["'use client';\n\nimport { useState, useCallback, useRef } from 'react';\nimport type { ChatMessage, ToolExecution, StreamEvent } from '../types';\n\nexport interface UseChatOptions {\n /** API endpoint for chat */\n apiEndpoint: string;\n /** Initial messages */\n initialMessages?: ChatMessage[];\n /** Callback when a tool is called */\n onToolCall?: (toolName: string, args: Record<string, unknown>) => void | Promise<void>;\n /** Callback when streaming starts */\n onStreamStart?: () => void;\n /** Callback when streaming ends */\n onStreamEnd?: () => void;\n /** Generate a fallback message when AI uses tools but provides no text.\n * If not provided, uses a generic fallback message. */\n generateFallbackMessage?: (toolCalls: ToolExecution[]) => string;\n}\n\nexport interface UseChatReturn {\n /** All messages in the conversation */\n messages: ChatMessage[];\n /** Current input value */\n input: string;\n /** Set the input value */\n setInput: (value: string) => void;\n /** Whether the assistant is currently responding */\n isLoading: boolean;\n /** ID of the currently streaming message */\n streamingMessageId: string | null;\n /** Send a message */\n sendMessage: (content?: string) => Promise<void>;\n /** Clear all messages */\n clearMessages: () => void;\n /** Add a message manually */\n addMessage: (message: Omit<ChatMessage, 'id' | 'timestamp'>) => void;\n}\n\n/**\n * Hook for managing chat state and streaming\n */\nexport function useChat(options: UseChatOptions): UseChatReturn {\n const { apiEndpoint, initialMessages = [], onToolCall, onStreamStart, onStreamEnd, generateFallbackMessage } = options;\n\n const [messages, setMessages] = useState<ChatMessage[]>(initialMessages);\n const [input, setInput] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const addMessage = useCallback((message: Omit<ChatMessage, 'id' | 'timestamp'>) => {\n const newMessage: ChatMessage = {\n ...message,\n id: Date.now().toString(),\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, newMessage]);\n return newMessage;\n }, []);\n\n const clearMessages = useCallback(() => {\n setMessages(initialMessages);\n }, [initialMessages]);\n\n const sendMessage = useCallback(\n async (content?: string) => {\n const messageContent = content || input;\n if (!messageContent.trim() || isLoading) return;\n\n // Cancel any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n // Add user message\n const userMessage: ChatMessage = {\n id: Date.now().toString(),\n role: 'user',\n content: messageContent,\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, userMessage]);\n setInput('');\n setIsLoading(true);\n onStreamStart?.();\n\n // Add placeholder for assistant message\n const assistantMessageId = (Date.now() + 1).toString();\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n toolCalls: [],\n };\n setMessages((prev) => [...prev, assistantMessage]);\n setStreamingMessageId(assistantMessageId);\n\n let fullText = '';\n const toolCalls: ToolExecution[] = [];\n\n try {\n // Prepare messages for API (convert to format expected by API)\n const apiMessages = messages.concat(userMessage).map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ messages: apiMessages }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) {\n throw new Error('Failed to get response');\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No reader available');\n\n const decoder = new TextDecoder();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const text = decoder.decode(value);\n const lines = text.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const data = JSON.parse(line.slice(6)) as StreamEvent;\n\n if (data.type === 'text') {\n fullText += data.content;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId ? { ...m, content: fullText } : m\n )\n );\n } else if (data.type === 'tool') {\n const toolCall = { name: data.name, args: data.args };\n toolCalls.push(toolCall);\n\n // Execute tool call callback\n if (onToolCall) {\n try {\n await onToolCall(data.name, data.args);\n } catch (e) {\n console.error('Tool execution error:', e);\n }\n }\n } else if (data.type === 'done') {\n // Update message with tool calls\n if (toolCalls.length > 0) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId ? { ...m, toolCalls } : m\n )\n );\n }\n\n // If no text, generate contextual fallback based on tools used\n if (!fullText && toolCalls.length > 0 && generateFallbackMessage) {\n const fallbackMessage = generateFallbackMessage(toolCalls);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: fallbackMessage }\n : m\n )\n );\n } else if (!fullText) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: \"I've made some changes. Take a look!\" }\n : m\n )\n );\n }\n } else if (data.type === 'error') {\n throw new Error(data.message);\n }\n } catch {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n // Request was cancelled, ignore\n return;\n }\n\n console.error('Chat error:', error);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: 'Sorry, I encountered an error. Please try again.' }\n : m\n )\n );\n } finally {\n setIsLoading(false);\n setStreamingMessageId(null);\n onStreamEnd?.();\n }\n },\n [apiEndpoint, input, isLoading, messages, onToolCall, onStreamStart, onStreamEnd, generateFallbackMessage]\n );\n\n return {\n messages,\n input,\n setInput,\n isLoading,\n streamingMessageId,\n sendMessage,\n clearMessages,\n addMessage,\n };\n}\n","'use client';\n\nimport { useState, useRef, useEffect, useCallback } from 'react';\n\n// Web Speech API types\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n}\n\ninterface SpeechRecognitionInstance {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n start(): void;\n stop(): void;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onend: (() => void) | null;\n onerror: (() => void) | null;\n}\n\nexport interface UseSpeechOptions {\n /** Language for speech recognition */\n lang?: string;\n /** Callback when speech is recognized */\n onResult?: (transcript: string, isFinal: boolean) => void;\n}\n\nexport interface UseSpeechReturn {\n /** Whether speech recognition is supported */\n isSupported: boolean;\n /** Whether currently listening */\n isListening: boolean;\n /** Toggle listening on/off */\n toggleListening: () => void;\n /** Start listening */\n startListening: () => void;\n /** Stop listening */\n stopListening: () => void;\n /** Speak text using TTS */\n speak: (text: string) => void;\n /** Whether TTS is enabled */\n ttsEnabled: boolean;\n /** Toggle TTS on/off */\n setTtsEnabled: (enabled: boolean) => void;\n /** Cancel current speech */\n cancelSpeech: () => void;\n}\n\n/**\n * Hook for speech recognition and text-to-speech\n */\nexport function useSpeech(options: UseSpeechOptions = {}): UseSpeechReturn {\n const { lang = 'en-US', onResult } = options;\n\n const [isSupported, setIsSupported] = useState(false);\n const [isListening, setIsListening] = useState(false);\n const [ttsEnabled, setTtsEnabled] = useState(false);\n\n const recognitionRef = useRef<SpeechRecognitionInstance | null>(null);\n\n // Initialize speech recognition\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const windowWithSpeech = window as any;\n const SpeechRecognitionAPI =\n windowWithSpeech.SpeechRecognition || windowWithSpeech.webkitSpeechRecognition;\n\n if (SpeechRecognitionAPI) {\n setIsSupported(true);\n recognitionRef.current = new SpeechRecognitionAPI() as SpeechRecognitionInstance;\n recognitionRef.current.continuous = false;\n recognitionRef.current.interimResults = true;\n recognitionRef.current.lang = lang;\n\n recognitionRef.current.onresult = (event) => {\n const result = event.results[0];\n const transcript = result[0].transcript;\n onResult?.(transcript, result.isFinal);\n\n if (result.isFinal) {\n setIsListening(false);\n }\n };\n\n recognitionRef.current.onend = () => setIsListening(false);\n recognitionRef.current.onerror = () => setIsListening(false);\n }\n }, [lang, onResult]);\n\n const startListening = useCallback(() => {\n if (!recognitionRef.current) return;\n try {\n recognitionRef.current.start();\n setIsListening(true);\n } catch (e) {\n console.error('Speech recognition error:', e);\n }\n }, []);\n\n const stopListening = useCallback(() => {\n if (!recognitionRef.current) return;\n recognitionRef.current.stop();\n setIsListening(false);\n }, []);\n\n const toggleListening = useCallback(() => {\n if (isListening) {\n stopListening();\n } else {\n startListening();\n }\n }, [isListening, startListening, stopListening]);\n\n const speak = useCallback(\n (text: string) => {\n if (!ttsEnabled || typeof window === 'undefined' || !('speechSynthesis' in window)) {\n return;\n }\n\n speechSynthesis.cancel();\n const utterance = new SpeechSynthesisUtterance(text);\n utterance.rate = 1.0;\n utterance.pitch = 1.0;\n\n // Try to find a good voice\n const voices = speechSynthesis.getVoices();\n const preferredVoice = voices.find(\n (v) => v.name.includes('Google') || v.name.includes('Samantha') || v.name.includes('Alex')\n );\n if (preferredVoice) {\n utterance.voice = preferredVoice;\n }\n\n speechSynthesis.speak(utterance);\n },\n [ttsEnabled]\n );\n\n const cancelSpeech = useCallback(() => {\n if (typeof window !== 'undefined' && 'speechSynthesis' in window) {\n speechSynthesis.cancel();\n }\n }, []);\n\n return {\n isSupported,\n isListening,\n toggleListening,\n startListening,\n stopListening,\n speak,\n ttsEnabled,\n setTtsEnabled,\n cancelSpeech,\n };\n}\n","'use client';\n\nimport React from 'react';\nimport { motion } from 'framer-motion';\nimport ReactMarkdown from 'react-markdown';\nimport type { ChatMessage as ChatMessageType } from '../types';\n\nexport interface ChatMessageProps {\n message: ChatMessageType;\n isStreaming?: boolean;\n isFullscreen?: boolean;\n}\n\nexport function ChatMessage({ message, isStreaming, isFullscreen }: ChatMessageProps) {\n const isUser = message.role === 'user';\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className={`flex ${isUser ? 'justify-end' : 'justify-start'}`}\n >\n <div\n className={`px-4 py-3 rounded-2xl text-sm leading-relaxed ${\n isFullscreen ? 'max-w-[70%]' : 'max-w-[85%]'\n } ${\n isUser\n ? 'pilot-message-user rounded-br-md'\n : 'pilot-message-assistant rounded-bl-md'\n }`}\n >\n {isUser ? (\n message.content\n ) : (\n <div className=\"pilot-prose\">\n <ReactMarkdown>{message.content}</ReactMarkdown>\n {isStreaming && (\n <span className=\"inline-block w-2 h-4 pilot-cursor ml-0.5 animate-pulse\" />\n )}\n </div>\n )}\n </div>\n </motion.div>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { Send, Mic, MicOff } from 'lucide-react';\n\nexport interface ChatInputProps {\n value: string;\n onChange: (value: string) => void;\n onSubmit: () => void;\n disabled?: boolean;\n placeholder?: string;\n isListening?: boolean;\n onToggleListening?: () => void;\n showMic?: boolean;\n}\n\nexport function ChatInput({\n value,\n onChange,\n onSubmit,\n disabled = false,\n placeholder = 'Type a message...',\n isListening = false,\n onToggleListening,\n showMic = false,\n}: ChatInputProps) {\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (value.trim() && !disabled) {\n onSubmit();\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"p-4 pilot-border-top\">\n <div className=\"flex items-center gap-2 pilot-input-container px-4 py-3 transition-colors\">\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"bg-transparent flex-1 outline-none text-sm pilot-input\"\n placeholder={isListening ? 'Listening...' : placeholder}\n disabled={disabled}\n />\n {showMic && onToggleListening && (\n <button\n type=\"button\"\n onClick={onToggleListening}\n disabled={disabled}\n className={`p-2 rounded-xl transition-all ${\n isListening ? 'pilot-mic-active' : 'pilot-mic-inactive'\n }`}\n >\n {isListening ? <MicOff className=\"w-4 h-4\" /> : <Mic className=\"w-4 h-4\" />}\n </button>\n )}\n <button\n type=\"submit\"\n disabled={!value.trim() || disabled}\n className={`p-2 rounded-xl transition-all ${\n value.trim() && !disabled ? 'pilot-send-active' : 'pilot-send-inactive'\n }`}\n >\n <Send className=\"w-4 h-4\" />\n </button>\n </div>\n </form>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { Zap } from 'lucide-react';\nimport type { Suggestion } from '../types';\n\nexport interface SuggestionsProps {\n suggestions: Suggestion[];\n onSelect: (text: string) => void;\n isVisible?: boolean;\n isFullscreen?: boolean;\n suggestionsToShow?: number;\n rotationInterval?: number;\n}\n\nexport function Suggestions({\n suggestions,\n onSelect,\n isVisible = true,\n isFullscreen = false,\n suggestionsToShow = 3,\n rotationInterval = 5000,\n}: SuggestionsProps) {\n const [currentIndex, setCurrentIndex] = useState(0);\n\n // Rotate suggestions\n useEffect(() => {\n if (!isVisible || suggestions.length <= suggestionsToShow) return;\n\n const interval = setInterval(() => {\n setCurrentIndex((prev) => (prev + 1) % Math.ceil(suggestions.length / suggestionsToShow));\n }, rotationInterval);\n\n return () => clearInterval(interval);\n }, [isVisible, suggestions.length, suggestionsToShow, rotationInterval]);\n\n // Get current suggestions to display\n const currentSuggestions = suggestions.slice(\n currentIndex * suggestionsToShow,\n currentIndex * suggestionsToShow + suggestionsToShow\n );\n\n const totalPages = Math.ceil(suggestions.length / suggestionsToShow);\n\n if (!isVisible || suggestions.length === 0) return null;\n\n return (\n <AnimatePresence>\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n transition={{ duration: 0.3 }}\n className=\"pt-2\"\n >\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-1.5 pilot-text-muted\">\n <Zap className=\"w-3 h-3\" />\n <span className=\"text-[10px] uppercase tracking-wider font-medium\">Try asking</span>\n </div>\n {/* Pagination dots */}\n {totalPages > 1 && (\n <div className=\"flex gap-1\">\n {Array.from({ length: totalPages }).map((_, i) => (\n <button\n key={i}\n onClick={() => setCurrentIndex(i)}\n className={`h-1.5 rounded-full transition-all ${\n i === currentIndex\n ? 'pilot-dot-active w-3'\n : 'pilot-dot-inactive w-1.5 hover:opacity-75'\n }`}\n />\n ))}\n </div>\n )}\n </div>\n <AnimatePresence mode=\"wait\">\n <motion.div\n key={currentIndex}\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n transition={{ duration: 0.3 }}\n className={`flex gap-2 ${isFullscreen ? 'flex-row flex-wrap' : 'flex-col'}`}\n >\n {currentSuggestions.map((suggestion, index) => (\n <motion.button\n key={suggestion.text}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: index * 0.1 }}\n onClick={() => onSelect(suggestion.text)}\n className=\"pilot-suggestion group flex items-center gap-2 px-3 py-2 rounded-xl text-xs text-left transition-all duration-200\"\n >\n {suggestion.icon && <span className=\"text-base\">{suggestion.icon}</span>}\n <span>{suggestion.text}</span>\n </motion.button>\n ))}\n </motion.div>\n </AnimatePresence>\n </motion.div>\n </AnimatePresence>\n );\n}\n","'use client';\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { X, MessageCircle, Sparkles, Volume2, VolumeX, Maximize2, Minimize2 } from 'lucide-react';\nimport { useChat } from '../hooks/useChat';\nimport { useSpeech } from '../hooks/useSpeech';\nimport { ChatMessage } from './ChatMessage';\nimport { ChatInput } from './ChatInput';\nimport { Suggestions } from './Suggestions';\nimport type { SitePilotProps, ChatMessage as ChatMessageType, AccentPreset } from '../types';\n\n// Accent color presets (HSL values)\nconst ACCENT_PRESETS: Record<AccentPreset, { h: number; s: number; l: number }> = {\n amber: { h: 38, s: 92, l: 50 },\n pink: { h: 330, s: 100, l: 71 },\n blue: { h: 210, s: 100, l: 50 },\n green: { h: 142, s: 71, l: 45 },\n purple: { h: 270, s: 100, l: 60 },\n red: { h: 0, s: 84, l: 60 },\n cyan: { h: 180, s: 100, l: 45 },\n orange: { h: 25, s: 95, l: 53 },\n};\n\n// Convert hex color to HSL\nfunction hexToHSL(hex: string): { h: number; s: number; l: number } | null {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return null;\n\n let r = parseInt(result[1], 16) / 255;\n let g = parseInt(result[2], 16) / 255;\n let b = parseInt(result[3], 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n }\n\n return { h: Math.round(h * 360), s: Math.round(s * 100), l: Math.round(l * 100) };\n}\n\n/**\n * SitePilot - AI chat widget that can control and navigate your website\n *\n * @example\n * ```tsx\n * import { SitePilot } from 'ai-site-pilot';\n *\n * <SitePilot\n * apiEndpoint=\"/api/chat\"\n * suggestions={[\n * { text: 'Show me products', icon: '🛍️' },\n * { text: 'Help me find...', icon: '🔍' },\n * ]}\n * onToolCall={(name, args) => {\n * // Handle tool execution\n * }}\n * />\n * ```\n */\nexport function SitePilot({\n apiEndpoint,\n theme = {},\n suggestions = [],\n features = {},\n onToolCall,\n generateFallbackMessage,\n defaultOpen = false,\n placeholder = 'Type a message...',\n welcomeMessage = \"Hi! I'm here to help you navigate and explore. What would you like to know?\",\n className = '',\n}: SitePilotProps) {\n const {\n position = 'bottom-right',\n borderRadius = 24,\n accent,\n accentColor,\n accentColorDark,\n backgroundColor,\n textColor,\n textMutedColor,\n borderColor,\n userMessageBg,\n assistantMessageBg,\n } = theme;\n\n // Resolve accent color to HSL values\n const resolveAccentHSL = (): { h: number; s: number; l: number } | null => {\n // Priority: accentColor (custom) > accent (preset)\n if (accentColor) {\n return hexToHSL(accentColor);\n }\n if (accent && ACCENT_PRESETS[accent]) {\n return ACCENT_PRESETS[accent];\n }\n return null;\n };\n\n const accentHSL = resolveAccentHSL();\n\n const {\n speech = true,\n tts = true,\n fullscreen = true,\n suggestions: showSuggestionsFeature = true,\n } = features;\n\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [showSuggestions, setShowSuggestions] = useState(true);\n\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n // Initial welcome message\n const initialMessages: ChatMessageType[] = welcomeMessage\n ? [\n {\n id: 'init',\n role: 'assistant',\n content: welcomeMessage,\n timestamp: new Date(),\n },\n ]\n : [];\n\n const {\n messages,\n input,\n setInput,\n isLoading,\n streamingMessageId,\n sendMessage,\n } = useChat({\n apiEndpoint,\n initialMessages,\n onToolCall,\n generateFallbackMessage,\n onStreamStart: () => setShowSuggestions(false),\n });\n\n const {\n isSupported: speechSupported,\n isListening,\n toggleListening,\n speak,\n ttsEnabled,\n setTtsEnabled,\n } = useSpeech({\n onResult: (transcript, isFinal) => {\n setInput(transcript);\n if (isFinal) {\n // Could auto-submit here if desired\n }\n },\n });\n\n // Scroll to bottom when messages change\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages, isOpen]);\n\n // Speak assistant messages when TTS is enabled\n useEffect(() => {\n if (!ttsEnabled) return;\n\n const lastMessage = messages[messages.length - 1];\n if (\n lastMessage?.role === 'assistant' &&\n lastMessage.id !== streamingMessageId &&\n lastMessage.content\n ) {\n speak(lastMessage.content);\n }\n }, [messages, streamingMessageId, ttsEnabled, speak]);\n\n const handleSuggestionSelect = useCallback(\n (text: string) => {\n sendMessage(text);\n },\n [sendMessage]\n );\n\n const handleSubmit = useCallback(() => {\n sendMessage();\n }, [sendMessage]);\n\n // Position classes\n const positionClasses = {\n 'bottom-right': 'bottom-24 right-6 md:right-8',\n 'bottom-left': 'bottom-24 left-6 md:left-8',\n 'top-right': 'top-24 right-6 md:right-8',\n 'top-left': 'top-24 left-6 md:left-8',\n };\n\n const buttonPositionClasses = {\n 'bottom-right': 'bottom-6 right-6 md:right-8',\n 'bottom-left': 'bottom-6 left-6 md:left-8',\n 'top-right': 'top-6 right-6 md:right-8',\n 'top-left': 'top-6 left-6 md:left-8',\n };\n\n // CSS custom properties for theming\n const cssVars = {\n '--pilot-radius': `${borderRadius}px`,\n // Set HSL components for accent color (this is what the CSS uses)\n ...(accentHSL && {\n '--pilot-accent-h': accentHSL.h,\n '--pilot-accent-s': `${accentHSL.s}%`,\n '--pilot-accent-l': `${accentHSL.l}%`,\n }),\n ...(accentColorDark && { '--pilot-accent-dark': accentColorDark }),\n ...(backgroundColor && { '--pilot-bg': backgroundColor, '--pilot-bg-95': `${backgroundColor}f2` }),\n ...(textColor && { '--pilot-text': textColor }),\n ...(textMutedColor && { '--pilot-text-muted': textMutedColor }),\n ...(borderColor && { '--pilot-border': borderColor }),\n ...(userMessageBg && { '--pilot-user-bg': userMessageBg }),\n ...(assistantMessageBg && { '--pilot-assistant-bg': assistantMessageBg }),\n } as React.CSSProperties;\n\n return (\n <div className={`pilot-container ${className}`} style={cssVars}>\n {/* Chat Panel */}\n <AnimatePresence>\n {isOpen && (\n <motion.div\n initial={{ opacity: 0, y: 20, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 20, scale: 0.95 }}\n transition={{ type: 'spring', stiffness: 400, damping: 30 }}\n layout\n className={`fixed pilot-panel flex flex-col shadow-2xl z-[200] transition-all duration-300 ${\n isFullscreen\n ? 'inset-4 md:inset-8'\n : `${positionClasses[position]} w-[calc(100%-48px)] md:w-[400px] h-[520px]`\n }`}\n style={{ borderRadius: `${borderRadius}px` }}\n >\n {/* Header */}\n <div className=\"px-5 py-4 pilot-border-bottom flex justify-between items-center\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 pilot-avatar rounded-xl flex items-center justify-center shadow-lg\">\n <Sparkles className=\"w-5 h-5 text-white\" />\n </div>\n <div>\n <div className=\"font-semibold pilot-text text-sm\">AI Assistant</div>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"w-1.5 h-1.5 pilot-status-dot rounded-full animate-pulse\" />\n <span className=\"text-[10px] pilot-text-muted\">Ready to help</span>\n </div>\n </div>\n </div>\n <div className=\"flex items-center gap-1\">\n {tts && (\n <button\n onClick={() => setTtsEnabled(!ttsEnabled)}\n className={`p-2 rounded-lg transition-colors ${\n ttsEnabled ? 'pilot-button-active' : 'pilot-button-inactive'\n }`}\n title={ttsEnabled ? 'Disable voice' : 'Enable voice'}\n >\n {ttsEnabled ? (\n <Volume2 className=\"w-4 h-4\" />\n ) : (\n <VolumeX className=\"w-4 h-4\" />\n )}\n </button>\n )}\n {fullscreen && (\n <button\n onClick={() => setIsFullscreen(!isFullscreen)}\n className=\"p-2 rounded-lg transition-colors pilot-button-inactive\"\n title={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}\n >\n {isFullscreen ? (\n <Minimize2 className=\"w-4 h-4\" />\n ) : (\n <Maximize2 className=\"w-4 h-4\" />\n )}\n </button>\n )}\n <button\n onClick={() => setIsOpen(false)}\n className=\"p-2 hover:bg-white/5 rounded-lg transition-colors\"\n >\n <X className=\"w-4 h-4 pilot-text-muted\" />\n </button>\n </div>\n </div>\n\n {/* Messages Area */}\n <div className=\"flex-1 overflow-y-auto p-4 space-y-4 scrollbar-thin scrollbar-thumb-white/10 scrollbar-track-transparent\">\n {messages.map((msg) => (\n <ChatMessage\n key={msg.id}\n message={msg}\n isStreaming={streamingMessageId === msg.id}\n isFullscreen={isFullscreen}\n />\n ))}\n\n {/* Loading indicator */}\n {isLoading && !streamingMessageId && (\n <div className=\"flex justify-start\">\n <div className=\"pilot-loading px-4 py-3 rounded-2xl rounded-bl-md\">\n <div className=\"flex gap-1.5\">\n {[0, 0.15, 0.3].map((delay, i) => (\n <motion.span\n key={i}\n className=\"w-2 h-2 pilot-loading-dot rounded-full\"\n animate={{ y: [0, -4, 0] }}\n transition={{ duration: 0.6, repeat: Infinity, delay }}\n />\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Suggestions */}\n {showSuggestionsFeature && suggestions.length > 0 && (\n <Suggestions\n suggestions={suggestions}\n onSelect={handleSuggestionSelect}\n isVisible={showSuggestions && !isLoading}\n isFullscreen={isFullscreen}\n />\n )}\n\n <div ref={messagesEndRef} />\n </div>\n\n {/* Input Area */}\n <ChatInput\n value={input}\n onChange={setInput}\n onSubmit={handleSubmit}\n disabled={isLoading}\n placeholder={placeholder}\n isListening={isListening}\n onToggleListening={toggleListening}\n showMic={speech && speechSupported}\n />\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Toggle Button */}\n {!isOpen && (\n <motion.button\n onClick={() => setIsOpen(true)}\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n whileHover={{ scale: 1.05 }}\n whileTap={{ scale: 0.95 }}\n className={`fixed ${buttonPositionClasses[position]} flex items-center gap-2 pilot-toggle-button px-5 py-3.5 rounded-2xl font-medium shadow-xl transition-shadow z-[200]`}\n >\n <MessageCircle className=\"w-5 h-5\" />\n <span className=\"text-sm hidden sm:inline\">Ask AI</span>\n <span className=\"w-2 h-2 bg-white/80 rounded-full animate-pulse\" />\n </motion.button>\n )}\n </div>\n );\n}\n\nexport default SitePilot;\n","/**\n * Tool registry for managing and converting tool definitions\n */\n\nimport type { ToolDefinition, ToolParameters, ToolExecution } from './types';\n\n/**\n * Helper to create a fallback message generator based on tool name mappings\n *\n * @example\n * ```ts\n * const generateFallback = createFallbackMessageGenerator({\n * filter_by_category: (args) => `Filtered to show **${args.category}** projects.`,\n * open_project: (args) => `Opened **${args.projectId}** for you to explore.`,\n * navigate: (args) => `Scrolled to the **${args.section}** section.`,\n * });\n * ```\n */\nexport function createFallbackMessageGenerator(\n toolMessages: Record<string, (args: Record<string, unknown>) => string>,\n defaultMessage = \"I've made some changes. Take a look!\"\n): (toolCalls: ToolExecution[]) => string {\n return (toolCalls: ToolExecution[]) => {\n if (toolCalls.length === 0) return defaultMessage;\n\n const messages: string[] = [];\n\n for (const tool of toolCalls) {\n const generator = toolMessages[tool.name];\n if (generator) {\n messages.push(generator(tool.args));\n } else {\n messages.push(defaultMessage);\n }\n }\n\n return messages.join(' ');\n };\n}\n\n/**\n * Helper function to define a tool with type safety\n */\nexport function defineTool<TParams extends Record<string, unknown>>(\n config: ToolDefinition<TParams>\n): ToolDefinition<TParams> {\n return config;\n}\n\n/**\n * Create a simple tool with no parameters\n */\nexport function defineSimpleTool(\n name: string,\n description: string,\n handler?: () => void | Promise<void>\n): ToolDefinition {\n return {\n name,\n description,\n parameters: {\n type: 'object',\n properties: {},\n required: [],\n },\n handler,\n };\n}\n\n/**\n * Tool registry for managing multiple tools\n */\nexport class ToolRegistry {\n private tools: Map<string, ToolDefinition> = new Map();\n\n constructor(tools: ToolDefinition[] = []) {\n for (const tool of tools) {\n this.register(tool);\n }\n }\n\n /**\n * Register a tool\n */\n register(tool: ToolDefinition): void {\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Unregister a tool\n */\n unregister(name: string): void {\n this.tools.delete(name);\n }\n\n /**\n * Get a tool by name\n */\n get(name: string): ToolDefinition | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Get all tools\n */\n getAll(): ToolDefinition[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * Execute a tool by name with given arguments\n */\n async execute(execution: ToolExecution): Promise<void> {\n const tool = this.tools.get(execution.name);\n if (!tool) {\n console.warn(`Tool not found: ${execution.name}`);\n return;\n }\n if (tool.handler) {\n await tool.handler(execution.args);\n }\n }\n\n /**\n * Execute multiple tools in sequence\n */\n async executeAll(executions: ToolExecution[], delayMs = 300): Promise<void> {\n for (const execution of executions) {\n await this.execute(execution);\n if (delayMs > 0 && executions.indexOf(execution) < executions.length - 1) {\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n }\n\n /**\n * Convert to Vercel AI SDK tool format\n */\n toVercelAITools(): Record<string, { description: string; parameters: unknown }> {\n const result: Record<string, { description: string; parameters: unknown }> = {};\n\n for (const tool of this.tools.values()) {\n result[tool.name] = {\n description: tool.description,\n parameters: {\n type: 'object',\n properties: tool.parameters.properties,\n required: tool.parameters.required,\n },\n };\n }\n\n return result;\n }\n\n /**\n * Convert to Gemini function declarations format\n */\n toGeminiFunctionDeclarations(): Array<{\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, unknown>;\n required: string[];\n };\n }> {\n return this.getAll().map(tool => ({\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object' as const,\n properties: Object.fromEntries(\n Object.entries(tool.parameters.properties).map(([key, value]) => [\n key,\n {\n type: value.type,\n description: value.description,\n enum: value.enum,\n },\n ])\n ),\n required: tool.parameters.required,\n },\n }));\n }\n}\n\n/**\n * Create a tool registry from an array of tools\n */\nexport function createToolRegistry(tools: ToolDefinition[]): ToolRegistry {\n return new ToolRegistry(tools);\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -143,7 +143,7 @@ function useChat(options) {
|
|
|
143
143
|
onStreamEnd?.();
|
|
144
144
|
}
|
|
145
145
|
},
|
|
146
|
-
[apiEndpoint, input, isLoading, messages, onToolCall, onStreamStart, onStreamEnd]
|
|
146
|
+
[apiEndpoint, input, isLoading, messages, onToolCall, onStreamStart, onStreamEnd, generateFallbackMessage]
|
|
147
147
|
);
|
|
148
148
|
return {
|
|
149
149
|
messages,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useChat.ts","../src/hooks/useSpeech.ts","../src/components/ChatMessage.tsx","../src/components/ChatInput.tsx","../src/components/Suggestions.tsx","../src/components/SitePilot.tsx","../src/tools/registry.ts"],"names":["useState","useRef","useCallback","jsx","jsxs","useEffect","motion","AnimatePresence"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\nimport { useState, useCallback, useRef } from 'react';\nimport type { ChatMessage, ToolExecution, StreamEvent } from '../types';\n\nexport interface UseChatOptions {\n /** API endpoint for chat */\n apiEndpoint: string;\n /** Initial messages */\n initialMessages?: ChatMessage[];\n /** Callback when a tool is called */\n onToolCall?: (toolName: string, args: Record<string, unknown>) => void | Promise<void>;\n /** Callback when streaming starts */\n onStreamStart?: () => void;\n /** Callback when streaming ends */\n onStreamEnd?: () => void;\n /** Generate a fallback message when AI uses tools but provides no text.\n * If not provided, uses a generic fallback message. */\n generateFallbackMessage?: (toolCalls: ToolExecution[]) => string;\n}\n\nexport interface UseChatReturn {\n /** All messages in the conversation */\n messages: ChatMessage[];\n /** Current input value */\n input: string;\n /** Set the input value */\n setInput: (value: string) => void;\n /** Whether the assistant is currently responding */\n isLoading: boolean;\n /** ID of the currently streaming message */\n streamingMessageId: string | null;\n /** Send a message */\n sendMessage: (content?: string) => Promise<void>;\n /** Clear all messages */\n clearMessages: () => void;\n /** Add a message manually */\n addMessage: (message: Omit<ChatMessage, 'id' | 'timestamp'>) => void;\n}\n\n/**\n * Hook for managing chat state and streaming\n */\nexport function useChat(options: UseChatOptions): UseChatReturn {\n const { apiEndpoint, initialMessages = [], onToolCall, onStreamStart, onStreamEnd, generateFallbackMessage } = options;\n\n const [messages, setMessages] = useState<ChatMessage[]>(initialMessages);\n const [input, setInput] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const addMessage = useCallback((message: Omit<ChatMessage, 'id' | 'timestamp'>) => {\n const newMessage: ChatMessage = {\n ...message,\n id: Date.now().toString(),\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, newMessage]);\n return newMessage;\n }, []);\n\n const clearMessages = useCallback(() => {\n setMessages(initialMessages);\n }, [initialMessages]);\n\n const sendMessage = useCallback(\n async (content?: string) => {\n const messageContent = content || input;\n if (!messageContent.trim() || isLoading) return;\n\n // Cancel any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n // Add user message\n const userMessage: ChatMessage = {\n id: Date.now().toString(),\n role: 'user',\n content: messageContent,\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, userMessage]);\n setInput('');\n setIsLoading(true);\n onStreamStart?.();\n\n // Add placeholder for assistant message\n const assistantMessageId = (Date.now() + 1).toString();\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n toolCalls: [],\n };\n setMessages((prev) => [...prev, assistantMessage]);\n setStreamingMessageId(assistantMessageId);\n\n let fullText = '';\n const toolCalls: ToolExecution[] = [];\n\n try {\n // Prepare messages for API (convert to format expected by API)\n const apiMessages = messages.concat(userMessage).map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ messages: apiMessages }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) {\n throw new Error('Failed to get response');\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No reader available');\n\n const decoder = new TextDecoder();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const text = decoder.decode(value);\n const lines = text.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const data = JSON.parse(line.slice(6)) as StreamEvent;\n\n if (data.type === 'text') {\n fullText += data.content;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId ? { ...m, content: fullText } : m\n )\n );\n } else if (data.type === 'tool') {\n const toolCall = { name: data.name, args: data.args };\n toolCalls.push(toolCall);\n\n // Execute tool call callback\n if (onToolCall) {\n try {\n await onToolCall(data.name, data.args);\n } catch (e) {\n console.error('Tool execution error:', e);\n }\n }\n } else if (data.type === 'done') {\n // Update message with tool calls\n if (toolCalls.length > 0) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId ? { ...m, toolCalls } : m\n )\n );\n }\n\n // If no text, generate contextual fallback based on tools used\n if (!fullText && toolCalls.length > 0 && generateFallbackMessage) {\n const fallbackMessage = generateFallbackMessage(toolCalls);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: fallbackMessage }\n : m\n )\n );\n } else if (!fullText) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: \"I've made some changes. Take a look!\" }\n : m\n )\n );\n }\n } else if (data.type === 'error') {\n throw new Error(data.message);\n }\n } catch {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n // Request was cancelled, ignore\n return;\n }\n\n console.error('Chat error:', error);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: 'Sorry, I encountered an error. Please try again.' }\n : m\n )\n );\n } finally {\n setIsLoading(false);\n setStreamingMessageId(null);\n onStreamEnd?.();\n }\n },\n [apiEndpoint, input, isLoading, messages, onToolCall, onStreamStart, onStreamEnd]\n );\n\n return {\n messages,\n input,\n setInput,\n isLoading,\n streamingMessageId,\n sendMessage,\n clearMessages,\n addMessage,\n };\n}\n","'use client';\n\nimport { useState, useRef, useEffect, useCallback } from 'react';\n\n// Web Speech API types\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n}\n\ninterface SpeechRecognitionInstance {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n start(): void;\n stop(): void;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onend: (() => void) | null;\n onerror: (() => void) | null;\n}\n\nexport interface UseSpeechOptions {\n /** Language for speech recognition */\n lang?: string;\n /** Callback when speech is recognized */\n onResult?: (transcript: string, isFinal: boolean) => void;\n}\n\nexport interface UseSpeechReturn {\n /** Whether speech recognition is supported */\n isSupported: boolean;\n /** Whether currently listening */\n isListening: boolean;\n /** Toggle listening on/off */\n toggleListening: () => void;\n /** Start listening */\n startListening: () => void;\n /** Stop listening */\n stopListening: () => void;\n /** Speak text using TTS */\n speak: (text: string) => void;\n /** Whether TTS is enabled */\n ttsEnabled: boolean;\n /** Toggle TTS on/off */\n setTtsEnabled: (enabled: boolean) => void;\n /** Cancel current speech */\n cancelSpeech: () => void;\n}\n\n/**\n * Hook for speech recognition and text-to-speech\n */\nexport function useSpeech(options: UseSpeechOptions = {}): UseSpeechReturn {\n const { lang = 'en-US', onResult } = options;\n\n const [isSupported, setIsSupported] = useState(false);\n const [isListening, setIsListening] = useState(false);\n const [ttsEnabled, setTtsEnabled] = useState(false);\n\n const recognitionRef = useRef<SpeechRecognitionInstance | null>(null);\n\n // Initialize speech recognition\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const windowWithSpeech = window as any;\n const SpeechRecognitionAPI =\n windowWithSpeech.SpeechRecognition || windowWithSpeech.webkitSpeechRecognition;\n\n if (SpeechRecognitionAPI) {\n setIsSupported(true);\n recognitionRef.current = new SpeechRecognitionAPI() as SpeechRecognitionInstance;\n recognitionRef.current.continuous = false;\n recognitionRef.current.interimResults = true;\n recognitionRef.current.lang = lang;\n\n recognitionRef.current.onresult = (event) => {\n const result = event.results[0];\n const transcript = result[0].transcript;\n onResult?.(transcript, result.isFinal);\n\n if (result.isFinal) {\n setIsListening(false);\n }\n };\n\n recognitionRef.current.onend = () => setIsListening(false);\n recognitionRef.current.onerror = () => setIsListening(false);\n }\n }, [lang, onResult]);\n\n const startListening = useCallback(() => {\n if (!recognitionRef.current) return;\n try {\n recognitionRef.current.start();\n setIsListening(true);\n } catch (e) {\n console.error('Speech recognition error:', e);\n }\n }, []);\n\n const stopListening = useCallback(() => {\n if (!recognitionRef.current) return;\n recognitionRef.current.stop();\n setIsListening(false);\n }, []);\n\n const toggleListening = useCallback(() => {\n if (isListening) {\n stopListening();\n } else {\n startListening();\n }\n }, [isListening, startListening, stopListening]);\n\n const speak = useCallback(\n (text: string) => {\n if (!ttsEnabled || typeof window === 'undefined' || !('speechSynthesis' in window)) {\n return;\n }\n\n speechSynthesis.cancel();\n const utterance = new SpeechSynthesisUtterance(text);\n utterance.rate = 1.0;\n utterance.pitch = 1.0;\n\n // Try to find a good voice\n const voices = speechSynthesis.getVoices();\n const preferredVoice = voices.find(\n (v) => v.name.includes('Google') || v.name.includes('Samantha') || v.name.includes('Alex')\n );\n if (preferredVoice) {\n utterance.voice = preferredVoice;\n }\n\n speechSynthesis.speak(utterance);\n },\n [ttsEnabled]\n );\n\n const cancelSpeech = useCallback(() => {\n if (typeof window !== 'undefined' && 'speechSynthesis' in window) {\n speechSynthesis.cancel();\n }\n }, []);\n\n return {\n isSupported,\n isListening,\n toggleListening,\n startListening,\n stopListening,\n speak,\n ttsEnabled,\n setTtsEnabled,\n cancelSpeech,\n };\n}\n","'use client';\n\nimport React from 'react';\nimport { motion } from 'framer-motion';\nimport ReactMarkdown from 'react-markdown';\nimport type { ChatMessage as ChatMessageType } from '../types';\n\nexport interface ChatMessageProps {\n message: ChatMessageType;\n isStreaming?: boolean;\n isFullscreen?: boolean;\n}\n\nexport function ChatMessage({ message, isStreaming, isFullscreen }: ChatMessageProps) {\n const isUser = message.role === 'user';\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className={`flex ${isUser ? 'justify-end' : 'justify-start'}`}\n >\n <div\n className={`px-4 py-3 rounded-2xl text-sm leading-relaxed ${\n isFullscreen ? 'max-w-[70%]' : 'max-w-[85%]'\n } ${\n isUser\n ? 'pilot-message-user rounded-br-md'\n : 'pilot-message-assistant rounded-bl-md'\n }`}\n >\n {isUser ? (\n message.content\n ) : (\n <div className=\"pilot-prose\">\n <ReactMarkdown>{message.content}</ReactMarkdown>\n {isStreaming && (\n <span className=\"inline-block w-2 h-4 pilot-cursor ml-0.5 animate-pulse\" />\n )}\n </div>\n )}\n </div>\n </motion.div>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { Send, Mic, MicOff } from 'lucide-react';\n\nexport interface ChatInputProps {\n value: string;\n onChange: (value: string) => void;\n onSubmit: () => void;\n disabled?: boolean;\n placeholder?: string;\n isListening?: boolean;\n onToggleListening?: () => void;\n showMic?: boolean;\n}\n\nexport function ChatInput({\n value,\n onChange,\n onSubmit,\n disabled = false,\n placeholder = 'Type a message...',\n isListening = false,\n onToggleListening,\n showMic = false,\n}: ChatInputProps) {\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (value.trim() && !disabled) {\n onSubmit();\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"p-4 pilot-border-top\">\n <div className=\"flex items-center gap-2 pilot-input-container px-4 py-3 transition-colors\">\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"bg-transparent flex-1 outline-none text-sm pilot-input\"\n placeholder={isListening ? 'Listening...' : placeholder}\n disabled={disabled}\n />\n {showMic && onToggleListening && (\n <button\n type=\"button\"\n onClick={onToggleListening}\n disabled={disabled}\n className={`p-2 rounded-xl transition-all ${\n isListening ? 'pilot-mic-active' : 'pilot-mic-inactive'\n }`}\n >\n {isListening ? <MicOff className=\"w-4 h-4\" /> : <Mic className=\"w-4 h-4\" />}\n </button>\n )}\n <button\n type=\"submit\"\n disabled={!value.trim() || disabled}\n className={`p-2 rounded-xl transition-all ${\n value.trim() && !disabled ? 'pilot-send-active' : 'pilot-send-inactive'\n }`}\n >\n <Send className=\"w-4 h-4\" />\n </button>\n </div>\n </form>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { Zap } from 'lucide-react';\nimport type { Suggestion } from '../types';\n\nexport interface SuggestionsProps {\n suggestions: Suggestion[];\n onSelect: (text: string) => void;\n isVisible?: boolean;\n isFullscreen?: boolean;\n suggestionsToShow?: number;\n rotationInterval?: number;\n}\n\nexport function Suggestions({\n suggestions,\n onSelect,\n isVisible = true,\n isFullscreen = false,\n suggestionsToShow = 3,\n rotationInterval = 5000,\n}: SuggestionsProps) {\n const [currentIndex, setCurrentIndex] = useState(0);\n\n // Rotate suggestions\n useEffect(() => {\n if (!isVisible || suggestions.length <= suggestionsToShow) return;\n\n const interval = setInterval(() => {\n setCurrentIndex((prev) => (prev + 1) % Math.ceil(suggestions.length / suggestionsToShow));\n }, rotationInterval);\n\n return () => clearInterval(interval);\n }, [isVisible, suggestions.length, suggestionsToShow, rotationInterval]);\n\n // Get current suggestions to display\n const currentSuggestions = suggestions.slice(\n currentIndex * suggestionsToShow,\n currentIndex * suggestionsToShow + suggestionsToShow\n );\n\n const totalPages = Math.ceil(suggestions.length / suggestionsToShow);\n\n if (!isVisible || suggestions.length === 0) return null;\n\n return (\n <AnimatePresence>\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n transition={{ duration: 0.3 }}\n className=\"pt-2\"\n >\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-1.5 pilot-text-muted\">\n <Zap className=\"w-3 h-3\" />\n <span className=\"text-[10px] uppercase tracking-wider font-medium\">Try asking</span>\n </div>\n {/* Pagination dots */}\n {totalPages > 1 && (\n <div className=\"flex gap-1\">\n {Array.from({ length: totalPages }).map((_, i) => (\n <button\n key={i}\n onClick={() => setCurrentIndex(i)}\n className={`h-1.5 rounded-full transition-all ${\n i === currentIndex\n ? 'pilot-dot-active w-3'\n : 'pilot-dot-inactive w-1.5 hover:opacity-75'\n }`}\n />\n ))}\n </div>\n )}\n </div>\n <AnimatePresence mode=\"wait\">\n <motion.div\n key={currentIndex}\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n transition={{ duration: 0.3 }}\n className={`flex gap-2 ${isFullscreen ? 'flex-row flex-wrap' : 'flex-col'}`}\n >\n {currentSuggestions.map((suggestion, index) => (\n <motion.button\n key={suggestion.text}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: index * 0.1 }}\n onClick={() => onSelect(suggestion.text)}\n className=\"pilot-suggestion group flex items-center gap-2 px-3 py-2 rounded-xl text-xs text-left transition-all duration-200\"\n >\n {suggestion.icon && <span className=\"text-base\">{suggestion.icon}</span>}\n <span>{suggestion.text}</span>\n </motion.button>\n ))}\n </motion.div>\n </AnimatePresence>\n </motion.div>\n </AnimatePresence>\n );\n}\n","'use client';\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { X, MessageCircle, Sparkles, Volume2, VolumeX, Maximize2, Minimize2 } from 'lucide-react';\nimport { useChat } from '../hooks/useChat';\nimport { useSpeech } from '../hooks/useSpeech';\nimport { ChatMessage } from './ChatMessage';\nimport { ChatInput } from './ChatInput';\nimport { Suggestions } from './Suggestions';\nimport type { SitePilotProps, ChatMessage as ChatMessageType, AccentPreset } from '../types';\n\n// Accent color presets (HSL values)\nconst ACCENT_PRESETS: Record<AccentPreset, { h: number; s: number; l: number }> = {\n amber: { h: 38, s: 92, l: 50 },\n pink: { h: 330, s: 100, l: 71 },\n blue: { h: 210, s: 100, l: 50 },\n green: { h: 142, s: 71, l: 45 },\n purple: { h: 270, s: 100, l: 60 },\n red: { h: 0, s: 84, l: 60 },\n cyan: { h: 180, s: 100, l: 45 },\n orange: { h: 25, s: 95, l: 53 },\n};\n\n// Convert hex color to HSL\nfunction hexToHSL(hex: string): { h: number; s: number; l: number } | null {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return null;\n\n let r = parseInt(result[1], 16) / 255;\n let g = parseInt(result[2], 16) / 255;\n let b = parseInt(result[3], 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n }\n\n return { h: Math.round(h * 360), s: Math.round(s * 100), l: Math.round(l * 100) };\n}\n\n/**\n * SitePilot - AI chat widget that can control and navigate your website\n *\n * @example\n * ```tsx\n * import { SitePilot } from 'ai-site-pilot';\n *\n * <SitePilot\n * apiEndpoint=\"/api/chat\"\n * suggestions={[\n * { text: 'Show me products', icon: '🛍️' },\n * { text: 'Help me find...', icon: '🔍' },\n * ]}\n * onToolCall={(name, args) => {\n * // Handle tool execution\n * }}\n * />\n * ```\n */\nexport function SitePilot({\n apiEndpoint,\n theme = {},\n suggestions = [],\n features = {},\n onToolCall,\n generateFallbackMessage,\n defaultOpen = false,\n placeholder = 'Type a message...',\n welcomeMessage = \"Hi! I'm here to help you navigate and explore. What would you like to know?\",\n className = '',\n}: SitePilotProps) {\n const {\n position = 'bottom-right',\n borderRadius = 24,\n accent,\n accentColor,\n accentColorDark,\n backgroundColor,\n textColor,\n textMutedColor,\n borderColor,\n userMessageBg,\n assistantMessageBg,\n } = theme;\n\n // Resolve accent color to HSL values\n const resolveAccentHSL = (): { h: number; s: number; l: number } | null => {\n // Priority: accentColor (custom) > accent (preset)\n if (accentColor) {\n return hexToHSL(accentColor);\n }\n if (accent && ACCENT_PRESETS[accent]) {\n return ACCENT_PRESETS[accent];\n }\n return null;\n };\n\n const accentHSL = resolveAccentHSL();\n\n const {\n speech = true,\n tts = true,\n fullscreen = true,\n suggestions: showSuggestionsFeature = true,\n } = features;\n\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [showSuggestions, setShowSuggestions] = useState(true);\n\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n // Initial welcome message\n const initialMessages: ChatMessageType[] = welcomeMessage\n ? [\n {\n id: 'init',\n role: 'assistant',\n content: welcomeMessage,\n timestamp: new Date(),\n },\n ]\n : [];\n\n const {\n messages,\n input,\n setInput,\n isLoading,\n streamingMessageId,\n sendMessage,\n } = useChat({\n apiEndpoint,\n initialMessages,\n onToolCall,\n generateFallbackMessage,\n onStreamStart: () => setShowSuggestions(false),\n });\n\n const {\n isSupported: speechSupported,\n isListening,\n toggleListening,\n speak,\n ttsEnabled,\n setTtsEnabled,\n } = useSpeech({\n onResult: (transcript, isFinal) => {\n setInput(transcript);\n if (isFinal) {\n // Could auto-submit here if desired\n }\n },\n });\n\n // Scroll to bottom when messages change\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages, isOpen]);\n\n // Speak assistant messages when TTS is enabled\n useEffect(() => {\n if (!ttsEnabled) return;\n\n const lastMessage = messages[messages.length - 1];\n if (\n lastMessage?.role === 'assistant' &&\n lastMessage.id !== streamingMessageId &&\n lastMessage.content\n ) {\n speak(lastMessage.content);\n }\n }, [messages, streamingMessageId, ttsEnabled, speak]);\n\n const handleSuggestionSelect = useCallback(\n (text: string) => {\n sendMessage(text);\n },\n [sendMessage]\n );\n\n const handleSubmit = useCallback(() => {\n sendMessage();\n }, [sendMessage]);\n\n // Position classes\n const positionClasses = {\n 'bottom-right': 'bottom-24 right-6 md:right-8',\n 'bottom-left': 'bottom-24 left-6 md:left-8',\n 'top-right': 'top-24 right-6 md:right-8',\n 'top-left': 'top-24 left-6 md:left-8',\n };\n\n const buttonPositionClasses = {\n 'bottom-right': 'bottom-6 right-6 md:right-8',\n 'bottom-left': 'bottom-6 left-6 md:left-8',\n 'top-right': 'top-6 right-6 md:right-8',\n 'top-left': 'top-6 left-6 md:left-8',\n };\n\n // CSS custom properties for theming\n const cssVars = {\n '--pilot-radius': `${borderRadius}px`,\n // Set HSL components for accent color (this is what the CSS uses)\n ...(accentHSL && {\n '--pilot-accent-h': accentHSL.h,\n '--pilot-accent-s': `${accentHSL.s}%`,\n '--pilot-accent-l': `${accentHSL.l}%`,\n }),\n ...(accentColorDark && { '--pilot-accent-dark': accentColorDark }),\n ...(backgroundColor && { '--pilot-bg': backgroundColor, '--pilot-bg-95': `${backgroundColor}f2` }),\n ...(textColor && { '--pilot-text': textColor }),\n ...(textMutedColor && { '--pilot-text-muted': textMutedColor }),\n ...(borderColor && { '--pilot-border': borderColor }),\n ...(userMessageBg && { '--pilot-user-bg': userMessageBg }),\n ...(assistantMessageBg && { '--pilot-assistant-bg': assistantMessageBg }),\n } as React.CSSProperties;\n\n return (\n <div className={`pilot-container ${className}`} style={cssVars}>\n {/* Chat Panel */}\n <AnimatePresence>\n {isOpen && (\n <motion.div\n initial={{ opacity: 0, y: 20, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 20, scale: 0.95 }}\n transition={{ type: 'spring', stiffness: 400, damping: 30 }}\n layout\n className={`fixed pilot-panel flex flex-col shadow-2xl z-[200] transition-all duration-300 ${\n isFullscreen\n ? 'inset-4 md:inset-8'\n : `${positionClasses[position]} w-[calc(100%-48px)] md:w-[400px] h-[520px]`\n }`}\n style={{ borderRadius: `${borderRadius}px` }}\n >\n {/* Header */}\n <div className=\"px-5 py-4 pilot-border-bottom flex justify-between items-center\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 pilot-avatar rounded-xl flex items-center justify-center shadow-lg\">\n <Sparkles className=\"w-5 h-5 text-white\" />\n </div>\n <div>\n <div className=\"font-semibold pilot-text text-sm\">AI Assistant</div>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"w-1.5 h-1.5 pilot-status-dot rounded-full animate-pulse\" />\n <span className=\"text-[10px] pilot-text-muted\">Ready to help</span>\n </div>\n </div>\n </div>\n <div className=\"flex items-center gap-1\">\n {tts && (\n <button\n onClick={() => setTtsEnabled(!ttsEnabled)}\n className={`p-2 rounded-lg transition-colors ${\n ttsEnabled ? 'pilot-button-active' : 'pilot-button-inactive'\n }`}\n title={ttsEnabled ? 'Disable voice' : 'Enable voice'}\n >\n {ttsEnabled ? (\n <Volume2 className=\"w-4 h-4\" />\n ) : (\n <VolumeX className=\"w-4 h-4\" />\n )}\n </button>\n )}\n {fullscreen && (\n <button\n onClick={() => setIsFullscreen(!isFullscreen)}\n className=\"p-2 rounded-lg transition-colors pilot-button-inactive\"\n title={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}\n >\n {isFullscreen ? (\n <Minimize2 className=\"w-4 h-4\" />\n ) : (\n <Maximize2 className=\"w-4 h-4\" />\n )}\n </button>\n )}\n <button\n onClick={() => setIsOpen(false)}\n className=\"p-2 hover:bg-white/5 rounded-lg transition-colors\"\n >\n <X className=\"w-4 h-4 pilot-text-muted\" />\n </button>\n </div>\n </div>\n\n {/* Messages Area */}\n <div className=\"flex-1 overflow-y-auto p-4 space-y-4 scrollbar-thin scrollbar-thumb-white/10 scrollbar-track-transparent\">\n {messages.map((msg) => (\n <ChatMessage\n key={msg.id}\n message={msg}\n isStreaming={streamingMessageId === msg.id}\n isFullscreen={isFullscreen}\n />\n ))}\n\n {/* Loading indicator */}\n {isLoading && !streamingMessageId && (\n <div className=\"flex justify-start\">\n <div className=\"pilot-loading px-4 py-3 rounded-2xl rounded-bl-md\">\n <div className=\"flex gap-1.5\">\n {[0, 0.15, 0.3].map((delay, i) => (\n <motion.span\n key={i}\n className=\"w-2 h-2 pilot-loading-dot rounded-full\"\n animate={{ y: [0, -4, 0] }}\n transition={{ duration: 0.6, repeat: Infinity, delay }}\n />\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Suggestions */}\n {showSuggestionsFeature && suggestions.length > 0 && (\n <Suggestions\n suggestions={suggestions}\n onSelect={handleSuggestionSelect}\n isVisible={showSuggestions && !isLoading}\n isFullscreen={isFullscreen}\n />\n )}\n\n <div ref={messagesEndRef} />\n </div>\n\n {/* Input Area */}\n <ChatInput\n value={input}\n onChange={setInput}\n onSubmit={handleSubmit}\n disabled={isLoading}\n placeholder={placeholder}\n isListening={isListening}\n onToggleListening={toggleListening}\n showMic={speech && speechSupported}\n />\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Toggle Button */}\n {!isOpen && (\n <motion.button\n onClick={() => setIsOpen(true)}\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n whileHover={{ scale: 1.05 }}\n whileTap={{ scale: 0.95 }}\n className={`fixed ${buttonPositionClasses[position]} flex items-center gap-2 pilot-toggle-button px-5 py-3.5 rounded-2xl font-medium shadow-xl transition-shadow z-[200]`}\n >\n <MessageCircle className=\"w-5 h-5\" />\n <span className=\"text-sm hidden sm:inline\">Ask AI</span>\n <span className=\"w-2 h-2 bg-white/80 rounded-full animate-pulse\" />\n </motion.button>\n )}\n </div>\n );\n}\n\nexport default SitePilot;\n","/**\n * Tool registry for managing and converting tool definitions\n */\n\nimport type { ToolDefinition, ToolParameters, ToolExecution } from './types';\n\n/**\n * Helper to create a fallback message generator based on tool name mappings\n *\n * @example\n * ```ts\n * const generateFallback = createFallbackMessageGenerator({\n * filter_by_category: (args) => `Filtered to show **${args.category}** projects.`,\n * open_project: (args) => `Opened **${args.projectId}** for you to explore.`,\n * navigate: (args) => `Scrolled to the **${args.section}** section.`,\n * });\n * ```\n */\nexport function createFallbackMessageGenerator(\n toolMessages: Record<string, (args: Record<string, unknown>) => string>,\n defaultMessage = \"I've made some changes. Take a look!\"\n): (toolCalls: ToolExecution[]) => string {\n return (toolCalls: ToolExecution[]) => {\n if (toolCalls.length === 0) return defaultMessage;\n\n const messages: string[] = [];\n\n for (const tool of toolCalls) {\n const generator = toolMessages[tool.name];\n if (generator) {\n messages.push(generator(tool.args));\n } else {\n messages.push(defaultMessage);\n }\n }\n\n return messages.join(' ');\n };\n}\n\n/**\n * Helper function to define a tool with type safety\n */\nexport function defineTool<TParams extends Record<string, unknown>>(\n config: ToolDefinition<TParams>\n): ToolDefinition<TParams> {\n return config;\n}\n\n/**\n * Create a simple tool with no parameters\n */\nexport function defineSimpleTool(\n name: string,\n description: string,\n handler?: () => void | Promise<void>\n): ToolDefinition {\n return {\n name,\n description,\n parameters: {\n type: 'object',\n properties: {},\n required: [],\n },\n handler,\n };\n}\n\n/**\n * Tool registry for managing multiple tools\n */\nexport class ToolRegistry {\n private tools: Map<string, ToolDefinition> = new Map();\n\n constructor(tools: ToolDefinition[] = []) {\n for (const tool of tools) {\n this.register(tool);\n }\n }\n\n /**\n * Register a tool\n */\n register(tool: ToolDefinition): void {\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Unregister a tool\n */\n unregister(name: string): void {\n this.tools.delete(name);\n }\n\n /**\n * Get a tool by name\n */\n get(name: string): ToolDefinition | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Get all tools\n */\n getAll(): ToolDefinition[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * Execute a tool by name with given arguments\n */\n async execute(execution: ToolExecution): Promise<void> {\n const tool = this.tools.get(execution.name);\n if (!tool) {\n console.warn(`Tool not found: ${execution.name}`);\n return;\n }\n if (tool.handler) {\n await tool.handler(execution.args);\n }\n }\n\n /**\n * Execute multiple tools in sequence\n */\n async executeAll(executions: ToolExecution[], delayMs = 300): Promise<void> {\n for (const execution of executions) {\n await this.execute(execution);\n if (delayMs > 0 && executions.indexOf(execution) < executions.length - 1) {\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n }\n\n /**\n * Convert to Vercel AI SDK tool format\n */\n toVercelAITools(): Record<string, { description: string; parameters: unknown }> {\n const result: Record<string, { description: string; parameters: unknown }> = {};\n\n for (const tool of this.tools.values()) {\n result[tool.name] = {\n description: tool.description,\n parameters: {\n type: 'object',\n properties: tool.parameters.properties,\n required: tool.parameters.required,\n },\n };\n }\n\n return result;\n }\n\n /**\n * Convert to Gemini function declarations format\n */\n toGeminiFunctionDeclarations(): Array<{\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, unknown>;\n required: string[];\n };\n }> {\n return this.getAll().map(tool => ({\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object' as const,\n properties: Object.fromEntries(\n Object.entries(tool.parameters.properties).map(([key, value]) => [\n key,\n {\n type: value.type,\n description: value.description,\n enum: value.enum,\n },\n ])\n ),\n required: tool.parameters.required,\n },\n }));\n }\n}\n\n/**\n * Create a tool registry from an array of tools\n */\nexport function createToolRegistry(tools: ToolDefinition[]): ToolRegistry {\n return new ToolRegistry(tools);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useChat.ts","../src/hooks/useSpeech.ts","../src/components/ChatMessage.tsx","../src/components/ChatInput.tsx","../src/components/Suggestions.tsx","../src/components/SitePilot.tsx","../src/tools/registry.ts"],"names":["useState","useRef","useCallback","jsx","jsxs","useEffect","motion","AnimatePresence"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\nimport { useState, useCallback, useRef } from 'react';\nimport type { ChatMessage, ToolExecution, StreamEvent } from '../types';\n\nexport interface UseChatOptions {\n /** API endpoint for chat */\n apiEndpoint: string;\n /** Initial messages */\n initialMessages?: ChatMessage[];\n /** Callback when a tool is called */\n onToolCall?: (toolName: string, args: Record<string, unknown>) => void | Promise<void>;\n /** Callback when streaming starts */\n onStreamStart?: () => void;\n /** Callback when streaming ends */\n onStreamEnd?: () => void;\n /** Generate a fallback message when AI uses tools but provides no text.\n * If not provided, uses a generic fallback message. */\n generateFallbackMessage?: (toolCalls: ToolExecution[]) => string;\n}\n\nexport interface UseChatReturn {\n /** All messages in the conversation */\n messages: ChatMessage[];\n /** Current input value */\n input: string;\n /** Set the input value */\n setInput: (value: string) => void;\n /** Whether the assistant is currently responding */\n isLoading: boolean;\n /** ID of the currently streaming message */\n streamingMessageId: string | null;\n /** Send a message */\n sendMessage: (content?: string) => Promise<void>;\n /** Clear all messages */\n clearMessages: () => void;\n /** Add a message manually */\n addMessage: (message: Omit<ChatMessage, 'id' | 'timestamp'>) => void;\n}\n\n/**\n * Hook for managing chat state and streaming\n */\nexport function useChat(options: UseChatOptions): UseChatReturn {\n const { apiEndpoint, initialMessages = [], onToolCall, onStreamStart, onStreamEnd, generateFallbackMessage } = options;\n\n const [messages, setMessages] = useState<ChatMessage[]>(initialMessages);\n const [input, setInput] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const addMessage = useCallback((message: Omit<ChatMessage, 'id' | 'timestamp'>) => {\n const newMessage: ChatMessage = {\n ...message,\n id: Date.now().toString(),\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, newMessage]);\n return newMessage;\n }, []);\n\n const clearMessages = useCallback(() => {\n setMessages(initialMessages);\n }, [initialMessages]);\n\n const sendMessage = useCallback(\n async (content?: string) => {\n const messageContent = content || input;\n if (!messageContent.trim() || isLoading) return;\n\n // Cancel any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n // Add user message\n const userMessage: ChatMessage = {\n id: Date.now().toString(),\n role: 'user',\n content: messageContent,\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, userMessage]);\n setInput('');\n setIsLoading(true);\n onStreamStart?.();\n\n // Add placeholder for assistant message\n const assistantMessageId = (Date.now() + 1).toString();\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n toolCalls: [],\n };\n setMessages((prev) => [...prev, assistantMessage]);\n setStreamingMessageId(assistantMessageId);\n\n let fullText = '';\n const toolCalls: ToolExecution[] = [];\n\n try {\n // Prepare messages for API (convert to format expected by API)\n const apiMessages = messages.concat(userMessage).map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ messages: apiMessages }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) {\n throw new Error('Failed to get response');\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No reader available');\n\n const decoder = new TextDecoder();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const text = decoder.decode(value);\n const lines = text.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const data = JSON.parse(line.slice(6)) as StreamEvent;\n\n if (data.type === 'text') {\n fullText += data.content;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId ? { ...m, content: fullText } : m\n )\n );\n } else if (data.type === 'tool') {\n const toolCall = { name: data.name, args: data.args };\n toolCalls.push(toolCall);\n\n // Execute tool call callback\n if (onToolCall) {\n try {\n await onToolCall(data.name, data.args);\n } catch (e) {\n console.error('Tool execution error:', e);\n }\n }\n } else if (data.type === 'done') {\n // Update message with tool calls\n if (toolCalls.length > 0) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId ? { ...m, toolCalls } : m\n )\n );\n }\n\n // If no text, generate contextual fallback based on tools used\n if (!fullText && toolCalls.length > 0 && generateFallbackMessage) {\n const fallbackMessage = generateFallbackMessage(toolCalls);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: fallbackMessage }\n : m\n )\n );\n } else if (!fullText) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: \"I've made some changes. Take a look!\" }\n : m\n )\n );\n }\n } else if (data.type === 'error') {\n throw new Error(data.message);\n }\n } catch {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n // Request was cancelled, ignore\n return;\n }\n\n console.error('Chat error:', error);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? { ...m, content: 'Sorry, I encountered an error. Please try again.' }\n : m\n )\n );\n } finally {\n setIsLoading(false);\n setStreamingMessageId(null);\n onStreamEnd?.();\n }\n },\n [apiEndpoint, input, isLoading, messages, onToolCall, onStreamStart, onStreamEnd, generateFallbackMessage]\n );\n\n return {\n messages,\n input,\n setInput,\n isLoading,\n streamingMessageId,\n sendMessage,\n clearMessages,\n addMessage,\n };\n}\n","'use client';\n\nimport { useState, useRef, useEffect, useCallback } from 'react';\n\n// Web Speech API types\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n}\n\ninterface SpeechRecognitionInstance {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n start(): void;\n stop(): void;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onend: (() => void) | null;\n onerror: (() => void) | null;\n}\n\nexport interface UseSpeechOptions {\n /** Language for speech recognition */\n lang?: string;\n /** Callback when speech is recognized */\n onResult?: (transcript: string, isFinal: boolean) => void;\n}\n\nexport interface UseSpeechReturn {\n /** Whether speech recognition is supported */\n isSupported: boolean;\n /** Whether currently listening */\n isListening: boolean;\n /** Toggle listening on/off */\n toggleListening: () => void;\n /** Start listening */\n startListening: () => void;\n /** Stop listening */\n stopListening: () => void;\n /** Speak text using TTS */\n speak: (text: string) => void;\n /** Whether TTS is enabled */\n ttsEnabled: boolean;\n /** Toggle TTS on/off */\n setTtsEnabled: (enabled: boolean) => void;\n /** Cancel current speech */\n cancelSpeech: () => void;\n}\n\n/**\n * Hook for speech recognition and text-to-speech\n */\nexport function useSpeech(options: UseSpeechOptions = {}): UseSpeechReturn {\n const { lang = 'en-US', onResult } = options;\n\n const [isSupported, setIsSupported] = useState(false);\n const [isListening, setIsListening] = useState(false);\n const [ttsEnabled, setTtsEnabled] = useState(false);\n\n const recognitionRef = useRef<SpeechRecognitionInstance | null>(null);\n\n // Initialize speech recognition\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const windowWithSpeech = window as any;\n const SpeechRecognitionAPI =\n windowWithSpeech.SpeechRecognition || windowWithSpeech.webkitSpeechRecognition;\n\n if (SpeechRecognitionAPI) {\n setIsSupported(true);\n recognitionRef.current = new SpeechRecognitionAPI() as SpeechRecognitionInstance;\n recognitionRef.current.continuous = false;\n recognitionRef.current.interimResults = true;\n recognitionRef.current.lang = lang;\n\n recognitionRef.current.onresult = (event) => {\n const result = event.results[0];\n const transcript = result[0].transcript;\n onResult?.(transcript, result.isFinal);\n\n if (result.isFinal) {\n setIsListening(false);\n }\n };\n\n recognitionRef.current.onend = () => setIsListening(false);\n recognitionRef.current.onerror = () => setIsListening(false);\n }\n }, [lang, onResult]);\n\n const startListening = useCallback(() => {\n if (!recognitionRef.current) return;\n try {\n recognitionRef.current.start();\n setIsListening(true);\n } catch (e) {\n console.error('Speech recognition error:', e);\n }\n }, []);\n\n const stopListening = useCallback(() => {\n if (!recognitionRef.current) return;\n recognitionRef.current.stop();\n setIsListening(false);\n }, []);\n\n const toggleListening = useCallback(() => {\n if (isListening) {\n stopListening();\n } else {\n startListening();\n }\n }, [isListening, startListening, stopListening]);\n\n const speak = useCallback(\n (text: string) => {\n if (!ttsEnabled || typeof window === 'undefined' || !('speechSynthesis' in window)) {\n return;\n }\n\n speechSynthesis.cancel();\n const utterance = new SpeechSynthesisUtterance(text);\n utterance.rate = 1.0;\n utterance.pitch = 1.0;\n\n // Try to find a good voice\n const voices = speechSynthesis.getVoices();\n const preferredVoice = voices.find(\n (v) => v.name.includes('Google') || v.name.includes('Samantha') || v.name.includes('Alex')\n );\n if (preferredVoice) {\n utterance.voice = preferredVoice;\n }\n\n speechSynthesis.speak(utterance);\n },\n [ttsEnabled]\n );\n\n const cancelSpeech = useCallback(() => {\n if (typeof window !== 'undefined' && 'speechSynthesis' in window) {\n speechSynthesis.cancel();\n }\n }, []);\n\n return {\n isSupported,\n isListening,\n toggleListening,\n startListening,\n stopListening,\n speak,\n ttsEnabled,\n setTtsEnabled,\n cancelSpeech,\n };\n}\n","'use client';\n\nimport React from 'react';\nimport { motion } from 'framer-motion';\nimport ReactMarkdown from 'react-markdown';\nimport type { ChatMessage as ChatMessageType } from '../types';\n\nexport interface ChatMessageProps {\n message: ChatMessageType;\n isStreaming?: boolean;\n isFullscreen?: boolean;\n}\n\nexport function ChatMessage({ message, isStreaming, isFullscreen }: ChatMessageProps) {\n const isUser = message.role === 'user';\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className={`flex ${isUser ? 'justify-end' : 'justify-start'}`}\n >\n <div\n className={`px-4 py-3 rounded-2xl text-sm leading-relaxed ${\n isFullscreen ? 'max-w-[70%]' : 'max-w-[85%]'\n } ${\n isUser\n ? 'pilot-message-user rounded-br-md'\n : 'pilot-message-assistant rounded-bl-md'\n }`}\n >\n {isUser ? (\n message.content\n ) : (\n <div className=\"pilot-prose\">\n <ReactMarkdown>{message.content}</ReactMarkdown>\n {isStreaming && (\n <span className=\"inline-block w-2 h-4 pilot-cursor ml-0.5 animate-pulse\" />\n )}\n </div>\n )}\n </div>\n </motion.div>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { Send, Mic, MicOff } from 'lucide-react';\n\nexport interface ChatInputProps {\n value: string;\n onChange: (value: string) => void;\n onSubmit: () => void;\n disabled?: boolean;\n placeholder?: string;\n isListening?: boolean;\n onToggleListening?: () => void;\n showMic?: boolean;\n}\n\nexport function ChatInput({\n value,\n onChange,\n onSubmit,\n disabled = false,\n placeholder = 'Type a message...',\n isListening = false,\n onToggleListening,\n showMic = false,\n}: ChatInputProps) {\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (value.trim() && !disabled) {\n onSubmit();\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"p-4 pilot-border-top\">\n <div className=\"flex items-center gap-2 pilot-input-container px-4 py-3 transition-colors\">\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"bg-transparent flex-1 outline-none text-sm pilot-input\"\n placeholder={isListening ? 'Listening...' : placeholder}\n disabled={disabled}\n />\n {showMic && onToggleListening && (\n <button\n type=\"button\"\n onClick={onToggleListening}\n disabled={disabled}\n className={`p-2 rounded-xl transition-all ${\n isListening ? 'pilot-mic-active' : 'pilot-mic-inactive'\n }`}\n >\n {isListening ? <MicOff className=\"w-4 h-4\" /> : <Mic className=\"w-4 h-4\" />}\n </button>\n )}\n <button\n type=\"submit\"\n disabled={!value.trim() || disabled}\n className={`p-2 rounded-xl transition-all ${\n value.trim() && !disabled ? 'pilot-send-active' : 'pilot-send-inactive'\n }`}\n >\n <Send className=\"w-4 h-4\" />\n </button>\n </div>\n </form>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { Zap } from 'lucide-react';\nimport type { Suggestion } from '../types';\n\nexport interface SuggestionsProps {\n suggestions: Suggestion[];\n onSelect: (text: string) => void;\n isVisible?: boolean;\n isFullscreen?: boolean;\n suggestionsToShow?: number;\n rotationInterval?: number;\n}\n\nexport function Suggestions({\n suggestions,\n onSelect,\n isVisible = true,\n isFullscreen = false,\n suggestionsToShow = 3,\n rotationInterval = 5000,\n}: SuggestionsProps) {\n const [currentIndex, setCurrentIndex] = useState(0);\n\n // Rotate suggestions\n useEffect(() => {\n if (!isVisible || suggestions.length <= suggestionsToShow) return;\n\n const interval = setInterval(() => {\n setCurrentIndex((prev) => (prev + 1) % Math.ceil(suggestions.length / suggestionsToShow));\n }, rotationInterval);\n\n return () => clearInterval(interval);\n }, [isVisible, suggestions.length, suggestionsToShow, rotationInterval]);\n\n // Get current suggestions to display\n const currentSuggestions = suggestions.slice(\n currentIndex * suggestionsToShow,\n currentIndex * suggestionsToShow + suggestionsToShow\n );\n\n const totalPages = Math.ceil(suggestions.length / suggestionsToShow);\n\n if (!isVisible || suggestions.length === 0) return null;\n\n return (\n <AnimatePresence>\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n transition={{ duration: 0.3 }}\n className=\"pt-2\"\n >\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-1.5 pilot-text-muted\">\n <Zap className=\"w-3 h-3\" />\n <span className=\"text-[10px] uppercase tracking-wider font-medium\">Try asking</span>\n </div>\n {/* Pagination dots */}\n {totalPages > 1 && (\n <div className=\"flex gap-1\">\n {Array.from({ length: totalPages }).map((_, i) => (\n <button\n key={i}\n onClick={() => setCurrentIndex(i)}\n className={`h-1.5 rounded-full transition-all ${\n i === currentIndex\n ? 'pilot-dot-active w-3'\n : 'pilot-dot-inactive w-1.5 hover:opacity-75'\n }`}\n />\n ))}\n </div>\n )}\n </div>\n <AnimatePresence mode=\"wait\">\n <motion.div\n key={currentIndex}\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n transition={{ duration: 0.3 }}\n className={`flex gap-2 ${isFullscreen ? 'flex-row flex-wrap' : 'flex-col'}`}\n >\n {currentSuggestions.map((suggestion, index) => (\n <motion.button\n key={suggestion.text}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: index * 0.1 }}\n onClick={() => onSelect(suggestion.text)}\n className=\"pilot-suggestion group flex items-center gap-2 px-3 py-2 rounded-xl text-xs text-left transition-all duration-200\"\n >\n {suggestion.icon && <span className=\"text-base\">{suggestion.icon}</span>}\n <span>{suggestion.text}</span>\n </motion.button>\n ))}\n </motion.div>\n </AnimatePresence>\n </motion.div>\n </AnimatePresence>\n );\n}\n","'use client';\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { X, MessageCircle, Sparkles, Volume2, VolumeX, Maximize2, Minimize2 } from 'lucide-react';\nimport { useChat } from '../hooks/useChat';\nimport { useSpeech } from '../hooks/useSpeech';\nimport { ChatMessage } from './ChatMessage';\nimport { ChatInput } from './ChatInput';\nimport { Suggestions } from './Suggestions';\nimport type { SitePilotProps, ChatMessage as ChatMessageType, AccentPreset } from '../types';\n\n// Accent color presets (HSL values)\nconst ACCENT_PRESETS: Record<AccentPreset, { h: number; s: number; l: number }> = {\n amber: { h: 38, s: 92, l: 50 },\n pink: { h: 330, s: 100, l: 71 },\n blue: { h: 210, s: 100, l: 50 },\n green: { h: 142, s: 71, l: 45 },\n purple: { h: 270, s: 100, l: 60 },\n red: { h: 0, s: 84, l: 60 },\n cyan: { h: 180, s: 100, l: 45 },\n orange: { h: 25, s: 95, l: 53 },\n};\n\n// Convert hex color to HSL\nfunction hexToHSL(hex: string): { h: number; s: number; l: number } | null {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return null;\n\n let r = parseInt(result[1], 16) / 255;\n let g = parseInt(result[2], 16) / 255;\n let b = parseInt(result[3], 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n }\n\n return { h: Math.round(h * 360), s: Math.round(s * 100), l: Math.round(l * 100) };\n}\n\n/**\n * SitePilot - AI chat widget that can control and navigate your website\n *\n * @example\n * ```tsx\n * import { SitePilot } from 'ai-site-pilot';\n *\n * <SitePilot\n * apiEndpoint=\"/api/chat\"\n * suggestions={[\n * { text: 'Show me products', icon: '🛍️' },\n * { text: 'Help me find...', icon: '🔍' },\n * ]}\n * onToolCall={(name, args) => {\n * // Handle tool execution\n * }}\n * />\n * ```\n */\nexport function SitePilot({\n apiEndpoint,\n theme = {},\n suggestions = [],\n features = {},\n onToolCall,\n generateFallbackMessage,\n defaultOpen = false,\n placeholder = 'Type a message...',\n welcomeMessage = \"Hi! I'm here to help you navigate and explore. What would you like to know?\",\n className = '',\n}: SitePilotProps) {\n const {\n position = 'bottom-right',\n borderRadius = 24,\n accent,\n accentColor,\n accentColorDark,\n backgroundColor,\n textColor,\n textMutedColor,\n borderColor,\n userMessageBg,\n assistantMessageBg,\n } = theme;\n\n // Resolve accent color to HSL values\n const resolveAccentHSL = (): { h: number; s: number; l: number } | null => {\n // Priority: accentColor (custom) > accent (preset)\n if (accentColor) {\n return hexToHSL(accentColor);\n }\n if (accent && ACCENT_PRESETS[accent]) {\n return ACCENT_PRESETS[accent];\n }\n return null;\n };\n\n const accentHSL = resolveAccentHSL();\n\n const {\n speech = true,\n tts = true,\n fullscreen = true,\n suggestions: showSuggestionsFeature = true,\n } = features;\n\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [showSuggestions, setShowSuggestions] = useState(true);\n\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n // Initial welcome message\n const initialMessages: ChatMessageType[] = welcomeMessage\n ? [\n {\n id: 'init',\n role: 'assistant',\n content: welcomeMessage,\n timestamp: new Date(),\n },\n ]\n : [];\n\n const {\n messages,\n input,\n setInput,\n isLoading,\n streamingMessageId,\n sendMessage,\n } = useChat({\n apiEndpoint,\n initialMessages,\n onToolCall,\n generateFallbackMessage,\n onStreamStart: () => setShowSuggestions(false),\n });\n\n const {\n isSupported: speechSupported,\n isListening,\n toggleListening,\n speak,\n ttsEnabled,\n setTtsEnabled,\n } = useSpeech({\n onResult: (transcript, isFinal) => {\n setInput(transcript);\n if (isFinal) {\n // Could auto-submit here if desired\n }\n },\n });\n\n // Scroll to bottom when messages change\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages, isOpen]);\n\n // Speak assistant messages when TTS is enabled\n useEffect(() => {\n if (!ttsEnabled) return;\n\n const lastMessage = messages[messages.length - 1];\n if (\n lastMessage?.role === 'assistant' &&\n lastMessage.id !== streamingMessageId &&\n lastMessage.content\n ) {\n speak(lastMessage.content);\n }\n }, [messages, streamingMessageId, ttsEnabled, speak]);\n\n const handleSuggestionSelect = useCallback(\n (text: string) => {\n sendMessage(text);\n },\n [sendMessage]\n );\n\n const handleSubmit = useCallback(() => {\n sendMessage();\n }, [sendMessage]);\n\n // Position classes\n const positionClasses = {\n 'bottom-right': 'bottom-24 right-6 md:right-8',\n 'bottom-left': 'bottom-24 left-6 md:left-8',\n 'top-right': 'top-24 right-6 md:right-8',\n 'top-left': 'top-24 left-6 md:left-8',\n };\n\n const buttonPositionClasses = {\n 'bottom-right': 'bottom-6 right-6 md:right-8',\n 'bottom-left': 'bottom-6 left-6 md:left-8',\n 'top-right': 'top-6 right-6 md:right-8',\n 'top-left': 'top-6 left-6 md:left-8',\n };\n\n // CSS custom properties for theming\n const cssVars = {\n '--pilot-radius': `${borderRadius}px`,\n // Set HSL components for accent color (this is what the CSS uses)\n ...(accentHSL && {\n '--pilot-accent-h': accentHSL.h,\n '--pilot-accent-s': `${accentHSL.s}%`,\n '--pilot-accent-l': `${accentHSL.l}%`,\n }),\n ...(accentColorDark && { '--pilot-accent-dark': accentColorDark }),\n ...(backgroundColor && { '--pilot-bg': backgroundColor, '--pilot-bg-95': `${backgroundColor}f2` }),\n ...(textColor && { '--pilot-text': textColor }),\n ...(textMutedColor && { '--pilot-text-muted': textMutedColor }),\n ...(borderColor && { '--pilot-border': borderColor }),\n ...(userMessageBg && { '--pilot-user-bg': userMessageBg }),\n ...(assistantMessageBg && { '--pilot-assistant-bg': assistantMessageBg }),\n } as React.CSSProperties;\n\n return (\n <div className={`pilot-container ${className}`} style={cssVars}>\n {/* Chat Panel */}\n <AnimatePresence>\n {isOpen && (\n <motion.div\n initial={{ opacity: 0, y: 20, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 20, scale: 0.95 }}\n transition={{ type: 'spring', stiffness: 400, damping: 30 }}\n layout\n className={`fixed pilot-panel flex flex-col shadow-2xl z-[200] transition-all duration-300 ${\n isFullscreen\n ? 'inset-4 md:inset-8'\n : `${positionClasses[position]} w-[calc(100%-48px)] md:w-[400px] h-[520px]`\n }`}\n style={{ borderRadius: `${borderRadius}px` }}\n >\n {/* Header */}\n <div className=\"px-5 py-4 pilot-border-bottom flex justify-between items-center\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 pilot-avatar rounded-xl flex items-center justify-center shadow-lg\">\n <Sparkles className=\"w-5 h-5 text-white\" />\n </div>\n <div>\n <div className=\"font-semibold pilot-text text-sm\">AI Assistant</div>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"w-1.5 h-1.5 pilot-status-dot rounded-full animate-pulse\" />\n <span className=\"text-[10px] pilot-text-muted\">Ready to help</span>\n </div>\n </div>\n </div>\n <div className=\"flex items-center gap-1\">\n {tts && (\n <button\n onClick={() => setTtsEnabled(!ttsEnabled)}\n className={`p-2 rounded-lg transition-colors ${\n ttsEnabled ? 'pilot-button-active' : 'pilot-button-inactive'\n }`}\n title={ttsEnabled ? 'Disable voice' : 'Enable voice'}\n >\n {ttsEnabled ? (\n <Volume2 className=\"w-4 h-4\" />\n ) : (\n <VolumeX className=\"w-4 h-4\" />\n )}\n </button>\n )}\n {fullscreen && (\n <button\n onClick={() => setIsFullscreen(!isFullscreen)}\n className=\"p-2 rounded-lg transition-colors pilot-button-inactive\"\n title={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}\n >\n {isFullscreen ? (\n <Minimize2 className=\"w-4 h-4\" />\n ) : (\n <Maximize2 className=\"w-4 h-4\" />\n )}\n </button>\n )}\n <button\n onClick={() => setIsOpen(false)}\n className=\"p-2 hover:bg-white/5 rounded-lg transition-colors\"\n >\n <X className=\"w-4 h-4 pilot-text-muted\" />\n </button>\n </div>\n </div>\n\n {/* Messages Area */}\n <div className=\"flex-1 overflow-y-auto p-4 space-y-4 scrollbar-thin scrollbar-thumb-white/10 scrollbar-track-transparent\">\n {messages.map((msg) => (\n <ChatMessage\n key={msg.id}\n message={msg}\n isStreaming={streamingMessageId === msg.id}\n isFullscreen={isFullscreen}\n />\n ))}\n\n {/* Loading indicator */}\n {isLoading && !streamingMessageId && (\n <div className=\"flex justify-start\">\n <div className=\"pilot-loading px-4 py-3 rounded-2xl rounded-bl-md\">\n <div className=\"flex gap-1.5\">\n {[0, 0.15, 0.3].map((delay, i) => (\n <motion.span\n key={i}\n className=\"w-2 h-2 pilot-loading-dot rounded-full\"\n animate={{ y: [0, -4, 0] }}\n transition={{ duration: 0.6, repeat: Infinity, delay }}\n />\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Suggestions */}\n {showSuggestionsFeature && suggestions.length > 0 && (\n <Suggestions\n suggestions={suggestions}\n onSelect={handleSuggestionSelect}\n isVisible={showSuggestions && !isLoading}\n isFullscreen={isFullscreen}\n />\n )}\n\n <div ref={messagesEndRef} />\n </div>\n\n {/* Input Area */}\n <ChatInput\n value={input}\n onChange={setInput}\n onSubmit={handleSubmit}\n disabled={isLoading}\n placeholder={placeholder}\n isListening={isListening}\n onToggleListening={toggleListening}\n showMic={speech && speechSupported}\n />\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Toggle Button */}\n {!isOpen && (\n <motion.button\n onClick={() => setIsOpen(true)}\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n whileHover={{ scale: 1.05 }}\n whileTap={{ scale: 0.95 }}\n className={`fixed ${buttonPositionClasses[position]} flex items-center gap-2 pilot-toggle-button px-5 py-3.5 rounded-2xl font-medium shadow-xl transition-shadow z-[200]`}\n >\n <MessageCircle className=\"w-5 h-5\" />\n <span className=\"text-sm hidden sm:inline\">Ask AI</span>\n <span className=\"w-2 h-2 bg-white/80 rounded-full animate-pulse\" />\n </motion.button>\n )}\n </div>\n );\n}\n\nexport default SitePilot;\n","/**\n * Tool registry for managing and converting tool definitions\n */\n\nimport type { ToolDefinition, ToolParameters, ToolExecution } from './types';\n\n/**\n * Helper to create a fallback message generator based on tool name mappings\n *\n * @example\n * ```ts\n * const generateFallback = createFallbackMessageGenerator({\n * filter_by_category: (args) => `Filtered to show **${args.category}** projects.`,\n * open_project: (args) => `Opened **${args.projectId}** for you to explore.`,\n * navigate: (args) => `Scrolled to the **${args.section}** section.`,\n * });\n * ```\n */\nexport function createFallbackMessageGenerator(\n toolMessages: Record<string, (args: Record<string, unknown>) => string>,\n defaultMessage = \"I've made some changes. Take a look!\"\n): (toolCalls: ToolExecution[]) => string {\n return (toolCalls: ToolExecution[]) => {\n if (toolCalls.length === 0) return defaultMessage;\n\n const messages: string[] = [];\n\n for (const tool of toolCalls) {\n const generator = toolMessages[tool.name];\n if (generator) {\n messages.push(generator(tool.args));\n } else {\n messages.push(defaultMessage);\n }\n }\n\n return messages.join(' ');\n };\n}\n\n/**\n * Helper function to define a tool with type safety\n */\nexport function defineTool<TParams extends Record<string, unknown>>(\n config: ToolDefinition<TParams>\n): ToolDefinition<TParams> {\n return config;\n}\n\n/**\n * Create a simple tool with no parameters\n */\nexport function defineSimpleTool(\n name: string,\n description: string,\n handler?: () => void | Promise<void>\n): ToolDefinition {\n return {\n name,\n description,\n parameters: {\n type: 'object',\n properties: {},\n required: [],\n },\n handler,\n };\n}\n\n/**\n * Tool registry for managing multiple tools\n */\nexport class ToolRegistry {\n private tools: Map<string, ToolDefinition> = new Map();\n\n constructor(tools: ToolDefinition[] = []) {\n for (const tool of tools) {\n this.register(tool);\n }\n }\n\n /**\n * Register a tool\n */\n register(tool: ToolDefinition): void {\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Unregister a tool\n */\n unregister(name: string): void {\n this.tools.delete(name);\n }\n\n /**\n * Get a tool by name\n */\n get(name: string): ToolDefinition | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Get all tools\n */\n getAll(): ToolDefinition[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * Execute a tool by name with given arguments\n */\n async execute(execution: ToolExecution): Promise<void> {\n const tool = this.tools.get(execution.name);\n if (!tool) {\n console.warn(`Tool not found: ${execution.name}`);\n return;\n }\n if (tool.handler) {\n await tool.handler(execution.args);\n }\n }\n\n /**\n * Execute multiple tools in sequence\n */\n async executeAll(executions: ToolExecution[], delayMs = 300): Promise<void> {\n for (const execution of executions) {\n await this.execute(execution);\n if (delayMs > 0 && executions.indexOf(execution) < executions.length - 1) {\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n }\n\n /**\n * Convert to Vercel AI SDK tool format\n */\n toVercelAITools(): Record<string, { description: string; parameters: unknown }> {\n const result: Record<string, { description: string; parameters: unknown }> = {};\n\n for (const tool of this.tools.values()) {\n result[tool.name] = {\n description: tool.description,\n parameters: {\n type: 'object',\n properties: tool.parameters.properties,\n required: tool.parameters.required,\n },\n };\n }\n\n return result;\n }\n\n /**\n * Convert to Gemini function declarations format\n */\n toGeminiFunctionDeclarations(): Array<{\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, unknown>;\n required: string[];\n };\n }> {\n return this.getAll().map(tool => ({\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object' as const,\n properties: Object.fromEntries(\n Object.entries(tool.parameters.properties).map(([key, value]) => [\n key,\n {\n type: value.type,\n description: value.description,\n enum: value.enum,\n },\n ])\n ),\n required: tool.parameters.required,\n },\n }));\n }\n}\n\n/**\n * Create a tool registry from an array of tools\n */\nexport function createToolRegistry(tools: ToolDefinition[]): ToolRegistry {\n return new ToolRegistry(tools);\n}\n"]}
|
package/package.json
CHANGED