open-ask-ai 0.6.4 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/index.js CHANGED
@@ -455,7 +455,7 @@ var styles$1 = {"spinning":"spinning_VD3F3"};
455
455
 
456
456
  // Lazy load heavy components
457
457
  const ChatContainer$2 = React__namespace.lazy(() => Promise.resolve().then(function () { return ChatContainer$1; }).then(m => ({ default: m.ChatContainer })));
458
- function Widget(props) {
458
+ function LegacyWidget(props, ref) {
459
459
  const { apiUrl, project, drawerPosition = 'right', drawerWidth = 600, drawerExpandedWidth = 920, theme = 'light', texts, exampleQuestions, hotkey, enableHotkey = true, onOpen, onClose, onMessage, onError, className, style, children, } = props;
460
460
  const [isOpen, setIsOpen] = React__namespace.useState(false);
461
461
  const [componentsLoaded, setComponentsLoaded] = React__namespace.useState(false);
@@ -493,6 +493,15 @@ function Widget(props) {
493
493
  setInput('');
494
494
  resetChat();
495
495
  }, [resetChat]);
496
+ React__namespace.useImperativeHandle(ref, () => ({
497
+ open: handleOpen,
498
+ close: handleClose,
499
+ openWithNewSession: (message) => {
500
+ handleNewSession();
501
+ handleOpen();
502
+ sendMessage(message);
503
+ },
504
+ }), [handleOpen, handleClose, handleNewSession]);
496
505
  // Handle keyboard shortcut
497
506
  React__namespace.useEffect(() => {
498
507
  if (!enableHotkey || !hotkey)
@@ -529,6 +538,7 @@ function Widget(props) {
529
538
  },
530
539
  })) : (jsxRuntime.jsx(Trigger, { onClick: handleOpen, text: texts?.triggerButtonText, ariaLabel: texts?.triggerButtonAriaLabel })), jsxRuntime.jsx(Drawer, { isOpen: isOpen, onClose: handleClose, onNewSession: handleNewSession, hasMessages: messages.length > 0, position: drawerPosition, width: drawerWidth, expandedWidth: drawerExpandedWidth, title: texts?.drawerTitle, closeAriaLabel: texts?.drawerCloseAriaLabel, newSessionAriaLabel: texts?.drawerNewSessionAriaLabel, theme: theme, children: (isOpen || componentsLoaded) && (jsxRuntime.jsx(React__namespace.Suspense, { fallback: jsxRuntime.jsx(lucideReact.Loader2, { className: styles$1.spinning }), children: jsxRuntime.jsx(ChatContainer$2, { texts: texts, exampleQuestions: exampleQuestions, onMessage: onMessage, onError: onError, messages: messages, isStreaming: isStreaming, error: error, sendMessage: sendMessage, input: input, setInput: setInput }) })) })] }));
531
540
  }
541
+ const Widget = React__namespace.forwardRef(LegacyWidget);
532
542
 
533
543
  var styles = {"container":"container_FRFCj","messagesArea":"messagesArea_Hi-49","welcomeScreen":"welcomeScreen_fJ8-E","welcomeMessage":"welcomeMessage_unMIK","exampleQuestionsContainer":"exampleQuestionsContainer_RBWq6","exampleQuestionsTitle":"exampleQuestionsTitle_Vurj8","exampleButton":"exampleButton_6sOzR","messageWrapper":"messageWrapper_nsQr8","user":"user_s1Gzu","assistant":"assistant_xU0-H","message":"message_jxpo4","messageText":"messageText_neW3m","markdown":"markdown_mNC3q","textPart":"textPart_efb3b","reasoningPart":"reasoningPart_JD-Cg","reasoningLabel":"reasoningLabel_Qbv7v","reasoningContent":"reasoningContent_pBYq2","toolPart":"toolPart_jy7Rq","toolCallsContainer":"toolCallsContainer_1nUsV","toolCall":"toolCall_gEKn0","tool-completed":"tool-completed_5Utl8","reasoning-streaming":"reasoning-streaming_gj-ZD","tool-pending":"tool-pending_hifHC","tool-running":"tool-running_D0dCg","pulse":"pulse_STM-e","tool-error":"tool-error_eqjRM","codeBlockWrapper":"codeBlockWrapper_rOz7-","copyButton":"copyButton_Ry43q","cursor":"cursor_9Dhwg","blink":"blink_-4y-x","error":"error_uFX9a","inputForm":"inputForm_nC0l-","inputWrapper":"inputWrapper_zGeKy","input":"input_7lMOc","submitButton":"submitButton_2XrPY"};
534
544
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/core/api/client.ts","../../src/core/hooks/useSSE.ts","../../src/core/hooks/useChat.ts","../../src/components/ui/Button.tsx","../../src/components/widget/Trigger.tsx","../../src/components/widget/Drawer.tsx","../../src/components/widget/Widget.tsx","../../src/components/chat/ChatContainer.tsx"],"sourcesContent":["import type { UIMessage } from '../types/index.js';\n\n/**\n * API client for Ask AI widget\n * Supports AI SDK v6 UIMessage format with streaming responses\n */\nexport class APIClient {\n private apiUrl: string;\n private project?: string;\n\n constructor(apiUrl: string, project?: string) {\n this.apiUrl = apiUrl;\n this.project = project;\n }\n\n /**\n * Send messages and get UIMessageStream response\n */\n async sendMessages(\n messages: UIMessage[],\n signal?: AbortSignal\n ): Promise<Response> {\n const body: { messages: UIMessage[]; project?: string } = {\n messages,\n };\n\n if (this.project) {\n body.project = this.project;\n }\n\n const response = await fetch(this.apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send messages: ${response.statusText}`);\n }\n\n return response;\n }\n}\n","import { useCallback } from 'react';\nimport type { UIMessage, UIMessageChunk } from '../types/index.js';\n\ninterface UseSSEOptions {\n onChunk?: (chunk: UIMessageChunk) => void;\n onError?: (error: Error) => void;\n}\n\ninterface UseSSEReturn {\n handleUIMessageStream: (response: Response, currentMessage: UIMessage) => Promise<void>;\n}\n\n/**\n * Parse SSE chunk format for UIMessageChunk stream\n * Supports both standard SSE format \"data: {...}\" and AI SDK v6 format \"0:{...}\"\n */\nfunction parseUIMessageChunk(line: string): UIMessageChunk | null {\n // Handle standard SSE format: \"data: {json}\"\n if (line.startsWith('data: ')) {\n const jsonStr = line.slice(6); // Remove \"data: \" prefix\n\n // Skip [DONE] marker\n if (jsonStr === '[DONE]') {\n return null;\n }\n\n try {\n return JSON.parse(jsonStr) as UIMessageChunk;\n } catch (err) {\n console.error('Failed to parse UIMessageChunk:', line, err);\n return null;\n }\n }\n\n return null;\n}\n\nexport function useSSE(options: UseSSEOptions = {}): UseSSEReturn {\n const { onChunk, onError } = options;\n\n const handleUIMessageStream = useCallback(\n async (response: Response, _currentMessage: UIMessage) => {\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (!reader) {\n onError?.(new Error('No response body'));\n return;\n }\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in the buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n\n const chunk = parseUIMessageChunk(line);\n if (chunk) {\n onChunk?.(chunk);\n }\n }\n }\n } catch (err) {\n // Don't report AbortError as it's an intentional cancellation\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n const error = err instanceof Error ? err : new Error('SSE stream error');\n onError?.(error);\n } finally {\n reader.releaseLock();\n }\n },\n [onChunk, onError]\n );\n\n return {\n handleUIMessageStream,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useSSE } from './useSSE.js';\nimport type { UIMessage, UIMessageChunk, WidgetTexts } from '../types/index.js';\nimport type { APIClient } from '../api/client.js';\n\ninterface UseChatOptions {\n apiClient: APIClient;\n texts?: WidgetTexts;\n}\n\ninterface UseChatReturn {\n messages: UIMessage[];\n isStreaming: boolean;\n error: Error | null;\n sendMessage: (text: string) => Promise<void>;\n resetChat: () => void;\n}\n\nlet idCounter = 0;\n\nfunction getMessageId() {\n idCounter += 1;\n return `msg-${idCounter}`;\n}\n\n/**\n * Apply a UIMessageChunk to update the current assistant message\n */\nfunction applyChunkToMessage(message: UIMessage, chunk: UIMessageChunk): UIMessage {\n const parts = [...message.parts];\n\n switch (chunk.type) {\n case 'text-start': {\n // Start a new text part\n parts.push({\n type: 'text',\n text: '',\n state: 'streaming',\n });\n break;\n }\n\n case 'text-delta': {\n // Find the last text part and append delta\n const lastTextIndex = parts.findLastIndex((p: any) => p.type === 'text');\n if (lastTextIndex >= 0) {\n const textPart = parts[lastTextIndex];\n if (textPart.type === 'text') {\n parts[lastTextIndex] = {\n ...textPart,\n text: textPart.text + chunk.delta,\n };\n }\n }\n break;\n }\n\n case 'text-end': {\n // Mark the last text part as done\n const lastTextIndex = parts.findLastIndex((p: any) => p.type === 'text');\n if (lastTextIndex >= 0) {\n const textPart = parts[lastTextIndex];\n if (textPart.type === 'text') {\n parts[lastTextIndex] = {\n ...textPart,\n state: 'done',\n };\n }\n }\n break;\n }\n\n case 'reasoning-start': {\n // Start a new reasoning part\n parts.push({\n type: 'reasoning',\n text: '',\n state: 'streaming',\n });\n break;\n }\n\n case 'reasoning-delta': {\n // Find the last reasoning part and append delta\n const lastReasoningIndex = parts.findLastIndex((p: any) => p.type === 'reasoning');\n if (lastReasoningIndex >= 0) {\n const reasoningPart = parts[lastReasoningIndex];\n if (reasoningPart.type === 'reasoning') {\n parts[lastReasoningIndex] = {\n ...reasoningPart,\n text: reasoningPart.text + chunk.delta,\n };\n }\n }\n break;\n }\n\n case 'reasoning-end': {\n // Mark the last reasoning part as done\n const lastReasoningIndex = parts.findLastIndex((p: any) => p.type === 'reasoning');\n if (lastReasoningIndex >= 0) {\n const reasoningPart = parts[lastReasoningIndex];\n if (reasoningPart.type === 'reasoning') {\n parts[lastReasoningIndex] = {\n ...reasoningPart,\n state: 'done',\n };\n }\n }\n break;\n }\n\n case 'tool-input-start': {\n // Start a new dynamic tool call\n parts.push({\n type: 'dynamic-tool',\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: undefined,\n state: 'input-streaming',\n } as any);\n break;\n }\n\n case 'tool-input-available': {\n // Update tool call with input\n const toolIndex = parts.findIndex(\n (p: any) => p.type === 'dynamic-tool' && p.toolCallId === chunk.toolCallId\n );\n if (toolIndex >= 0) {\n const toolPart = parts[toolIndex] as any;\n parts[toolIndex] = {\n ...toolPart,\n input: chunk.input,\n state: 'input-available',\n };\n }\n break;\n }\n\n case 'tool-output-available': {\n // Update tool call with output\n const toolIndex = parts.findIndex(\n (p: any) => p.type === 'dynamic-tool' && p.toolCallId === chunk.toolCallId\n );\n if (toolIndex >= 0) {\n const toolPart = parts[toolIndex] as any;\n parts[toolIndex] = {\n ...toolPart,\n output: chunk.output,\n state: 'output-available',\n };\n }\n break;\n }\n\n case 'tool-output-error': {\n // Update tool call with error\n const toolIndex = parts.findIndex(\n (p: any) => p.type === 'dynamic-tool' && p.toolCallId === chunk.toolCallId\n );\n if (toolIndex >= 0) {\n const toolPart = parts[toolIndex] as any;\n parts[toolIndex] = {\n ...toolPart,\n errorText: chunk.errorText,\n state: 'error',\n };\n }\n break;\n }\n\n case 'error': {\n // Handle error chunk - could add error state to message\n console.error('Stream error:', chunk.errorText);\n break;\n }\n\n // Add other chunk types as needed\n default:\n // Ignore unknown chunk types\n break;\n }\n\n return {\n ...message,\n parts,\n };\n}\n\nexport function useChat({ apiClient }: UseChatOptions): UseChatReturn {\n const [messages, setMessages] = useState<UIMessage[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const { handleUIMessageStream } = useSSE({\n onChunk: (chunk) => {\n if (chunk.type === 'error') {\n setError(new Error(chunk.errorText));\n setIsStreaming(false);\n return;\n }\n\n // Update the last assistant message with the chunk\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant') {\n const updatedMessage = applyChunkToMessage(lastMessage, chunk);\n return [...prev.slice(0, -1), updatedMessage];\n }\n return prev;\n });\n },\n onError: (err) => {\n setError(err);\n setIsStreaming(false);\n // Remove the failed assistant message\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant' && lastMessage.parts.length === 0) {\n return prev.slice(0, -1);\n }\n return prev;\n });\n },\n });\n\n const sendMessage = useCallback(\n async (text: string) => {\n if (!text.trim()) {\n return;\n }\n\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Create new AbortController for this request\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setError(null);\n setIsStreaming(true);\n\n // Add user message immediately (optimistic UI)\n const userMessage: UIMessage = {\n id: getMessageId(),\n role: 'user',\n parts: [\n {\n type: 'text',\n text,\n },\n ],\n };\n\n // Add placeholder for assistant response\n const assistantMessage: UIMessage = {\n id: getMessageId(),\n role: 'assistant',\n parts: [],\n };\n\n const newMessages = [...messages, userMessage];\n setMessages([...newMessages, assistantMessage]);\n\n try {\n const response = await apiClient.sendMessages(\n newMessages,\n abortController.signal\n );\n await handleUIMessageStream(response, assistantMessage);\n setIsStreaming(false);\n } catch (err) {\n // Don't treat aborted requests as errors\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n\n const error = err instanceof Error ? err : new Error('Failed to send message');\n setError(error);\n setIsStreaming(false);\n\n // Remove the failed messages\n setMessages((prev) => prev.slice(0, -2));\n } finally {\n // Clear the abort controller reference if this was the current one\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n }\n },\n [messages, apiClient, handleUIMessageStream]\n );\n\n const resetChat = useCallback(() => {\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n\n setMessages([]);\n setError(null);\n setIsStreaming(false);\n }, []);\n\n return {\n messages,\n isStreaming,\n error,\n sendMessage,\n resetChat,\n };\n}\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport styles from './Button.module.css';\n\ntype ButtonVariant = 'default' | 'outline' | 'ghost' | 'icon';\ntype ButtonSize = 'default' | 'sm' | 'lg' | 'icon';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean;\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n\n const classNames = [\n styles.button,\n styles[`variant-${variant}`],\n styles[`size-${size}`],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Comp\n className={classNames}\n ref={ref}\n {...props}\n />\n );\n }\n);\n\nButton.displayName = 'Button';\n\nexport { Button };\n","import { Sparkles, Loader2 } from 'lucide-react';\nimport { Button } from '../ui/Button.js';\nimport styles from './Trigger.module.css';\n\ninterface TriggerProps {\n onClick: () => void;\n text?: string;\n ariaLabel?: string;\n className?: string;\n isLoading?: boolean;\n}\n\nexport function Trigger({\n onClick,\n text = 'Ask AI',\n ariaLabel = 'Open AI assistant',\n className,\n isLoading = false,\n}: TriggerProps) {\n const classNames = [styles.trigger, className].filter(Boolean).join(' ');\n\n return (\n <Button\n onClick={onClick}\n variant=\"outline\"\n aria-label={ariaLabel}\n className={classNames}\n disabled={isLoading}\n >\n {isLoading ? (\n <Loader2 className={`${styles.icon} ${styles.spinning}`} />\n ) : (\n <Sparkles className={styles.icon} />\n )}\n {text && <span>{text}</span>}\n </Button>\n );\n}\n","import * as React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { Sparkles, X, EraserIcon, Maximize2, Minimize2 } from 'lucide-react';\nimport { Button } from '../ui/Button.js';\nimport styles from './Drawer.module.css';\n\ninterface DrawerProps {\n isOpen: boolean;\n onClose: () => void;\n onNewSession?: () => void;\n hasMessages?: boolean;\n position?: 'right' | 'left';\n width?: number | string;\n expandedWidth?: number | string;\n title?: string;\n closeAriaLabel?: string;\n newSessionAriaLabel?: string;\n children?: React.ReactNode;\n theme?: 'light' | 'dark';\n}\n\nexport function Drawer({\n isOpen,\n onClose,\n onNewSession,\n hasMessages,\n position = 'right',\n width = 600,\n expandedWidth = 920,\n title = 'Ask AI',\n closeAriaLabel = 'Close',\n newSessionAriaLabel = 'New session',\n children,\n theme = 'light',\n}: DrawerProps) {\n const [isExpanded, setIsExpanded] = React.useState(false);\n\n const maxWidth = isExpanded ? expandedWidth : width;\n\n const contentClasses = [\n styles.content,\n styles[`position-${position}`],\n ].join(' ');\n\n // Create a portal container that inherits theme from the nearest .ask-ai ancestor\n const [portalContainer, setPortalContainer] = React.useState<HTMLElement | null>(null);\n\n React.useEffect(() => {\n if (typeof document === 'undefined') return;\n\n // Create a portal container with ask-ai class\n const container = document.createElement('div');\n container.className = `ask-ai${theme === 'dark' ? ' dark' : ''}`;\n document.body.appendChild(container);\n setPortalContainer(container);\n\n return () => {\n document.body.removeChild(container);\n };\n }, [theme]);\n\n return (\n <DialogPrimitive.Root open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogPrimitive.Portal container={portalContainer}>\n {/* Overlay */}\n <DialogPrimitive.Overlay className={styles.overlay} />\n\n {/* Drawer Content */}\n <DialogPrimitive.Content\n className={contentClasses}\n style={{ maxWidth }}\n >\n {/* Header */}\n <div className={styles.header}>\n <DialogPrimitive.Title className={styles.title}>\n <Sparkles className={styles.icon} />\n {title}\n </DialogPrimitive.Title>\n <div className={styles.headerActions}>\n {onNewSession && hasMessages && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={newSessionAriaLabel}\n className={styles.newSessionButton}\n onClick={onNewSession}\n >\n <EraserIcon className={styles.newSessionIcon} />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={isExpanded ? 'Shrink' : 'Expand'}\n className={styles.expandButton}\n onClick={() => setIsExpanded(!isExpanded)}\n >\n {isExpanded ? (\n <Minimize2 className={styles.expandIcon} />\n ) : (\n <Maximize2 className={styles.expandIcon} />\n )}\n </Button>\n <DialogPrimitive.Close asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={closeAriaLabel}\n className={styles.closeButton}\n >\n <X className={styles.closeIcon} />\n </Button>\n </DialogPrimitive.Close>\n </div>\n </div>\n\n {/* Content */}\n <div className={styles.body}>\n {children}\n </div>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n}\n","import * as React from 'react';\nimport { Loader2 } from 'lucide-react';\nimport { APIClient } from '../../core/api/client.js';\nimport { useChat } from '../../core/hooks/useChat.js';\nimport type { WidgetProps } from '../../core/types/index.js';\nimport { Trigger } from './Trigger.js';\nimport { Drawer } from './Drawer.js';\nimport styles from './Widget.module.css';\n\n// Lazy load heavy components\nconst ChatContainer = React.lazy(() => import('../chat/ChatContainer.js').then(m => ({ default: m.ChatContainer })));\n\nexport function Widget(props: WidgetProps) {\n const {\n apiUrl,\n project,\n drawerPosition = 'right',\n drawerWidth = 600,\n drawerExpandedWidth = 920,\n theme = 'light',\n texts,\n exampleQuestions,\n hotkey,\n enableHotkey = true,\n onOpen,\n onClose,\n onMessage,\n onError,\n className,\n style,\n children,\n } = props;\n\n const [isOpen, setIsOpen] = React.useState(false);\n const [componentsLoaded, setComponentsLoaded] = React.useState(false);\n const [apiClient] = React.useState(() => new APIClient(apiUrl, project));\n\n // Lift chat state to Widget level to persist across drawer open/close\n const { messages, isStreaming, error, sendMessage, resetChat } = useChat({ apiClient, texts });\n\n // Input state also needs to persist\n const [input, setInput] = React.useState('');\n\n // Preload components\n const preloadComponents = React.useCallback(async () => {\n if (componentsLoaded) return;\n\n try {\n // Trigger lazy loading by importing the modules\n await import('../chat/ChatContainer.js');\n setComponentsLoaded(true);\n } catch (error) {\n console.error('Failed to preload components:', error);\n }\n }, [componentsLoaded]);\n\n // Handle drawer open\n const handleOpen = React.useCallback(async () => {\n preloadComponents();\n setIsOpen(true);\n onOpen?.();\n }, [preloadComponents, onOpen]);\n\n // Handle drawer close\n const handleClose = React.useCallback(() => {\n setIsOpen(false);\n onClose?.();\n }, [onClose]);\n\n // Handle new session\n const handleNewSession = React.useCallback(() => {\n setInput('');\n resetChat();\n }, [resetChat]);\n\n // Handle keyboard shortcut\n React.useEffect(() => {\n if (!enableHotkey || !hotkey) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const keys = hotkey.toLowerCase().split('+');\n const ctrl = keys.includes('ctrl') || keys.includes('control');\n const cmd = keys.includes('cmd') || keys.includes('command') || keys.includes('meta');\n const shift = keys.includes('shift');\n const alt = keys.includes('alt');\n const key = keys[keys.length - 1];\n\n const ctrlPressed = ctrl && (e.ctrlKey || e.metaKey);\n const cmdPressed = cmd && (e.metaKey || e.ctrlKey);\n const shiftPressed = !shift || e.shiftKey;\n const altPressed = !alt || e.altKey;\n\n if ((ctrlPressed || cmdPressed) && shiftPressed && altPressed && e.key.toLowerCase() === key) {\n e.preventDefault();\n setIsOpen((prev) => !prev);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [enableHotkey, hotkey]);\n\n return (\n <div className={`ask-ai ${className || ''} ${theme === 'dark' ? 'dark' : ''}`} style={style}>\n {/* Trigger Button - Custom or Default */}\n {children && React.isValidElement(children) ? (\n React.cloneElement(children, {\n ...children.props,\n onClick: (e: React.MouseEvent) => {\n // Call existing onClick if present\n const existingOnClick = children.props?.onClick;\n if (existingOnClick) {\n existingOnClick(e);\n }\n // Then call our handleOpen\n handleOpen();\n },\n })\n ) : (\n <Trigger\n onClick={handleOpen}\n text={texts?.triggerButtonText}\n ariaLabel={texts?.triggerButtonAriaLabel}\n />\n )}\n\n {/* Drawer with Chat */}\n <Drawer\n isOpen={isOpen}\n onClose={handleClose}\n onNewSession={handleNewSession}\n hasMessages={messages.length > 0}\n position={drawerPosition}\n width={drawerWidth}\n expandedWidth={drawerExpandedWidth}\n title={texts?.drawerTitle}\n closeAriaLabel={texts?.drawerCloseAriaLabel}\n newSessionAriaLabel={texts?.drawerNewSessionAriaLabel}\n theme={theme}\n >\n {/* Chat - Lazy loaded with Suspense */}\n {(isOpen || componentsLoaded) && (\n <React.Suspense fallback={\n <Loader2 className={styles.spinning} />\n }>\n <ChatContainer\n texts={texts}\n exampleQuestions={exampleQuestions}\n onMessage={onMessage}\n onError={onError}\n messages={messages}\n isStreaming={isStreaming}\n error={error}\n sendMessage={sendMessage}\n input={input}\n setInput={setInput}\n />\n </React.Suspense>\n )}\n </Drawer>\n </div>\n );\n}\n","import * as React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport rehypeHighlight from 'rehype-highlight';\nimport { common } from 'lowlight';\nimport type { WidgetTexts, UIMessage } from '../../core/types/index.js';\nimport styles from './ChatContainer.module.css';\nimport { ArrowUp, Copy, Check } from 'lucide-react';\nimport type { DynamicToolUIPart, ToolUIPart, UIDataTypes, UIMessagePart, UITools } from 'ai';\n\ninterface ChatContainerProps {\n texts?: WidgetTexts;\n exampleQuestions?: string[];\n onMessage?: (message: any) => void;\n onError?: (error: Error) => void;\n // Lifted state from parent\n messages: UIMessage[];\n isStreaming: boolean;\n error: Error | null;\n sendMessage: (text: string) => Promise<void>;\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n}\n\nexport function ChatContainer({\n texts,\n exampleQuestions,\n onMessage,\n onError,\n messages,\n isStreaming,\n error,\n sendMessage,\n input,\n setInput,\n}: ChatContainerProps) {\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const messagesAreaRef = React.useRef<HTMLDivElement>(null);\n const shouldAutoScrollRef = React.useRef(true); // Track if auto-scroll is enabled\n\n // Check if user is at the bottom of the messages area\n const isAtBottom = React.useCallback(() => {\n const messagesArea = messagesAreaRef.current;\n if (!messagesArea) return true;\n\n const threshold = 50; // pixels from bottom to consider \"at bottom\"\n const scrollBottom = messagesArea.scrollHeight - messagesArea.scrollTop - messagesArea.clientHeight;\n return scrollBottom < threshold;\n }, []);\n\n // Scroll to bottom of messages area\n const scrollToBottom = React.useCallback(() => {\n const messagesArea = messagesAreaRef.current;\n if (messagesArea) {\n messagesArea.scrollTop = messagesArea.scrollHeight;\n }\n }, []);\n\n // Handle user scroll events\n const handleScroll = React.useCallback(() => {\n const atBottom = isAtBottom();\n shouldAutoScrollRef.current = atBottom;\n }, [isAtBottom]);\n\n // Auto-scroll when messages change (if enabled)\n React.useEffect(() => {\n if (shouldAutoScrollRef.current) {\n scrollToBottom();\n }\n }, [messages, scrollToBottom]);\n\n // Auto-resize textarea based on content\n const adjustTextareaHeight = React.useCallback(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.style.height = 'auto';\n textarea.style.height = `${textarea.scrollHeight}px`;\n }\n }, []);\n\n // Call onError callback when error occurs\n React.useEffect(() => {\n if (error && onError) {\n onError(error);\n }\n }, [error, onError]);\n\n // Call onMessage callback when new message arrives\n React.useEffect(() => {\n if (messages.length > 0 && onMessage) {\n onMessage(messages[messages.length - 1]);\n }\n }, [messages, onMessage]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const inputValue = input.trim();\n if (!inputValue || isStreaming) return;\n\n // Enable auto-scroll for new user message\n shouldAutoScrollRef.current = true;\n\n setInput('');\n await sendMessage(inputValue);\n // Reset textarea height after submission\n setTimeout(() => {\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n }\n }, 0);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInput(e.target.value);\n adjustTextareaHeight();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Enter (without Shift)\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (input.trim() && !isStreaming) {\n handleSubmit(e as any);\n }\n }\n // Allow Shift+Enter for new line (default textarea behavior)\n };\n\n const handleExampleClick = async (question: string) => {\n if (isStreaming) return;\n // Enable auto-scroll for new user message\n shouldAutoScrollRef.current = true;\n await sendMessage(question);\n };\n\n const inputPlaceholder = texts?.inputPlaceholder || 'Ask a question...';\n const welcomeMessage = texts?.welcomeMessage || 'Hi! How can I help you today?';\n const exampleQuestionsTitle = texts?.exampleQuestionsTitle || 'Example questions:';\n\n return (\n <div className={styles.container}>\n {/* Messages Area */}\n <div\n ref={messagesAreaRef}\n onScroll={handleScroll}\n className={styles.messagesArea}\n >\n {messages.length === 0 ? (\n // Welcome Screen\n <div className={styles.welcomeScreen}>\n <p className={styles.welcomeMessage}>\n {welcomeMessage}\n </p>\n\n {exampleQuestions && exampleQuestions.length > 0 && (\n <div className={styles.exampleQuestionsContainer}>\n <p className={styles.exampleQuestionsTitle}>\n {exampleQuestionsTitle}\n </p>\n {exampleQuestions.map((question, index) => (\n <button\n key={index}\n onClick={() => handleExampleClick(question)}\n className={styles.exampleButton}\n >\n {question}\n </button>\n ))}\n </div>\n )}\n </div>\n ) : (\n // Messages\n <>\n {messages.map((message, index) => (\n <div\n key={message.id}\n className={`${styles.messageWrapper} ${styles[message.role]}`}\n >\n <div className={`${styles.message} ${styles[message.role]}`}>\n {message.role === 'assistant' ? (\n <div className={styles.markdown}>\n {/* Render each part in order */}\n {message.parts.map((part, index) => <MessagePart key={index} part={part} />)}\n {isStreaming && index === messages.length -1 && <span className={styles.cursor} />}\n </div>\n ) : (\n <div className={styles.messageText}>\n {/* For user messages, extract and display text */}\n {message.parts\n .filter(part => part.type === 'text')\n .map(part => part.type === 'text' ? part.text : '')\n .join('')}\n </div>\n )}\n </div>\n </div>\n ))}\n </>\n )}\n\n {error && (\n <div className={styles.error}>\n {error.message}\n </div>\n )}\n </div>\n\n {/* Input Area */}\n <form onSubmit={handleSubmit} className={styles.inputForm}>\n <div className={styles.inputWrapper}>\n <textarea\n ref={textareaRef}\n value={input}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder={inputPlaceholder}\n className={styles.input}\n rows={1}\n />\n <button\n type=\"submit\"\n disabled={!input.trim() || isStreaming}\n className={styles.submitButton}\n >\n <ArrowUp />\n </button>\n </div>\n </form>\n </div>\n );\n}\n\nfunction CodeBlock({ children, className, ...props }: any) {\n const [copied, setCopied] = React.useState(false);\n const match = /language-(\\w+)/.exec(className || '');\n const isCodeBlock = match;\n\n const handleCopy = async () => {\n // Recursively extract text content from React elements\n const getTextContent = (node: any): string => {\n if (typeof node === 'string') return node;\n if (typeof node === 'number') return String(node);\n if (Array.isArray(node)) return node.map(getTextContent).join('');\n if (node?.props?.children) return getTextContent(node.props.children);\n return '';\n };\n\n const code = getTextContent(children).replace(/\\n$/, '');\n try {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n };\n\n if (isCodeBlock) {\n return (\n <div className={styles.codeBlockWrapper}>\n <button\n onClick={handleCopy}\n className={styles.copyButton}\n aria-label=\"Copy code\"\n >\n {copied ? <Check size={14} /> : <Copy size={14} />}\n </button>\n <code className={className} {...props}>\n {children}\n </code>\n </div>\n );\n }\n\n return <code className={className} {...props}>{children}</code>;\n}\n\nfunction MessagePart({part}: {part: UIMessagePart<UIDataTypes, UITools>}) {\n if (part.type === 'text') {\n return (\n <div className={styles.textPart}>\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[[rehypeHighlight, {\n languages: common,\n prefix: 'hljs-'\n }]]}\n components={{\n code: CodeBlock\n }}\n >\n {part.text}\n </ReactMarkdown>\n </div>\n );\n }\n\n if (part.type === 'reasoning') {\n return null;\n // return (\n // <div className={`${styles.reasoningPart} ${styles[`reasoning-${part.state}`]}`}>\n // <div className={styles.reasoningLabel}>Thinking...</div>\n // <div className={styles.reasoningContent}>\n // {part.text}\n // </div>\n // </div>\n // );\n }\n\n if (isToolUIPart(part)) {\n const status = part.state === 'output-available' ? 'completed' :\n part.state === 'output-error' ? 'error' :\n part.state === 'input-streaming' ? 'running' : 'pending';\n\n return (\n <div className={styles.toolPart}>\n <span className={`${styles.toolCall} ${styles[`tool-${status}`]}`}>\n {getToolDisplayName(part.type === 'dynamic-tool' ? part.toolName : part.type.replace('tool-', ''))}\n {(status === 'completed' || status === 'error') ? '' : '...'}\n </span>\n </div>\n );\n }\n\n // Handle other part types if needed\n return null;\n};\n\n// Helper function to format tool name\nconst getToolDisplayName = (toolName: string) => {\n if (toolName === 'readFile') {\n return 'Reading docs';\n }\n if (toolName === 'bash') {\n return 'Exploring docs';\n }\n return 'Searching docs';\n};\n\nfunction isToolUIPart(part: UIMessagePart<UIDataTypes, UITools>): part is DynamicToolUIPart | ToolUIPart {\n return part.type === 'dynamic-tool' || part.type.startsWith('tool-');\n}"],"names":["useCallback","useState","useRef","React","Slot","styles","_jsx","_jsxs","Loader2","Sparkles","DialogPrimitive","EraserIcon","Minimize2","Maximize2","X","ChatContainer","_Fragment","ArrowUp","Check","Copy","common"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/core/api/client.ts","../../src/core/hooks/useSSE.ts","../../src/core/hooks/useChat.ts","../../src/components/ui/Button.tsx","../../src/components/widget/Trigger.tsx","../../src/components/widget/Drawer.tsx","../../src/components/widget/Widget.tsx","../../src/components/chat/ChatContainer.tsx"],"sourcesContent":["import type { UIMessage } from '../types/index.js';\n\n/**\n * API client for Ask AI widget\n * Supports AI SDK v6 UIMessage format with streaming responses\n */\nexport class APIClient {\n private apiUrl: string;\n private project?: string;\n\n constructor(apiUrl: string, project?: string) {\n this.apiUrl = apiUrl;\n this.project = project;\n }\n\n /**\n * Send messages and get UIMessageStream response\n */\n async sendMessages(\n messages: UIMessage[],\n signal?: AbortSignal\n ): Promise<Response> {\n const body: { messages: UIMessage[]; project?: string } = {\n messages,\n };\n\n if (this.project) {\n body.project = this.project;\n }\n\n const response = await fetch(this.apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send messages: ${response.statusText}`);\n }\n\n return response;\n }\n}\n","import { useCallback } from 'react';\nimport type { UIMessage, UIMessageChunk } from '../types/index.js';\n\ninterface UseSSEOptions {\n onChunk?: (chunk: UIMessageChunk) => void;\n onError?: (error: Error) => void;\n}\n\ninterface UseSSEReturn {\n handleUIMessageStream: (response: Response, currentMessage: UIMessage) => Promise<void>;\n}\n\n/**\n * Parse SSE chunk format for UIMessageChunk stream\n * Supports both standard SSE format \"data: {...}\" and AI SDK v6 format \"0:{...}\"\n */\nfunction parseUIMessageChunk(line: string): UIMessageChunk | null {\n // Handle standard SSE format: \"data: {json}\"\n if (line.startsWith('data: ')) {\n const jsonStr = line.slice(6); // Remove \"data: \" prefix\n\n // Skip [DONE] marker\n if (jsonStr === '[DONE]') {\n return null;\n }\n\n try {\n return JSON.parse(jsonStr) as UIMessageChunk;\n } catch (err) {\n console.error('Failed to parse UIMessageChunk:', line, err);\n return null;\n }\n }\n\n return null;\n}\n\nexport function useSSE(options: UseSSEOptions = {}): UseSSEReturn {\n const { onChunk, onError } = options;\n\n const handleUIMessageStream = useCallback(\n async (response: Response, _currentMessage: UIMessage) => {\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (!reader) {\n onError?.(new Error('No response body'));\n return;\n }\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in the buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n\n const chunk = parseUIMessageChunk(line);\n if (chunk) {\n onChunk?.(chunk);\n }\n }\n }\n } catch (err) {\n // Don't report AbortError as it's an intentional cancellation\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n const error = err instanceof Error ? err : new Error('SSE stream error');\n onError?.(error);\n } finally {\n reader.releaseLock();\n }\n },\n [onChunk, onError]\n );\n\n return {\n handleUIMessageStream,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useSSE } from './useSSE.js';\nimport type { UIMessage, UIMessageChunk, WidgetTexts } from '../types/index.js';\nimport type { APIClient } from '../api/client.js';\n\ninterface UseChatOptions {\n apiClient: APIClient;\n texts?: WidgetTexts;\n}\n\ninterface UseChatReturn {\n messages: UIMessage[];\n isStreaming: boolean;\n error: Error | null;\n sendMessage: (text: string) => Promise<void>;\n resetChat: () => void;\n}\n\nlet idCounter = 0;\n\nfunction getMessageId() {\n idCounter += 1;\n return `msg-${idCounter}`;\n}\n\n/**\n * Apply a UIMessageChunk to update the current assistant message\n */\nfunction applyChunkToMessage(message: UIMessage, chunk: UIMessageChunk): UIMessage {\n const parts = [...message.parts];\n\n switch (chunk.type) {\n case 'text-start': {\n // Start a new text part\n parts.push({\n type: 'text',\n text: '',\n state: 'streaming',\n });\n break;\n }\n\n case 'text-delta': {\n // Find the last text part and append delta\n const lastTextIndex = parts.findLastIndex((p: any) => p.type === 'text');\n if (lastTextIndex >= 0) {\n const textPart = parts[lastTextIndex];\n if (textPart.type === 'text') {\n parts[lastTextIndex] = {\n ...textPart,\n text: textPart.text + chunk.delta,\n };\n }\n }\n break;\n }\n\n case 'text-end': {\n // Mark the last text part as done\n const lastTextIndex = parts.findLastIndex((p: any) => p.type === 'text');\n if (lastTextIndex >= 0) {\n const textPart = parts[lastTextIndex];\n if (textPart.type === 'text') {\n parts[lastTextIndex] = {\n ...textPart,\n state: 'done',\n };\n }\n }\n break;\n }\n\n case 'reasoning-start': {\n // Start a new reasoning part\n parts.push({\n type: 'reasoning',\n text: '',\n state: 'streaming',\n });\n break;\n }\n\n case 'reasoning-delta': {\n // Find the last reasoning part and append delta\n const lastReasoningIndex = parts.findLastIndex((p: any) => p.type === 'reasoning');\n if (lastReasoningIndex >= 0) {\n const reasoningPart = parts[lastReasoningIndex];\n if (reasoningPart.type === 'reasoning') {\n parts[lastReasoningIndex] = {\n ...reasoningPart,\n text: reasoningPart.text + chunk.delta,\n };\n }\n }\n break;\n }\n\n case 'reasoning-end': {\n // Mark the last reasoning part as done\n const lastReasoningIndex = parts.findLastIndex((p: any) => p.type === 'reasoning');\n if (lastReasoningIndex >= 0) {\n const reasoningPart = parts[lastReasoningIndex];\n if (reasoningPart.type === 'reasoning') {\n parts[lastReasoningIndex] = {\n ...reasoningPart,\n state: 'done',\n };\n }\n }\n break;\n }\n\n case 'tool-input-start': {\n // Start a new dynamic tool call\n parts.push({\n type: 'dynamic-tool',\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: undefined,\n state: 'input-streaming',\n } as any);\n break;\n }\n\n case 'tool-input-available': {\n // Update tool call with input\n const toolIndex = parts.findIndex(\n (p: any) => p.type === 'dynamic-tool' && p.toolCallId === chunk.toolCallId\n );\n if (toolIndex >= 0) {\n const toolPart = parts[toolIndex] as any;\n parts[toolIndex] = {\n ...toolPart,\n input: chunk.input,\n state: 'input-available',\n };\n }\n break;\n }\n\n case 'tool-output-available': {\n // Update tool call with output\n const toolIndex = parts.findIndex(\n (p: any) => p.type === 'dynamic-tool' && p.toolCallId === chunk.toolCallId\n );\n if (toolIndex >= 0) {\n const toolPart = parts[toolIndex] as any;\n parts[toolIndex] = {\n ...toolPart,\n output: chunk.output,\n state: 'output-available',\n };\n }\n break;\n }\n\n case 'tool-output-error': {\n // Update tool call with error\n const toolIndex = parts.findIndex(\n (p: any) => p.type === 'dynamic-tool' && p.toolCallId === chunk.toolCallId\n );\n if (toolIndex >= 0) {\n const toolPart = parts[toolIndex] as any;\n parts[toolIndex] = {\n ...toolPart,\n errorText: chunk.errorText,\n state: 'error',\n };\n }\n break;\n }\n\n case 'error': {\n // Handle error chunk - could add error state to message\n console.error('Stream error:', chunk.errorText);\n break;\n }\n\n // Add other chunk types as needed\n default:\n // Ignore unknown chunk types\n break;\n }\n\n return {\n ...message,\n parts,\n };\n}\n\nexport function useChat({ apiClient }: UseChatOptions): UseChatReturn {\n const [messages, setMessages] = useState<UIMessage[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const { handleUIMessageStream } = useSSE({\n onChunk: (chunk) => {\n if (chunk.type === 'error') {\n setError(new Error(chunk.errorText));\n setIsStreaming(false);\n return;\n }\n\n // Update the last assistant message with the chunk\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant') {\n const updatedMessage = applyChunkToMessage(lastMessage, chunk);\n return [...prev.slice(0, -1), updatedMessage];\n }\n return prev;\n });\n },\n onError: (err) => {\n setError(err);\n setIsStreaming(false);\n // Remove the failed assistant message\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant' && lastMessage.parts.length === 0) {\n return prev.slice(0, -1);\n }\n return prev;\n });\n },\n });\n\n const sendMessage = useCallback(\n async (text: string) => {\n if (!text.trim()) {\n return;\n }\n\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Create new AbortController for this request\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setError(null);\n setIsStreaming(true);\n\n // Add user message immediately (optimistic UI)\n const userMessage: UIMessage = {\n id: getMessageId(),\n role: 'user',\n parts: [\n {\n type: 'text',\n text,\n },\n ],\n };\n\n // Add placeholder for assistant response\n const assistantMessage: UIMessage = {\n id: getMessageId(),\n role: 'assistant',\n parts: [],\n };\n\n const newMessages = [...messages, userMessage];\n setMessages([...newMessages, assistantMessage]);\n\n try {\n const response = await apiClient.sendMessages(\n newMessages,\n abortController.signal\n );\n await handleUIMessageStream(response, assistantMessage);\n setIsStreaming(false);\n } catch (err) {\n // Don't treat aborted requests as errors\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n\n const error = err instanceof Error ? err : new Error('Failed to send message');\n setError(error);\n setIsStreaming(false);\n\n // Remove the failed messages\n setMessages((prev) => prev.slice(0, -2));\n } finally {\n // Clear the abort controller reference if this was the current one\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n }\n },\n [messages, apiClient, handleUIMessageStream]\n );\n\n const resetChat = useCallback(() => {\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n\n setMessages([]);\n setError(null);\n setIsStreaming(false);\n }, []);\n\n return {\n messages,\n isStreaming,\n error,\n sendMessage,\n resetChat,\n };\n}\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport styles from './Button.module.css';\n\ntype ButtonVariant = 'default' | 'outline' | 'ghost' | 'icon';\ntype ButtonSize = 'default' | 'sm' | 'lg' | 'icon';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean;\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n\n const classNames = [\n styles.button,\n styles[`variant-${variant}`],\n styles[`size-${size}`],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Comp\n className={classNames}\n ref={ref}\n {...props}\n />\n );\n }\n);\n\nButton.displayName = 'Button';\n\nexport { Button };\n","import { Sparkles, Loader2 } from 'lucide-react';\nimport { Button } from '../ui/Button.js';\nimport styles from './Trigger.module.css';\n\ninterface TriggerProps {\n onClick: () => void;\n text?: string;\n ariaLabel?: string;\n className?: string;\n isLoading?: boolean;\n}\n\nexport function Trigger({\n onClick,\n text = 'Ask AI',\n ariaLabel = 'Open AI assistant',\n className,\n isLoading = false,\n}: TriggerProps) {\n const classNames = [styles.trigger, className].filter(Boolean).join(' ');\n\n return (\n <Button\n onClick={onClick}\n variant=\"outline\"\n aria-label={ariaLabel}\n className={classNames}\n disabled={isLoading}\n >\n {isLoading ? (\n <Loader2 className={`${styles.icon} ${styles.spinning}`} />\n ) : (\n <Sparkles className={styles.icon} />\n )}\n {text && <span>{text}</span>}\n </Button>\n );\n}\n","import * as React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { Sparkles, X, EraserIcon, Maximize2, Minimize2 } from 'lucide-react';\nimport { Button } from '../ui/Button.js';\nimport styles from './Drawer.module.css';\n\ninterface DrawerProps {\n isOpen: boolean;\n onClose: () => void;\n onNewSession?: () => void;\n hasMessages?: boolean;\n position?: 'right' | 'left';\n width?: number | string;\n expandedWidth?: number | string;\n title?: string;\n closeAriaLabel?: string;\n newSessionAriaLabel?: string;\n children?: React.ReactNode;\n theme?: 'light' | 'dark';\n}\n\nexport function Drawer({\n isOpen,\n onClose,\n onNewSession,\n hasMessages,\n position = 'right',\n width = 600,\n expandedWidth = 920,\n title = 'Ask AI',\n closeAriaLabel = 'Close',\n newSessionAriaLabel = 'New session',\n children,\n theme = 'light',\n}: DrawerProps) {\n const [isExpanded, setIsExpanded] = React.useState(false);\n\n const maxWidth = isExpanded ? expandedWidth : width;\n\n const contentClasses = [\n styles.content,\n styles[`position-${position}`],\n ].join(' ');\n\n // Create a portal container that inherits theme from the nearest .ask-ai ancestor\n const [portalContainer, setPortalContainer] = React.useState<HTMLElement | null>(null);\n\n React.useEffect(() => {\n if (typeof document === 'undefined') return;\n\n // Create a portal container with ask-ai class\n const container = document.createElement('div');\n container.className = `ask-ai${theme === 'dark' ? ' dark' : ''}`;\n document.body.appendChild(container);\n setPortalContainer(container);\n\n return () => {\n document.body.removeChild(container);\n };\n }, [theme]);\n\n return (\n <DialogPrimitive.Root open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogPrimitive.Portal container={portalContainer}>\n {/* Overlay */}\n <DialogPrimitive.Overlay className={styles.overlay} />\n\n {/* Drawer Content */}\n <DialogPrimitive.Content\n className={contentClasses}\n style={{ maxWidth }}\n >\n {/* Header */}\n <div className={styles.header}>\n <DialogPrimitive.Title className={styles.title}>\n <Sparkles className={styles.icon} />\n {title}\n </DialogPrimitive.Title>\n <div className={styles.headerActions}>\n {onNewSession && hasMessages && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={newSessionAriaLabel}\n className={styles.newSessionButton}\n onClick={onNewSession}\n >\n <EraserIcon className={styles.newSessionIcon} />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={isExpanded ? 'Shrink' : 'Expand'}\n className={styles.expandButton}\n onClick={() => setIsExpanded(!isExpanded)}\n >\n {isExpanded ? (\n <Minimize2 className={styles.expandIcon} />\n ) : (\n <Maximize2 className={styles.expandIcon} />\n )}\n </Button>\n <DialogPrimitive.Close asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={closeAriaLabel}\n className={styles.closeButton}\n >\n <X className={styles.closeIcon} />\n </Button>\n </DialogPrimitive.Close>\n </div>\n </div>\n\n {/* Content */}\n <div className={styles.body}>\n {children}\n </div>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n}\n","import * as React from 'react';\nimport { Loader2 } from 'lucide-react';\nimport { APIClient } from '../../core/api/client.js';\nimport { useChat } from '../../core/hooks/useChat.js';\nimport type { WidgetProps, WidgetRef } from '../../core/types/index.js';\nimport { Trigger } from './Trigger.js';\nimport { Drawer } from './Drawer.js';\nimport styles from './Widget.module.css';\n\n// Lazy load heavy components\nconst ChatContainer = React.lazy(() => import('../chat/ChatContainer.js').then(m => ({ default: m.ChatContainer })));\n\nfunction LegacyWidget(props: WidgetProps, ref: React.Ref<WidgetRef>) {\n const {\n apiUrl,\n project,\n drawerPosition = 'right',\n drawerWidth = 600,\n drawerExpandedWidth = 920,\n theme = 'light',\n texts,\n exampleQuestions,\n hotkey,\n enableHotkey = true,\n onOpen,\n onClose,\n onMessage,\n onError,\n className,\n style,\n children,\n } = props;\n\n const [isOpen, setIsOpen] = React.useState(false);\n const [componentsLoaded, setComponentsLoaded] = React.useState(false);\n const [apiClient] = React.useState(() => new APIClient(apiUrl, project));\n\n // Lift chat state to Widget level to persist across drawer open/close\n const { messages, isStreaming, error, sendMessage, resetChat } = useChat({ apiClient, texts });\n\n // Input state also needs to persist\n const [input, setInput] = React.useState('');\n\n // Preload components\n const preloadComponents = React.useCallback(async () => {\n if (componentsLoaded) return;\n\n try {\n // Trigger lazy loading by importing the modules\n await import('../chat/ChatContainer.js');\n setComponentsLoaded(true);\n } catch (error) {\n console.error('Failed to preload components:', error);\n }\n }, [componentsLoaded]);\n\n // Handle drawer open\n const handleOpen = React.useCallback(async () => {\n preloadComponents();\n setIsOpen(true);\n onOpen?.();\n }, [preloadComponents, onOpen]);\n\n // Handle drawer close\n const handleClose = React.useCallback(() => {\n setIsOpen(false);\n onClose?.();\n }, [onClose]);\n\n // Handle new session\n const handleNewSession = React.useCallback(() => {\n setInput('');\n resetChat();\n }, [resetChat]);\n\n React.useImperativeHandle(ref, () => ({\n open: handleOpen,\n close: handleClose,\n openWithNewSession: (message) => {\n handleNewSession();\n handleOpen();\n sendMessage(message);\n },\n }), [handleOpen, handleClose, handleNewSession]);\n\n // Handle keyboard shortcut\n React.useEffect(() => {\n if (!enableHotkey || !hotkey) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const keys = hotkey.toLowerCase().split('+');\n const ctrl = keys.includes('ctrl') || keys.includes('control');\n const cmd = keys.includes('cmd') || keys.includes('command') || keys.includes('meta');\n const shift = keys.includes('shift');\n const alt = keys.includes('alt');\n const key = keys[keys.length - 1];\n\n const ctrlPressed = ctrl && (e.ctrlKey || e.metaKey);\n const cmdPressed = cmd && (e.metaKey || e.ctrlKey);\n const shiftPressed = !shift || e.shiftKey;\n const altPressed = !alt || e.altKey;\n\n if ((ctrlPressed || cmdPressed) && shiftPressed && altPressed && e.key.toLowerCase() === key) {\n e.preventDefault();\n setIsOpen((prev) => !prev);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [enableHotkey, hotkey]);\n\n return (\n <div className={`ask-ai ${className || ''} ${theme === 'dark' ? 'dark' : ''}`} style={style}>\n {/* Trigger Button - Custom or Default */}\n {children && React.isValidElement(children) ? (\n React.cloneElement(children, {\n ...children.props,\n onClick: (e: React.MouseEvent) => {\n // Call existing onClick if present\n const existingOnClick = children.props?.onClick;\n if (existingOnClick) {\n existingOnClick(e);\n }\n // Then call our handleOpen\n handleOpen();\n },\n })\n ) : (\n <Trigger\n onClick={handleOpen}\n text={texts?.triggerButtonText}\n ariaLabel={texts?.triggerButtonAriaLabel}\n />\n )}\n\n {/* Drawer with Chat */}\n <Drawer\n isOpen={isOpen}\n onClose={handleClose}\n onNewSession={handleNewSession}\n hasMessages={messages.length > 0}\n position={drawerPosition}\n width={drawerWidth}\n expandedWidth={drawerExpandedWidth}\n title={texts?.drawerTitle}\n closeAriaLabel={texts?.drawerCloseAriaLabel}\n newSessionAriaLabel={texts?.drawerNewSessionAriaLabel}\n theme={theme}\n >\n {/* Chat - Lazy loaded with Suspense */}\n {(isOpen || componentsLoaded) && (\n <React.Suspense fallback={\n <Loader2 className={styles.spinning} />\n }>\n <ChatContainer\n texts={texts}\n exampleQuestions={exampleQuestions}\n onMessage={onMessage}\n onError={onError}\n messages={messages}\n isStreaming={isStreaming}\n error={error}\n sendMessage={sendMessage}\n input={input}\n setInput={setInput}\n />\n </React.Suspense>\n )}\n </Drawer>\n </div>\n );\n}\n\nexport const Widget = React.forwardRef(LegacyWidget);","import * as React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport rehypeHighlight from 'rehype-highlight';\nimport { common } from 'lowlight';\nimport type { WidgetTexts, UIMessage } from '../../core/types/index.js';\nimport styles from './ChatContainer.module.css';\nimport { ArrowUp, Copy, Check } from 'lucide-react';\nimport type { DynamicToolUIPart, ToolUIPart, UIDataTypes, UIMessagePart, UITools } from 'ai';\n\ninterface ChatContainerProps {\n texts?: WidgetTexts;\n exampleQuestions?: string[];\n onMessage?: (message: any) => void;\n onError?: (error: Error) => void;\n // Lifted state from parent\n messages: UIMessage[];\n isStreaming: boolean;\n error: Error | null;\n sendMessage: (text: string) => Promise<void>;\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n}\n\nexport function ChatContainer({\n texts,\n exampleQuestions,\n onMessage,\n onError,\n messages,\n isStreaming,\n error,\n sendMessage,\n input,\n setInput,\n}: ChatContainerProps) {\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const messagesAreaRef = React.useRef<HTMLDivElement>(null);\n const shouldAutoScrollRef = React.useRef(true); // Track if auto-scroll is enabled\n\n // Check if user is at the bottom of the messages area\n const isAtBottom = React.useCallback(() => {\n const messagesArea = messagesAreaRef.current;\n if (!messagesArea) return true;\n\n const threshold = 50; // pixels from bottom to consider \"at bottom\"\n const scrollBottom = messagesArea.scrollHeight - messagesArea.scrollTop - messagesArea.clientHeight;\n return scrollBottom < threshold;\n }, []);\n\n // Scroll to bottom of messages area\n const scrollToBottom = React.useCallback(() => {\n const messagesArea = messagesAreaRef.current;\n if (messagesArea) {\n messagesArea.scrollTop = messagesArea.scrollHeight;\n }\n }, []);\n\n // Handle user scroll events\n const handleScroll = React.useCallback(() => {\n const atBottom = isAtBottom();\n shouldAutoScrollRef.current = atBottom;\n }, [isAtBottom]);\n\n // Auto-scroll when messages change (if enabled)\n React.useEffect(() => {\n if (shouldAutoScrollRef.current) {\n scrollToBottom();\n }\n }, [messages, scrollToBottom]);\n\n // Auto-resize textarea based on content\n const adjustTextareaHeight = React.useCallback(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.style.height = 'auto';\n textarea.style.height = `${textarea.scrollHeight}px`;\n }\n }, []);\n\n // Call onError callback when error occurs\n React.useEffect(() => {\n if (error && onError) {\n onError(error);\n }\n }, [error, onError]);\n\n // Call onMessage callback when new message arrives\n React.useEffect(() => {\n if (messages.length > 0 && onMessage) {\n onMessage(messages[messages.length - 1]);\n }\n }, [messages, onMessage]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const inputValue = input.trim();\n if (!inputValue || isStreaming) return;\n\n // Enable auto-scroll for new user message\n shouldAutoScrollRef.current = true;\n\n setInput('');\n await sendMessage(inputValue);\n // Reset textarea height after submission\n setTimeout(() => {\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n }\n }, 0);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInput(e.target.value);\n adjustTextareaHeight();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Enter (without Shift)\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (input.trim() && !isStreaming) {\n handleSubmit(e as any);\n }\n }\n // Allow Shift+Enter for new line (default textarea behavior)\n };\n\n const handleExampleClick = async (question: string) => {\n if (isStreaming) return;\n // Enable auto-scroll for new user message\n shouldAutoScrollRef.current = true;\n await sendMessage(question);\n };\n\n const inputPlaceholder = texts?.inputPlaceholder || 'Ask a question...';\n const welcomeMessage = texts?.welcomeMessage || 'Hi! How can I help you today?';\n const exampleQuestionsTitle = texts?.exampleQuestionsTitle || 'Example questions:';\n\n return (\n <div className={styles.container}>\n {/* Messages Area */}\n <div\n ref={messagesAreaRef}\n onScroll={handleScroll}\n className={styles.messagesArea}\n >\n {messages.length === 0 ? (\n // Welcome Screen\n <div className={styles.welcomeScreen}>\n <p className={styles.welcomeMessage}>\n {welcomeMessage}\n </p>\n\n {exampleQuestions && exampleQuestions.length > 0 && (\n <div className={styles.exampleQuestionsContainer}>\n <p className={styles.exampleQuestionsTitle}>\n {exampleQuestionsTitle}\n </p>\n {exampleQuestions.map((question, index) => (\n <button\n key={index}\n onClick={() => handleExampleClick(question)}\n className={styles.exampleButton}\n >\n {question}\n </button>\n ))}\n </div>\n )}\n </div>\n ) : (\n // Messages\n <>\n {messages.map((message, index) => (\n <div\n key={message.id}\n className={`${styles.messageWrapper} ${styles[message.role]}`}\n >\n <div className={`${styles.message} ${styles[message.role]}`}>\n {message.role === 'assistant' ? (\n <div className={styles.markdown}>\n {/* Render each part in order */}\n {message.parts.map((part, index) => <MessagePart key={index} part={part} />)}\n {isStreaming && index === messages.length -1 && <span className={styles.cursor} />}\n </div>\n ) : (\n <div className={styles.messageText}>\n {/* For user messages, extract and display text */}\n {message.parts\n .filter(part => part.type === 'text')\n .map(part => part.type === 'text' ? part.text : '')\n .join('')}\n </div>\n )}\n </div>\n </div>\n ))}\n </>\n )}\n\n {error && (\n <div className={styles.error}>\n {error.message}\n </div>\n )}\n </div>\n\n {/* Input Area */}\n <form onSubmit={handleSubmit} className={styles.inputForm}>\n <div className={styles.inputWrapper}>\n <textarea\n ref={textareaRef}\n value={input}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder={inputPlaceholder}\n className={styles.input}\n rows={1}\n />\n <button\n type=\"submit\"\n disabled={!input.trim() || isStreaming}\n className={styles.submitButton}\n >\n <ArrowUp />\n </button>\n </div>\n </form>\n </div>\n );\n}\n\nfunction CodeBlock({ children, className, ...props }: any) {\n const [copied, setCopied] = React.useState(false);\n const match = /language-(\\w+)/.exec(className || '');\n const isCodeBlock = match;\n\n const handleCopy = async () => {\n // Recursively extract text content from React elements\n const getTextContent = (node: any): string => {\n if (typeof node === 'string') return node;\n if (typeof node === 'number') return String(node);\n if (Array.isArray(node)) return node.map(getTextContent).join('');\n if (node?.props?.children) return getTextContent(node.props.children);\n return '';\n };\n\n const code = getTextContent(children).replace(/\\n$/, '');\n try {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n };\n\n if (isCodeBlock) {\n return (\n <div className={styles.codeBlockWrapper}>\n <button\n onClick={handleCopy}\n className={styles.copyButton}\n aria-label=\"Copy code\"\n >\n {copied ? <Check size={14} /> : <Copy size={14} />}\n </button>\n <code className={className} {...props}>\n {children}\n </code>\n </div>\n );\n }\n\n return <code className={className} {...props}>{children}</code>;\n}\n\nfunction MessagePart({part}: {part: UIMessagePart<UIDataTypes, UITools>}) {\n if (part.type === 'text') {\n return (\n <div className={styles.textPart}>\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[[rehypeHighlight, {\n languages: common,\n prefix: 'hljs-'\n }]]}\n components={{\n code: CodeBlock\n }}\n >\n {part.text}\n </ReactMarkdown>\n </div>\n );\n }\n\n if (part.type === 'reasoning') {\n return null;\n // return (\n // <div className={`${styles.reasoningPart} ${styles[`reasoning-${part.state}`]}`}>\n // <div className={styles.reasoningLabel}>Thinking...</div>\n // <div className={styles.reasoningContent}>\n // {part.text}\n // </div>\n // </div>\n // );\n }\n\n if (isToolUIPart(part)) {\n const status = part.state === 'output-available' ? 'completed' :\n part.state === 'output-error' ? 'error' :\n part.state === 'input-streaming' ? 'running' : 'pending';\n\n return (\n <div className={styles.toolPart}>\n <span className={`${styles.toolCall} ${styles[`tool-${status}`]}`}>\n {getToolDisplayName(part.type === 'dynamic-tool' ? part.toolName : part.type.replace('tool-', ''))}\n {(status === 'completed' || status === 'error') ? '' : '...'}\n </span>\n </div>\n );\n }\n\n // Handle other part types if needed\n return null;\n};\n\n// Helper function to format tool name\nconst getToolDisplayName = (toolName: string) => {\n if (toolName === 'readFile') {\n return 'Reading docs';\n }\n if (toolName === 'bash') {\n return 'Exploring docs';\n }\n return 'Searching docs';\n};\n\nfunction isToolUIPart(part: UIMessagePart<UIDataTypes, UITools>): part is DynamicToolUIPart | ToolUIPart {\n return part.type === 'dynamic-tool' || part.type.startsWith('tool-');\n}"],"names":["useCallback","useState","useRef","React","Slot","styles","_jsx","_jsxs","Loader2","Sparkles","DialogPrimitive","EraserIcon","Minimize2","Maximize2","X","ChatContainer","_Fragment","ArrowUp","Check","Copy","common"],"mappings":"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"}
@@ -444,7 +444,8 @@
444
444
  width: 100%;
445
445
  margin: 0.75em 0;
446
446
  border-collapse: collapse;
447
- font-size: 0.9em;
447
+ font-size: inherit;
448
+ line-height: inherit;
448
449
  }
449
450
 
450
451
  .markdown_mNC3q th,
package/dist/esm/index.js CHANGED
@@ -430,7 +430,7 @@ var styles = {"spinning":"spinning_VD3F3"};
430
430
 
431
431
  // Lazy load heavy components
432
432
  const ChatContainer = React.lazy(() => import('./ask-ai.js').then(m => ({ default: m.ChatContainer })));
433
- function Widget(props) {
433
+ function LegacyWidget(props, ref) {
434
434
  const { apiUrl, project, drawerPosition = 'right', drawerWidth = 600, drawerExpandedWidth = 920, theme = 'light', texts, exampleQuestions, hotkey, enableHotkey = true, onOpen, onClose, onMessage, onError, className, style, children, } = props;
435
435
  const [isOpen, setIsOpen] = React.useState(false);
436
436
  const [componentsLoaded, setComponentsLoaded] = React.useState(false);
@@ -468,6 +468,15 @@ function Widget(props) {
468
468
  setInput('');
469
469
  resetChat();
470
470
  }, [resetChat]);
471
+ React.useImperativeHandle(ref, () => ({
472
+ open: handleOpen,
473
+ close: handleClose,
474
+ openWithNewSession: (message) => {
475
+ handleNewSession();
476
+ handleOpen();
477
+ sendMessage(message);
478
+ },
479
+ }), [handleOpen, handleClose, handleNewSession]);
471
480
  // Handle keyboard shortcut
472
481
  React.useEffect(() => {
473
482
  if (!enableHotkey || !hotkey)
@@ -504,6 +513,7 @@ function Widget(props) {
504
513
  },
505
514
  })) : (jsx(Trigger, { onClick: handleOpen, text: texts?.triggerButtonText, ariaLabel: texts?.triggerButtonAriaLabel })), jsx(Drawer, { isOpen: isOpen, onClose: handleClose, onNewSession: handleNewSession, hasMessages: messages.length > 0, position: drawerPosition, width: drawerWidth, expandedWidth: drawerExpandedWidth, title: texts?.drawerTitle, closeAriaLabel: texts?.drawerCloseAriaLabel, newSessionAriaLabel: texts?.drawerNewSessionAriaLabel, theme: theme, children: (isOpen || componentsLoaded) && (jsx(React.Suspense, { fallback: jsx(Loader2, { className: styles.spinning }), children: jsx(ChatContainer, { texts: texts, exampleQuestions: exampleQuestions, onMessage: onMessage, onError: onError, messages: messages, isStreaming: isStreaming, error: error, sendMessage: sendMessage, input: input, setInput: setInput }) })) })] }));
506
515
  }
516
+ const Widget = React.forwardRef(LegacyWidget);
507
517
 
508
518
  export { APIClient, Widget as AskAIWidget, useChat, useSSE };
509
519
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/core/api/client.ts","../../src/core/hooks/useSSE.ts","../../src/core/hooks/useChat.ts","../../src/components/ui/Button.tsx","../../src/components/widget/Trigger.tsx","../../src/components/widget/Drawer.tsx","../../src/components/widget/Widget.tsx"],"sourcesContent":["import type { UIMessage } from '../types/index.js';\n\n/**\n * API client for Ask AI widget\n * Supports AI SDK v6 UIMessage format with streaming responses\n */\nexport class APIClient {\n private apiUrl: string;\n private project?: string;\n\n constructor(apiUrl: string, project?: string) {\n this.apiUrl = apiUrl;\n this.project = project;\n }\n\n /**\n * Send messages and get UIMessageStream response\n */\n async sendMessages(\n messages: UIMessage[],\n signal?: AbortSignal\n ): Promise<Response> {\n const body: { messages: UIMessage[]; project?: string } = {\n messages,\n };\n\n if (this.project) {\n body.project = this.project;\n }\n\n const response = await fetch(this.apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send messages: ${response.statusText}`);\n }\n\n return response;\n }\n}\n","import { useCallback } from 'react';\nimport type { UIMessage, UIMessageChunk } from '../types/index.js';\n\ninterface UseSSEOptions {\n onChunk?: (chunk: UIMessageChunk) => void;\n onError?: (error: Error) => void;\n}\n\ninterface UseSSEReturn {\n handleUIMessageStream: (response: Response, currentMessage: UIMessage) => Promise<void>;\n}\n\n/**\n * Parse SSE chunk format for UIMessageChunk stream\n * Supports both standard SSE format \"data: {...}\" and AI SDK v6 format \"0:{...}\"\n */\nfunction parseUIMessageChunk(line: string): UIMessageChunk | null {\n // Handle standard SSE format: \"data: {json}\"\n if (line.startsWith('data: ')) {\n const jsonStr = line.slice(6); // Remove \"data: \" prefix\n\n // Skip [DONE] marker\n if (jsonStr === '[DONE]') {\n return null;\n }\n\n try {\n return JSON.parse(jsonStr) as UIMessageChunk;\n } catch (err) {\n console.error('Failed to parse UIMessageChunk:', line, err);\n return null;\n }\n }\n\n return null;\n}\n\nexport function useSSE(options: UseSSEOptions = {}): UseSSEReturn {\n const { onChunk, onError } = options;\n\n const handleUIMessageStream = useCallback(\n async (response: Response, _currentMessage: UIMessage) => {\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (!reader) {\n onError?.(new Error('No response body'));\n return;\n }\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in the buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n\n const chunk = parseUIMessageChunk(line);\n if (chunk) {\n onChunk?.(chunk);\n }\n }\n }\n } catch (err) {\n // Don't report AbortError as it's an intentional cancellation\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n const error = err instanceof Error ? err : new Error('SSE stream error');\n onError?.(error);\n } finally {\n reader.releaseLock();\n }\n },\n [onChunk, onError]\n );\n\n return {\n handleUIMessageStream,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useSSE } from './useSSE.js';\nimport type { UIMessage, UIMessageChunk, WidgetTexts } from '../types/index.js';\nimport type { APIClient } from '../api/client.js';\n\ninterface UseChatOptions {\n apiClient: APIClient;\n texts?: WidgetTexts;\n}\n\ninterface UseChatReturn {\n messages: UIMessage[];\n isStreaming: boolean;\n error: Error | null;\n sendMessage: (text: string) => Promise<void>;\n resetChat: () => void;\n}\n\nlet idCounter = 0;\n\nfunction getMessageId() {\n idCounter += 1;\n return `msg-${idCounter}`;\n}\n\n/**\n * Apply a UIMessageChunk to update the current assistant message\n */\nfunction applyChunkToMessage(message: UIMessage, chunk: UIMessageChunk): UIMessage {\n const parts = [...message.parts];\n\n switch (chunk.type) {\n case 'text-start': {\n // Start a new text part\n parts.push({\n type: 'text',\n text: '',\n state: 'streaming',\n });\n break;\n }\n\n case 'text-delta': {\n // Find the last text part and append delta\n const lastTextIndex = parts.findLastIndex((p: any) => p.type === 'text');\n if (lastTextIndex >= 0) {\n const textPart = parts[lastTextIndex];\n if (textPart.type === 'text') {\n parts[lastTextIndex] = {\n ...textPart,\n text: textPart.text + chunk.delta,\n };\n }\n }\n break;\n }\n\n case 'text-end': {\n // Mark the last text part as done\n const lastTextIndex = parts.findLastIndex((p: any) => p.type === 'text');\n if (lastTextIndex >= 0) {\n const textPart = parts[lastTextIndex];\n if (textPart.type === 'text') {\n parts[lastTextIndex] = {\n ...textPart,\n state: 'done',\n };\n }\n }\n break;\n }\n\n case 'reasoning-start': {\n // Start a new reasoning part\n parts.push({\n type: 'reasoning',\n text: '',\n state: 'streaming',\n });\n break;\n }\n\n case 'reasoning-delta': {\n // Find the last reasoning part and append delta\n const lastReasoningIndex = parts.findLastIndex((p: any) => p.type === 'reasoning');\n if (lastReasoningIndex >= 0) {\n const reasoningPart = parts[lastReasoningIndex];\n if (reasoningPart.type === 'reasoning') {\n parts[lastReasoningIndex] = {\n ...reasoningPart,\n text: reasoningPart.text + chunk.delta,\n };\n }\n }\n break;\n }\n\n case 'reasoning-end': {\n // Mark the last reasoning part as done\n const lastReasoningIndex = parts.findLastIndex((p: any) => p.type === 'reasoning');\n if (lastReasoningIndex >= 0) {\n const reasoningPart = parts[lastReasoningIndex];\n if (reasoningPart.type === 'reasoning') {\n parts[lastReasoningIndex] = {\n ...reasoningPart,\n state: 'done',\n };\n }\n }\n break;\n }\n\n case 'tool-input-start': {\n // Start a new dynamic tool call\n parts.push({\n type: 'dynamic-tool',\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: undefined,\n state: 'input-streaming',\n } as any);\n break;\n }\n\n case 'tool-input-available': {\n // Update tool call with input\n const toolIndex = parts.findIndex(\n (p: any) => p.type === 'dynamic-tool' && p.toolCallId === chunk.toolCallId\n );\n if (toolIndex >= 0) {\n const toolPart = parts[toolIndex] as any;\n parts[toolIndex] = {\n ...toolPart,\n input: chunk.input,\n state: 'input-available',\n };\n }\n break;\n }\n\n case 'tool-output-available': {\n // Update tool call with output\n const toolIndex = parts.findIndex(\n (p: any) => p.type === 'dynamic-tool' && p.toolCallId === chunk.toolCallId\n );\n if (toolIndex >= 0) {\n const toolPart = parts[toolIndex] as any;\n parts[toolIndex] = {\n ...toolPart,\n output: chunk.output,\n state: 'output-available',\n };\n }\n break;\n }\n\n case 'tool-output-error': {\n // Update tool call with error\n const toolIndex = parts.findIndex(\n (p: any) => p.type === 'dynamic-tool' && p.toolCallId === chunk.toolCallId\n );\n if (toolIndex >= 0) {\n const toolPart = parts[toolIndex] as any;\n parts[toolIndex] = {\n ...toolPart,\n errorText: chunk.errorText,\n state: 'error',\n };\n }\n break;\n }\n\n case 'error': {\n // Handle error chunk - could add error state to message\n console.error('Stream error:', chunk.errorText);\n break;\n }\n\n // Add other chunk types as needed\n default:\n // Ignore unknown chunk types\n break;\n }\n\n return {\n ...message,\n parts,\n };\n}\n\nexport function useChat({ apiClient }: UseChatOptions): UseChatReturn {\n const [messages, setMessages] = useState<UIMessage[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const { handleUIMessageStream } = useSSE({\n onChunk: (chunk) => {\n if (chunk.type === 'error') {\n setError(new Error(chunk.errorText));\n setIsStreaming(false);\n return;\n }\n\n // Update the last assistant message with the chunk\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant') {\n const updatedMessage = applyChunkToMessage(lastMessage, chunk);\n return [...prev.slice(0, -1), updatedMessage];\n }\n return prev;\n });\n },\n onError: (err) => {\n setError(err);\n setIsStreaming(false);\n // Remove the failed assistant message\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant' && lastMessage.parts.length === 0) {\n return prev.slice(0, -1);\n }\n return prev;\n });\n },\n });\n\n const sendMessage = useCallback(\n async (text: string) => {\n if (!text.trim()) {\n return;\n }\n\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Create new AbortController for this request\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setError(null);\n setIsStreaming(true);\n\n // Add user message immediately (optimistic UI)\n const userMessage: UIMessage = {\n id: getMessageId(),\n role: 'user',\n parts: [\n {\n type: 'text',\n text,\n },\n ],\n };\n\n // Add placeholder for assistant response\n const assistantMessage: UIMessage = {\n id: getMessageId(),\n role: 'assistant',\n parts: [],\n };\n\n const newMessages = [...messages, userMessage];\n setMessages([...newMessages, assistantMessage]);\n\n try {\n const response = await apiClient.sendMessages(\n newMessages,\n abortController.signal\n );\n await handleUIMessageStream(response, assistantMessage);\n setIsStreaming(false);\n } catch (err) {\n // Don't treat aborted requests as errors\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n\n const error = err instanceof Error ? err : new Error('Failed to send message');\n setError(error);\n setIsStreaming(false);\n\n // Remove the failed messages\n setMessages((prev) => prev.slice(0, -2));\n } finally {\n // Clear the abort controller reference if this was the current one\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n }\n },\n [messages, apiClient, handleUIMessageStream]\n );\n\n const resetChat = useCallback(() => {\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n\n setMessages([]);\n setError(null);\n setIsStreaming(false);\n }, []);\n\n return {\n messages,\n isStreaming,\n error,\n sendMessage,\n resetChat,\n };\n}\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport styles from './Button.module.css';\n\ntype ButtonVariant = 'default' | 'outline' | 'ghost' | 'icon';\ntype ButtonSize = 'default' | 'sm' | 'lg' | 'icon';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean;\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n\n const classNames = [\n styles.button,\n styles[`variant-${variant}`],\n styles[`size-${size}`],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Comp\n className={classNames}\n ref={ref}\n {...props}\n />\n );\n }\n);\n\nButton.displayName = 'Button';\n\nexport { Button };\n","import { Sparkles, Loader2 } from 'lucide-react';\nimport { Button } from '../ui/Button.js';\nimport styles from './Trigger.module.css';\n\ninterface TriggerProps {\n onClick: () => void;\n text?: string;\n ariaLabel?: string;\n className?: string;\n isLoading?: boolean;\n}\n\nexport function Trigger({\n onClick,\n text = 'Ask AI',\n ariaLabel = 'Open AI assistant',\n className,\n isLoading = false,\n}: TriggerProps) {\n const classNames = [styles.trigger, className].filter(Boolean).join(' ');\n\n return (\n <Button\n onClick={onClick}\n variant=\"outline\"\n aria-label={ariaLabel}\n className={classNames}\n disabled={isLoading}\n >\n {isLoading ? (\n <Loader2 className={`${styles.icon} ${styles.spinning}`} />\n ) : (\n <Sparkles className={styles.icon} />\n )}\n {text && <span>{text}</span>}\n </Button>\n );\n}\n","import * as React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { Sparkles, X, EraserIcon, Maximize2, Minimize2 } from 'lucide-react';\nimport { Button } from '../ui/Button.js';\nimport styles from './Drawer.module.css';\n\ninterface DrawerProps {\n isOpen: boolean;\n onClose: () => void;\n onNewSession?: () => void;\n hasMessages?: boolean;\n position?: 'right' | 'left';\n width?: number | string;\n expandedWidth?: number | string;\n title?: string;\n closeAriaLabel?: string;\n newSessionAriaLabel?: string;\n children?: React.ReactNode;\n theme?: 'light' | 'dark';\n}\n\nexport function Drawer({\n isOpen,\n onClose,\n onNewSession,\n hasMessages,\n position = 'right',\n width = 600,\n expandedWidth = 920,\n title = 'Ask AI',\n closeAriaLabel = 'Close',\n newSessionAriaLabel = 'New session',\n children,\n theme = 'light',\n}: DrawerProps) {\n const [isExpanded, setIsExpanded] = React.useState(false);\n\n const maxWidth = isExpanded ? expandedWidth : width;\n\n const contentClasses = [\n styles.content,\n styles[`position-${position}`],\n ].join(' ');\n\n // Create a portal container that inherits theme from the nearest .ask-ai ancestor\n const [portalContainer, setPortalContainer] = React.useState<HTMLElement | null>(null);\n\n React.useEffect(() => {\n if (typeof document === 'undefined') return;\n\n // Create a portal container with ask-ai class\n const container = document.createElement('div');\n container.className = `ask-ai${theme === 'dark' ? ' dark' : ''}`;\n document.body.appendChild(container);\n setPortalContainer(container);\n\n return () => {\n document.body.removeChild(container);\n };\n }, [theme]);\n\n return (\n <DialogPrimitive.Root open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogPrimitive.Portal container={portalContainer}>\n {/* Overlay */}\n <DialogPrimitive.Overlay className={styles.overlay} />\n\n {/* Drawer Content */}\n <DialogPrimitive.Content\n className={contentClasses}\n style={{ maxWidth }}\n >\n {/* Header */}\n <div className={styles.header}>\n <DialogPrimitive.Title className={styles.title}>\n <Sparkles className={styles.icon} />\n {title}\n </DialogPrimitive.Title>\n <div className={styles.headerActions}>\n {onNewSession && hasMessages && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={newSessionAriaLabel}\n className={styles.newSessionButton}\n onClick={onNewSession}\n >\n <EraserIcon className={styles.newSessionIcon} />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={isExpanded ? 'Shrink' : 'Expand'}\n className={styles.expandButton}\n onClick={() => setIsExpanded(!isExpanded)}\n >\n {isExpanded ? (\n <Minimize2 className={styles.expandIcon} />\n ) : (\n <Maximize2 className={styles.expandIcon} />\n )}\n </Button>\n <DialogPrimitive.Close asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={closeAriaLabel}\n className={styles.closeButton}\n >\n <X className={styles.closeIcon} />\n </Button>\n </DialogPrimitive.Close>\n </div>\n </div>\n\n {/* Content */}\n <div className={styles.body}>\n {children}\n </div>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n}\n","import * as React from 'react';\nimport { Loader2 } from 'lucide-react';\nimport { APIClient } from '../../core/api/client.js';\nimport { useChat } from '../../core/hooks/useChat.js';\nimport type { WidgetProps } from '../../core/types/index.js';\nimport { Trigger } from './Trigger.js';\nimport { Drawer } from './Drawer.js';\nimport styles from './Widget.module.css';\n\n// Lazy load heavy components\nconst ChatContainer = React.lazy(() => import('../chat/ChatContainer.js').then(m => ({ default: m.ChatContainer })));\n\nexport function Widget(props: WidgetProps) {\n const {\n apiUrl,\n project,\n drawerPosition = 'right',\n drawerWidth = 600,\n drawerExpandedWidth = 920,\n theme = 'light',\n texts,\n exampleQuestions,\n hotkey,\n enableHotkey = true,\n onOpen,\n onClose,\n onMessage,\n onError,\n className,\n style,\n children,\n } = props;\n\n const [isOpen, setIsOpen] = React.useState(false);\n const [componentsLoaded, setComponentsLoaded] = React.useState(false);\n const [apiClient] = React.useState(() => new APIClient(apiUrl, project));\n\n // Lift chat state to Widget level to persist across drawer open/close\n const { messages, isStreaming, error, sendMessage, resetChat } = useChat({ apiClient, texts });\n\n // Input state also needs to persist\n const [input, setInput] = React.useState('');\n\n // Preload components\n const preloadComponents = React.useCallback(async () => {\n if (componentsLoaded) return;\n\n try {\n // Trigger lazy loading by importing the modules\n await import('../chat/ChatContainer.js');\n setComponentsLoaded(true);\n } catch (error) {\n console.error('Failed to preload components:', error);\n }\n }, [componentsLoaded]);\n\n // Handle drawer open\n const handleOpen = React.useCallback(async () => {\n preloadComponents();\n setIsOpen(true);\n onOpen?.();\n }, [preloadComponents, onOpen]);\n\n // Handle drawer close\n const handleClose = React.useCallback(() => {\n setIsOpen(false);\n onClose?.();\n }, [onClose]);\n\n // Handle new session\n const handleNewSession = React.useCallback(() => {\n setInput('');\n resetChat();\n }, [resetChat]);\n\n // Handle keyboard shortcut\n React.useEffect(() => {\n if (!enableHotkey || !hotkey) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const keys = hotkey.toLowerCase().split('+');\n const ctrl = keys.includes('ctrl') || keys.includes('control');\n const cmd = keys.includes('cmd') || keys.includes('command') || keys.includes('meta');\n const shift = keys.includes('shift');\n const alt = keys.includes('alt');\n const key = keys[keys.length - 1];\n\n const ctrlPressed = ctrl && (e.ctrlKey || e.metaKey);\n const cmdPressed = cmd && (e.metaKey || e.ctrlKey);\n const shiftPressed = !shift || e.shiftKey;\n const altPressed = !alt || e.altKey;\n\n if ((ctrlPressed || cmdPressed) && shiftPressed && altPressed && e.key.toLowerCase() === key) {\n e.preventDefault();\n setIsOpen((prev) => !prev);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [enableHotkey, hotkey]);\n\n return (\n <div className={`ask-ai ${className || ''} ${theme === 'dark' ? 'dark' : ''}`} style={style}>\n {/* Trigger Button - Custom or Default */}\n {children && React.isValidElement(children) ? (\n React.cloneElement(children, {\n ...children.props,\n onClick: (e: React.MouseEvent) => {\n // Call existing onClick if present\n const existingOnClick = children.props?.onClick;\n if (existingOnClick) {\n existingOnClick(e);\n }\n // Then call our handleOpen\n handleOpen();\n },\n })\n ) : (\n <Trigger\n onClick={handleOpen}\n text={texts?.triggerButtonText}\n ariaLabel={texts?.triggerButtonAriaLabel}\n />\n )}\n\n {/* Drawer with Chat */}\n <Drawer\n isOpen={isOpen}\n onClose={handleClose}\n onNewSession={handleNewSession}\n hasMessages={messages.length > 0}\n position={drawerPosition}\n width={drawerWidth}\n expandedWidth={drawerExpandedWidth}\n title={texts?.drawerTitle}\n closeAriaLabel={texts?.drawerCloseAriaLabel}\n newSessionAriaLabel={texts?.drawerNewSessionAriaLabel}\n theme={theme}\n >\n {/* Chat - Lazy loaded with Suspense */}\n {(isOpen || componentsLoaded) && (\n <React.Suspense fallback={\n <Loader2 className={styles.spinning} />\n }>\n <ChatContainer\n texts={texts}\n exampleQuestions={exampleQuestions}\n onMessage={onMessage}\n onError={onError}\n messages={messages}\n isStreaming={isStreaming}\n error={error}\n sendMessage={sendMessage}\n input={input}\n setInput={setInput}\n />\n </React.Suspense>\n )}\n </Drawer>\n </div>\n );\n}\n"],"names":["styles","_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/core/api/client.ts","../../src/core/hooks/useSSE.ts","../../src/core/hooks/useChat.ts","../../src/components/ui/Button.tsx","../../src/components/widget/Trigger.tsx","../../src/components/widget/Drawer.tsx","../../src/components/widget/Widget.tsx"],"sourcesContent":["import type { UIMessage } from '../types/index.js';\n\n/**\n * API client for Ask AI widget\n * Supports AI SDK v6 UIMessage format with streaming responses\n */\nexport class APIClient {\n private apiUrl: string;\n private project?: string;\n\n constructor(apiUrl: string, project?: string) {\n this.apiUrl = apiUrl;\n this.project = project;\n }\n\n /**\n * Send messages and get UIMessageStream response\n */\n async sendMessages(\n messages: UIMessage[],\n signal?: AbortSignal\n ): Promise<Response> {\n const body: { messages: UIMessage[]; project?: string } = {\n messages,\n };\n\n if (this.project) {\n body.project = this.project;\n }\n\n const response = await fetch(this.apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send messages: ${response.statusText}`);\n }\n\n return response;\n }\n}\n","import { useCallback } from 'react';\nimport type { UIMessage, UIMessageChunk } from '../types/index.js';\n\ninterface UseSSEOptions {\n onChunk?: (chunk: UIMessageChunk) => void;\n onError?: (error: Error) => void;\n}\n\ninterface UseSSEReturn {\n handleUIMessageStream: (response: Response, currentMessage: UIMessage) => Promise<void>;\n}\n\n/**\n * Parse SSE chunk format for UIMessageChunk stream\n * Supports both standard SSE format \"data: {...}\" and AI SDK v6 format \"0:{...}\"\n */\nfunction parseUIMessageChunk(line: string): UIMessageChunk | null {\n // Handle standard SSE format: \"data: {json}\"\n if (line.startsWith('data: ')) {\n const jsonStr = line.slice(6); // Remove \"data: \" prefix\n\n // Skip [DONE] marker\n if (jsonStr === '[DONE]') {\n return null;\n }\n\n try {\n return JSON.parse(jsonStr) as UIMessageChunk;\n } catch (err) {\n console.error('Failed to parse UIMessageChunk:', line, err);\n return null;\n }\n }\n\n return null;\n}\n\nexport function useSSE(options: UseSSEOptions = {}): UseSSEReturn {\n const { onChunk, onError } = options;\n\n const handleUIMessageStream = useCallback(\n async (response: Response, _currentMessage: UIMessage) => {\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (!reader) {\n onError?.(new Error('No response body'));\n return;\n }\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in the buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n\n const chunk = parseUIMessageChunk(line);\n if (chunk) {\n onChunk?.(chunk);\n }\n }\n }\n } catch (err) {\n // Don't report AbortError as it's an intentional cancellation\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n const error = err instanceof Error ? err : new Error('SSE stream error');\n onError?.(error);\n } finally {\n reader.releaseLock();\n }\n },\n [onChunk, onError]\n );\n\n return {\n handleUIMessageStream,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useSSE } from './useSSE.js';\nimport type { UIMessage, UIMessageChunk, WidgetTexts } from '../types/index.js';\nimport type { APIClient } from '../api/client.js';\n\ninterface UseChatOptions {\n apiClient: APIClient;\n texts?: WidgetTexts;\n}\n\ninterface UseChatReturn {\n messages: UIMessage[];\n isStreaming: boolean;\n error: Error | null;\n sendMessage: (text: string) => Promise<void>;\n resetChat: () => void;\n}\n\nlet idCounter = 0;\n\nfunction getMessageId() {\n idCounter += 1;\n return `msg-${idCounter}`;\n}\n\n/**\n * Apply a UIMessageChunk to update the current assistant message\n */\nfunction applyChunkToMessage(message: UIMessage, chunk: UIMessageChunk): UIMessage {\n const parts = [...message.parts];\n\n switch (chunk.type) {\n case 'text-start': {\n // Start a new text part\n parts.push({\n type: 'text',\n text: '',\n state: 'streaming',\n });\n break;\n }\n\n case 'text-delta': {\n // Find the last text part and append delta\n const lastTextIndex = parts.findLastIndex((p: any) => p.type === 'text');\n if (lastTextIndex >= 0) {\n const textPart = parts[lastTextIndex];\n if (textPart.type === 'text') {\n parts[lastTextIndex] = {\n ...textPart,\n text: textPart.text + chunk.delta,\n };\n }\n }\n break;\n }\n\n case 'text-end': {\n // Mark the last text part as done\n const lastTextIndex = parts.findLastIndex((p: any) => p.type === 'text');\n if (lastTextIndex >= 0) {\n const textPart = parts[lastTextIndex];\n if (textPart.type === 'text') {\n parts[lastTextIndex] = {\n ...textPart,\n state: 'done',\n };\n }\n }\n break;\n }\n\n case 'reasoning-start': {\n // Start a new reasoning part\n parts.push({\n type: 'reasoning',\n text: '',\n state: 'streaming',\n });\n break;\n }\n\n case 'reasoning-delta': {\n // Find the last reasoning part and append delta\n const lastReasoningIndex = parts.findLastIndex((p: any) => p.type === 'reasoning');\n if (lastReasoningIndex >= 0) {\n const reasoningPart = parts[lastReasoningIndex];\n if (reasoningPart.type === 'reasoning') {\n parts[lastReasoningIndex] = {\n ...reasoningPart,\n text: reasoningPart.text + chunk.delta,\n };\n }\n }\n break;\n }\n\n case 'reasoning-end': {\n // Mark the last reasoning part as done\n const lastReasoningIndex = parts.findLastIndex((p: any) => p.type === 'reasoning');\n if (lastReasoningIndex >= 0) {\n const reasoningPart = parts[lastReasoningIndex];\n if (reasoningPart.type === 'reasoning') {\n parts[lastReasoningIndex] = {\n ...reasoningPart,\n state: 'done',\n };\n }\n }\n break;\n }\n\n case 'tool-input-start': {\n // Start a new dynamic tool call\n parts.push({\n type: 'dynamic-tool',\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: undefined,\n state: 'input-streaming',\n } as any);\n break;\n }\n\n case 'tool-input-available': {\n // Update tool call with input\n const toolIndex = parts.findIndex(\n (p: any) => p.type === 'dynamic-tool' && p.toolCallId === chunk.toolCallId\n );\n if (toolIndex >= 0) {\n const toolPart = parts[toolIndex] as any;\n parts[toolIndex] = {\n ...toolPart,\n input: chunk.input,\n state: 'input-available',\n };\n }\n break;\n }\n\n case 'tool-output-available': {\n // Update tool call with output\n const toolIndex = parts.findIndex(\n (p: any) => p.type === 'dynamic-tool' && p.toolCallId === chunk.toolCallId\n );\n if (toolIndex >= 0) {\n const toolPart = parts[toolIndex] as any;\n parts[toolIndex] = {\n ...toolPart,\n output: chunk.output,\n state: 'output-available',\n };\n }\n break;\n }\n\n case 'tool-output-error': {\n // Update tool call with error\n const toolIndex = parts.findIndex(\n (p: any) => p.type === 'dynamic-tool' && p.toolCallId === chunk.toolCallId\n );\n if (toolIndex >= 0) {\n const toolPart = parts[toolIndex] as any;\n parts[toolIndex] = {\n ...toolPart,\n errorText: chunk.errorText,\n state: 'error',\n };\n }\n break;\n }\n\n case 'error': {\n // Handle error chunk - could add error state to message\n console.error('Stream error:', chunk.errorText);\n break;\n }\n\n // Add other chunk types as needed\n default:\n // Ignore unknown chunk types\n break;\n }\n\n return {\n ...message,\n parts,\n };\n}\n\nexport function useChat({ apiClient }: UseChatOptions): UseChatReturn {\n const [messages, setMessages] = useState<UIMessage[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const { handleUIMessageStream } = useSSE({\n onChunk: (chunk) => {\n if (chunk.type === 'error') {\n setError(new Error(chunk.errorText));\n setIsStreaming(false);\n return;\n }\n\n // Update the last assistant message with the chunk\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant') {\n const updatedMessage = applyChunkToMessage(lastMessage, chunk);\n return [...prev.slice(0, -1), updatedMessage];\n }\n return prev;\n });\n },\n onError: (err) => {\n setError(err);\n setIsStreaming(false);\n // Remove the failed assistant message\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant' && lastMessage.parts.length === 0) {\n return prev.slice(0, -1);\n }\n return prev;\n });\n },\n });\n\n const sendMessage = useCallback(\n async (text: string) => {\n if (!text.trim()) {\n return;\n }\n\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Create new AbortController for this request\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setError(null);\n setIsStreaming(true);\n\n // Add user message immediately (optimistic UI)\n const userMessage: UIMessage = {\n id: getMessageId(),\n role: 'user',\n parts: [\n {\n type: 'text',\n text,\n },\n ],\n };\n\n // Add placeholder for assistant response\n const assistantMessage: UIMessage = {\n id: getMessageId(),\n role: 'assistant',\n parts: [],\n };\n\n const newMessages = [...messages, userMessage];\n setMessages([...newMessages, assistantMessage]);\n\n try {\n const response = await apiClient.sendMessages(\n newMessages,\n abortController.signal\n );\n await handleUIMessageStream(response, assistantMessage);\n setIsStreaming(false);\n } catch (err) {\n // Don't treat aborted requests as errors\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n\n const error = err instanceof Error ? err : new Error('Failed to send message');\n setError(error);\n setIsStreaming(false);\n\n // Remove the failed messages\n setMessages((prev) => prev.slice(0, -2));\n } finally {\n // Clear the abort controller reference if this was the current one\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n }\n },\n [messages, apiClient, handleUIMessageStream]\n );\n\n const resetChat = useCallback(() => {\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n\n setMessages([]);\n setError(null);\n setIsStreaming(false);\n }, []);\n\n return {\n messages,\n isStreaming,\n error,\n sendMessage,\n resetChat,\n };\n}\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport styles from './Button.module.css';\n\ntype ButtonVariant = 'default' | 'outline' | 'ghost' | 'icon';\ntype ButtonSize = 'default' | 'sm' | 'lg' | 'icon';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean;\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n\n const classNames = [\n styles.button,\n styles[`variant-${variant}`],\n styles[`size-${size}`],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Comp\n className={classNames}\n ref={ref}\n {...props}\n />\n );\n }\n);\n\nButton.displayName = 'Button';\n\nexport { Button };\n","import { Sparkles, Loader2 } from 'lucide-react';\nimport { Button } from '../ui/Button.js';\nimport styles from './Trigger.module.css';\n\ninterface TriggerProps {\n onClick: () => void;\n text?: string;\n ariaLabel?: string;\n className?: string;\n isLoading?: boolean;\n}\n\nexport function Trigger({\n onClick,\n text = 'Ask AI',\n ariaLabel = 'Open AI assistant',\n className,\n isLoading = false,\n}: TriggerProps) {\n const classNames = [styles.trigger, className].filter(Boolean).join(' ');\n\n return (\n <Button\n onClick={onClick}\n variant=\"outline\"\n aria-label={ariaLabel}\n className={classNames}\n disabled={isLoading}\n >\n {isLoading ? (\n <Loader2 className={`${styles.icon} ${styles.spinning}`} />\n ) : (\n <Sparkles className={styles.icon} />\n )}\n {text && <span>{text}</span>}\n </Button>\n );\n}\n","import * as React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { Sparkles, X, EraserIcon, Maximize2, Minimize2 } from 'lucide-react';\nimport { Button } from '../ui/Button.js';\nimport styles from './Drawer.module.css';\n\ninterface DrawerProps {\n isOpen: boolean;\n onClose: () => void;\n onNewSession?: () => void;\n hasMessages?: boolean;\n position?: 'right' | 'left';\n width?: number | string;\n expandedWidth?: number | string;\n title?: string;\n closeAriaLabel?: string;\n newSessionAriaLabel?: string;\n children?: React.ReactNode;\n theme?: 'light' | 'dark';\n}\n\nexport function Drawer({\n isOpen,\n onClose,\n onNewSession,\n hasMessages,\n position = 'right',\n width = 600,\n expandedWidth = 920,\n title = 'Ask AI',\n closeAriaLabel = 'Close',\n newSessionAriaLabel = 'New session',\n children,\n theme = 'light',\n}: DrawerProps) {\n const [isExpanded, setIsExpanded] = React.useState(false);\n\n const maxWidth = isExpanded ? expandedWidth : width;\n\n const contentClasses = [\n styles.content,\n styles[`position-${position}`],\n ].join(' ');\n\n // Create a portal container that inherits theme from the nearest .ask-ai ancestor\n const [portalContainer, setPortalContainer] = React.useState<HTMLElement | null>(null);\n\n React.useEffect(() => {\n if (typeof document === 'undefined') return;\n\n // Create a portal container with ask-ai class\n const container = document.createElement('div');\n container.className = `ask-ai${theme === 'dark' ? ' dark' : ''}`;\n document.body.appendChild(container);\n setPortalContainer(container);\n\n return () => {\n document.body.removeChild(container);\n };\n }, [theme]);\n\n return (\n <DialogPrimitive.Root open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogPrimitive.Portal container={portalContainer}>\n {/* Overlay */}\n <DialogPrimitive.Overlay className={styles.overlay} />\n\n {/* Drawer Content */}\n <DialogPrimitive.Content\n className={contentClasses}\n style={{ maxWidth }}\n >\n {/* Header */}\n <div className={styles.header}>\n <DialogPrimitive.Title className={styles.title}>\n <Sparkles className={styles.icon} />\n {title}\n </DialogPrimitive.Title>\n <div className={styles.headerActions}>\n {onNewSession && hasMessages && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={newSessionAriaLabel}\n className={styles.newSessionButton}\n onClick={onNewSession}\n >\n <EraserIcon className={styles.newSessionIcon} />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={isExpanded ? 'Shrink' : 'Expand'}\n className={styles.expandButton}\n onClick={() => setIsExpanded(!isExpanded)}\n >\n {isExpanded ? (\n <Minimize2 className={styles.expandIcon} />\n ) : (\n <Maximize2 className={styles.expandIcon} />\n )}\n </Button>\n <DialogPrimitive.Close asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={closeAriaLabel}\n className={styles.closeButton}\n >\n <X className={styles.closeIcon} />\n </Button>\n </DialogPrimitive.Close>\n </div>\n </div>\n\n {/* Content */}\n <div className={styles.body}>\n {children}\n </div>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n}\n","import * as React from 'react';\nimport { Loader2 } from 'lucide-react';\nimport { APIClient } from '../../core/api/client.js';\nimport { useChat } from '../../core/hooks/useChat.js';\nimport type { WidgetProps, WidgetRef } from '../../core/types/index.js';\nimport { Trigger } from './Trigger.js';\nimport { Drawer } from './Drawer.js';\nimport styles from './Widget.module.css';\n\n// Lazy load heavy components\nconst ChatContainer = React.lazy(() => import('../chat/ChatContainer.js').then(m => ({ default: m.ChatContainer })));\n\nfunction LegacyWidget(props: WidgetProps, ref: React.Ref<WidgetRef>) {\n const {\n apiUrl,\n project,\n drawerPosition = 'right',\n drawerWidth = 600,\n drawerExpandedWidth = 920,\n theme = 'light',\n texts,\n exampleQuestions,\n hotkey,\n enableHotkey = true,\n onOpen,\n onClose,\n onMessage,\n onError,\n className,\n style,\n children,\n } = props;\n\n const [isOpen, setIsOpen] = React.useState(false);\n const [componentsLoaded, setComponentsLoaded] = React.useState(false);\n const [apiClient] = React.useState(() => new APIClient(apiUrl, project));\n\n // Lift chat state to Widget level to persist across drawer open/close\n const { messages, isStreaming, error, sendMessage, resetChat } = useChat({ apiClient, texts });\n\n // Input state also needs to persist\n const [input, setInput] = React.useState('');\n\n // Preload components\n const preloadComponents = React.useCallback(async () => {\n if (componentsLoaded) return;\n\n try {\n // Trigger lazy loading by importing the modules\n await import('../chat/ChatContainer.js');\n setComponentsLoaded(true);\n } catch (error) {\n console.error('Failed to preload components:', error);\n }\n }, [componentsLoaded]);\n\n // Handle drawer open\n const handleOpen = React.useCallback(async () => {\n preloadComponents();\n setIsOpen(true);\n onOpen?.();\n }, [preloadComponents, onOpen]);\n\n // Handle drawer close\n const handleClose = React.useCallback(() => {\n setIsOpen(false);\n onClose?.();\n }, [onClose]);\n\n // Handle new session\n const handleNewSession = React.useCallback(() => {\n setInput('');\n resetChat();\n }, [resetChat]);\n\n React.useImperativeHandle(ref, () => ({\n open: handleOpen,\n close: handleClose,\n openWithNewSession: (message) => {\n handleNewSession();\n handleOpen();\n sendMessage(message);\n },\n }), [handleOpen, handleClose, handleNewSession]);\n\n // Handle keyboard shortcut\n React.useEffect(() => {\n if (!enableHotkey || !hotkey) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const keys = hotkey.toLowerCase().split('+');\n const ctrl = keys.includes('ctrl') || keys.includes('control');\n const cmd = keys.includes('cmd') || keys.includes('command') || keys.includes('meta');\n const shift = keys.includes('shift');\n const alt = keys.includes('alt');\n const key = keys[keys.length - 1];\n\n const ctrlPressed = ctrl && (e.ctrlKey || e.metaKey);\n const cmdPressed = cmd && (e.metaKey || e.ctrlKey);\n const shiftPressed = !shift || e.shiftKey;\n const altPressed = !alt || e.altKey;\n\n if ((ctrlPressed || cmdPressed) && shiftPressed && altPressed && e.key.toLowerCase() === key) {\n e.preventDefault();\n setIsOpen((prev) => !prev);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [enableHotkey, hotkey]);\n\n return (\n <div className={`ask-ai ${className || ''} ${theme === 'dark' ? 'dark' : ''}`} style={style}>\n {/* Trigger Button - Custom or Default */}\n {children && React.isValidElement(children) ? (\n React.cloneElement(children, {\n ...children.props,\n onClick: (e: React.MouseEvent) => {\n // Call existing onClick if present\n const existingOnClick = children.props?.onClick;\n if (existingOnClick) {\n existingOnClick(e);\n }\n // Then call our handleOpen\n handleOpen();\n },\n })\n ) : (\n <Trigger\n onClick={handleOpen}\n text={texts?.triggerButtonText}\n ariaLabel={texts?.triggerButtonAriaLabel}\n />\n )}\n\n {/* Drawer with Chat */}\n <Drawer\n isOpen={isOpen}\n onClose={handleClose}\n onNewSession={handleNewSession}\n hasMessages={messages.length > 0}\n position={drawerPosition}\n width={drawerWidth}\n expandedWidth={drawerExpandedWidth}\n title={texts?.drawerTitle}\n closeAriaLabel={texts?.drawerCloseAriaLabel}\n newSessionAriaLabel={texts?.drawerNewSessionAriaLabel}\n theme={theme}\n >\n {/* Chat - Lazy loaded with Suspense */}\n {(isOpen || componentsLoaded) && (\n <React.Suspense fallback={\n <Loader2 className={styles.spinning} />\n }>\n <ChatContainer\n texts={texts}\n exampleQuestions={exampleQuestions}\n onMessage={onMessage}\n onError={onError}\n messages={messages}\n isStreaming={isStreaming}\n error={error}\n sendMessage={sendMessage}\n input={input}\n setInput={setInput}\n />\n </React.Suspense>\n )}\n </Drawer>\n </div>\n );\n}\n\nexport const Widget = React.forwardRef(LegacyWidget);"],"names":["styles","_jsx","_jsxs"],"mappings":"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"}
@@ -444,7 +444,8 @@
444
444
  width: 100%;
445
445
  margin: 0.75em 0;
446
446
  border-collapse: collapse;
447
- font-size: 0.9em;
447
+ font-size: inherit;
448
+ line-height: inherit;
448
449
  }
449
450
 
450
451
  .markdown_mNC3q th,
@@ -1,2 +1,3 @@
1
- import type { WidgetProps } from '../../core/types/index.js';
2
- export declare function Widget(props: WidgetProps): import("react/jsx-runtime").JSX.Element;
1
+ import * as React from 'react';
2
+ import type { WidgetProps, WidgetRef } from '../../core/types/index.js';
3
+ export declare const Widget: React.ForwardRefExoticComponent<WidgetProps & React.RefAttributes<WidgetRef>>;
@@ -38,3 +38,8 @@ export interface WidgetProps {
38
38
  onClick?: (e: React.MouseEvent) => void;
39
39
  }>;
40
40
  }
41
+ export interface WidgetRef {
42
+ open: () => void;
43
+ close: () => void;
44
+ openWithNewSession: (message: string) => void;
45
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "open-ask-ai",
3
- "version": "0.6.4",
3
+ "version": "0.7.0",
4
4
  "description": "AI-powered Q&A widget for documentation sites",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",
@@ -8,9 +8,9 @@
8
8
  "types": "./dist/types/index.d.ts",
9
9
  "exports": {
10
10
  ".": {
11
+ "types": "./dist/types/index.d.ts",
11
12
  "import": "./dist/esm/index.js",
12
- "require": "./dist/cjs/index.js",
13
- "types": "./dist/types/index.d.ts"
13
+ "require": "./dist/cjs/index.js"
14
14
  },
15
15
  "./package.json": "./package.json",
16
16
  "./styles.css": {
package/README.md DELETED
@@ -1,240 +0,0 @@
1
- # Open Ask AI
2
-
3
- AI-powered Q&A widget for documentation sites. A customizable button component that opens a drawer-style chat interface, designed to be embedded anywhere in your application.
4
-
5
- **Now using AI SDK v6 UIMessage format!** See [MIGRATION.md](./MIGRATION.md) for upgrade guide.
6
-
7
- ## Features
8
-
9
- - 🎯 **Embeddable Button**: A regular button component that can be placed anywhere in your layout (header, sidebar, footer, etc.)
10
- - 🎨 **Drawer-style UI**: Chat interface appears in a drawer that doesn't block documentation content
11
- - 🌓 **Automatic Dark Mode**: Detects system and site theme automatically
12
- - 🎨 **Customizable Theming**: Override styles via CSS variables
13
- - 🌍 **Multi-language Support**: Customize all UI text through props
14
- - ⌨️ **Keyboard Shortcut**: Optional hotkey support (e.g., Cmd+K)
15
- - ⚡ **Modern Stack**: Built with React 19, TypeScript, and AI SDK v6
16
- - 🔄 **Stateless**: No session management required - all messages sent with each request
17
-
18
- ## Installation
19
-
20
- ```bash
21
- npm install open-ask-ai
22
- ```
23
-
24
- ## Quick Start
25
-
26
- ```tsx
27
- import { AskAIWidget } from 'open-ask-ai'
28
- import 'open-ask-ai/dist/index.css'
29
-
30
- function Header() {
31
- return (
32
- <header>
33
- <nav>
34
- {/* Your navigation items */}
35
- </nav>
36
-
37
- {/* Embed the Ask AI button anywhere */}
38
- <AskAIWidget
39
- apiUrl="http://localhost:3000/api/stream"
40
- project="my-docs"
41
- exampleQuestions={[
42
- "How do I get started?",
43
- "What are the key features?"
44
- ]}
45
- />
46
- </header>
47
- )
48
- }
49
- ```
50
-
51
- ## Configuration
52
-
53
- ### Widget Props
54
-
55
- ```tsx
56
- interface WidgetProps {
57
- // Required
58
- apiUrl: string // Complete URL to SSE stream endpoint (e.g., 'https://example.com/api/stream')
59
-
60
- // Optional
61
- project?: string // Project identifier (sent in request body)
62
-
63
- // UI Configuration
64
- drawerPosition?: 'right' | 'left' // Drawer slide direction (default: 'right')
65
- drawerWidth?: number | string // Drawer width (default: 600)
66
- drawerExpandedWidth?: number | string // Expanded drawer width (default: 920)
67
- theme?: 'light' | 'dark' // Theme (default: 'light')
68
-
69
- // Content
70
- texts?: WidgetTexts // All UI text labels (see below)
71
- exampleQuestions?: string[] // Questions shown in empty state
72
-
73
- // Interaction
74
- hotkey?: string // Keyboard shortcut (e.g., 'cmd+k', 'ctrl+k')
75
- enableHotkey?: boolean // Enable/disable hotkey (default: true)
76
-
77
- // Callbacks
78
- onOpen?: () => void // Called when drawer opens
79
- onClose?: () => void // Called when drawer closes
80
- onMessage?: (message: UIMessage) => void
81
- onError?: (error: Error) => void
82
-
83
- // Styling
84
- className?: string // Additional CSS classes
85
- style?: React.CSSProperties // Inline styles (for CSS variables)
86
-
87
- // Custom trigger
88
- children?: React.ReactElement // Custom trigger button
89
- }
90
- ```
91
-
92
- ### Customizing Text Labels
93
-
94
- All UI text can be customized through the `texts` prop:
95
-
96
- ```tsx
97
- interface WidgetTexts {
98
- // Button
99
- triggerButtonText?: string // Default: "Ask AI"
100
- triggerButtonAriaLabel?: string // Default: "Open AI assistant"
101
-
102
- // Drawer
103
- drawerTitle?: string // Default: "Ask AI"
104
- drawerCloseAriaLabel?: string // Default: "Close"
105
-
106
- // Chat interface
107
- welcomeMessage?: string
108
- exampleQuestionsTitle?: string
109
- inputPlaceholder?: string
110
- sendButtonAriaLabel?: string
111
-
112
- // Status messages
113
- emptyResponseText?: string // Default: "AI 未能生成回复,请重试"
114
- }
115
- ```
116
-
117
- ### Theming
118
-
119
- Override CSS variables to customize the appearance:
120
-
121
- ```css
122
- .ask-ai {
123
- --ask-ai-primary: #10b981;
124
- --ask-ai-primary-hover: #059669;
125
- --ask-ai-font-family: 'Inter', sans-serif;
126
- /* Add more custom variables as needed */
127
- }
128
- ```
129
-
130
- ### Multi-language Support
131
-
132
- ```tsx
133
- <AskAIWidget
134
- apiUrl="..."
135
- texts={{
136
- triggerButtonText: "问 AI",
137
- drawerTitle: "AI 助手",
138
- welcomeMessage: "你好!有什么可以帮你的吗?",
139
- inputPlaceholder: "输入你的问题...",
140
- }}
141
- />
142
- ```
143
-
144
- ## Usage Examples
145
-
146
- ### Embed in Header
147
-
148
- ```tsx
149
- import { AskAIWidget } from 'open-ask-ai'
150
-
151
- function Header() {
152
- return (
153
- <header className="flex items-center justify-between">
154
- <Logo />
155
- <nav>{/* Navigation items */}</nav>
156
- <div className="flex items-center gap-2">
157
- <AskAIWidget apiUrl="http://localhost:3000/api/stream" />
158
- <ThemeToggle />
159
- </div>
160
- </header>
161
- )
162
- }
163
- ```
164
-
165
- ### Embed in Sidebar
166
-
167
- ```tsx
168
- function Sidebar() {
169
- return (
170
- <aside>
171
- <nav>{/* Menu items */}</nav>
172
- <div className="mt-auto p-4">
173
- <AskAIWidget
174
- apiUrl="http://localhost:3000/api/stream"
175
- drawerPosition="left"
176
- />
177
- </div>
178
- </aside>
179
- )
180
- }
181
- ```
182
-
183
- ### With Keyboard Shortcut
184
-
185
- ```tsx
186
- <AskAIWidget
187
- apiUrl="http://localhost:3000/api/stream"
188
- hotkey="cmd+k" // Cmd+K on Mac, Ctrl+K on Windows/Linux
189
- enableHotkey={true}
190
- />
191
- ```
192
-
193
- ### With Event Callbacks
194
-
195
- ```tsx
196
- <AskAIWidget
197
- apiUrl="http://localhost:3000/api/stream"
198
- onOpen={() => console.log('AI assistant opened')}
199
- onClose={() => console.log('AI assistant closed')}
200
- onMessage={(message) => {
201
- // Track messages for analytics
202
- // Extract text from message parts
203
- const text = message.parts
204
- .filter(p => p.type === 'text')
205
- .map(p => p.type === 'text' ? p.text : '')
206
- .join('');
207
- analytics.track('ai_message', { role: message.role, text });
208
- }}
209
- onError={(error) => {
210
- // Handle errors
211
- console.error('AI error:', error)
212
- }}
213
- />
214
- ```
215
-
216
- ### With Project Identifier
217
-
218
- ```tsx
219
- <AskAIWidget
220
- apiUrl="http://localhost:3000/api/stream"
221
- project="my-documentation" // Sent in request body
222
- />
223
- ```
224
-
225
- ## Development
226
-
227
- ```bash
228
- # Install dependencies
229
- npm install
230
-
231
- # Build
232
- npm run build
233
-
234
- # Type check
235
- npm run typecheck
236
- ```
237
-
238
- ## License
239
-
240
- MIT