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 +11 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/styles.css +2 -1
- package/dist/esm/index.js +11 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/styles.css +2 -1
- package/dist/types/components/widget/Widget.d.ts +3 -2
- package/dist/types/core/types/index.d.ts +5 -0
- package/package.json +3 -3
- package/README.md +0 -240
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
|
|
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
|
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -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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"}
|
package/dist/cjs/styles.css
CHANGED
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
|
|
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
|
package/dist/esm/index.js.map
CHANGED
|
@@ -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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"}
|
package/dist/esm/styles.css
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
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>>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "open-ask-ai",
|
|
3
|
-
"version": "0.
|
|
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
|