@hsafa/ui-sdk 0.3.0 → 0.3.2
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/index.cjs +14 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +14 -14
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Button.module.css","../src/components/Button.tsx","../src/components/FloatingChatButton.tsx","../src/hooks/useAutoScroll.ts","../src/utils/file-upload.ts","../src/hooks/useFileUploadHook.ts","../src/providers/HsafaProvider.tsx","../src/components/IconWrapper.tsx","../src/components/IconButton.tsx","../src/components/hsafa-chat/ChatHeader.tsx","../src/components/MermaidDiagram.tsx","../src/utils/markdown.ts","../src/components/MarkdownRendererWithMermaid.tsx","../src/components/hsafa-chat/ReasoningAndTools.tsx","../src/components/hsafa-chat/FinalResponse.tsx","../src/utils/file.ts","../src/components/AttachmentItem.tsx","../src/components/AttachmentDisplay.tsx","../src/components/hsafa-chat/MessageEditor.tsx","../src/components/hsafa-chat/MessageList.tsx","../src/components/hsafa-chat/ChatInput.tsx","../src/utils/chat-storage.ts","../src/utils/time.ts","../src/components/hsafa-chat/ChatHistoryModal.tsx","../src/components/web-controler/getDomComponents.ts","../src/components/web-controler/guideCursor.ts","../src/components/web-controler/FillInput.ts","../src/components/web-controler/CursorController.tsx","../src/components/HsafaChat.tsx","../src/utils/chat-theme.ts","../src/components/ContentContainer.tsx","../src/utils/component-registry.ts"],"names":["Button_default","Button","variant","size","loading","disabled","children","className","props","buttonClasses","jsxs","jsx","FloatingChatButton","show","onClick","resolvedColors","floatingButtonPosition","floatingButtonStyles","e","useAutoScroll","shouldScroll","ref","useRef","shouldScrollRef","useEffect","el","observer","joinUrl","baseUrl","path","a","b","MAX_UPLOAD_SIZE","useFileUpload","attachments","setAttachments","useState","uploading","setUploading","fileInputRef","formatBytes","useCallback","bytes","units","exponent","uploadAttachment","file","formData","response","text","data","handleRemoveAttachment","id","prev","att","handleFileSelection","fileList","setError","files","uploaded","attachment","err","buildUserContent","parts","t","mt","clearAttachments","HsafaContext","createContext","HsafaProvider","dir","theme","actions","setActions","components","setComponents","streamingStates","setStreamingStates","chatOpenStates","setChatOpenStates","registerAction","name","handler","next","existing","unregisterAction","registerComponent","component","unregisterComponent","setStreamingState","chatId","isStreaming","setChatOpenState","isOpen","isAnyStreaming","useMemo","state","isAnyChatOpen","value","useHsafa","ctx","useContext","IconWrapper","IconComponent","React","IconButton","icon","ariaLabel","title","ChatHeader","alwaysOpen","streaming","onNew","onToggleHistory","onClose","historyBtnRef","Plus","History","ChevronRight","MermaidDiagram","chart","containerRef","error","setLoading","mounted","mermaid","svg","svgElement","borderColor","bgColor","errorBg","errorText","loadingText","escapeHtml","s","inlineFormat","renderMarkdownToHtmlSafe","input","lines","html","inCode","codeLang","codeBuffer","inUl","inOl","hasMermaid","codeBlockBg","codeTextColor","tableHeaderBg","tableHeaderTextColor","closeLists","nextNonEmptyIndex","start","k","splitTableCells","rawLine","trimmed","line","c","isTableHeaderRow","cells","isSeparatorRow","alignmentFromSep","cell","hasLeft","hasRight","parseTableBlock","startIndex","headerIdx","sepIdx","headerCells","sepCells","colCount","aligns","i","rows","normalized","tableHtml","content","textAlign","isFirst","isLast","row","raw","fenceMatch","mermaidCode","codeHtml","cls","h","level","endIndex","ulItem","olItem","MarkdownRendererWithMermaid","elements","part","index","match","getToolStatus","statusMap","ReasoningAndTools","messageId","openReasoningIds","toggleReasoning","groups","currentReasonings","reasoningStartDate","reasoningEndDate","reasoningCompleted","it","isDynamicTool","isPrefixedTool","derivedToolName","g","idx","itemId","isCompleted","hasText","handleClick","i2","color","isRunning","isGetFromUser","FinalResponse","items","UIComponents","item","componentName","Component","AttachmentItem","mode","onRemove","maxWidth","isImage","isEditable","isLink","containerStyle","Fragment","fileIcon","File","Eye","X","Download","AttachmentDisplay","MessageEditor","initialText","editingText","onEditingTextChange","onCancel","onSave","onRemoveAttachment","onAddAttachments","handleKeyDown","handleFileChange","MessageList","chatMessages","isLoading","onUserMessageClick","editingMessageId","onCancelEdit","onSaveEdit","editAttachments","onRemoveEditAttachment","onAddEditAttachments","editUploading","messageParts","messageText","p","messageAttachments","imgUrl","final","ChatInput","setInput","textareaRef","onFileInputChange","onSend","onStop","status","canStop","hasMessages","createChatStorage","agentId","LS_PREFIX","chatsIndexKey","chatKey","currentChatKey","showChatKey","loadChatsIndex","saveChatsIndex","list","loadChat","saveChat","upsertChatMeta","meta","x","deleteChatMeta","deleteChatData","defaultValue","savedShow","timeAgo","ts","diff","m","d","w","months","ChatHistoryModal","historyOpen","historySearch","currentChatId","refreshKey","onSearchChange","onChatSelect","onChatDelete","historyPopupRef","modalContent","q","Trash2","createPortal","isVisible","style","getElementLabel","label","parentLabel","clone","getElementText","getElementValue","type","opt","getUniqueSelector","current","selector","classes","parent","siblings","child","getDomComponents","options","includeHidden","what","limit","contentContainer","searchScope","selectors","visible","importance","total","maxItems","truncated","limited","guideCursor","target","cursorGuide","isHTMLElement","n","dispatch","setTextLike","setter","setCheckbox","setSelectSingle","setSelectMultiple","values","setVals","coerceDate","v","setFiles","dt","f","FillActiveInput","ce","tag","inp","alt","vStr","ta","sel","host","cursorReactRoot","cursorSvgCache","cursorStylesInjected","cursorHideTimer","cursorIsMoving","ensureCursorVisible","cursor","keepCursorVisibleWhileMoving","scheduleCursorHide","ms","stopMovingAndMaybeHide","getScrollableAncestors","scrollable","overflow","waitForScrollSettled","targetElement","timeoutMs","quietMs","scrollableElements","getScrollPositions","positions","getTargetPos","rect","lastScrollPos","lastTargetPos","lastChange","resolve","tick","now","curScrollPos","curTargetPos","changed","DEFAULT_ARROW_SVG","DEFAULT_POINTER_SVG","loadCursorSvgs","CursorVisual","arrowSvg","pointerSvg","getOrCreateCursor","svgs","styleId","createRoot","clamp","min","max","easeInOutCubic","cssColorToRgba","css","r","relativeLuminance","srgb","isDarkColor","rgba","getEffectiveBackgroundAtPoint","y","seen","bg","updateCursorColorAt","dark","strokeColor","animatePosition","from","to","durationMs","easing","curveStrength","curveDirection","onFrame","easeFn","useCurve","cp","dx","dy","dist","mx","my","nx","ny","sign","bend","frame","u","wobbleAmp","applyOffset","offset","dispatchMouseLike","point","extra","common","isDown","isUp","enriched","ev","isElement","obj","resolveWithin","within","byId","resolveTarget","all","getAnchoredPoint","anchor","ax","ay","clampToViewport","CursorController","stepsOrTarget","steps","results","curX","curY","highlight","cursorHotspot","dragTo","action","t0","resolved","targetPoint","ux","uy","overshoot","over","clickedId","hotspot","pageP","clickTarget","dest","destPoint","dst","startP","startTarget","moveTarget","moveP","endTarget","CursorController_default","HsafaChat","primaryColor","primaryColorDark","primaryColorLight","backgroundColor","textColor","accentColor","initialMessages","onMessagesChange","defaultOpen","HsafaTools","providerDir","providerTheme","effectiveTheme","key","uploadError","setUploadError","setChatId","transport","DefaultChatTransport","init","enhancedBody","onFinishCallback","message","onErrorCallback","builtInTools","res","last","clicked","act","_","allTools","formHostRef","formStateRef","cleanupAllForms","renderOrUpdateUserForm","toolCallId","currentParent","toolHost","description","submitLabel","skipLabel","fields","existingState","form","wrap","lab","inputEl","o","fieldId","savedVal","trimmedSubmit","trimmedSkip","showActions","submitBtn","skipBtn","chatApiRef","badge","getToolFunction","toolName","toolConfig","chatApi","useChat","lastAssistantMessageIsCompleteWithToolCalls","toolCall","toolFn","result","sendMessage","stop","chatError","lastProcessedInputRef","toolInput","currentInput","lastInput","seenIds","pendingRenders","out","hydrated","inVal","node","raf","onMessagesChangeRef","prevMessagesRef","setIsOpen","setHistoryOpen","setHistorySearch","historyRefreshKey","setHistoryRefreshKey","setOpenReasoningIds","setEditingMessageId","setEditingText","setEditAttachments","setEditUploading","editTextareaRef","scrollRef","storage","createdChatRef","restoredOnMountRef","savedId","saved","msgs","found","firstUser","titleSource","textPart","wasLoadingRef","handleSendMessage","trimmedInput","handleNewChat","newId","handleToggleHistory","handleClose","textarea","newHeight","handleAddEditAttachments","newAttachments","handleRemoveEditAttachment","handleUserMessageClick","handleCancelEdit","handleSaveEdit","messageIndex","updatedMessages","panel","themeColors","ContentContainer","mutedTextColor","enableBorderAnimation","borderRadius","enableContentBorder","enableMargin","chatWidth","effectiveDir","componentId","isMounted","setIsMounted","timeout","themeColorScheme","contentBorderRadius","chatWidthPx","marginStyle","containerWidth","ComponentRegistry","registry"],"mappings":"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","file":"index.cjs","sourcesContent":["/* Base button styles */\n.button {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n border: 1px solid transparent;\n border-radius: 0.75rem;\n font-weight: 600;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n text-decoration: none;\n white-space: nowrap;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n\n.button:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n/* Size variants */\n.sm {\n padding: 0.375rem 0.75rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.md {\n padding: 0.5rem 1rem;\n font-size: 1rem;\n line-height: 1.5rem;\n}\n\n.lg {\n padding: 0.75rem 1.5rem;\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n\n/* Color variants */\n.primary {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n border-color: transparent;\n}\n\n.primary:hover:not(:disabled) {\n background: linear-gradient(135deg, #5a67d8 0%, #6b46c1 100%);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);\n}\n\n.secondary {\n background-color: #f7fafc;\n color: #2d3748;\n border-color: #e2e8f0;\n}\n\n.secondary:hover:not(:disabled) {\n background-color: #edf2f7;\n border-color: #cbd5e0;\n}\n\n.outline {\n background-color: transparent;\n color: #667eea;\n border-color: #667eea;\n}\n\n.outline:hover:not(:disabled) {\n background-color: #667eea;\n color: white;\n}\n\n.ghost {\n background-color: transparent;\n color: #4a5568;\n border-color: transparent;\n}\n\n.ghost:hover:not(:disabled) {\n background-color: #f7fafc;\n color: #2d3748;\n}\n\n/* Loading state */\n.loading {\n pointer-events: none;\n}\n\n.hiddenText {\n opacity: 0;\n}\n\n.spinner {\n position: absolute;\n width: 1rem;\n height: 1rem;\n border: 2px solid transparent;\n border-top: 2px solid currentColor;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n","import React from \"react\";\nimport styles from \"./Button.module.css\";\n\n/**\n * Props for the Button component\n */\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Visual style variant of the button */\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\";\n /** Size of the button */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Whether the button is in a loading state */\n loading?: boolean;\n /** Content to be displayed inside the button */\n children: React.ReactNode;\n}\n\n/**\n * A versatile button component with multiple variants, sizes, and states.\n * \n * @example\n * ```tsx\n * // Basic usage\n * <Button>Click me</Button>\n * \n * // With variant and size\n * <Button variant=\"secondary\" size=\"lg\">Large Secondary Button</Button>\n * \n * // Loading state\n * <Button loading>Processing...</Button>\n * \n * // With click handler\n * <Button onClick={() => console.log('Clicked!')}>Click me</Button>\n * ```\n */\nexport const Button: React.FC<ButtonProps> = ({\n variant = \"primary\",\n size = \"md\",\n loading = false,\n disabled,\n children,\n className,\n ...props\n}) => {\n const buttonClasses = [\n styles.button,\n styles[variant],\n styles[size],\n loading && styles.loading,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n className={buttonClasses}\n disabled={disabled || loading}\n {...props}\n >\n {loading && <span className={styles.spinner} />}\n <span className={loading ? styles.hiddenText : undefined}>\n {children}\n </span>\n </button>\n );\n};\n","import React from 'react';\nimport { ThemeColors } from '../utils/chat-theme';\n\ninterface FloatingChatButtonProps {\n show: boolean;\n onClick: () => void;\n resolvedColors: ThemeColors;\n floatingButtonPosition: {\n bottom?: number | string;\n right?: number | string;\n top?: number | string;\n left?: number | string;\n };\n}\n\nexport function FloatingChatButton({\n show,\n onClick,\n resolvedColors,\n floatingButtonPosition\n}: FloatingChatButtonProps) {\n if (!show) return null;\n\n const floatingButtonStyles = {\n position: 'fixed' as const,\n bottom: typeof floatingButtonPosition.bottom === 'number' ? `${floatingButtonPosition.bottom}px` : floatingButtonPosition.bottom,\n right: floatingButtonPosition.right ? (typeof floatingButtonPosition.right === 'number' ? `${floatingButtonPosition.right}px` : floatingButtonPosition.right) : undefined,\n top: floatingButtonPosition.top ? (typeof floatingButtonPosition.top === 'number' ? `${floatingButtonPosition.top}px` : floatingButtonPosition.top) : undefined,\n left: floatingButtonPosition.left ? (typeof floatingButtonPosition.left === 'number' ? `${floatingButtonPosition.left}px` : floatingButtonPosition.left) : undefined,\n zIndex: 1000\n };\n\n return (\n <button\n aria-label=\"Open chat\"\n onClick={onClick}\n style={{\n ...floatingButtonStyles,\n borderColor: resolvedColors.borderColor,\n backgroundColor: resolvedColors.accentColor,\n color: resolvedColors.textColor,\n borderRadius: '50%',\n border: `1px solid ${resolvedColors.borderColor}`,\n padding: '12px',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n transition: 'all 0.2s',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = resolvedColors.primaryColor;\n e.currentTarget.style.backgroundColor = `${resolvedColors.accentColor}dd`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = resolvedColors.borderColor;\n e.currentTarget.style.backgroundColor = resolvedColors.accentColor;\n }}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n </button>\n );\n}\n","import { useEffect, useRef } from \"react\";\n\nexport function useAutoScroll<T extends HTMLElement>(shouldScroll: boolean = true) {\n const ref = useRef<T | null>(null);\n const shouldScrollRef = useRef(shouldScroll);\n\n // Update the ref when shouldScroll changes\n useEffect(() => {\n shouldScrollRef.current = shouldScroll;\n }, [shouldScroll]);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const observer = new MutationObserver(() => {\n // Only scroll if shouldScroll is true\n if (shouldScrollRef.current) {\n el.scrollTop = el.scrollHeight;\n }\n });\n\n observer.observe(el, { childList: true, subtree: true });\n \n // Initial scroll only if shouldScroll is true\n if (shouldScrollRef.current) {\n el.scrollTop = el.scrollHeight;\n }\n\n return () => observer.disconnect();\n }, []);\n\n return ref;\n}\n","import { Attachment } from '../types/chat';\n\n// File upload constants\nexport const MAX_UPLOAD_SIZE = 25 * 1024 * 1024; // 25MB\n\nexport function joinUrl(baseUrl: string | undefined, path: string): string {\n if (!baseUrl) return path;\n const a = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const b = path.startsWith('/') ? path : `/${path}`;\n return `${a}${b}`;\n}\n\nexport function buildUserContent(text: string, attachments: Attachment[]) {\n const parts: any[] = [];\n const t = (text || '').trim();\n if (t) parts.push({ type: 'text', text: t });\n for (const a of (attachments || [])) {\n const mt = a.mimeType || 'application/octet-stream';\n if (mt.startsWith('image/')) {\n parts.push({ type: 'image', image: new URL(a.url), mediaType: mt });\n } else {\n parts.push({ type: 'file', data: a.url, mediaType: mt, name: a.name });\n }\n }\n return parts;\n}\n\nexport async function uploadAttachment(file: File, baseUrl: string | undefined): Promise<Attachment> {\n const formData = new FormData();\n formData.append('file', file);\n\n const response = await fetch(joinUrl(baseUrl, '/api/uploads'), {\n method: 'POST',\n body: formData,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(text || `Failed to upload ${file.name}`);\n }\n\n const data = await response.json();\n return {\n id: data.id,\n name: data.name || file.name,\n url: data.url,\n mimeType: data.mimeType || file.type || 'application/octet-stream',\n size: typeof data.size === 'number' ? data.size : file.size,\n };\n}\n\nexport async function handleFileSelection(\n fileList: FileList | File[] | null,\n baseUrl: string | undefined,\n onError: (error: string) => void,\n onUploading: (uploading: boolean) => void\n): Promise<Attachment[]> {\n if (!fileList) return [];\n \n const files = Array.isArray(fileList) ? fileList : Array.from(fileList);\n onUploading(true);\n\n const uploaded: Attachment[] = [];\n try {\n for (const file of files) {\n if (file.size > MAX_UPLOAD_SIZE) {\n onError(`\"${file.name}\" exceeds the ${(MAX_UPLOAD_SIZE / (1024 * 1024)).toFixed(0)}MB limit.`);\n continue;\n }\n\n try {\n const attachment = await uploadAttachment(file, baseUrl);\n uploaded.push(attachment);\n } catch (err: any) {\n console.error('Failed to upload attachment:', err);\n onError(String(err?.message ?? `Failed to upload ${file.name}`));\n }\n }\n\n return uploaded;\n } finally {\n onUploading(false);\n }\n}\n","import { useState, useRef, useCallback } from 'react';\nimport { Attachment } from '../types/chat';\nimport { joinUrl } from '../utils/file-upload';\n\nconst MAX_UPLOAD_SIZE = 25 * 1024 * 1024; // 25MB\n\nexport function useFileUpload(baseUrl: string) {\n const [attachments, setAttachments] = useState<Attachment[]>([]);\n const [uploading, setUploading] = useState(false);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n\n const formatBytes = useCallback((bytes: number) => {\n if (!bytes || Number.isNaN(bytes)) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const exponent = Math.min(units.length - 1, Math.floor(Math.log(bytes) / Math.log(1024)));\n const value = bytes / Math.pow(1024, exponent);\n return `${value.toFixed(exponent === 0 ? 0 : 1)} ${units[exponent]}`;\n }, []);\n\n const uploadAttachment = useCallback(async (file: File): Promise<Attachment> => {\n const formData = new FormData();\n formData.append('file', file);\n\n const response = await fetch(joinUrl(baseUrl, '/api/uploads'), {\n method: 'POST',\n body: formData,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(text || `Failed to upload ${file.name}`);\n }\n\n const data = await response.json();\n return {\n id: data.id,\n name: data.name || file.name,\n url: data.url,\n mimeType: data.mimeType || file.type || 'application/octet-stream',\n size: typeof data.size === 'number' ? data.size : file.size,\n };\n }, [baseUrl]);\n\n const handleRemoveAttachment = useCallback((id: string) => {\n setAttachments(prev => prev.filter(att => att.id !== id));\n }, []);\n\n const handleFileSelection = useCallback(async (fileList: FileList | File[] | null, setError: (error: string | null) => void) => {\n if (!fileList) return;\n const files = Array.isArray(fileList) ? fileList : Array.from(fileList);\n setError(null);\n setUploading(true);\n\n const uploaded: Attachment[] = [];\n try {\n for (const file of files) {\n if (file.size > MAX_UPLOAD_SIZE) {\n setError(`\"${file.name}\" exceeds the ${formatBytes(MAX_UPLOAD_SIZE)} limit.`);\n continue;\n }\n\n try {\n const attachment = await uploadAttachment(file);\n uploaded.push(attachment);\n } catch (err: any) {\n console.error('Failed to upload attachment:', err);\n setError(String(err?.message ?? `Failed to upload ${file.name}`));\n }\n }\n\n if (uploaded.length) {\n setAttachments(prev => [...prev, ...uploaded]);\n }\n } finally {\n setUploading(false);\n }\n }, [uploadAttachment, formatBytes]);\n\n const buildUserContent = useCallback((text: string, attachments: Attachment[]) => {\n const parts: any[] = [];\n const t = (text || '').trim();\n if (t) parts.push({ type: 'text', text: t });\n for (const a of (attachments || [])) {\n const mt = a.mimeType || 'application/octet-stream';\n if (mt.startsWith('image/')) {\n parts.push({ type: 'image', image: new URL(a.url), mediaType: mt });\n } else {\n parts.push({ type: 'file', data: a.url, mediaType: mt, name: a.name });\n }\n }\n return parts;\n }, []);\n\n const clearAttachments = useCallback(() => {\n setAttachments([]);\n }, []);\n\n return {\n attachments,\n uploading,\n fileInputRef,\n formatBytes,\n handleRemoveAttachment,\n handleFileSelection,\n buildUserContent,\n clearAttachments,\n MAX_UPLOAD_SIZE\n };\n}\n","import React, { createContext, useCallback, useContext, useMemo, useState } from \"react\";\n\n/**\n * Handler function for custom actions that can be triggered by the AI agent\n */\nexport type HsafaActionHandler = (params: any, meta: {\n /** Name of the action being called */\n name: string;\n /** When the action is being triggered */\n trigger: 'partial' | 'final' | 'params_complete';\n /** Index of the action in the sequence */\n index: number;\n /** ID of the assistant message that triggered this action */\n assistantMessageId?: string;\n /** ID of the current chat session */\n chatId?: string;\n}) => Promise<any> | any;\n\n/**\n * Configuration options for the Hsafa SDK\n */\nexport interface HsafaConfig {\n /** Base URL for agent API calls, e.g. \"\" (same origin) or \"https://example.com\" */\n baseUrl?: string;\n /** Default text direction for SDK components */\n dir?: 'ltr' | 'rtl';\n /** Default theme for SDK components */\n theme?: 'dark' | 'light';\n}\n\n/**\n * Context value provided by HsafaProvider\n */\nexport interface HsafaContextValue extends HsafaConfig {\n /** Registered custom actions */\n actions: Map<string, HsafaActionHandler>;\n /** Registered custom components */\n components: Map<string, React.ComponentType<any>>;\n /** Register a custom action handler */\n registerAction: (name: string, handler: HsafaActionHandler) => () => void;\n /** Unregister a custom action handler */\n unregisterAction: (name: string, handler?: HsafaActionHandler) => void;\n /** Register a custom component */\n registerComponent: (name: string, component: React.ComponentType<any>) => () => void;\n /** Unregister a custom component */\n unregisterComponent: (name: string, component?: React.ComponentType<any>) => void;\n /** Global streaming state - true if any chat is streaming */\n isAnyStreaming: boolean;\n /** Set streaming state for a specific chat instance */\n setStreamingState: (chatId: string, isStreaming: boolean) => void;\n /** Global chat open state - true if any chat is open */\n isAnyChatOpen: boolean;\n /** Set chat open state for a specific chat instance */\n setChatOpenState: (chatId: string, isOpen: boolean) => void;\n}\n\nconst HsafaContext = createContext<HsafaContextValue | undefined>(undefined);\n\n/**\n * Props for the HsafaProvider component\n */\nexport interface HsafaProviderProps extends HsafaConfig {\n /** Child components that will have access to the Hsafa context */\n children: React.ReactNode;\n}\n\n/**\n * Provider component that sets up the Hsafa context for the SDK.\n * Wrap your app or chat components with this provider to enable Hsafa functionality.\n * \n * @example\n * ```tsx\n * <HsafaProvider baseUrl=\"https://api.example.com\">\n * <HsafaChat agentId=\"my-agent\" />\n * </HsafaProvider>\n * ```\n */\nexport function HsafaProvider({ baseUrl, dir = 'ltr', theme = 'dark', children }: HsafaProviderProps) {\n const [actions, setActions] = useState<Map<string, HsafaActionHandler>>(new Map());\n const [components, setComponents] = useState<Map<string, React.ComponentType<any>>>(new Map());\n const [streamingStates, setStreamingStates] = useState<Map<string, boolean>>(new Map());\n const [chatOpenStates, setChatOpenStates] = useState<Map<string, boolean>>(new Map());\n\n const registerAction = useCallback((name: string, handler: HsafaActionHandler) => {\n setActions(prev => {\n const next = new Map(prev);\n next.set(String(name), handler);\n return next;\n });\n return () => {\n setActions(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!handler || existing === handler) next.delete(String(name));\n return next;\n });\n };\n }, []);\n\n const unregisterAction = useCallback((name: string, handler?: HsafaActionHandler) => {\n setActions(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!handler || existing === handler) next.delete(String(name));\n return next;\n });\n }, []);\n\n const registerComponent = useCallback((name: string, component: React.ComponentType<any>) => {\n setComponents(prev => {\n const next = new Map(prev);\n next.set(String(name), component);\n return next;\n });\n return () => {\n setComponents(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!component || existing === component) next.delete(String(name));\n return next;\n });\n };\n }, []);\n\n const unregisterComponent = useCallback((name: string, component?: React.ComponentType<any>) => {\n setComponents(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!component || existing === component) next.delete(String(name));\n return next;\n });\n }, []);\n\n const setStreamingState = useCallback((chatId: string, isStreaming: boolean) => {\n setStreamingStates(prev => {\n const next = new Map(prev);\n if (isStreaming) {\n next.set(chatId, true);\n } else {\n next.delete(chatId);\n }\n return next;\n });\n }, []);\n\n const setChatOpenState = useCallback((chatId: string, isOpen: boolean) => {\n setChatOpenStates(prev => {\n const next = new Map(prev);\n if (isOpen) {\n next.set(chatId, true);\n } else {\n next.delete(chatId);\n }\n return next;\n });\n }, []);\n\n const isAnyStreaming = useMemo(() => {\n return Array.from(streamingStates.values()).some(state => state);\n }, [streamingStates]);\n\n const isAnyChatOpen = useMemo(() => {\n return Array.from(chatOpenStates.values()).some(state => state);\n }, [chatOpenStates]);\n\n const value: HsafaContextValue = useMemo(() => ({\n baseUrl,\n dir,\n theme,\n actions,\n components,\n registerAction,\n unregisterAction,\n registerComponent,\n unregisterComponent,\n isAnyStreaming,\n setStreamingState,\n isAnyChatOpen,\n setChatOpenState,\n }), [baseUrl, dir, theme, actions, components, registerAction, unregisterAction, registerComponent, unregisterComponent, isAnyStreaming, setStreamingState, isAnyChatOpen, setChatOpenState]);\n\n return (\n <HsafaContext.Provider value={value}>\n {children}\n </HsafaContext.Provider>\n );\n}\n\n/**\n * Hook to access the Hsafa context.\n * Must be used within a HsafaProvider.\n * \n * @returns The Hsafa context value with actions, components, and configuration\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const { registerAction, baseUrl } = useHsafa();\n * \n * useEffect(() => {\n * const unregister = registerAction('myAction', async (params) => {\n * console.log('Action called with:', params);\n * return { success: true };\n * });\n * \n * return unregister;\n * }, [registerAction]);\n * \n * return <div>My Component</div>;\n * }\n * ```\n */\nexport function useHsafa(): HsafaContextValue {\n const ctx = useContext(HsafaContext);\n if (!ctx) return {\n baseUrl: undefined,\n actions: new Map(),\n components: new Map(),\n registerAction: () => () => undefined,\n unregisterAction: () => undefined,\n registerComponent: () => () => undefined,\n unregisterComponent: () => undefined,\n isAnyStreaming: false,\n setStreamingState: () => undefined,\n isAnyChatOpen: false,\n setChatOpenState: () => undefined,\n };\n return ctx;\n}\n","import React from 'react';\n\nexport interface IconWrapperProps {\n IconComponent: any;\n [key: string]: any;\n}\n\n/**\n * React 19 compatibility wrapper for Lucide icons\n */\nexport function IconWrapper({ IconComponent, ...props }: IconWrapperProps) {\n return React.createElement(IconComponent, props);\n}\n","import React from 'react';\nimport { ThemeColors } from '../utils/chat-theme';\n\ninterface IconButtonProps {\n icon: React.ReactNode;\n onClick: () => void;\n ariaLabel: string;\n resolvedColors: ThemeColors;\n disabled?: boolean;\n title?: string;\n}\n\nexport function IconButton({\n icon,\n onClick,\n ariaLabel,\n resolvedColors,\n disabled = false,\n title\n}: IconButtonProps) {\n return (\n <button\n aria-label={ariaLabel}\n title={title}\n disabled={disabled}\n style={{\n backgroundColor: 'transparent',\n color: resolvedColors.mutedTextColor,\n border: 'none',\n borderRadius: '8px',\n padding: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.5 : 1,\n transition: 'all 0.2s ease-out',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n }}\n onMouseEnter={(e) => {\n if (!disabled) {\n e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground;\n e.currentTarget.style.color = resolvedColors.textColor;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = resolvedColors.mutedTextColor;\n }}\n onClick={onClick}\n >\n {icon}\n </button>\n );\n}\n","import React from 'react';\nimport { Maximize2, Plus, History, ChevronRight } from 'lucide-react';\nimport { IconWrapper } from '../IconWrapper';\nimport { ThemeColors } from '../../utils/chat-theme';\nimport type { TranslationKeys } from '../../i18n/translations';\nimport { IconButton } from '../IconButton';\n\ninterface ChatHeaderProps {\n title: string;\n alwaysOpen: boolean;\n streaming: boolean;\n dir: string;\n resolvedColors: ThemeColors;\n onNew: () => void;\n onToggleHistory: () => void;\n onClose: () => void;\n historyBtnRef: React.RefObject<HTMLButtonElement>;\n t: (key: keyof TranslationKeys) => string;\n}\n\nexport function ChatHeader({\n title,\n alwaysOpen,\n streaming,\n dir,\n resolvedColors,\n onNew,\n onToggleHistory,\n onClose,\n historyBtnRef,\n t\n}: ChatHeaderProps) {\n return (\n <div style={{\n marginBottom: '24px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n direction: dir === 'rtl' ? 'rtl' : 'ltr'\n }}>\n <div style={{ minWidth: '0' }}>\n <h1\n title={title}\n style={{\n color: resolvedColors.textColor,\n fontSize: '18px',\n fontWeight: '600',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n margin: '0'\n }}\n >\n {title}\n </h1>\n </div>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n position: 'relative',\n color: resolvedColors.mutedTextColor\n }}>\n \n \n <IconButton\n icon={<IconWrapper IconComponent={Plus} size=\"20\" strokeWidth=\"2\" />}\n onClick={() => { if (!streaming) onNew(); }}\n ariaLabel={t('header.new')}\n resolvedColors={resolvedColors}\n disabled={streaming}\n />\n \n <button\n ref={historyBtnRef}\n aria-label={t('header.history')}\n style={{ \n backgroundColor: 'transparent',\n color: resolvedColors.mutedTextColor,\n border: 'none',\n borderRadius: '8px',\n padding: '8px',\n cursor: 'pointer',\n transition: 'all 0.2s ease-out',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground;\n e.currentTarget.style.color = resolvedColors.textColor;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = resolvedColors.mutedTextColor;\n }}\n onClick={onToggleHistory}\n >\n <IconWrapper IconComponent={History} size=\"20\" strokeWidth=\"2\" />\n </button>\n \n {!alwaysOpen && (\n <IconButton\n icon={<IconWrapper IconComponent={ChevronRight} size=\"20\" strokeWidth=\"2\" style={{ transform: dir === 'rtl' ? 'rotate(180deg)' : 'none' }} />}\n onClick={onClose}\n ariaLabel={t('header.close')}\n resolvedColors={resolvedColors}\n />\n )}\n </div>\n </div>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\n\nexport interface MermaidDiagramProps {\n chart: string;\n theme: 'light' | 'dark';\n}\n\n/**\n * Simple MermaidDiagram component for SDK use\n */\nexport function MermaidDiagram({ chart, theme }: MermaidDiagramProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let mounted = true;\n \n const renderMermaid = async () => {\n try {\n setLoading(true);\n setError(null);\n \n // Dynamic import to avoid SSR issues - only try if mermaid is available\n let mermaid: any;\n try {\n mermaid = await import('mermaid');\n } catch {\n throw new Error('Mermaid library not available');\n }\n \n if (!mounted) return;\n \n // Configure mermaid\n mermaid.default?.initialize({\n startOnLoad: false,\n theme: theme === 'dark' ? 'dark' : 'default',\n themeVariables: {\n darkMode: theme === 'dark',\n primaryColor: theme === 'dark' ? '#3B82F6' : '#1D4ED8',\n primaryTextColor: theme === 'dark' ? '#F3F4F6' : '#1F2937',\n primaryBorderColor: theme === 'dark' ? '#374151' : '#D1D5DB',\n },\n flowchart: { useMaxWidth: true },\n sequence: { useMaxWidth: true },\n gantt: { useMaxWidth: true },\n });\n \n if (containerRef.current && mounted) {\n const id = `mermaid-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n const { svg } = await mermaid.default.render(id, chart);\n \n if (containerRef.current && mounted) {\n containerRef.current.innerHTML = svg;\n const svgElement = containerRef.current.querySelector('svg');\n if (svgElement) {\n svgElement.style.maxWidth = '100%';\n svgElement.style.height = 'auto';\n svgElement.style.display = 'block';\n }\n }\n }\n } catch (err) {\n if (mounted) {\n setError(err instanceof Error ? err.message : 'Failed to render diagram');\n }\n } finally {\n if (mounted) {\n setLoading(false);\n }\n }\n };\n \n renderMermaid();\n \n return () => { mounted = false; };\n }, [chart, theme]);\n \n const borderColor = theme === 'dark' ? '#374151' : '#D1D5DB';\n const bgColor = theme === 'dark' ? '#1F2937' : '#F9FAFB';\n const errorBg = theme === 'dark' ? '#7F1D1D' : '#FEF2F2';\n const errorText = theme === 'dark' ? '#FCA5A5' : '#DC2626';\n const loadingText = theme === 'dark' ? '#9CA3AF' : '#6B7280';\n \n if (error) {\n return (\n <div style={{\n borderRadius: '12px',\n border: `1px solid ${borderColor}`,\n backgroundColor: errorBg,\n padding: '16px',\n margin: '8px 0'\n }}>\n <div style={{\n fontSize: '14px',\n color: errorText,\n marginBottom: '8px',\n fontWeight: '500'\n }}>\n Failed to render diagram\n </div>\n <div style={{\n fontSize: '12px',\n color: errorText,\n opacity: 0.8\n }}>\n {error}\n </div>\n </div>\n );\n }\n \n return (\n <div style={{\n borderRadius: '12px',\n border: `1px solid ${borderColor}`,\n backgroundColor: bgColor,\n padding: '16px',\n margin: '8px 0',\n overflow: 'hidden'\n }}>\n {loading && (\n <div style={{\n fontSize: '14px',\n color: loadingText,\n textAlign: 'center',\n padding: '32px'\n }}>\n Rendering diagram...\n </div>\n )}\n <div \n ref={containerRef}\n style={{\n display: loading ? 'none' : 'block',\n textAlign: 'center',\n minHeight: loading ? '0' : '50px'\n }}\n />\n </div>\n );\n}\n","/**\n * Markdown rendering utilities for the HsafaChat component\n */\n\n/**\n * Escape HTML characters\n */\nexport function escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Apply inline formatting (links, bold, italic, code)\n */\nexport function inlineFormat(s: string): string {\n s = s.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline; color: inherit; opacity: 0.8;\">$1</a>');\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n s = s.replace(/\\*([^*\\n]+)\\*/g, '<em>$1</em>');\n s = s.replace(/`([^`]+)`/g, '<code style=\"padding: 2px 4px; border-radius: 4px; background-color: rgba(0,0,0,0.1); font-family: monospace;\">$1</code>');\n return s;\n}\n\n/**\n * Render markdown to HTML with mermaid detection\n */\nexport function renderMarkdownToHtmlSafe(input: string, theme: 'light' | 'dark' = 'dark'): { html: string; hasMermaid: boolean } {\n const lines = (input || '').replace(/\\r\\n/g, '\\n').split('\\n');\n let html = '';\n let inCode = false;\n let codeLang = '';\n let codeBuffer: string[] = [];\n let inUl = false;\n let inOl = false;\n let hasMermaid = false;\n\n const borderColor = theme === 'dark' ? '#374151' : '#D1D5DB';\n const bgColor = theme === 'dark' ? '#1F2937' : '#F9FAFB';\n const codeBlockBg = theme === 'dark' ? '#111827' : '#F3F4F6';\n const codeTextColor = theme === 'dark' ? '#E5E7EB' : '#374151';\n\n const closeLists = () => {\n if (inUl) { html += '</ul>'; inUl = false; }\n if (inOl) { html += '</ol>'; inOl = false; }\n };\n\n for (let i = 0; i < lines.length; i++) {\n let raw = lines[i];\n const fenceMatch = raw.match(/^```\\s*(\\w+)?\\s*$/);\n \n if (fenceMatch) {\n if (!inCode) {\n closeLists();\n inCode = true;\n codeLang = fenceMatch[1] ? String(fenceMatch[1]) : '';\n codeBuffer = [];\n } else {\n // Check if this is a mermaid diagram\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n inCode = false;\n codeLang = '';\n codeBuffer = [];\n }\n continue;\n }\n\n if (inCode) {\n codeBuffer.push(raw);\n continue;\n }\n\n // Horizontal rules\n if (/^\\s*(---|\\*\\*\\*|___)\\s*$/.test(raw)) {\n closeLists();\n html += '<hr style=\"margin: 12px 0; opacity: 0.6; border: none; border-top: 1px solid currentColor;\" />';\n continue;\n }\n\n // Headers\n const h = raw.match(/^(#{1,6})\\s+(.+)$/);\n if (h) {\n closeLists();\n const level = h[1].length;\n const content = inlineFormat(escapeHtml(h[2].trim()));\n const size = level <= 2 ? '18px' : level === 3 ? '16px' : '14px';\n html += `<h${level} style=\"font-size: ${size}; font-weight: 600; margin: 8px 0 4px 0;\">${content}</h${level}>`;\n continue;\n }\n\n // Lists\n const ulItem = raw.match(/^\\s*[-*]\\s+(.+)$/);\n const olItem = raw.match(/^\\s*\\d+\\.\\s+(.+)$/);\n if (ulItem) {\n if (!inUl) { closeLists(); html += '<ul style=\"list-style-type: disc; padding-left: 24px; margin: 4px 0;\">'; inUl = true; }\n const content = inlineFormat(escapeHtml(ulItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n if (olItem) {\n if (!inOl) { closeLists(); html += '<ol style=\"list-style-type: decimal; padding-left: 24px; margin: 4px 0;\">'; inOl = true; }\n const content = inlineFormat(escapeHtml(olItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n\n // Empty lines\n if (raw.trim().length === 0) {\n closeLists();\n html += '<div style=\"height: 8px;\"></div>';\n } else {\n closeLists();\n const content = inlineFormat(escapeHtml(raw));\n html += `<p style=\"line-height: 1.6; margin: 4px 0; word-break: break-word;\">${content}</p>`;\n }\n }\n\n // Handle unclosed code blocks\n if (inCode) {\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n }\n if (inUl) html += '</ul>';\n if (inOl) html += '</ol>';\n \n return { html, hasMermaid };\n}\n","import React, { useMemo } from 'react';\nimport { MermaidDiagram } from './MermaidDiagram';\nimport { escapeHtml } from '../utils/markdown';\n\nfunction inlineFormat(s: string) {\n s = s.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline; color: inherit; opacity: 0.8;\">$1</a>');\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n s = s.replace(/\\*([^*\\n]+)\\*/g, '<em>$1</em>');\n s = s.replace(/`([^`]+)`/g, '<code style=\"padding: 2px 4px; border-radius: 4px; background-color: rgba(0,0,0,0.1); font-family: monospace;\">$1</code>');\n return s;\n}\n\nfunction renderMarkdownToHtmlSafe(input: string, theme: 'light' | 'dark' = 'dark'): { html: string; hasMermaid: boolean } {\n const lines = (input || '').replace(/\\r\\n/g, '\\n').split('\\n');\n let html = '';\n let inCode = false;\n let codeLang = '';\n let codeBuffer: string[] = [];\n let inUl = false;\n let inOl = false;\n let hasMermaid = false;\n\n const borderColor = theme === 'dark' ? '#374151' : '#D1D5DB';\n const bgColor = theme === 'dark' ? '#1F2937' : '#F9FAFB';\n const codeBlockBg = theme === 'dark' ? '#111827' : '#F3F4F6';\n const codeTextColor = theme === 'dark' ? '#E5E7EB' : '#374151';\n const tableHeaderBg = theme === 'dark' ? '#374151' : '#F3F4F6';\n const tableHeaderTextColor = theme === 'dark' ? '#F9FAFB' : '#111827';\n\n const closeLists = () => {\n if (inUl) { html += '</ul>'; inUl = false; }\n if (inOl) { html += '</ol>'; inOl = false; }\n };\n\n // Helpers for table parsing\n const nextNonEmptyIndex = (start: number) => {\n for (let k = start; k < lines.length; k++) {\n if (lines[k].trim().length > 0) return k;\n }\n return -1;\n };\n\n const splitTableCells = (rawLine: string) => {\n const trimmed = rawLine.trim();\n const line = trimmed.startsWith('|') ? trimmed.slice(1) : trimmed;\n const sanitized = line.endsWith('|') ? line.slice(0, -1) : line;\n return sanitized.split('|').map(c => c.trim());\n };\n\n const isTableHeaderRow = (rawLine: string) => {\n const t = rawLine.trim();\n if (!t.startsWith('|')) return false;\n const cells = splitTableCells(t);\n return cells.length >= 2 && cells.some(c => c.length > 0);\n };\n\n const isSeparatorRow = (rawLine: string) => {\n const cells = splitTableCells(rawLine);\n if (cells.length === 0) return false;\n return cells.every(c => /^:?-{3,}:?$/.test(c));\n };\n\n const alignmentFromSep = (cell: string): 'left' | 'center' | 'right' => {\n const hasLeft = cell.startsWith(':');\n const hasRight = cell.endsWith(':');\n if (hasLeft && hasRight) return 'center';\n if (!hasLeft && hasRight) return 'right';\n return 'left';\n };\n\n const parseTableBlock = (startIndex: number): { tableHtml: string; endIndex: number } => {\n const headerIdx = startIndex;\n const sepIdx = nextNonEmptyIndex(headerIdx + 1);\n if (sepIdx === -1) {\n return { tableHtml: '', endIndex: startIndex };\n }\n const headerCells = splitTableCells(lines[headerIdx]);\n const sepCells = splitTableCells(lines[sepIdx]);\n const colCount = Math.max(headerCells.length, sepCells.length);\n const aligns: Array<'left' | 'center' | 'right'> = [];\n for (let i = 0; i < colCount; i++) {\n const cell = sepCells[i] || '---';\n aligns.push(alignmentFromSep(cell));\n }\n\n const rows: string[][] = [];\n let k = sepIdx + 1;\n while (k < lines.length) {\n const t = lines[k].trim();\n if (t.length === 0) { k++; continue; }\n if (!t.startsWith('|')) break;\n const cells = splitTableCells(lines[k]);\n const normalized: string[] = [];\n for (let i = 0; i < colCount; i++) {\n normalized.push(cells[i] ?? '');\n }\n rows.push(normalized);\n k++;\n }\n\n // Build table HTML\n let tableHtml = `<div style=\"overflow: auto; max-width: 100%; max-height: 60vh; border-radius: 10px; margin: 8px 0;\"> \n<table style=\"width: 100%; min-width: max-content; border-collapse: separate; border-spacing: 0; margin: 0;\">`;\n // Header\n tableHtml += '<thead><tr>';\n for (let i = 0; i < colCount; i++) {\n const content = inlineFormat(escapeHtml(headerCells[i] ?? ''));\n const textAlign = aligns[i];\n const isFirst = i === 0;\n const isLast = i === colCount - 1;\n const radiusStyles = `${isFirst ? 'border-top-left-radius: 10px;' : ''}${isLast ? 'border-top-right-radius: 10px;' : ''}`;\n tableHtml += `<th style=\"text-align: ${textAlign}; padding: 10px 12px; border-bottom: 1px solid ${borderColor}; background-color: ${tableHeaderBg}; color: ${tableHeaderTextColor}; position: sticky; top: 0; z-index: 1; ${radiusStyles}\">${content}</th>`;\n }\n tableHtml += '</tr></thead>';\n // Body\n tableHtml += '<tbody>';\n for (const row of rows) {\n tableHtml += '<tr>';\n for (let i = 0; i < colCount; i++) {\n const content = inlineFormat(escapeHtml(row[i] ?? ''));\n const textAlign = aligns[i];\n const isFirst = i === 0;\n const isLast = i === colCount - 1;\n tableHtml += `<td style=\"text-align: ${textAlign}; padding: 10px 12px; border-bottom: 1px solid ${borderColor}; ${isFirst ? `border-left: 1px solid ${borderColor};` : ''} border-right: 1px solid ${borderColor};\">${content}</td>`;\n }\n tableHtml += '</tr>';\n }\n tableHtml += '</tbody></table></div>';\n\n return { tableHtml, endIndex: k - 1 };\n };\n\n for (let i = 0; i < lines.length; i++) {\n let raw = lines[i];\n const fenceMatch = raw.match(/^```\\s*(\\w+)?\\s*$/);\n \n if (fenceMatch) {\n if (!inCode) {\n closeLists();\n inCode = true;\n codeLang = fenceMatch[1] ? String(fenceMatch[1]) : '';\n codeBuffer = [];\n } else {\n // Check if this is a mermaid diagram\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n inCode = false;\n codeLang = '';\n codeBuffer = [];\n }\n continue;\n }\n\n if (inCode) {\n codeBuffer.push(raw);\n continue;\n }\n\n // Horizontal rules\n if (/^\\s*(---|\\*\\*\\*|___)\\s*$/.test(raw)) {\n closeLists();\n html += '<hr style=\"margin: 12px 0; opacity: 0.6; border: none; border-top: 1px solid currentColor;\" />';\n continue;\n }\n\n // Headers\n const h = raw.match(/^(#{1,6})\\s+(.+)$/);\n if (h) {\n closeLists();\n const level = h[1].length;\n const content = inlineFormat(escapeHtml(h[2].trim()));\n const size = level <= 2 ? '18px' : level === 3 ? '16px' : '14px';\n html += `<h${level} style=\"font-size: ${size}; font-weight: 600; margin: 8px 0 4px 0;\">${content}</h${level}>`;\n continue;\n }\n\n // Tables (GitHub-style)\n if (isTableHeaderRow(raw)) {\n const sepIdx = nextNonEmptyIndex(i + 1);\n if (sepIdx !== -1 && isSeparatorRow(lines[sepIdx])) {\n closeLists();\n const { tableHtml, endIndex } = parseTableBlock(i);\n if (tableHtml) {\n html += tableHtml;\n i = endIndex;\n continue;\n }\n }\n }\n\n // Lists\n const ulItem = raw.match(/^\\s*[-*]\\s+(.+)$/);\n const olItem = raw.match(/^\\s*\\d+\\.\\s+(.+)$/);\n if (ulItem) {\n if (!inUl) { closeLists(); html += '<ul style=\"list-style-type: disc; padding-left: 24px; margin: 4px 0;\">'; inUl = true; }\n const content = inlineFormat(escapeHtml(ulItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n if (olItem) {\n if (!inOl) { closeLists(); html += '<ol style=\"list-style-type: decimal; padding-left: 24px; margin: 4px 0;\">'; inOl = true; }\n const content = inlineFormat(escapeHtml(olItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n\n // Empty lines\n if (raw.trim().length === 0) {\n closeLists();\n html += '<div style=\"height: 8px;\"></div>';\n } else {\n closeLists();\n const content = inlineFormat(escapeHtml(raw));\n html += `<p style=\"line-height: 1.6; margin: 4px 0; word-break: break-word;\">${content}</p>`;\n }\n }\n\n // Handle unclosed code blocks\n if (inCode) {\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n }\n if (inUl) html += '</ul>';\n if (inOl) html += '</ol>';\n \n return { html, hasMermaid };\n}\n\n// Markdown component that handles both regular markdown and mermaid diagrams\nexport function MarkdownRendererWithMermaid({ content, theme }: { content: string; theme: 'light' | 'dark' }) {\n const { html, hasMermaid } = useMemo(() => renderMarkdownToHtmlSafe(content, theme), [content, theme]);\n \n if (!hasMermaid) {\n return (\n <div\n style={{\n fontSize: '14px',\n lineHeight: '1.6',\n wordBreak: 'break-word',\n maxWidth: '100%',\n overflow: 'hidden'\n }}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n }\n\n // Parse HTML and replace mermaid placeholders with components\n const parts = html.split(/(<div class=\"mermaid-placeholder\"[^>]*><\\/div>)/g);\n const elements: React.ReactNode[] = [];\n \n parts.forEach((part, index) => {\n if (part.includes('mermaid-placeholder')) {\n // Extract mermaid code from data attribute\n const match = part.match(/data-mermaid=\"([^\"]*)\"/); \n if (match) {\n const mermaidCode = match[1]\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/&/g, '&')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n \n elements.push(\n React.createElement(MermaidDiagram, {\n key: `mermaid-${index}`,\n chart: mermaidCode,\n theme: theme\n })\n );\n }\n } else if (part.trim()) {\n // Regular HTML content\n elements.push(\n React.createElement('div', {\n key: `html-${index}`,\n style: {\n fontSize: '14px',\n lineHeight: '1.6',\n wordBreak: 'break-word',\n maxWidth: '100%',\n overflow: 'hidden'\n },\n dangerouslySetInnerHTML: { __html: part }\n })\n );\n }\n });\n\n return React.createElement(React.Fragment, {}, ...elements);\n}\n","import React from \"react\";\nimport { MarkdownRendererWithMermaid } from \"../MarkdownRendererWithMermaid\";\n\ntype ThemeColors = {\n mutedTextColor: string;\n inputBackground: string;\n borderColor: string;\n textColor: string;\n};\n\ninterface ReasoningAndToolsProps {\n parts: any[];\n messageId: string;\n openReasoningIds: Set<string>;\n toggleReasoning: (id: string) => void;\n resolvedColors: ThemeColors;\n}\n\nconst getToolStatus = (state?: string) => {\n const statusMap: Record<string, { color: string; text: string }> = {\n 'input-streaming': { color: '#eab308', text: 'Inputting' },\n 'input-available': { color: '#3b82f6', text: 'Running' },\n 'error': { color: '#ef4444', text: 'Error' },\n 'output-available': { color: '#10b981', text: 'Called' },\n 'finished': { color: '#10b981', text: 'Called' }\n };\n return statusMap[state || 'output-available'] || statusMap['output-available'];\n};\n\n\nexport function ReasoningAndTools({ parts, messageId, openReasoningIds, toggleReasoning, resolvedColors }: ReasoningAndToolsProps) {\n const groups: Array<\n { type: 'reasoning'; texts: string[]; startDate?: number; endDate?: number; isCompleted?: boolean } |\n { type: 'tool'; toolName?: string; status?: string; input?: any; output?: any; startDate?: number; endDate?: number }\n > = [];\n\n let currentReasonings: string[] = [];\n let reasoningStartDate: number | undefined;\n let reasoningEndDate: number | undefined;\n let reasoningCompleted = false;\n\n for (const it of Array.isArray(parts) ? parts : []) {\n if (!it) continue;\n // Reasoning chunks\n if (it.type === 'reasoning' && typeof it.text === 'string') {\n currentReasonings.push(it.text);\n if (!reasoningStartDate) reasoningStartDate = it.startDate;\n reasoningEndDate = it.endDate;\n // Check if this reasoning part is marked as done\n if (it.state === 'done') {\n reasoningCompleted = true;\n }\n continue;\n }\n\n // Tool calls: support both \"tool-*\" and \"dynamic-tool\"\n const isDynamicTool = it.type === 'dynamic-tool';\n const isPrefixedTool = typeof it.type === 'string' && it.type.startsWith('tool-');\n if (isDynamicTool || isPrefixedTool || it.type === 'tool-call') {\n if (currentReasonings.length) {\n groups.push({ \n type: 'reasoning', \n texts: currentReasonings, \n startDate: reasoningStartDate, \n endDate: reasoningEndDate,\n isCompleted: reasoningCompleted\n });\n currentReasonings = [];\n reasoningStartDate = undefined;\n reasoningEndDate = undefined;\n reasoningCompleted = false;\n }\n\n const derivedToolName = isDynamicTool\n ? String(it.toolName || 'dynamic-tool')\n : isPrefixedTool\n ? String(it.type?.slice('tool-'.length) || 'tool')\n : String(it.toolName || 'tool');\n\n if (derivedToolName === 'getFromUser' || derivedToolName === 'get_from_user') {\n // Render a placeholder host so inline form mounts in the tool area\n groups.push({\n type: 'tool',\n toolName: derivedToolName,\n status: it.state || it.status,\n input: it.input,\n output: it.output,\n startDate: it.startDate,\n endDate: it.endDate,\n toolCallId: it.toolCallId,\n } as any);\n } else {\n groups.push({\n type: 'tool',\n toolName: derivedToolName,\n status: it.state || it.status, // Use 'state' field, fallback to 'status'\n input: it.input,\n output: it.output,\n startDate: it.startDate,\n endDate: it.endDate\n });\n }\n continue;\n }\n }\n\n if (currentReasonings.length) {\n groups.push({ \n type: 'reasoning', \n texts: currentReasonings, \n startDate: reasoningStartDate, \n endDate: reasoningEndDate,\n isCompleted: reasoningCompleted\n });\n }\n\n if (!groups.length) return null;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {groups.map((g, idx) => {\n const itemId = `${messageId}-${idx}`;\n const isOpen = openReasoningIds.has(itemId);\n\n if (g.type === 'reasoning') {\n const isCompleted = g.isCompleted || (typeof g.startDate === 'number' && typeof g.endDate === 'number');\n const hasText = g.texts && g.texts.length > 0 && g.texts.some(t => t.trim().length > 0);\n \n const handleClick = () => {\n if (hasText) {\n toggleReasoning(itemId);\n }\n };\n if (isCompleted && !hasText) {\n return null;\n }\n\n return (\n <div key={itemId} onClick={handleClick} style={{ cursor: hasText ? 'pointer' : 'default', padding: '0' }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n <div style={{ fontSize: '13px', color: resolvedColors.mutedTextColor, fontWeight: 500, display: 'flex', alignItems: 'center', gap: '6px', overflow: 'hidden', maxWidth: '100%', minWidth: 0, width: '100%' }}>\n \n <span style={{ display: 'inline-flex', alignItems: 'center', gap: '6px' }}>\n {!isCompleted && (\n <span style={{ display: 'inline-block', height: '6px', width: '6px', borderRadius: '50%', backgroundColor: resolvedColors.mutedTextColor, animation: 'pulse 1.5s ease-in-out infinite' }} />\n )}\n <span \n style={{ \n color: resolvedColors.textColor, \n fontWeight: 600, \n opacity: 0.9,\n background: !isCompleted ? `linear-gradient(90deg, ${resolvedColors.textColor}, ${resolvedColors.mutedTextColor}, ${resolvedColors.mutedTextColor})` : 'none',\n backgroundSize: !isCompleted ? '200% 100%' : 'auto',\n backgroundClip: !isCompleted ? 'text' : 'unset',\n WebkitBackgroundClip: !isCompleted ? 'text' : 'unset',\n WebkitTextFillColor: !isCompleted? 'transparent' : resolvedColors.mutedTextColor,\n animation: !isCompleted ? 'shimmer 2s ease-in-out infinite' : undefined\n }}\n >\n {isCompleted ? 'Finish Thinking' : 'Thinking'}\n </span>\n </span>\n \n {hasText && (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0, transform: isOpen ? 'rotate(90deg)' : 'rotate(0deg)', transition: 'transform 0.2s ease-out' }}>\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n )}\n </div>\n <div style={{ display: 'grid', gridTemplateRows: (isOpen || !isCompleted) ? '1fr' : '0fr', transition: 'grid-template-rows 0.2s ease-out', overflow: 'hidden' }}>\n <div style={{ minHeight: 0 }}>\n {g.texts && g.texts.length > 0 ? (\n <div style={{ fontSize: '13px', color: resolvedColors.mutedTextColor, lineHeight: '1.6', maxWidth: '100%' }}>\n {/* While expanded and streaming, show all reasoning; otherwise, show only the latest or all if completed and expanded */}\n {(\n (!isCompleted && isOpen)\n ? g.texts\n : (!isCompleted\n ? [g.texts[g.texts.length - 1]]\n : (isOpen ? g.texts : [])\n )\n ).map((t, i2) => (\n <div key={`rg-line-${idx}-${i2}`} style={{ marginBottom: '6px' }}>\n <MarkdownRendererWithMermaid content={t} theme={'dark'} />\n </div>\n ))}\n </div>\n ) : (\n <div style={{ fontSize: '12px', color: resolvedColors.mutedTextColor, opacity: 0.7, display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span style={{ display: 'inline-block', height: '6px', width: '6px', borderRadius: '50%', backgroundColor: resolvedColors.mutedTextColor, animation: 'pulse 1.5s ease-in-out infinite' }} />\n <span style={{ letterSpacing: '2px', animation: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite' }}>...</span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n const { color, text } = getToolStatus(g.status);\n const isRunning = g.status === 'input-streaming' || g.status === 'input-available';\n \n const isGetFromUser = g.toolName === 'getFromUser' || g.toolName === 'get_from_user';\n return (\n <div key={itemId} style={{ display: 'flex', gap: '12px', position: 'relative' }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: '13px', color: resolvedColors.mutedTextColor, display: 'flex', alignItems: 'center', gap: '8px', flexWrap: 'wrap' }}>\n <span style={{ \n fontWeight: 600, \n color,\n display: 'flex',\n alignItems: 'center',\n gap: '6px'\n }}>\n <span style={{ \n display: 'inline-block', \n height: '6px', \n width: '6px', \n borderRadius: '50%', \n backgroundColor: color,\n animation: isRunning ? 'pulse 1.5s ease-in-out infinite' : undefined\n }} />\n {text}\n </span>\n <span style={{ fontWeight: 500, color: resolvedColors.textColor }}>{g.toolName || 'tool'}</span>\n </div>\n {isGetFromUser ? (\n <div style={{ marginTop: '8px' }}>\n <div \n data-get-from-user-host={(g as any).toolCallId || itemId}\n style={{\n width: '100%',\n }}\n />\n </div>\n ) : null}\n </div>\n </div>\n );\n })}\n <style>\n {`\n @keyframes shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n }\n `}\n </style>\n </div>\n );\n}\n\n\n","import React from \"react\";\nimport { MarkdownRendererWithMermaid } from \"../MarkdownRendererWithMermaid\";\n\ntype ThemeColors = {\n textColor: string;\n mutedTextColor: string;\n borderColor: string;\n cardBackground: string;\n};\n\ninterface FinalResponseProps {\n items: any[] | undefined;\n resolvedColors: ThemeColors;\n UIComponents?: Record<string, React.ComponentType<any>>;\n}\n\nexport function FinalResponse({ items, resolvedColors, UIComponents = {} }: FinalResponseProps) {\n if (!Array.isArray(items) || items.length === 0) return null;\n\n return (\n <div style={{ }}>\n <div style={{ margin: 0, color: resolvedColors.textColor, display: 'flex', flexDirection: 'column', gap: '12px' }}>\n {items.map((item, i) => {\n // Check if item is a UI component object\n if (typeof item === 'object' && item !== null && item.type === 'ui') {\n const { component: componentName, props } = item;\n \n // Look up the component in the passed UIComponents prop\n const Component = UIComponents[componentName];\n \n if (Component) {\n // Render the custom component\n return (\n <div key={i} style={{ \n padding: '16px', \n borderRadius: '12px',\n backgroundColor: resolvedColors.cardBackground,\n border: `1px solid ${resolvedColors.borderColor}`\n }}>\n <Component props={props} resolvedColors={resolvedColors} />\n </div>\n );\n } else {\n return (\n <div></div>\n );\n }\n }\n \n // For plain text items, render as markdown\n const text = typeof item === 'string' ? item : JSON.stringify(item);\n return (\n <div key={i} style={{ whiteSpace: 'pre-wrap', lineHeight: 1.6 }}>\n <MarkdownRendererWithMermaid content={text} theme={'dark'} />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n\n","/**\n * File utility functions for the HsafaChat component\n */\n\n/**\n * Format bytes to human-readable format\n */\nexport function formatBytes(bytes: number): string {\n if (!bytes || Number.isNaN(bytes)) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const exponent = Math.min(units.length - 1, Math.floor(Math.log(bytes) / Math.log(1024)));\n const value = bytes / Math.pow(1024, exponent);\n return `${value.toFixed(exponent === 0 ? 0 : 1)} ${units[exponent]}`;\n}\n\n/**\n * Join URL paths safely\n */\nexport function joinUrl(baseUrl: string | undefined, path: string): string {\n if (!baseUrl) return path;\n const a = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const b = path.startsWith('/') ? path : `/${path}`;\n return `${a}${b}`;\n}\n","import React from 'react';\nimport { File, Eye, X, Download } from 'lucide-react';\nimport { IconWrapper } from './IconWrapper';\nimport { Attachment } from '../types/chat';\nimport { formatBytes } from '../utils/file';\nimport { ThemeColors } from '../utils/chat-theme';\n\ninterface AttachmentItemProps {\n attachment: Attachment;\n resolvedColors: ThemeColors;\n mode: 'editable' | 'viewable' | 'input';\n onRemove?: (id: string) => void;\n maxWidth?: string;\n}\n\nexport function AttachmentItem({\n attachment,\n resolvedColors,\n mode,\n onRemove,\n maxWidth = '200px'\n}: AttachmentItemProps) {\n const isImage = attachment.mimeType?.startsWith('image/');\n const isEditable = mode === 'editable' || mode === 'input';\n const isLink = mode === 'viewable';\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: mode === 'input' ? '8px' : '6px',\n padding: mode === 'input' ? '8px 12px' : '6px 10px',\n backgroundColor: resolvedColors.inputBackground,\n borderRadius: mode === 'input' ? '10px' : '8px',\n border: `1px solid ${resolvedColors.borderColor}`,\n fontSize: mode === 'input' ? '12px' : '11px',\n color: resolvedColors.textColor,\n transition: 'all 0.2s ease-out',\n cursor: isLink ? 'pointer' : 'default',\n maxWidth: mode === 'input' ? '140px' : maxWidth,\n position: 'relative'\n };\n\n const content = (\n <>\n {/* Thumbnail or icon */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: mode === 'input' ? '20px' : '16px',\n height: mode === 'input' ? '20px' : '16px',\n borderRadius: mode === 'input' ? '4px' : '3px',\n backgroundColor: isImage ? 'transparent' : resolvedColors.accentColor,\n flexShrink: 0\n }}>\n {isImage ? (\n <img \n src={attachment.url} \n alt={attachment.name}\n style={{\n width: mode === 'input' ? '20px' : '16px',\n height: mode === 'input' ? '20px' : '16px',\n borderRadius: mode === 'input' ? '4px' : '3px',\n objectFit: 'cover'\n }}\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n const fileIcon = (e.target as HTMLImageElement).nextElementSibling as HTMLElement;\n if (fileIcon) fileIcon.style.display = 'block';\n }}\n />\n ) : null}\n <IconWrapper IconComponent={File}\n size={mode === 'input' ? 14 : 10} \n strokeWidth=\"2\" \n style={{ \n display: isImage ? 'none' : 'block',\n color: resolvedColors.mutedTextColor \n }} \n />\n </div>\n \n {/* File name and size */}\n <div style={{\n minWidth: '0',\n flex: '1',\n display: 'flex',\n flexDirection: 'column'\n }}>\n <span \n title={attachment.name}\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontWeight: '500'\n }}\n >\n {attachment.name}\n </span>\n <span style={{\n fontSize: mode === 'input' ? '10px' : '9px',\n color: resolvedColors.mutedTextColor,\n marginTop: mode === 'input' ? '2px' : '1px'\n }}>\n {formatBytes(attachment.size)}\n </span>\n </div>\n \n {/* Action buttons */}\n {mode === 'input' && isImage && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n window.open(attachment.url, '_blank');\n }}\n style={{\n background: 'none',\n border: 'none',\n color: resolvedColors.mutedTextColor,\n cursor: 'pointer',\n padding: '2px',\n display: 'flex',\n alignItems: 'center',\n borderRadius: '4px',\n transition: 'all 0.2s'\n }}\n title=\"Preview image\"\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground;\n e.currentTarget.style.color = resolvedColors.textColor;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = resolvedColors.mutedTextColor;\n }}\n >\n <IconWrapper IconComponent={Eye} size=\"12\" strokeWidth=\"2\" />\n </button>\n )}\n \n {isEditable && onRemove && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove(attachment.id);\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: mode === 'input' ? 'auto' : '16px',\n height: mode === 'input' ? 'auto' : '16px',\n padding: mode === 'input' ? '2px' : '0',\n borderRadius: '4px',\n border: 'none',\n backgroundColor: 'transparent',\n color: resolvedColors.mutedTextColor,\n cursor: 'pointer',\n transition: 'all 0.2s',\n flexShrink: 0\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#ef444420';\n e.currentTarget.style.color = '#ef4444';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = resolvedColors.mutedTextColor;\n }}\n >\n <IconWrapper IconComponent={X} size=\"12\" strokeWidth=\"2\" />\n </button>\n )}\n \n {isLink && (\n <IconWrapper IconComponent={Download}\n size=\"10\" \n strokeWidth=\"2\" \n style={{ \n color: resolvedColors.mutedTextColor,\n flexShrink: 0\n }} \n />\n )}\n </>\n );\n\n if (isLink) {\n return (\n <a\n href={attachment.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{\n ...containerStyle,\n textDecoration: 'none'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground;\n e.currentTarget.style.borderColor = resolvedColors.primaryColor;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = resolvedColors.inputBackground;\n e.currentTarget.style.borderColor = resolvedColors.borderColor;\n }}\n >\n {content}\n </a>\n );\n }\n\n return <div style={containerStyle}>{content}</div>;\n}\n","import React from 'react';\nimport { Attachment } from '../types/chat';\nimport { ThemeColors } from '../utils/chat-theme';\nimport { AttachmentItem } from './AttachmentItem';\n\ninterface AttachmentDisplayProps {\n attachments: Attachment[];\n resolvedColors: ThemeColors;\n onRemove?: (id: string) => void;\n}\n\nexport function AttachmentDisplay({ attachments, resolvedColors, onRemove }: AttachmentDisplayProps) {\n if (!Array.isArray(attachments) || attachments.length === 0) {\n return null;\n }\n\n const mode = typeof onRemove === 'function' ? 'editable' : 'viewable';\n\n return (\n <div style={{\n marginTop: '12px',\n display: 'flex',\n flexWrap: 'wrap',\n gap: '8px'\n }}>\n {attachments.map((att) => (\n <AttachmentItem\n key={att.id}\n attachment={att}\n resolvedColors={resolvedColors}\n mode={mode}\n onRemove={onRemove}\n />\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport { Plus } from 'lucide-react';\nimport { Attachment } from '../../types/chat';\nimport { AttachmentDisplay } from '../AttachmentDisplay';\n\ntype ThemeColors = {\n primaryColor: string;\n accentColor: string;\n textColor: string;\n mutedTextColor: string;\n borderColor: string;\n inputBackground: string;\n cardBackground: string;\n};\n\ninterface MessageEditorProps {\n messageId: string;\n initialText: string;\n editingText: string;\n onEditingTextChange: (text: string) => void;\n onCancel: () => void;\n onSave: (messageId: string, text: string) => void;\n streaming: boolean;\n resolvedColors: ThemeColors;\n attachments?: Attachment[];\n onRemoveAttachment?: (id: string) => void;\n onAddAttachments?: (files: FileList) => void;\n uploading?: boolean;\n t: (key: string) => string;\n}\n\nexport function MessageEditor({\n messageId,\n initialText,\n editingText,\n onEditingTextChange,\n onCancel,\n onSave,\n streaming,\n resolvedColors,\n attachments,\n onRemoveAttachment,\n onAddAttachments,\n uploading,\n t\n}: MessageEditorProps) {\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onCancel();\n } else if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (!streaming) {\n onSave(messageId, editingText || initialText);\n }\n }\n };\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0 && onAddAttachments) {\n onAddAttachments(files);\n }\n // Reset the input so the same file can be selected again\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n return (\n <div style={{\n maxWidth: '720px',\n borderRadius: '16px',\n padding: '8px',\n fontSize: '15px',\n border: `2px solid ${resolvedColors.primaryColor}`,\n backgroundColor: resolvedColors.accentColor,\n color: resolvedColors.textColor,\n marginBottom: '16px',\n marginTop: '16px'\n }}>\n <textarea\n autoFocus\n style={{\n width: '100%',\n resize: 'none',\n backgroundColor: 'transparent',\n padding: '8px',\n lineHeight: '1.6',\n outline: 'none',\n border: 'none',\n color: 'inherit',\n fontFamily: 'inherit',\n fontSize: 'inherit'\n }}\n rows={Math.max(2, Math.min(10, Math.ceil((editingText || initialText).length / 60)))}\n value={editingText}\n onChange={(e) => onEditingTextChange(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n \n {attachments && attachments.length > 0 && (\n <div style={{ padding: '8px' }}>\n <AttachmentDisplay\n attachments={attachments}\n resolvedColors={resolvedColors}\n onRemove={onRemoveAttachment}\n />\n </div>\n )}\n \n {uploading && (\n <div style={{\n padding: '8px 16px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '13px',\n color: resolvedColors.mutedTextColor\n }}>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ animation: 'spin 1s linear infinite' }}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n <span>{t('input.uploadingFiles')}</span>\n </div>\n )}\n \n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n padding: '8px 8px 8px 0'\n }}>\n {/* File upload button */}\n {onAddAttachments && (\n <div>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n onChange={handleFileChange}\n style={{ display: 'none' }}\n />\n <button\n onClick={() => fileInputRef.current?.click()}\n disabled={uploading || streaming}\n title={uploading ? t('input.uploadingFiles') : t('input.attachFiles')}\n style={{\n display: 'flex',\n margin: '0 10px',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '50%',\n width: '28px',\n height: '28px',\n transition: 'all 0.2s',\n border: `1px solid ${resolvedColors.borderColor}`,\n color: resolvedColors.mutedTextColor,\n backgroundColor: 'transparent',\n cursor: uploading || streaming ? 'not-allowed' : 'pointer',\n opacity: uploading || streaming ? 0.5 : 1\n }}\n onMouseEnter={(e) => {\n if (!uploading && !streaming) {\n e.currentTarget.style.backgroundColor = resolvedColors.inputBackground;\n e.currentTarget.style.borderColor = resolvedColors.primaryColor;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.borderColor = resolvedColors.borderColor;\n }}\n >\n <Plus size={16} strokeWidth={2} />\n </button>\n </div>\n )}\n \n {/* Action buttons container */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px'\n }}>\n <button\n style={{\n borderRadius: '8px',\n padding: '4px 12px',\n fontSize: '14px',\n transition: 'background-color 0.2s',\n border: `1px solid ${resolvedColors.borderColor}`,\n color: resolvedColors.mutedTextColor,\n backgroundColor: 'transparent',\n cursor: 'pointer'\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = resolvedColors.inputBackground}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = 'transparent'}\n onClick={onCancel}\n >\n {t('editor.cancel')}\n </button>\n <button\n style={{\n borderRadius: '8px',\n padding: '4px 12px',\n fontSize: '14px',\n transition: 'border-color 0.2s',\n border: `1px solid ${resolvedColors.borderColor}`,\n backgroundColor: resolvedColors.cardBackground,\n color: resolvedColors.textColor,\n cursor: 'pointer'\n }}\n onMouseEnter={(e) => e.currentTarget.style.borderColor = resolvedColors.primaryColor}\n onMouseLeave={(e) => e.currentTarget.style.borderColor = resolvedColors.borderColor}\n onClick={() => { if (!streaming) onSave(messageId, editingText || initialText); }}\n >\n {t('editor.saveAndRegenerate')}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { ReasoningAndTools } from \"./ReasoningAndTools\";\nimport { FinalResponse } from \"./FinalResponse\";\nimport { MessageEditor } from \"./MessageEditor\";\nimport { Attachment } from \"../../types/chat\";\nimport { AttachmentDisplay } from \"../AttachmentDisplay\";\n\ntype ThemeColors = {\n textColor: string;\n mutedTextColor: string;\n borderColor: string;\n accentColor: string;\n hoverBackground: string;\n inputBackground: string;\n cardBackground: string;\n primaryColor: string;\n backgroundColor: string;\n};\n\ninterface MessageListProps {\n chatMessages: any[];\n isLoading: boolean;\n openReasoningIds: Set<string>;\n toggleReasoning: (id: string) => void;\n resolvedColors: ThemeColors;\n t: (k: string) => string;\n onUserMessageClick: (id: string, text: string, attachments?: Attachment[]) => void;\n editingMessageId: string | null;\n editingText: string;\n onEditingTextChange: (text: string) => void;\n onCancelEdit: () => void;\n onSaveEdit: (messageId: string, text: string) => void;\n editAttachments?: Attachment[];\n onRemoveEditAttachment?: (id: string) => void;\n onAddEditAttachments?: (files: FileList) => void;\n editUploading?: boolean;\n UIComponents?: Record<string, React.ComponentType<any>>;\n}\n\nexport function MessageList({ \n chatMessages, \n isLoading, \n openReasoningIds, \n toggleReasoning, \n resolvedColors, \n t, \n onUserMessageClick,\n editingMessageId,\n editingText,\n onEditingTextChange,\n onCancelEdit,\n onSaveEdit,\n editAttachments,\n onRemoveEditAttachment,\n onAddEditAttachments,\n editUploading,\n UIComponents = {}\n}: MessageListProps) {\n return (\n <>\n <style>\n {`\n @keyframes jumpingDots {\n 0%, 80%, 100% { \n transform: translateY(0);\n }\n 40% { \n transform: translateY(-5px);\n }\n }\n `}\n </style>\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n \n }}>\n {chatMessages.map((m: any, i: number) => {\n const messageParts = Array.isArray(m.parts) ? m.parts : [];\n const messageText = messageParts\n .filter((p: any) => p.type === 'text')\n .map((p: any) => (p && typeof p.text === 'string' ? p.text : ''))\n .join('\\n');\n\n // Extract file and image attachments from message parts\n const messageAttachments: Attachment[] = messageParts\n .filter((p: any) => p.type === 'file' || p.type === 'image')\n .map((p: any) => {\n if (p.type === 'image') {\n const imgUrl = typeof p.image === 'string' ? p.image : p.image?.toString?.() || '';\n return {\n id: imgUrl || `${m.id}-img-${Date.now()}`,\n name: p.name || 'image',\n url: imgUrl,\n mimeType: p.mediaType || 'image/jpeg',\n size: p.size || 0\n };\n } else {\n return {\n id: p.url || `${m.id}-file-${Date.now()}`,\n name: p.name || 'file',\n url: p.url || '',\n mimeType: p.mediaType || 'application/octet-stream',\n size: p.size || 0\n };\n }\n });\n\n return (\n <div key={m.id} style={{ padding: '0 4px' }}>\n {m.role === 'user' ? (\n editingMessageId === m.id ? (\n <MessageEditor\n messageId={m.id}\n initialText={messageText}\n editingText={editingText}\n onEditingTextChange={onEditingTextChange}\n onCancel={onCancelEdit}\n onSave={onSaveEdit}\n streaming={isLoading}\n resolvedColors={resolvedColors}\n attachments={editAttachments}\n onRemoveAttachment={onRemoveEditAttachment}\n onAddAttachments={onAddEditAttachments}\n uploading={editUploading}\n t={t}\n />\n ) : (\n <div>\n <div\n title={t('editor.clickToEdit')}\n onClick={() => onUserMessageClick(m.id, messageText, messageAttachments)}\n style={{\n maxWidth: '720px',\n borderRadius: '16px',\n padding: '16px',\n fontSize: '15px',\n lineHeight: '1.6',\n whiteSpace: 'pre-wrap',\n cursor: 'pointer',\n transition: 'background-color 0.2s',\n backgroundColor: resolvedColors.accentColor,\n color: resolvedColors.textColor,\n marginBottom: '16px',\n marginTop: '16px'\n }}\n onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground)}\n onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = resolvedColors.accentColor)}\n >\n {messageText}\n {messageAttachments.length > 0 && (\n <AttachmentDisplay\n attachments={messageAttachments}\n resolvedColors={resolvedColors}\n />\n )}\n </div>\n </div>\n )\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\n {/* Reasoning + Tools from parts, supporting tool-* and dynamic-tool */}\n <ReasoningAndTools\n parts={messageParts}\n messageId={m.id}\n openReasoningIds={openReasoningIds}\n toggleReasoning={toggleReasoning}\n resolvedColors={resolvedColors}\n />\n\n {/* Final response list from data-final-response */}\n {(() => {\n const final = messageParts.find((p: any) => p.type === 'data-final-response' && p.data && Array.isArray(p.data.items));\n if (!final) return null;\n return (\n <FinalResponse items={final.data.items} resolvedColors={resolvedColors} UIComponents={UIComponents} />\n );\n })()}\n </div>\n )}\n </div>\n );\n })}\n\n {/* Jumping dots loading indicator - appears immediately after user submits */}\n {isLoading && (\n <div style={{ \n display: 'flex', \n alignItems: 'center', \n gap: '4px', \n padding: '0 4px',\n height: '20px'\n }}>\n <span \n style={{ \n display: 'inline-block', \n width: '4px', \n height: '4px', \n borderRadius: '50%', \n backgroundColor: resolvedColors.mutedTextColor,\n animation: 'jumpingDots 1s infinite ease-in-out',\n animationDelay: '0s'\n }} \n />\n <span \n style={{ \n display: 'inline-block', \n width: '4px', \n height: '4px', \n borderRadius: '50%', \n backgroundColor: resolvedColors.mutedTextColor,\n animation: 'jumpingDots 1s infinite ease-in-out',\n animationDelay: '0.2s'\n }} \n />\n <span \n style={{ \n display: 'inline-block', \n width: '4px', \n height: '4px', \n borderRadius: '50%', \n backgroundColor: resolvedColors.mutedTextColor,\n animation: 'jumpingDots 1s infinite ease-in-out',\n animationDelay: '0.4s'\n }} \n />\n </div>\n )}\n </div>\n </>\n );\n}\n\n\n","import React from \"react\";\n\ntype ThemeColors = {\n textColor: string;\n mutedTextColor: string;\n borderColor: string;\n inputBackground: string;\n cardBackground: string;\n primaryColor: string;\n};\n\ninterface ChatInputProps {\n input: string;\n setInput: (v: string) => void;\n textareaRef: React.RefObject<HTMLTextAreaElement>;\n fileInputRef: React.RefObject<HTMLInputElement>;\n isLoading: boolean;\n uploading: boolean;\n attachments: Array<{ id: string; name: string; url: string; mimeType: string; size: number }>;\n formatBytes: (n: number) => string;\n handleRemoveAttachment: (id: string) => void;\n onFileInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onSend: () => void;\n onStop: () => void;\n status?: 'ready' | 'streaming' | 'submitted' | 'error';\n t: (k: string) => string;\n resolvedColors: ThemeColors;\n}\n\nexport function ChatInput({ input, setInput, textareaRef, fileInputRef, isLoading, uploading, attachments, formatBytes, handleRemoveAttachment, onFileInputChange, onSend, onStop, status, t, resolvedColors }: ChatInputProps) {\n const canStop = status === 'streaming' || status === 'submitted';\n const hasMessages = attachments.length > 0 || input.trim().length > 0;\n\n return (\n <div style={{ position: 'sticky', bottom: '0', marginTop: 'auto', paddingBottom: '8px', paddingTop: '4px', }}>\n <div style={{ position: 'relative', flex: 1 }}>\n <div style={{ position: 'relative', width: '100%', borderRadius: '16px', paddingBottom: '48px', paddingTop: '16px', border: `1px solid ${resolvedColors.borderColor}`, backgroundColor: resolvedColors.cardBackground }}>\n {attachments.length > 0 && (\n <div style={{ padding: '0px 16px 12px 16px', display: 'flex', flexWrap: 'wrap', gap: '10px' }}>\n {attachments.map((att) => {\n const isImage = att.mimeType.startsWith('image/');\n return (\n <div key={att.id} style={{ display: 'flex', alignItems: 'center', gap: '8px', padding: '8px 12px', backgroundColor: resolvedColors.inputBackground, borderRadius: '10px', border: `1px solid ${resolvedColors.borderColor}`, fontSize: '12px', color: resolvedColors.textColor, position: 'relative' }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', width: '20px', height: '20px', borderRadius: '4px', backgroundColor: isImage ? 'transparent' : resolvedColors.cardBackground }}>\n {isImage ? (\n <img src={att.url} alt={att.name} style={{ width: '20px', height: '20px', borderRadius: '4px', objectFit: 'cover' }} />\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"20\" rx=\"2\" ry=\"2\" />\n </svg>\n )}\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', minWidth: 0, flex: 1 }}>\n <span title={att.name} style={{ maxWidth: '140px', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', fontWeight: 500 }}>{att.name}</span>\n <span style={{ color: resolvedColors.mutedTextColor, fontSize: '10px', marginTop: '2px' }}>{formatBytes(att.size)}</span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', marginLeft: '8px' }}>\n {isImage && (\n <a href={att.url} target=\"_blank\" rel=\"noopener noreferrer\" style={{ background: 'none', border: 'none', color: resolvedColors.mutedTextColor, cursor: 'pointer', padding: '2px', display: 'flex', alignItems: 'center', borderRadius: '4px', textDecoration: 'none' }} title={t('input.previewImage')}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n </a>\n )}\n <button onClick={() => handleRemoveAttachment(att.id)} style={{ background: 'none', border: 'none', color: resolvedColors.mutedTextColor, cursor: 'pointer', padding: '2px', display: 'flex', alignItems: 'center', borderRadius: '4px' }} title={t('input.removeFile')}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {uploading && (\n <div style={{\n padding: '0px 16px 12px 16px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '13px',\n color: resolvedColors.mutedTextColor\n }}>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ animation: 'spin 1s linear infinite' }}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n <span>{t('input.uploadingFiles')}</span>\n </div>\n )}\n\n <div style={{ padding: '0 16px' }}>\n <textarea\n ref={textareaRef}\n aria-label=\"Prompt\"\n rows={1}\n placeholder={t('input.placeholder')}\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n onSend();\n }\n }}\n disabled={isLoading || uploading}\n style={{\n height: '24px',\n maxHeight: '200px',\n width: '100%',\n resize: 'none',\n backgroundColor: 'transparent',\n fontSize: '15px',\n lineHeight: '1.6',\n outline: 'none',\n border: 'none',\n color: resolvedColors.textColor,\n fontFamily: 'inherit',\n overflow: 'auto'\n }}\n />\n </div>\n\n <input ref={fileInputRef} type=\"file\" multiple onChange={onFileInputChange} style={{ display: 'none' }} accept=\"*/*\" />\n\n <div style={{ position: 'absolute', bottom: '8px', left: '8px', display: 'flex', alignItems: 'center', gap: '4px', color: resolvedColors.mutedTextColor }}>\n <button onClick={() => fileInputRef.current?.click()} disabled={isLoading || uploading} style={{ borderRadius: '8px', padding: '8px', transition: 'all 0.2s', backgroundColor: 'transparent', border: 'none', cursor: isLoading || uploading ? 'not-allowed' : 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', color: 'inherit', opacity: isLoading || uploading ? 0.5 : 1 }} aria-label={t('input.attachFiles')}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 1 1 5.66 5.66l-9.2 9.19a2 2 0 1 1-2.83-2.83l8.49-8.49\" />\n </svg>\n </button>\n </div>\n\n <div style={{ position: 'absolute', bottom: '8px', right: '8px' }}>\n {/* Stop button - shows when streaming or submitted */}\n {isLoading ? (\n <button \n onClick={onStop} \n disabled={!canStop}\n aria-label={t('input.stop')} \n title=\"Stop generation\"\n style={{\n borderRadius: '12px',\n padding: '12px',\n transition: 'all 0.2s ease-out',\n border: `1px solid #ef4444`,\n backgroundColor: '#ef444420',\n color: '#ef4444',\n opacity: canStop ? 1 : 0.4,\n cursor: canStop ? 'pointer' : 'not-allowed',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n }}\n onMouseEnter={(e) => {\n if (canStop) {\n e.currentTarget.style.backgroundColor = '#ef444430';\n e.currentTarget.style.transform = 'scale(1.02)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#ef444420';\n e.currentTarget.style.transform = 'scale(1)';\n }}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/>\n </svg>\n </button>\n ) : (\n <button \n onClick={onSend} \n disabled={(!hasMessages) || uploading} \n aria-label={t('input.send')} \n title=\"Send message\"\n style={{ \n borderRadius: '12px', \n padding: '12px',\n transition: 'all 0.2s ease-out', \n border: `1px solid ${resolvedColors.borderColor}`, \n backgroundColor: resolvedColors.cardBackground, \n color: (!hasMessages) || uploading ? resolvedColors.mutedTextColor : resolvedColors.primaryColor, \n cursor: (!hasMessages) || uploading ? 'not-allowed' : 'pointer', \n display: 'flex', \n alignItems: 'center', \n justifyContent: 'center', \n opacity: (!hasMessages) || uploading ? 0.5 : 1 \n }}\n onMouseEnter={(e) => {\n if (hasMessages && !uploading) {\n e.currentTarget.style.borderColor = resolvedColors.primaryColor;\n e.currentTarget.style.transform = 'scale(1.02)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = resolvedColors.borderColor;\n e.currentTarget.style.transform = 'scale(1)';\n }}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m5 12 7-7 7 7\"/>\n <path d=\"M12 19V5\"/>\n </svg>\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n\n","import { ChatMessage } from '../types/chat';\n\nexport interface ChatMeta {\n id: string;\n title: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface ChatData {\n id: string;\n messages: ChatMessage[];\n agentId?: string;\n}\n\nexport function createChatStorage(agentId: string) {\n const LS_PREFIX = `hsafaChat_${agentId}`;\n const chatsIndexKey = `${LS_PREFIX}.chats`;\n const chatKey = (id: string) => `${LS_PREFIX}.chat.${id}`;\n const currentChatKey = `${LS_PREFIX}.currentChatId`;\n const showChatKey = `${LS_PREFIX}.showChat`;\n\n const loadChatsIndex = (): ChatMeta[] => {\n try {\n const raw = localStorage.getItem(chatsIndexKey);\n return raw ? JSON.parse(raw) : [];\n } catch { return []; }\n };\n\n const saveChatsIndex = (list: ChatMeta[]) => {\n try { localStorage.setItem(chatsIndexKey, JSON.stringify(list)); } catch {}\n };\n\n const loadChat = (id: string): ChatData | null => {\n try { \n const raw = localStorage.getItem(chatKey(id)); \n return raw ? JSON.parse(raw) : null; \n } catch { return null; }\n };\n\n const saveChat = (data: ChatData) => {\n try { localStorage.setItem(chatKey(data.id), JSON.stringify(data)); } catch {}\n };\n\n const upsertChatMeta = (meta: ChatMeta) => {\n const list = loadChatsIndex();\n const idx = list.findIndex(x => x.id === meta.id);\n if (idx >= 0) list[idx] = meta; else list.unshift(meta);\n saveChatsIndex(list);\n };\n\n const deleteChatMeta = (id: string) => {\n const list = loadChatsIndex();\n const next = list.filter(x => x.id !== id);\n saveChatsIndex(next);\n };\n\n const deleteChatData = (id: string) => {\n try { localStorage.removeItem(chatKey(id)); } catch {}\n };\n\n const deleteChat = (id: string) => {\n deleteChatData(id);\n deleteChatMeta(id);\n };\n\n const loadShowChatPreference = (defaultValue: boolean): boolean => {\n try {\n const savedShow = localStorage.getItem(showChatKey);\n return savedShow !== null ? savedShow === 'true' : defaultValue;\n } catch {\n return defaultValue;\n }\n };\n\n const saveShowChatPreference = (value: boolean) => {\n try { localStorage.setItem(showChatKey, String(value)); } catch {}\n };\n\n const loadCurrentChatId = (): string | null => {\n try {\n return localStorage.getItem(currentChatKey);\n } catch {\n return null;\n }\n };\n\n const saveCurrentChatId = (chatId: string) => {\n try { localStorage.setItem(currentChatKey, chatId); } catch {}\n };\n\n const removeCurrentChatId = () => {\n try { localStorage.removeItem(currentChatKey); } catch {}\n };\n\n return {\n loadChatsIndex,\n saveChatsIndex,\n loadChat,\n saveChat,\n upsertChatMeta,\n deleteChatMeta,\n deleteChatData,\n deleteChat,\n loadShowChatPreference,\n saveShowChatPreference,\n loadCurrentChatId,\n saveCurrentChatId,\n removeCurrentChatId\n };\n}\n\nexport function genId() {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n","/**\n * Time utility functions for the HsafaChat component\n */\n\n/**\n * Lightweight relative time helper (e.g., 1m, 6h, 7h)\n */\nexport function timeAgo(ts: number): string {\n const diff = Date.now() - ts;\n const s = Math.max(1, Math.floor(diff / 1000));\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h}h`;\n const d = Math.floor(h / 24);\n if (d < 7) return `${d}d`;\n const w = Math.floor(d / 7);\n if (w < 4) return `${w}w`;\n const months = Math.floor(d / 30);\n if (months < 12) return `${months}mo`;\n const y = Math.floor(months / 12);\n return `${y}y`;\n}\n\n/**\n * Generate unique ID\n */\nexport function genId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n","import React from 'react';\nimport { createPortal } from 'react-dom';\nimport { Trash2 } from 'lucide-react';\nimport { IconWrapper } from '../IconWrapper';\nimport { ThemeColors } from '../../utils/chat-theme';\nimport { timeAgo } from '../../utils/time';\n\ninterface ChatMeta {\n id: string;\n title: string;\n createdAt: number;\n updatedAt: number;\n}\n\ninterface ChatHistoryModalProps {\n historyOpen: boolean;\n historySearch: string;\n currentChatId: string | null;\n refreshKey?: number;\n resolvedColors: ThemeColors;\n onClose: () => void;\n onSearchChange: (search: string) => void;\n onChatSelect: (chatId: string) => void;\n onChatDelete: (chatId: string) => void;\n loadChatsIndex: () => ChatMeta[];\n historyPopupRef: React.RefObject<HTMLDivElement>;\n}\n\nexport function ChatHistoryModal({\n historyOpen,\n historySearch,\n currentChatId,\n refreshKey,\n resolvedColors,\n onClose,\n onSearchChange,\n onChatSelect,\n onChatDelete,\n loadChatsIndex,\n historyPopupRef\n}: ChatHistoryModalProps) {\n if (!historyOpen) return null;\n\n const modalContent = (\n <>\n {/* Backdrop with blur */}\n <div\n style={{\n position: 'fixed',\n inset: '0',\n zIndex: 1100,\n backgroundColor: 'rgba(0, 0, 0, 0.4)',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)'\n }}\n onClick={onClose}\n />\n {/* Command palette panel */}\n <div\n ref={historyPopupRef}\n style={{\n position: 'fixed',\n left: '50%',\n top: '64px',\n transform: 'translateX(-50%)',\n zIndex: 1101,\n width: '680px',\n maxWidth: '94vw',\n overflow: 'hidden',\n borderRadius: '16px',\n border: `1px solid ${resolvedColors.borderColor}`,\n backgroundColor: `${resolvedColors.backgroundColor}f0`,\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n backdropFilter: 'blur(16px)',\n WebkitBackdropFilter: 'blur(16px)'\n }}\n >\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n borderBottom: `1px solid ${resolvedColors.borderColor}`,\n padding: '12px 16px'\n }}>\n <div style={{ flex: '1' }}>\n <input\n autoFocus\n value={historySearch}\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder=\"Search\"\n style={{\n width: '100%',\n borderRadius: '8px',\n backgroundColor: resolvedColors.inputBackground,\n padding: '8px 12px',\n fontSize: '14px',\n color: resolvedColors.textColor,\n border: `1px solid ${resolvedColors.borderColor}`,\n outline: 'none'\n }}\n onFocus={(e) => e.currentTarget.style.borderColor = resolvedColors.primaryColor}\n onBlur={(e) => e.currentTarget.style.borderColor = resolvedColors.borderColor}\n />\n </div>\n </div>\n <div style={{\n maxHeight: '60vh',\n overflowY: 'auto'\n }}>\n {(() => {\n const q = historySearch.toLowerCase().trim();\n let list = loadChatsIndex();\n if (q) list = list.filter(m => (m.title || '').toLowerCase().includes(q));\n if (!list || list.length === 0) return (\n <div style={{\n padding: '24px',\n color: resolvedColors.mutedTextColor,\n textAlign: 'center'\n }}>No chats found.</div>\n );\n return (\n <div>\n {list.map((meta, index) => (\n <div key={meta.id} style={{\n borderTop: index > 0 ? `1px solid ${resolvedColors.borderColor}` : 'none'\n }}>\n <div style={{\n display: 'flex',\n width: '100%',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n padding: '12px',\n backgroundColor: meta.id === currentChatId ? resolvedColors.cardBackground : 'transparent'\n }}>\n <button\n style={{\n flex: '1',\n textAlign: 'left',\n transition: 'background-color 0.2s',\n borderRadius: '8px',\n padding: '8px',\n border: 'none',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n color: resolvedColors.textColor\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = 'transparent'}\n onClick={() => onChatSelect(meta.id)}\n >\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px'\n }}>\n <div style={{ minWidth: '0', flex: '1' }}>\n <div style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontSize: '14px',\n color: resolvedColors.textColor\n }}>{meta.title || 'Untitled chat'}</div>\n </div>\n <div style={{\n flexShrink: 0,\n fontSize: '12px',\n color: resolvedColors.mutedTextColor\n }}>{timeAgo(meta.updatedAt)}</div>\n </div>\n </button>\n <button\n style={{\n flexShrink: 0,\n borderRadius: '6px',\n padding: '8px',\n color: resolvedColors.mutedTextColor,\n border: '1px solid transparent',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n transition: 'all 0.2s'\n }}\n title=\"Delete chat\"\n onMouseEnter={(e) => {\n e.currentTarget.style.color = '#ef4444';\n e.currentTarget.style.backgroundColor = 'rgba(239, 68, 68, 0.1)';\n e.currentTarget.style.borderColor = 'rgba(239, 68, 68, 0.3)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = resolvedColors.mutedTextColor;\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.borderColor = 'transparent';\n }}\n onClick={(e) => {\n e.stopPropagation();\n onChatDelete(meta.id);\n }}\n >\n <IconWrapper IconComponent={Trash2} size=\"16\" strokeWidth=\"2\" />\n </button>\n </div>\n </div>\n ))}\n </div>\n );\n })()}\n </div>\n </div>\n </>\n );\n \n // Only use portal if document.body is available\n if (typeof document !== 'undefined' && document.body) {\n return createPortal(modalContent, document.body);\n }\n \n // Fallback to inline rendering\n return modalContent;\n}\n","\"use client\";\n\n/**\n * getDomComponents - Scan and analyze all interactive DOM elements inside ContentContainer\n * \n * Returns a structured list of all inputs, buttons, links, and interactive elements\n * that the agent can interact with using the web controller tools.\n */\n\nexport interface DomComponent {\n id: string | null;\n tag: string;\n type?: string;\n name?: string;\n label?: string;\n placeholder?: string;\n value?: string | boolean | string[];\n options?: Array<{ value: string; label: string; selected: boolean; disabled: boolean }>; // for selects\n checked?: boolean;\n disabled?: boolean;\n required?: boolean;\n className?: string;\n text?: string;\n href?: string;\n role?: string;\n ariaLabel?: string;\n selector?: string;\n isVisible: boolean;\n isInteractive: boolean;\n}\n\nexport interface GetDomComponentsOptions {\n includeHidden?: boolean;\n selector?: string;\n what?: 'inputs' | 'content';\n limit?: number; // max number of components to return (default 50)\n}\n\nexport interface GetDomComponentsResult {\n ok: boolean;\n components: DomComponent[];\n count: number;\n total: number; // total components before limiting\n truncated?: boolean; // true if limited\n containerFound: boolean;\n error?: string;\n}\n\nfunction isVisible(el: Element): boolean {\n if (!(el instanceof HTMLElement)) return true;\n const style = window.getComputedStyle(el);\n return (\n style.display !== 'none' &&\n style.visibility !== 'hidden' &&\n style.opacity !== '0' &&\n el.offsetParent !== null\n );\n}\n\nfunction getElementLabel(el: Element): string | undefined {\n // Check for associated label\n if (el.id) {\n const label = document.querySelector(`label[for=\"${el.id}\"]`);\n if (label) return label.textContent?.trim();\n }\n \n // Check for parent label\n const parentLabel = el.closest('label');\n if (parentLabel) {\n // Get label text excluding the input's own text\n const clone = parentLabel.cloneNode(true) as HTMLElement;\n const input = clone.querySelector('input, select, textarea');\n if (input) input.remove();\n return clone.textContent?.trim();\n }\n \n return undefined;\n}\n\nfunction getElementText(el: Element): string | undefined {\n if (el.textContent && el.textContent.trim()) {\n return el.textContent.trim().slice(0, 100); // Limit to 100 chars\n }\n return undefined;\n}\n\nfunction getElementValue(el: Element): string | boolean | string[] | undefined {\n if (el instanceof HTMLInputElement) {\n const type = el.type.toLowerCase();\n if (type === 'checkbox' || type === 'radio') {\n return el.checked;\n }\n return el.value;\n }\n \n if (el instanceof HTMLTextAreaElement) {\n return el.value;\n }\n \n if (el instanceof HTMLSelectElement) {\n if (el.multiple) {\n return Array.from(el.selectedOptions).map(opt => opt.value);\n }\n return el.value;\n }\n \n if (el instanceof HTMLElement && el.isContentEditable) {\n return el.textContent || undefined;\n }\n \n return undefined;\n}\n\nfunction getUniqueSelector(el: Element): string {\n if (el.id) return `#${el.id}`;\n \n // Build a path-based selector\n const path: string[] = [];\n let current: Element | null = el;\n \n while (current && current !== document.body) {\n let selector = current.tagName.toLowerCase();\n \n if (current.className && typeof current.className === 'string') {\n const classes = current.className.split(' ').filter(c => c.trim()).slice(0, 2);\n if (classes.length > 0) {\n selector += '.' + classes.join('.');\n }\n }\n \n // Add nth-child if needed for uniqueness\n const parent: Element | null = current.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n (child: Element) => child.tagName === (current as Element).tagName\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(current) + 1;\n selector += `:nth-child(${index})`;\n }\n }\n \n path.unshift(selector);\n current = parent;\n }\n \n return path.slice(-3).join(' > '); // Last 3 levels for brevity\n}\n\nexport async function getDomComponents(options: GetDomComponentsOptions = {}): Promise<GetDomComponentsResult> {\n try {\n const { includeHidden = false, selector, what = 'content', limit } = options;\n \n // Find ContentContainer\n const contentContainer = document.querySelector('.hsafa-content-container');\n \n if (!contentContainer) {\n return {\n ok: false,\n components: [],\n count: 0,\n total: 0,\n containerFound: false,\n error: 'ContentContainer not found on page. Make sure you have wrapped your app with <ContentContainer>.'\n };\n }\n \n // Determine search scope\n const searchScope = selector \n ? contentContainer.querySelector(selector) || contentContainer\n : contentContainer;\n \n const components: DomComponent[] = [];\n \n // Build selectors based on requested scope\n let selectors: string[] = [];\n if (what === 'inputs') {\n selectors = [\n 'input', 'textarea', 'select', '[contenteditable=\"true\"]', '[contenteditable=\"\"]'\n ];\n } else {\n // content (default): semantic structure + rich content + interactive elements\n selectors = [\n // Structural regions\n 'header','nav','main','section','article','aside','footer',\n // Headings and text\n 'h1','h2','h3','h4','h5','h6','p',\n // Media and lists\n 'img[alt]','ul','ol','li',\n // Tables\n 'table','thead','tbody','tr','td','th',\n // Forms and labels\n 'form','label',\n // Inputs and editable content\n 'input','textarea','select','[contenteditable=\"true\"]','[contenteditable=\"\"]',\n // Interactive\n 'a[href]','button','[role=\"button\"]','[role=\"link\"]','[onclick]','[tabindex]',\n // Containers (last to avoid flooding low-importance items)\n 'div'\n ];\n }\n \n const elements = searchScope.querySelectorAll(selectors.join(', '));\n \n elements.forEach((el) => {\n const visible = isVisible(el);\n \n // Skip hidden elements unless requested\n if (!visible && !includeHidden) return;\n \n const component: DomComponent = {\n id: el.id || null,\n tag: el.tagName.toLowerCase(),\n className: el.className && typeof el.className === 'string' ? el.className : undefined,\n isVisible: visible,\n isInteractive: true,\n selector: getUniqueSelector(el)\n };\n \n // Add type-specific properties\n if (el instanceof HTMLInputElement) {\n component.type = el.type;\n component.name = el.name || undefined;\n component.placeholder = el.placeholder || undefined;\n component.value = getElementValue(el);\n component.checked = el.type === 'checkbox' || el.type === 'radio' ? el.checked : undefined;\n component.disabled = el.disabled;\n component.required = el.required;\n } else if (el instanceof HTMLTextAreaElement) {\n component.name = el.name || undefined;\n component.placeholder = el.placeholder || undefined;\n component.value = getElementValue(el);\n component.disabled = el.disabled;\n component.required = el.required;\n } else if (el instanceof HTMLSelectElement) {\n component.name = el.name || undefined;\n component.value = getElementValue(el);\n component.disabled = el.disabled;\n component.required = el.required;\n component.options = Array.from(el.options).map(opt => ({\n value: opt.value,\n label: opt.text,\n selected: opt.selected,\n disabled: opt.disabled\n }));\n } else if (el instanceof HTMLButtonElement) {\n component.type = el.type;\n component.disabled = el.disabled;\n component.text = getElementText(el);\n } else if (el instanceof HTMLAnchorElement) {\n component.href = el.href;\n component.text = getElementText(el);\n } else if (el instanceof HTMLImageElement) {\n component.text = el.alt || undefined;\n component.label = el.alt || component.label;\n } else {\n component.text = getElementText(el);\n }\n \n // Add label and ARIA\n component.label = getElementLabel(el);\n component.role = el.getAttribute('role') || undefined;\n component.ariaLabel = el.getAttribute('aria-label') || undefined;\n \n components.push(component);\n });\n \n // Sort: tailor importance based on requested 'what'\n const importance = (c: DomComponent) => {\n if (!c.isVisible) return 0;\n if (what === 'inputs') {\n if (c.tag === 'input' || c.tag === 'textarea' || c.tag === 'select' || c.role === 'textbox') return 3;\n if (c.tag === 'button' || c.tag === 'a') return 2;\n return 1;\n }\n // content (default)\n if (['header','nav','main','footer'].includes(c.tag)) return 5;\n if (['section','article','aside'].includes(c.tag)) return 4;\n if (['h1','h2','h3'].includes(c.tag)) return 4;\n if (['h4','h5','h6'].includes(c.tag)) return 3;\n if (c.tag === 'form') return 4;\n if (c.tag === 'label') return 3;\n if (c.tag === 'input' || c.tag === 'textarea' || c.tag === 'select') return 4;\n if (c.tag === 'p' || c.tag === 'img') return 3;\n if (c.tag === 'button' || c.tag === 'a') return 3;\n return 1;\n };\n \n components.sort((a, b) => importance(b) - importance(a));\n const total = components.length;\n const defaultLimit = what === 'inputs' ? 100 : 150;\n const maxItems = Math.max(1, Math.min(200, typeof limit === 'number' ? Math.floor(limit) : defaultLimit));\n const truncated = total > maxItems;\n const limited = truncated ? components.slice(0, maxItems) : components;\n return {\n ok: true,\n components: limited,\n count: limited.length,\n total,\n truncated,\n containerFound: true\n };\n } catch (error: any) {\n return {\n ok: false,\n components: [],\n count: 0,\n total: 0,\n containerFound: false,\n error: error?.message || String(error)\n };\n }\n}\n\n// Expose globally for console testing\nif (typeof window !== 'undefined') {\n (window as any).getDomComponents = getDomComponents;\n}\n\n","\"use client\";\n\n/**\n * guideCursor - Wrapper for window.__cursorGuide\n * \n * Move the visual cursor to elements and perform click/drag actions.\n * Requires CursorController component to be mounted on the page.\n */\n\nimport type { GuideTarget, GuideOptions, GuideRunResult } from './CursorController';\n\nexport interface GuideCursorOptions extends GuideOptions {}\n\n/**\n * Guide the cursor to a target element or position\n * \n * @example\n * ```ts\n * // Move to an element and click it\n * await guideCursor('#submitBtn', { action: 'click' });\n * \n * // Move to a position\n * await guideCursor({ position: { x: 100, y: 200 } });\n * \n * // Drag from one element to another\n * await guideCursor('#item1', { action: 'drag', dragTo: '#dropzone' });\n * ```\n */\nexport async function guideCursor(\n target: GuideTarget,\n options: GuideCursorOptions = {}\n): Promise<GuideRunResult> {\n if (typeof window === 'undefined') {\n return {\n ok: false,\n steps: [{\n ok: false,\n action: 'none',\n targetKind: 'position',\n durationMs: 0,\n error: 'guideCursor only works in browser environment'\n }]\n };\n }\n\n const cursorGuide = (window as any).__cursorGuide;\n \n if (!cursorGuide) {\n return {\n ok: false,\n steps: [{\n ok: false,\n action: 'none',\n targetKind: 'position',\n durationMs: 0,\n error: 'CursorController not initialized. Make sure to mount <CursorController /> component.'\n }]\n };\n }\n\n try {\n return await cursorGuide(target, options);\n } catch (error: any) {\n return {\n ok: false,\n steps: [{\n ok: false,\n action: options.action || 'none',\n targetKind: 'position',\n durationMs: 0,\n error: error?.message || String(error)\n }]\n };\n }\n}\n\n// Expose globally for console testing\nif (typeof window !== 'undefined') {\n (window as any).guideCursor = guideCursor;\n}\n\n","\"use client\";\n\n/**\n * FillInput utilities\n *\n * Exports two helpers for programmatically filling inputs while dispatching the\n * same DOM events a user would normally trigger (input/change/click):\n *\n * - FillInput(inputId, value, options?)\n * Fill a single field by its element id with the provided value.\n *\n * - FillActiveInput(value, options?)\n * Fill the currently focused field without needing its id.\n *\n * Basic example:\n * ```ts\n * import { FillInput, FillActiveInput } from \"./FillInput\";\n *\n * // Fill individual fields by id\n * await FillInput(\"fi_name\", \"Jane Doe\");\n * await FillInput(\"fi_email\", \"jane@example.com\");\n * await FillInput(\"fi_role_admin\", true); // radio -> check this option\n * await FillInput(\"fi_country2\", \"sa\"); // select value\n * await FillInput(\"fi_tags\", [\"a\", \"c\"]); // multi-select values\n * await FillInput(\"fi_newsletter\", true); // checkbox\n * await FillInput(\"fi_dob\", \"1995-05-15\"); // date input\n * await FillInput(\"about\", \"Hello there\"); // contenteditable by id\n *\n * // Fill the currently focused field\n * (document.getElementById(\"fi_name\") as HTMLElement)?.focus();\n * await FillActiveInput(\"Alice\");\n * ```\n *\n * Notes:\n * - Scrolling is disabled; these helpers will not scroll the page.\n * - typingDelayMs is ignored; filling is instantaneous.\n * - For file inputs, pass a File or File[]; browsers may restrict programmatic assignment.\n */\n\n// Utility to fill a form (or any container) by id with data, firing realistic events\n// Supported fields: input (text, email, password, number, range, date, time, color, checkbox, radio, file),\n// textarea, select (single/multiple), and contenteditable elements.\n\nexport type FillInputOptions = {\n typingDelayMs?: number; // deprecated: ignored; filling is instantaneous\n scrollIntoView?: boolean; // deprecated: ignored; no scrolling performed\n};\n\nexport type FillResult = {\n ok: boolean;\n filled: Array<{ key: string; status: \"ok\" | \"skipped\" | \"error\"; message?: string }>;\n errors?: string[];\n};\n\nfunction isHTMLElement(n: Element | null | undefined): n is HTMLElement {\n return !!n && n.nodeType === 1;\n}\n\nfunction looksLikeSelector(key: string) {\n return /[#.\\[\\] :]/.test(key);\n}\n\nfunction delay(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction dispatch(el: Element, type: string) {\n el.dispatchEvent(new Event(type, { bubbles: true }));\n}\n\nfunction setTextLike(el: HTMLInputElement | HTMLTextAreaElement, value: string) {\n const setter = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(el), \"value\")?.set;\n if (setter) setter.call(el, value);\n else (el as any).value = value;\n dispatch(el, \"input\");\n}\n\nasync function typeText(el: HTMLInputElement | HTMLTextAreaElement, value: string, delayMs: number) {\n el.focus();\n // clear existing value by selecting and deleting\n setTextLike(el, \"\");\n for (const ch of value.split(\"\")) {\n const prev = (el as any).value as string;\n setTextLike(el, prev + ch);\n if (delayMs > 0) await delay(delayMs);\n }\n dispatch(el, \"change\");\n (el as any).blur?.();\n}\n\n// scrolling intentionally disabled in FillInput/FillActiveInput\n\n// findFields no longer needed for single-element FillInput\n\nfunction setCheckbox(el: HTMLInputElement, value: boolean) {\n if (el.checked !== value) {\n el.click(); // clicking fires the right sequence (pointer/mouse/input/change)\n }\n}\n\nfunction setRadio(group: HTMLInputElement[], value: string) {\n const target = group.find((r) => r.value === String(value));\n if (target && !target.checked) target.click();\n}\n\nfunction setSelectSingle(el: HTMLSelectElement, value: string | number | { label?: string; index?: number }) {\n if (typeof value === \"object\" && value && \"index\" in value && typeof value.index === \"number\") {\n el.selectedIndex = Math.max(0, Math.min(el.options.length - 1, value.index));\n } else if (typeof value === \"object\" && value && \"label\" in value && typeof value.label === \"string\") {\n const i = Array.from(el.options).findIndex((o) => o.text === value.label);\n el.selectedIndex = i >= 0 ? i : 0;\n } else {\n el.value = String(value);\n }\n dispatch(el, \"input\");\n dispatch(el, \"change\");\n}\n\nfunction setSelectMultiple(el: HTMLSelectElement, values: Array<string | number>) {\n const setVals = new Set(values.map(String));\n Array.from(el.options).forEach((opt) => {\n opt.selected = setVals.has(opt.value) || setVals.has(opt.text);\n });\n dispatch(el, \"input\");\n dispatch(el, \"change\");\n}\n\nfunction coerceDate(v: any): string {\n if (!v) return \"\";\n if (v instanceof Date) return v.toISOString().slice(0, 10);\n // assume string 'YYYY-MM-DD' or other\n return String(v);\n}\n\nfunction setFiles(el: HTMLInputElement, files: File | File[]) {\n const list = Array.isArray(files) ? files : [files];\n const dt = new DataTransfer();\n for (const f of list) dt.items.add(f);\n Object.defineProperty(el, \"files\", { value: dt.files, configurable: true });\n dispatch(el, \"input\");\n dispatch(el, \"change\");\n}\n\n// The FillInput function has been removed to enforce using FillActiveInput only.\n\nexport async function FillActiveInput(value: any, options: FillInputOptions = {}): Promise<FillResult> {\n let el = (document.activeElement as Element | null) || null;\n // If focus is within a shadow root or child, try to find the nearest contenteditable host\n if (el && isHTMLElement(el)) {\n const ce = (el as HTMLElement).closest('[contenteditable=\"true\"], [contenteditable=\"\"]') as HTMLElement | null;\n if (ce) el = ce;\n }\n\n if (!el || el === document.body) {\n return { ok: false, filled: [{ key: \"active\", status: \"skipped\", message: \"No active input element\" }], errors: [\"No active input element\"] };\n }\n\n try {\n const tag = el.tagName.toLowerCase();\n\n if (tag === \"input\") {\n const inp = el as HTMLInputElement;\n const type = (inp.type || \"text\").toLowerCase();\n if (type === \"checkbox\") {\n setCheckbox(inp, Boolean(value));\n } else if (type === \"radio\") {\n const name = inp.name;\n if (name && value != null && String(inp.value) !== String(value)) {\n const alt = document.querySelector(`input[type=\"radio\"][name=\"${CSS.escape(name)}\"][value=\"${CSS.escape(String(value))}\"]`) as HTMLInputElement | null;\n if (alt) alt.click();\n else inp.click(); // fallback to clicking the active one\n } else {\n inp.click();\n }\n } else if (type === \"file\") {\n if (value instanceof File || (Array.isArray(value) && value.every((v) => v instanceof File))) {\n setFiles(inp, value as any);\n } else {\n return { ok: false, filled: [{ key: \"active\", status: \"skipped\", message: \"Provide File or File[] for file input\" }], errors: [\"Provide File or File[] for file input\"] };\n }\n } else {\n const vStr = type === \"date\" ? coerceDate(value) : String(value ?? \"\");\n setTextLike(inp, vStr);\n dispatch(inp, \"change\");\n }\n return { ok: true, filled: [{ key: \"active\", status: \"ok\" }] };\n }\n\n if (tag === \"textarea\") {\n const ta = el as HTMLTextAreaElement;\n const vStr = String(value ?? \"\");\n setTextLike(ta, vStr);\n dispatch(ta, \"change\");\n return { ok: true, filled: [{ key: \"active\", status: \"ok\" }] };\n }\n\n if (tag === \"select\") {\n const sel = el as HTMLSelectElement;\n if (sel.multiple) setSelectMultiple(sel, Array.isArray(value) ? value : [value]);\n else setSelectSingle(sel, value);\n return { ok: true, filled: [{ key: \"active\", status: \"ok\" }] };\n }\n\n // contenteditable\n if (isHTMLElement(el) && (el as HTMLElement).isContentEditable) {\n const host = el as HTMLElement;\n host.focus();\n host.textContent = String(value ?? \"\");\n dispatch(host, \"input\");\n dispatch(host, \"change\");\n (host as any).blur?.();\n return { ok: true, filled: [{ key: \"active\", status: \"ok\" }] };\n }\n\n return { ok: false, filled: [{ key: \"active\", status: \"skipped\", message: `Unsupported active element: ${tag}` }], errors: [`Unsupported active element: ${tag}`] };\n } catch (e: any) {\n return { ok: false, filled: [{ key: \"active\", status: \"error\", message: e?.message ?? String(e) }], errors: [e?.message ?? String(e)] };\n }\n}\n\n// Optional: expose globally for easy console testing in the demo\nif (typeof window !== \"undefined\") {\n (window as any).FillActiveInput = FillActiveInput;\n}\n","\"use client\";\n\nimport React, { useEffect } from \"react\";\nimport { createRoot, Root } from \"react-dom/client\";\n\n/**\n * CursorController\n *\n * Mount this component once on a page (e.g. in the demo at `/demo`). It registers a\n * global function `window.__cursorGuide(stepsOrTarget, options?)` that moves a fake\n * cursor to a target and optionally performs actions (click, drag).\n *\n * In `app/demo/page.tsx`, a convenience wrapper `guideCursorTo(targetOrSteps, options?)`\n * is also exported and exposed globally as `window.guideCursorTo`.\n *\n * Quick examples (run in DevTools on /demo):\n * ```js\n * // Move to a screen position\n * await window.guideCursorTo({ position: { x: 140, y: 160 } }, { durationMs: 700 });\n *\n * // Click an element by selector or id\n * await window.guideCursorTo('#submitBtn', { action: 'click', anchor: 'center' });\n *\n * // Drag from one element to another\n * await window.guideCursorTo({ selector: '#cardBacklog0' }, { action: 'drag', dragTo: '#doingDrop' });\n *\n * // Multi-step sequence\n * await window.guideCursorTo([\n * { target: '#tabStats', action: 'click', options: { durationMs: 600 } },\n * { target: { position: { x: 100, y: 120 } } },\n * { target: '#progressStartBtn', action: 'click' },\n * ]);\n * ```\n *\n * Options highlights (see `GuideOptions`):\n * - action: 'none' | 'click' | 'drag'\n * - durationMs, easing: control motion speed/curve\n * - path: 'straight' | 'curve', curveStrength, curveDirection\n * - anchor: where inside the element to aim (e.g. 'center', 'top-left' or {x:0..1,y:0..1})\n * - cursorHotspot: px offset to the click location\n * - dragTo: target for drag action\n */\n\n// Types for the public API\nexport type GuideAction = \"none\" | \"click\" | \"drag\";\n\nexport type GuideTarget =\n | string // id or selector (resolved as id first)\n | Element\n | { selector: string; nth?: number; within?: Element | string }\n | { position: { x: number; y: number } };\n\nexport type Anchor = \"center\" | \"top-left\" | \"bottom-right\" | { x: number; y: number };\n\nexport type GuideOptions = {\n action?: GuideAction;\n durationMs?: number; // total travel duration\n easing?: \"ease\" | \"ease-in\" | \"ease-out\" | \"ease-in-out\" | \"linear\";\n offset?: { x?: number; y?: number };\n highlight?: boolean; // briefly highlight target when reached\n // Path options\n path?: \"straight\" | \"curve\"; // default curve\n curveStrength?: number; // 0..1, fraction of distance used as bend magnitude (default 0.25)\n curveDirection?: \"auto\" | \"left\" | \"right\"; // default auto\n // New options\n anchor?: Anchor; // where inside the element to aim\n cursorHotspot?: { x?: number; y?: number }; // px offset added to click/press location\n dragTo?: GuideTarget; // destination target for action='drag'\n};\n\nexport type GuideStep = { target: GuideTarget; action?: GuideAction; options?: GuideOptions };\nexport type GuideStepResult = { ok: boolean; action: GuideAction; targetKind: \"element\" | \"position\"; durationMs: number; clickedElementId?: string | null; error?: string };\nexport type GuideRunResult = { ok: boolean; steps: GuideStepResult[] };\n\n// Cursor controller state (DOM-based, no React re-renders)\nlet cursorReactRoot: Root | null = null;\nlet cursorSvgCache: { arrow?: string; pointer?: string } = {};\nlet cursorStylesInjected = false;\n\n// Visibility/idle management so the cursor never disappears while moving\nlet cursorHideTimer: number | null = null;\nlet cursorIsMoving = false;\n\nfunction ensureCursorVisible(cursor: HTMLElement) {\n cursor.classList.add(\"visible\");\n}\n\nfunction keepCursorVisibleWhileMoving() {\n cursorIsMoving = true;\n if (cursorHideTimer != null) {\n clearTimeout(cursorHideTimer);\n cursorHideTimer = null;\n }\n}\n\nfunction scheduleCursorHide(cursor: HTMLElement, ms = 1500) {\n if (cursorIsMoving) return;\n if (cursorHideTimer != null) {\n clearTimeout(cursorHideTimer);\n }\n cursorHideTimer = window.setTimeout(() => {\n if (!cursorIsMoving) cursor.classList.remove(\"visible\");\n }, ms);\n}\n\nfunction stopMovingAndMaybeHide(cursor: HTMLElement, ms = 1200) {\n cursorIsMoving = false;\n scheduleCursorHide(cursor, ms);\n}\n\n// Get all scrollable ancestors of an element\nfunction getScrollableAncestors(el: Element | null): Element[] {\n const scrollable: Element[] = [];\n let current = el?.parentElement;\n while (current) {\n const style = getComputedStyle(current);\n const overflow = style.overflow + style.overflowY + style.overflowX;\n if (/(auto|scroll)/.test(overflow)) {\n scrollable.push(current);\n }\n current = current.parentElement;\n }\n return scrollable;\n}\n\n// Wait until element position and all scroll positions are settled\nasync function waitForScrollSettled(targetElement?: Element | null, timeoutMs = 1500, quietMs = 160) {\n const start = performance.now();\n \n // Monitor window scroll and all scrollable ancestors\n const scrollableElements = targetElement ? getScrollableAncestors(targetElement) : [];\n \n const getScrollPositions = () => {\n const positions: number[] = [\n window.scrollX || document.documentElement.scrollLeft || 0,\n window.scrollY || document.documentElement.scrollTop || 0,\n ];\n scrollableElements.forEach(el => {\n positions.push(el.scrollLeft, el.scrollTop);\n });\n return positions;\n };\n \n // Also monitor target element's position if provided\n const getTargetPos = () => {\n if (!targetElement) return { x: 0, y: 0 };\n const rect = targetElement.getBoundingClientRect();\n return { x: rect.left, y: rect.top };\n };\n \n let lastScrollPos = getScrollPositions();\n let lastTargetPos = getTargetPos();\n let lastChange = performance.now();\n \n return new Promise<void>((resolve) => {\n function tick(now: number) {\n const curScrollPos = getScrollPositions();\n const curTargetPos = getTargetPos();\n \n // Check if any scroll position or target position changed\n let changed = false;\n for (let i = 0; i < curScrollPos.length; i++) {\n if (curScrollPos[i] !== lastScrollPos[i]) {\n changed = true;\n break;\n }\n }\n if (!changed && targetElement) {\n if (curTargetPos.x !== lastTargetPos.x || curTargetPos.y !== lastTargetPos.y) {\n changed = true;\n }\n }\n \n if (changed) {\n lastScrollPos = curScrollPos;\n lastTargetPos = curTargetPos;\n lastChange = now;\n }\n \n if (now - lastChange >= quietMs || now - start >= timeoutMs) {\n resolve();\n return;\n }\n requestAnimationFrame(tick);\n }\n requestAnimationFrame(tick);\n });\n}\n\n// Inline SVG assets (use provided cursor images)\nconst DEFAULT_ARROW_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\" width=\"32px\" height=\"32px\"><path d=\"M 7.2304688 4.9863281 C 5.9215232 4.8276681 4.8053213 6.0177722 5.0234375 7.3066406 A 1.0001 1.0001 0 0 0 5.0253906 7.3085938 C 5.9996339 12.981516 7.7205826 18.716222 10 24.515625 A 1.0001 1.0001 0 0 0 10 24.517578 C 10.26886 25.199332 10.914322 25.653844 11.5625 25.738281 C 12.210678 25.822721 12.879213 25.592031 13.359375 25.09375 C 14.505165 23.921134 15.214424 22.695429 15.90625 21.498047 C 17.56565 23.217848 19.256845 24.909775 21.0625 26.484375 L 21.060547 26.480469 C 21.799528 27.12933 22.841378 27.205969 23.673828 26.78125 A 1.0001 1.0001 0 0 0 23.691406 26.771484 C 24.987999 26.077693 26.028685 25.052256 26.71875 23.746094 L 26.71875 23.744141 C 27.174557 22.900924 27.06954 21.854242 26.439453 21.119141 A 1.0001 1.0001 0 0 0 26.433594 21.113281 C 24.867416 19.313474 23.193611 17.633865 21.488281 15.986328 C 22.714141 15.237691 23.933938 14.51508 25.158203 13.414062 A 1.0001 1.0001 0 0 0 25.162109 13.410156 C 26.052979 12.600274 25.977319 11.169141 25.101562 10.404297 A 1.0001 1.0001 0 0 0 24.669922 10.042969 C 18.793373 7.4738953 12.973806 5.6931843 7.2324219 4.9882812 A 1.0001 1.0001 0 0 0 7.2304688 4.9863281 z M 6.9960938 6.9746094 C 12.468883 7.6474978 18.081513 9.3573116 23.796875 11.849609 A 1.0001 1.0001 0 0 0 23.867188 11.884766 C 23.901248 11.899796 23.884276 11.867987 23.816406 11.929688 C 22.403891 13.198979 20.999383 14.076858 19.457031 14.976562 A 1.0001 1.0001 0 0 0 19.275391 16.568359 C 21.250864 18.425305 23.134972 20.36916 24.919922 22.419922 C 25.009402 22.524309 25.024026 22.676488 24.960938 22.792969 A 1.0001 1.0001 0 0 0 24.955078 22.804688 C 24.446951 23.770198 23.730542 24.476149 22.755859 25 C 22.611605 25.06851 22.457885 25.047856 22.378906 24.978516 A 1.0001 1.0001 0 0 0 22.376953 24.976562 C 20.293628 23.159824 18.307991 21.233373 16.419922 19.216797 A 1.0001 1.0001 0 0 0 14.835938 19.378906 C 13.841812 21.004716 13.152668 22.447221 11.925781 23.701172 A 1.0001 1.0001 0 0 0 11.919922 23.707031 C 11.883822 23.744501 11.865156 23.739957 11.847656 23.742188 C 9.6161121 18.057657 7.9395914 12.46667 6.9960938 6.9746094 z\"/></svg>`;\nconst DEFAULT_POINTER_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\" width=\"32px\" height=\"32px\"><path d=\"M 22.5 3 C 19.480226 3 17 5.4802259 17 8.5 L 17 23.412109 L 14.871094 22.697266 C 13.308963 22.172461 11.892528 22 10.703125 22 C 9.5908429 22 8.5540295 22.197475 7.640625 22.65625 C 5.2906802 23.831199 3.9427678 26.197397 4.0019531 28.90625 C 4.0019531 28.90625 4.0019531 28.908203 4.0019531 28.908203 C 4.0019531 28.908203 4.0019531 28.910156 4.0019531 28.910156 C 4.0184171 29.660452 4.4596385 30.354695 5.1328125 30.6875 A 1.50015 1.50015 0 0 0 5.1367188 30.689453 C 5.1367188 30.689453 9.4097266 32.789754 11.599609 33.949219 C 12.445613 34.397848 13.696939 34.926046 15.210938 36.09375 C 16.724935 37.261454 18.423179 39.012543 19.826172 41.792969 C 21.023611 44.165544 23.672779 45.195669 26.144531 44.955078 A 1.50015 1.50015 0 0 0 26.146484 44.955078 C 31.427085 44.439215 32.081856 44.381732 35.59375 44.023438 C 37.044229 43.875625 38.276993 43.213524 39.111328 42.289062 C 39.945663 41.364602 40.422895 40.257718 40.798828 39.125 C 41.561218 36.826116 42.933037 33.169846 43.671875 30.599609 C 45.018525 25.913269 41.884024 21.194549 37.246094 19.953125 L 37.242188 19.951172 C 36.99827 19.885452 36.756736 19.832884 36.521484 19.789062 A 1.50015 1.50015 0 0 0 36.513672 19.787109 L 28 18.248047 L 28 8.5 C 28 5.4802259 25.519774 3 22.5 3 z M 22.5 6 C 23.898226 6 25 7.1017741 25 8.5 L 25 19.5 A 1.50015 1.50015 0 0 0 26.232422 20.976562 L 35.980469 22.740234 C 36.14895 22.771804 36.312663 22.808524 36.464844 22.849609 A 1.50015 1.50015 0 0 0 36.46875 22.849609 C 39.614436 23.689967 41.641993 26.803286 40.789062 29.771484 C 40.115901 32.113248 38.752735 35.768572 37.953125 38.179688 C 37.641059 39.119968 37.279727 39.837554 36.882812 40.277344 C 36.485898 40.717133 36.095584 40.956874 35.289062 41.039062 C 31.783676 41.396695 31.135884 41.452908 25.855469 41.96875 C 24.423221 42.108159 23.024467 41.472831 22.503906 40.441406 C 20.887905 37.238832 18.854971 35.116296 17.042969 33.71875 C 15.230967 32.321204 13.560902 31.594199 13.003906 31.298828 C 10.939171 30.205625 7.8041786 28.665144 7.1035156 28.320312 C 7.1954033 26.8809 7.6810328 25.989859 8.9824219 25.339844 A 1.50015 1.50015 0 0 0 8.9863281 25.337891 C 9.3949198 25.132713 9.9434071 25 10.703125 25 C 11.605722 25 12.680146 25.12582 13.916016 25.541016 L 18.021484 26.921875 A 1.50015 1.50015 0 0 0 20 25.5 L 20 8.5 C 20 7.1017741 21.101774 6 22.5 6 z\"/></svg>`;\n\nasync function loadCursorSvgs() {\n if (!cursorSvgCache.arrow) {\n try {\n cursorSvgCache.arrow = DEFAULT_ARROW_SVG;\n cursorSvgCache.pointer = DEFAULT_POINTER_SVG;\n } catch (e) {\n console.warn(\"Failed to set cursor SVGs\", e);\n }\n }\n return cursorSvgCache;\n}\n\nfunction CursorVisual({ arrowSvg, pointerSvg }: { arrowSvg?: string; pointerSvg?: string }) {\n return (\n <>\n {arrowSvg && (\n <div className=\"arrow\" dangerouslySetInnerHTML={{ __html: arrowSvg }} />\n )}\n {pointerSvg && (\n <div className=\"pointer\" dangerouslySetInnerHTML={{ __html: pointerSvg }} />\n )}\n </>\n );\n}\n\nasync function getOrCreateCursor(): Promise<HTMLDivElement> {\n const id = \"demo-fake-cursor\";\n let cursor = document.getElementById(id) as HTMLDivElement | null;\n const svgs = await loadCursorSvgs();\n\n // Inject CSS once to toggle arrow/pointer visibility\n if (!cursorStylesInjected) {\n const styleId = \"cursor-controller-styles\";\n if (!document.getElementById(styleId)) {\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = `\n .fake-cursor { pointer-events: none; opacity: 0; transition: opacity 0.2s ease; z-index: 2147483647; }\n .fake-cursor.visible { opacity: 1; }\n .fake-cursor .arrow { display: none; }\n .fake-cursor .pointer { display: none; }\n .fake-cursor.as-arrow .arrow { display: block; }\n .fake-cursor.as-arrow .pointer { display: none; }\n .fake-cursor.as-pointer .arrow { display: none; }\n .fake-cursor.as-pointer .pointer { display: block; }\n .fake-cursor.pressing .pointer svg path { filter: brightness(0.9); }\n `;\n document.head.appendChild(style);\n }\n cursorStylesInjected = true;\n }\n\n if (!cursor) {\n cursor = document.createElement(\"div\");\n cursor.id = id;\n cursor.className = \"fake-cursor as-arrow\";\n cursor.style.position = \"fixed\";\n cursor.style.left = \"20px\";\n cursor.style.top = \"20px\";\n document.body.appendChild(cursor);\n // mount React visuals\n cursorReactRoot = createRoot(cursor);\n cursorReactRoot.render(<CursorVisual arrowSvg={svgs.arrow} pointerSvg={svgs.pointer} />);\n } else {\n cursor.classList.add(\"as-arrow\");\n if (!cursorReactRoot) {\n cursorReactRoot = createRoot(cursor);\n cursorReactRoot.render(<CursorVisual arrowSvg={svgs.arrow} pointerSvg={svgs.pointer} />);\n }\n }\n return cursor;\n}\n\nfunction clamp(n: number, min: number, max: number) {\n return Math.max(min, Math.min(max, n));\n}\n\nfunction easeInOutCubic(t: number) {\n return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n}\n\n// Background color sampling and contrast\nfunction cssColorToRgba(css: string): { r: number; g: number; b: number; a: number } | null {\n if (!css) return null;\n const ctx = document.createElement(\"canvas\").getContext(\"2d\");\n if (!ctx) return null;\n ctx.fillStyle = \"#000\";\n ctx.fillStyle = css; // triggers parsing\n // computed value will be in rgb/rgba\n const parsed = ctx.fillStyle as string;\n const m = parsed.match(/rgba?\\(([^)]+)\\)/i);\n if (!m) return null;\n const parts = m[1].split(/\\s*,\\s*/).map(Number);\n const [r, g, b, a = 1] = parts;\n return { r, g, b, a };\n}\n\nfunction relativeLuminance({ r, g, b }: { r: number; g: number; b: number }) {\n const srgb = [r, g, b]\n .map((v) => v / 255)\n .map((v) => (v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4)));\n return 0.2126 * srgb[0] + 0.7152 * srgb[1] + 0.0722 * srgb[2];\n}\n\nfunction isDarkColor(css: string | null) {\n const rgba = css ? cssColorToRgba(css) : null;\n if (!rgba) return false;\n // Consider fully transparent as light (to prefer dark cursor)\n if (rgba.a === 0) return false;\n return relativeLuminance(rgba) < 0.5;\n}\n\nfunction getEffectiveBackgroundAtPoint(x: number, y: number): string | null {\n let el = document.elementFromPoint(x, y) as HTMLElement | null;\n const seen = new Set<HTMLElement>();\n while (el && !seen.has(el)) {\n seen.add(el);\n const cs = getComputedStyle(el);\n const bg = cs.backgroundColor;\n const rgba = cssColorToRgba(bg);\n if (rgba && rgba.a > 0) return bg;\n el = el.parentElement as HTMLElement | null;\n }\n const bodyBg = getComputedStyle(document.body).backgroundColor;\n return bodyBg || \"rgb(255,255,255)\";\n}\n\nfunction updateCursorColorAt(cursor: HTMLElement, x: number, y: number) {\n const bg = getEffectiveBackgroundAtPoint(x, y);\n const dark = isDarkColor(bg);\n const strokeColor = dark ? \"#ffffff\" : \"#000000\";\n\n // Update all path elements in the cursor SVGs\n const paths = cursor.querySelectorAll(\"svg path\");\n paths.forEach((path) => {\n (path as SVGPathElement).style.fill = \"white\";\n (path as SVGPathElement).style.stroke = strokeColor;\n (path as SVGPathElement).style.strokeWidth = \"1\";\n });\n\n // Add contrasting shadow for extra visibility\n cursor.style.filter = dark\n ? \"drop-shadow(0 1px 2px rgba(0,0,0,0.8))\"\n : \"drop-shadow(0 1px 2px rgba(255,255,255,0.9))\";\n}\n\nasync function animatePosition(\n el: HTMLElement,\n from: { x: number; y: number },\n to: { x: number; y: number },\n durationMs: number,\n easing: GuideOptions[\"easing\"] = \"ease-in-out\",\n path: GuideOptions[\"path\"] = \"curve\",\n curveStrength: number = 0.25,\n curveDirection: GuideOptions[\"curveDirection\"] = \"auto\",\n onFrame?: (p: { x: number; y: number; t: number; now: number }) => void\n) {\n // Keep the cursor visible for the entire duration of this animation\n keepCursorVisibleWhileMoving();\n ensureCursorVisible(el);\n\n const start = performance.now();\n const easeFn = easing === \"linear\" ? (t: number) => t : easeInOutCubic;\n\n // Precompute control point for a quadratic Bezier if using curve\n const useCurve = path !== \"straight\";\n let cp = { x: 0, y: 0 };\n if (useCurve) {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const dist = Math.hypot(dx, dy) || 1;\n const mx = (from.x + to.x) / 2;\n const my = (from.y + to.y) / 2;\n // Perpendicular normal (clockwise)\n let nx = -dy / dist;\n let ny = dx / dist;\n let sign = 1;\n if (curveDirection === \"left\") sign = -1;\n else if (curveDirection === \"right\") sign = 1;\n else {\n // auto: randomize direction for variety\n sign = Math.random() < 0.5 ? -1 : 1;\n }\n const bend = clamp(curveStrength, 0, 1) * dist;\n cp = { x: mx + sign * nx * bend, y: my + sign * ny * bend };\n }\n\n return new Promise<void>((resolve) => {\n function frame(now: number) {\n const t = clamp((now - start) / durationMs, 0, 1);\n const k = easeFn(t);\n let x: number, y: number;\n if (useCurve) {\n // Quadratic Bezier: B(t) = (1-t)^2 P0 + 2(1-t)t P1 + t^2 P2\n const u = 1 - k;\n x = u * u * from.x + 2 * u * k * cp.x + k * k * to.x;\n y = u * u * from.y + 2 * u * k * cp.y + k * k * to.y;\n } else {\n x = from.x + (to.x - from.x) * k;\n y = from.y + (to.y - from.y) * k;\n }\n // Add subtle wobble for realism (very small amplitude), taper to 0 near end\n const wobbleBase = 0.35;\n const wobbleAmp = wobbleBase * (1 - k);\n const nx = Math.sin(now * 0.02) * wobbleAmp;\n const ny = Math.cos(now * 0.018) * wobbleAmp;\n el.style.left = `${x + nx}px`;\n el.style.top = `${y + ny}px`;\n updateCursorColorAt(el, x + nx, y + ny);\n if (onFrame) onFrame({ x: x + nx, y: y + ny, t, now });\n if (t < 1) requestAnimationFrame(frame);\n else resolve();\n }\n requestAnimationFrame(frame);\n });\n}\n\nfunction getCenterPoint(el: Element) {\n const r = el.getBoundingClientRect();\n return { x: r.left + r.width / 2, y: r.top + r.height / 2 };\n}\n\nfunction applyOffset(p: { x: number; y: number }, offset?: { x?: number; y?: number }) {\n return { x: p.x + (offset?.x ?? 0), y: p.y + (offset?.y ?? 0) };\n}\n\nfunction dispatchMouseLike(\n target: Element,\n type: string,\n point: { x: number; y: number },\n extra?: any\n) {\n const common = {\n bubbles: true,\n cancelable: true,\n view: window,\n clientX: point.x,\n clientY: point.y,\n ...extra,\n };\n\n try {\n const isDown = type === \"pointerdown\" || type === \"mousedown\";\n const isUp = type === \"pointerup\" || type === \"mouseup\";\n const enriched = {\n button: 0,\n buttons: isDown ? 1 : 0,\n isPrimary: true,\n ...common,\n };\n if (\"PointerEvent\" in window) {\n // @ts-ignore - PointerEvent init differs slightly\n const ev = new PointerEvent(type, { pointerId: 1, pointerType: \"mouse\", ...enriched });\n target.dispatchEvent(ev);\n } else {\n const ev = new MouseEvent(type, enriched as MouseEventInit);\n target.dispatchEvent(ev);\n }\n } catch {\n const ev = new MouseEvent(type, common);\n target.dispatchEvent(ev);\n }\n}\n\nfunction isElement(obj: any): obj is Element {\n return obj && typeof obj === \"object\" && obj.nodeType === 1;\n}\n\nfunction resolveWithin(within?: Element | string | null): Element | Document {\n if (!within) return document;\n if (isElement(within)) return within;\n if (typeof within === \"string\") {\n const byId = document.getElementById(within);\n if (byId) return byId;\n const q = document.querySelector(within);\n if (q) return q as Element;\n }\n return document;\n}\n\nfunction resolveTarget(target: GuideTarget): { kind: \"element\" | \"position\"; element?: Element | null; point?: { x: number; y: number } } {\n if (isElement(target)) return { kind: \"element\", element: target };\n if (typeof target === \"string\") {\n const byId = document.getElementById(target);\n if (byId) return { kind: \"element\", element: byId };\n const q = document.querySelector(target);\n return { kind: q ? \"element\" : \"position\", element: q ?? null };\n }\n if (typeof target === \"object\" && \"position\" in target) {\n return { kind: \"position\", point: target.position };\n }\n if (typeof target === \"object\" && \"selector\" in target) {\n const scope = resolveWithin(target.within ?? null);\n const all = (scope as Element | Document).querySelectorAll(target.selector);\n const idx = Math.max(0, Math.min(all.length - 1, target.nth ?? 0));\n const el = all[idx] ?? null;\n return { kind: el ? \"element\" : \"position\", element: el };\n }\n return { kind: \"position\", point: { x: 0, y: 0 } };\n}\n\nfunction getAnchoredPoint(el: Element, anchor?: Anchor) {\n const r = el.getBoundingClientRect();\n if (!anchor || anchor === \"center\") return { x: r.left + r.width / 2, y: r.top + r.height / 2 };\n if (anchor === \"top-left\") return { x: r.left, y: r.top };\n if (anchor === \"bottom-right\") return { x: r.right, y: r.bottom };\n const ax = clamp(anchor.x, 0, 1);\n const ay = clamp(anchor.y, 0, 1);\n return { x: r.left + r.width * ax, y: r.top + r.height * ay };\n}\n\nfunction clampToViewport(p: { x: number; y: number }) {\n return { x: clamp(p.x, 0, window.innerWidth), y: clamp(p.y, 0, window.innerHeight) };\n}\n\n \n\nfunction CursorController() {\n useEffect(() => {\n (window as any).__cursorGuide = async (\n stepsOrTarget: GuideTarget | GuideStep[],\n options: GuideOptions = {}\n ): Promise<GuideRunResult> => {\n const steps: GuideStep[] = Array.isArray(stepsOrTarget)\n ? stepsOrTarget\n : [{ target: stepsOrTarget, action: options.action ?? \"none\", options }];\n\n const results: GuideStepResult[] = [];\n const cursor = await getOrCreateCursor();\n cursor.classList.add(\"visible\", \"as-arrow\");\n cursor.classList.remove(\"as-pointer\", \"pressing\");\n ensureCursorVisible(cursor);\n keepCursorVisibleWhileMoving();\n const curX = parseFloat(cursor.style.left || \"20\") || 20;\n const curY = parseFloat(cursor.style.top || \"20\") || 20;\n updateCursorColorAt(cursor, curX, curY);\n\n for (const s of steps) {\n const {\n durationMs = 800,\n easing = \"ease-in-out\",\n offset,\n highlight = true,\n path = \"curve\",\n curveStrength = 0.25,\n curveDirection = \"auto\",\n anchor,\n cursorHotspot,\n dragTo,\n } = s.options ?? {};\n\n const action: GuideAction = s.action ?? (s.options?.action ?? \"none\");\n const t0 = performance.now();\n\n const resolved = resolveTarget(s.target);\n let targetPoint: { x: number; y: number } | null = null;\n let targetElement: Element | null = null;\n if (resolved.kind === \"element\" && resolved.element) {\n targetElement = resolved.element;\n \n // Hide cursor during scroll to avoid confusion\n cursor.classList.remove(\"visible\");\n \n // Scroll the element into view\n targetElement.scrollIntoView({ behavior: \"smooth\", block: \"center\", inline: \"center\" });\n \n // Wait for ALL scrolling (window and containers) to settle\n await waitForScrollSettled(targetElement, 1500, 180);\n \n // Show cursor again after scroll is complete\n ensureCursorVisible(cursor);\n \n // Get target point AFTER scroll has settled\n targetPoint = getAnchoredPoint(targetElement, anchor);\n } else if (resolved.kind === \"position\" && resolved.point) {\n targetPoint = resolved.point;\n }\n if (!targetPoint) {\n results.push({ ok: false, action, targetKind: resolved.kind, durationMs: Math.round(performance.now() - t0), error: \"Target not found\" });\n continue;\n }\n\n // Get cursor's current position AFTER scroll has settled\n const from = {\n x: parseFloat(cursor.style.left || \"20\") || 20,\n y: parseFloat(cursor.style.top || \"20\") || 20,\n };\n const to = clampToViewport(applyOffset(targetPoint, offset));\n\n await animatePosition(cursor, from, to, durationMs, easing, path, curveStrength, curveDirection);\n\n // Small overshoot and settle\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const dist = Math.hypot(dx, dy) || 1;\n const ux = dx / dist;\n const uy = dy / dist;\n const overshoot = Math.min(6, Math.max(3, dist * 0.02));\n const over = { x: to.x + ux * overshoot, y: to.y + uy * overshoot };\n await animatePosition(cursor, to, over, Math.max(70, durationMs * 0.1), \"ease-out\", \"straight\", 0, \"right\");\n await animatePosition(cursor, over, to, 120, \"ease-out\", \"straight\", 0, \"left\");\n\n if (highlight) {\n (cursor as any).classList?.add(\"click\");\n setTimeout(() => (cursor as any).classList?.remove(\"click\"), 180);\n }\n\n let clickedId: string | null = null;\n try {\n if (action === \"click\") {\n cursor.classList.remove(\"as-arrow\");\n cursor.classList.add(\"as-pointer\", \"pressing\");\n const hotspot = { x: cursorHotspot?.x ?? 0, y: cursorHotspot?.y ?? 0 };\n // Convert viewport coords to page coords for elementFromPoint stability after scroll\n const pageP = { x: to.x + hotspot.x, y: to.y + hotspot.y };\n cursor.style.left = `${pageP.x}px`;\n cursor.style.top = `${pageP.y}px`;\n updateCursorColorAt(cursor, pageP.x, pageP.y);\n const clickTarget = targetElement ?? document.elementFromPoint(pageP.x, pageP.y) ?? document.body;\n dispatchMouseLike(clickTarget, \"pointerdown\", pageP);\n dispatchMouseLike(clickTarget, \"mousedown\", pageP);\n await new Promise((r) => setTimeout(r, 90));\n cursor.classList.remove(\"pressing\");\n dispatchMouseLike(clickTarget, \"mouseup\", pageP);\n dispatchMouseLike(clickTarget, \"click\", pageP);\n setTimeout(() => {\n cursor.classList.remove(\"as-pointer\");\n cursor.classList.add(\"as-arrow\");\n }, 140);\n if (clickTarget instanceof HTMLElement) clickTarget.focus?.();\n clickedId = (clickTarget as HTMLElement)?.id ?? null;\n } else if (action === \"drag\") {\n if (!dragTo) throw new Error(\"dragTo is required for action 'drag'\");\n const dest = resolveTarget(dragTo);\n let destPoint: { x: number; y: number } | null = null;\n if (dest.kind === \"element\" && dest.element) destPoint = getAnchoredPoint(dest.element, anchor);\n if (dest.kind === \"position\" && dest.point) destPoint = dest.point;\n if (!destPoint) throw new Error(\"dragTo target not found\");\n const dst = clampToViewport(applyOffset(destPoint, offset));\n\n const startP = { x: to.x, y: to.y };\n const startTarget = targetElement ?? document.elementFromPoint(startP.x, startP.y) ?? document.body;\n cursor.classList.remove(\"as-arrow\");\n cursor.classList.add(\"as-pointer\", \"pressing\");\n dispatchMouseLike(startTarget, \"pointerdown\", startP);\n dispatchMouseLike(startTarget, \"mousedown\", startP);\n\n await animatePosition(cursor, startP, dst, Math.max(200, durationMs), easing, path, curveStrength, curveDirection, ({ x, y }) => {\n const moveTarget = document.elementFromPoint(x, y) ?? document.body;\n const moveP = { x, y };\n dispatchMouseLike(moveTarget, \"pointermove\", moveP);\n dispatchMouseLike(moveTarget, \"mousemove\", moveP);\n });\n\n const endTarget = document.elementFromPoint(dst.x, dst.y) ?? document.body;\n cursor.classList.remove(\"pressing\");\n dispatchMouseLike(endTarget, \"pointerup\", dst);\n dispatchMouseLike(endTarget, \"mouseup\", dst);\n }\n\n results.push({ ok: true, action, targetKind: resolved.kind, durationMs: Math.round(performance.now() - t0), clickedElementId: clickedId });\n } catch (e: any) {\n results.push({ ok: false, action, targetKind: resolved.kind, durationMs: Math.round(performance.now() - t0), error: e?.message ?? String(e) });\n }\n }\n\n stopMovingAndMaybeHide(cursor, 2000);\n return { ok: results.every(r => r.ok), steps: results };\n };\n return () => {\n try {\n delete (window as any).__cursorGuide;\n } catch {\n (window as any).__cursorGuide = undefined;\n }\n };\n }, []);\n\n return null;\n}\n\nexport default CursorController;\n","import React, { useState, useRef, useCallback, useEffect, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport, lastAssistantMessageIsCompleteWithToolCalls } from \"ai\";\nimport { ChatHeader } from \"./hsafa-chat/ChatHeader\";\nimport { useFileUpload } from \"../hooks/useFileUploadHook\";\nimport { useAutoScroll } from \"../hooks/useAutoScroll\";\nimport { HsafaChatProps } from \"../types/chat\";\nimport { buildUserContent } from \"../utils/file-upload\";\nimport { MessageList } from \"./hsafa-chat\";\nimport { ChatInput } from \"./hsafa-chat\";\nimport { createChatStorage } from \"../utils/chat-storage\";\nimport { ChatHistoryModal } from \"./hsafa-chat/ChatHistoryModal\";\nimport { useHsafa } from \"../providers/HsafaProvider\";\nimport { FloatingChatButton } from \"./FloatingChatButton\";\nimport { getDomComponents, guideCursor, FillActiveInput } from \"./web-controler\";\n\nexport function HsafaChat({\n agentId,\n theme,\n primaryColor,\n primaryColorDark,\n primaryColorLight,\n backgroundColor,\n borderColor,\n textColor,\n accentColor,\n baseUrl = '',\n initialMessages = [],\n onMessagesChange,\n defaultOpen = true,\n floatingButtonPosition = { bottom: 24, right: 24 },\n UIComponents = {},\n HsafaTools = {},\n}: HsafaChatProps & { \n baseUrl?: string;\n initialMessages?: any[];\n onMessagesChange?: (messages: any[]) => void;\n}) {\n const { dir: providerDir, theme: providerTheme } = useHsafa();\n const effectiveTheme = (theme || providerTheme || 'dark');\n \n // Determine the primary color based on theme\n const effectivePrimaryColor = effectiveTheme === 'dark' \n ? (primaryColorDark || primaryColor || '#ffffff')\n : (primaryColorLight || primaryColor || '#000000');\n \n const themeColors = {\n primaryColor: effectivePrimaryColor,\n backgroundColor: backgroundColor || (effectiveTheme === 'dark' ? '#0B0B0F' : '#FFFFFF'),\n borderColor: borderColor || (effectiveTheme === 'dark' ? '#2A2C33' : '#E5E7EB'),\n textColor: textColor || (effectiveTheme === 'dark' ? '#EDEEF0' : '#111827'),\n accentColor: accentColor || (effectiveTheme === 'dark' ? '#17181C' : '#F9FAFB'),\n mutedTextColor: effectiveTheme === 'dark' ? '#9AA0A6' : '#6B7280',\n inputBackground: effectiveTheme === 'dark' ? '#17181C' : '#F3F4F6',\n cardBackground: effectiveTheme === 'dark' ? '#121318' : '#FFFFFF',\n hoverBackground: effectiveTheme === 'dark' ? '#1c1e25' : '#F3F4F6',\n };\n\n const resolvedColors = themeColors;\n const t = (key: string) => ({\n 'header.new': 'New',\n 'header.history': 'History',\n 'header.close': 'Close chat',\n 'input.placeholder': 'Ask your question...',\n 'input.attachFiles': 'Attach files',\n 'input.insertLink': 'Insert link',\n 'input.send': 'Send',\n 'input.stop': 'Stop',\n 'input.uploadingFiles': 'Uploading files...',\n 'input.previewImage': 'Preview image',\n 'input.removeFile': 'Remove file',\n 'messages.empty': 'Start by sending a message to the agent.',\n 'general.agent': 'Agent',\n 'editor.cancel': 'Cancel',\n 'editor.saveAndRegenerate': 'Save & Regenerate',\n 'editor.clickToEdit': 'Click to edit',\n } as Record<string, string>)[key] || key;\n\n // File upload hook\n const {\n attachments,\n uploading,\n fileInputRef,\n formatBytes,\n handleRemoveAttachment,\n handleFileSelection,\n clearAttachments,\n } = useFileUpload(baseUrl);\n\n const [uploadError, setUploadError] = useState<string | null>(null);\n\n // Local state for input\n const [input, setInput] = useState<string>('');\n \n // Generate chat ID for the session\n const [chatId, setChatId] = useState(() => `chat_${Date.now()}_${Math.random().toString(36).slice(2)}`);\n \n // Configure transport to fetch from the correct endpoint\n const transport = useMemo(() => {\n return new DefaultChatTransport({\n api: `${baseUrl}/api/run/${agentId}`,\n // Custom fetch to include chatId in request body\n fetch: async (input: RequestInfo | URL, init?: RequestInit) => {\n // Add chatId to the request body\n const body = init?.body ? JSON.parse(init.body as string) : {};\n const enhancedBody = {\n ...body,\n chatId,\n };\n \n return fetch(input, {\n ...init,\n body: JSON.stringify(enhancedBody),\n });\n },\n });\n }, [baseUrl, agentId, chatId]);\n \n // Memoize callbacks to prevent infinite loops\n const onFinishCallback = useCallback((message: any) => {\n console.log('Message finished:', message);\n // Don't call onMessagesChange here as it causes infinite loops\n // The parent can track messages through other means if needed\n }, []);\n\n const onErrorCallback = useCallback((error: Error) => {\n console.error('Chat error:', error);\n }, []);\n\n // Built-in Web Controller Tools\n const builtInTools: Record<string, any> = useMemo(() => ({\n // Tool 1: Get DOM Components (read-only)\n getDomComponents: {\n tool: async ({ includeHidden, selector }: any) => {\n return await getDomComponents({ includeHidden, selector });\n },\n executeEachToken: false,\n },\n // Tool 2: Control Cursor\n controlCursor: {\n tool: async ({ target, action, anchor, durationMs, dragTo }: any) => {\n const res = await guideCursor(target, { action, anchor, durationMs, dragTo });\n // Normalize a friendly message for the agent, especially after clicks\n if (res && res.ok) {\n const last = Array.isArray(res.steps) && res.steps.length ? res.steps[res.steps.length - 1] : undefined;\n const clicked = last?.clickedElementId ? ` (clicked element id: ${last.clickedElementId})` : '';\n const act = action || last?.action || 'none';\n return {\n success: true,\n message: act === 'click' ? `Cursor moved and clicked successfully${clicked}` : act === 'drag' ? `Cursor dragged successfully` : `Cursor moved successfully`,\n details: res,\n };\n }\n return {\n success: false,\n message: 'Cursor action failed',\n details: res,\n };\n },\n executeEachToken: false,\n },\n // Tool 3: Fill Active Input (with streaming)\n fillActiveInput: {\n tool: async ({ value }: any) => {\n const res = await FillActiveInput(value);\n return {\n success: !!res?.ok,\n message: res?.ok ? 'Active input filled successfully' : (res?.errors?.[0] || 'Failed to fill active input'),\n details: res,\n };\n },\n executeEachToken: true, // Enable character-by-character streaming\n },\n // Frontend-only: Get From User (dynamic form). We declare a stub so streaming handler can detect it.\n getFromUser: {\n tool: async (_: any) => ({ ok: true }),\n executeEachToken: true,\n },\n }), []);\n\n // Merge built-in tools with user-provided HsafaTools\n const allTools: Record<string, any> = useMemo(() => ({\n ...builtInTools,\n ...HsafaTools, // User tools can override built-in tools if needed\n }), [builtInTools, HsafaTools]);\n\n // Ephemeral in-chat form rendering for get_from_user\n const formHostRef = useRef<Map<string, HTMLDivElement>>(new Map());\n const formStateRef = useRef<Map<string, { submitted?: boolean; skipped?: boolean; values?: Record<string, any> }>>(new Map());\n const cleanupAllForms = useCallback(() => {\n try {\n formHostRef.current.forEach((el) => { try { el.remove(); } catch {} });\n formHostRef.current.clear();\n formStateRef.current.clear();\n } catch {}\n }, []);\n const renderOrUpdateUserForm = useCallback((input: any, toolCallId: string) => {\n // Find the latest assistant message container to mount the form under\n // We avoid modifying the default tool-call UI by taking over rendering here\n let host = formHostRef.current.get(toolCallId);\n if (!host) {\n host = document.createElement('div');\n host.className = 'hsafa-inline-form';\n // Prefer to mount into the tool area placeholder when available\n const toolHost = document.querySelector(`[data-get-from-user-host=\"${toolCallId}\"]`) as HTMLElement | null;\n if (toolHost) {\n toolHost.innerHTML = '';\n toolHost.appendChild(host);\n } else {\n // Fallback to chat panel container\n const chatEl = document.querySelector('.chat-scroll-container');\n (chatEl || document.body).appendChild(host);\n }\n formHostRef.current.set(toolCallId, host);\n } else {\n // If host exists but not inside placeholder yet, try to relocate it\n const currentParent = host.parentElement;\n const toolHost = document.querySelector(`[data-get-from-user-host=\"${toolCallId}\"]`) as HTMLElement | null;\n if (toolHost && currentParent !== toolHost) {\n try { currentParent?.removeChild(host); } catch {}\n toolHost.innerHTML = '';\n toolHost.appendChild(host);\n }\n }\n\n // Build form from input incrementally\n const title = input?.title || 'Provide input';\n const description = input?.description || '';\n const submitLabel = input?.submitLabel || 'Submit';\n const skipLabel = input?.skipLabel || 'Skip';\n // Allow zero-field forms (e.g., Accept/Reject only)\n const fields = Array.isArray(input?.fields)\n ? input.fields\n : (input?.label || input?.placeholder)\n ? [{ id: 'value', label: input?.label || 'Value', type: 'text', placeholder: input?.placeholder || '' }]\n : [];\n\n const existingState = formStateRef.current.get(toolCallId) || { submitted: false, skipped: false, values: undefined };\n\n host.innerHTML = '';\n const form = document.createElement('form');\n form.style.margin = '12px 0';\n form.style.padding = '14px';\n form.style.border = '1px solid var(--hsafa-border, #2A2C33)';\n form.style.borderRadius = '12px';\n form.style.background = 'var(--hsafa-card, #121318)';\n form.style.color = 'var(--hsafa-text, #EDEEF0)';\n form.style.boxShadow = '0 6px 20px rgba(0,0,0,0.25)';\n\n const h = document.createElement('div');\n h.style.fontWeight = '600';\n h.style.marginBottom = '6px';\n h.textContent = title;\n form.appendChild(h);\n\n if (description) {\n const d = document.createElement('div');\n d.style.fontSize = '12px';\n d.style.opacity = '0.8';\n d.style.marginBottom = '10px';\n d.textContent = description;\n form.appendChild(d);\n }\n\n fields.forEach((f: any) => {\n const wrap = document.createElement('div');\n wrap.style.margin = '10px 0';\n if (f.label) {\n const lab = document.createElement('label');\n lab.style.display = 'block';\n lab.style.fontSize = '12px';\n lab.style.marginBottom = '6px';\n lab.style.opacity = '0.9';\n lab.textContent = f.label;\n wrap.appendChild(lab);\n }\n let inputEl: HTMLElement;\n const type = (f.type || 'text').toLowerCase();\n if (type === 'textarea') {\n const el = document.createElement('textarea');\n el.placeholder = f.placeholder || '';\n (el as any).value = f.value ?? '';\n el.style.width = '100%';\n el.style.minHeight = '72px';\n el.style.padding = '10px 12px';\n el.style.border = '1px solid var(--hsafa-border, #2A2C33)';\n el.style.borderRadius = '10px';\n el.style.background = 'var(--hsafa-input-bg, #17181C)';\n el.style.color = 'inherit';\n inputEl = el;\n } else if (type === 'select' && Array.isArray(f.options)) {\n const el = document.createElement('select');\n el.style.width = '100%';\n el.style.padding = '10px 12px';\n el.style.border = '1px solid var(--hsafa-border, #2A2C33)';\n el.style.borderRadius = '10px';\n el.style.background = 'var(--hsafa-input-bg, #17181C)';\n el.style.color = 'inherit';\n f.options.forEach((opt: any) => {\n const o = document.createElement('option');\n o.value = String(opt.value);\n o.text = String(opt.label ?? opt.value);\n el.appendChild(o);\n });\n (el as any).value = f.value ?? '';\n inputEl = el;\n } else if (type === 'checkbox') {\n const el = document.createElement('input');\n el.type = 'checkbox';\n (el as any).checked = !!f.value;\n el.style.transform = 'scale(1.1)';\n inputEl = el;\n } else {\n const el = document.createElement('input');\n el.type = type as any;\n el.placeholder = f.placeholder || '';\n (el as any).value = f.value ?? '';\n el.style.width = '100%';\n el.style.padding = '10px 12px';\n el.style.border = '1px solid var(--hsafa-border, #2A2C33)';\n el.style.borderRadius = '10px';\n el.style.background = 'var(--hsafa-input-bg, #17181C)';\n el.style.color = 'inherit';\n inputEl = el;\n }\n const fieldId = f.id || 'value';\n (inputEl as any).dataset.fieldId = fieldId;\n // Prefill from existing state values when present (hydrated from messages)\n const savedVal = existingState.values && Object.prototype.hasOwnProperty.call(existingState.values, fieldId)\n ? (existingState.values as any)[fieldId]\n : undefined;\n if (typeof savedVal !== 'undefined') {\n if ((inputEl as HTMLInputElement).type === 'checkbox') {\n (inputEl as HTMLInputElement).checked = !!savedVal;\n } else {\n (inputEl as HTMLInputElement).value = String(savedVal);\n }\n }\n if (existingState.submitted || existingState.skipped) {\n (inputEl as any).setAttribute('disabled', 'true');\n (inputEl as any).style.opacity = '0.7';\n }\n wrap.appendChild(inputEl);\n form.appendChild(wrap);\n });\n\n const trimmedSubmit = String(submitLabel || '').trim();\n const trimmedSkip = String(skipLabel || '').trim();\n const showActions = Boolean(trimmedSubmit || trimmedSkip);\n let submitBtn: HTMLButtonElement | null = null;\n let skipBtn: HTMLButtonElement | null = null;\n if (showActions) {\n const actions = document.createElement('div');\n actions.style.display = 'flex';\n actions.style.gap = '8px';\n actions.style.marginTop = '10px';\n submitBtn = document.createElement('button');\n submitBtn.type = 'submit';\n submitBtn.textContent = trimmedSubmit || 'Submit';\n submitBtn.style.padding = '6px 10px';\n submitBtn.style.borderRadius = '8px';\n submitBtn.style.background = 'var(--hsafa-button-bg, var(--hsafa-primary, #2563eb))';\n submitBtn.style.color = '#000000';\n skipBtn = document.createElement('button');\n skipBtn.type = 'button';\n skipBtn.textContent = trimmedSkip || 'Skip';\n skipBtn.style.padding = '6px 10px';\n skipBtn.style.borderRadius = '8px';\n skipBtn.style.background = 'transparent';\n skipBtn.style.border = '1px solid var(--hsafa-border, #2A2C33)';\n skipBtn.style.color = 'inherit';\n if (existingState.submitted) {\n submitBtn.textContent = `${trimmedSubmit || 'Submit'} ✓`;\n submitBtn.style.opacity = '0.8';\n submitBtn.disabled = true;\n }\n if (existingState.skipped) {\n skipBtn.textContent = `${trimmedSkip || 'Skip'} ✓`;\n skipBtn.style.opacity = '0.8';\n skipBtn.disabled = true;\n }\n actions.appendChild(submitBtn);\n actions.appendChild(skipBtn);\n form.appendChild(actions);\n }\n\n form.onsubmit = (e) => {\n e.preventDefault();\n const data: Record<string, any> = {};\n form.querySelectorAll('[data-field-id]').forEach((el) => {\n const id = (el as HTMLElement).dataset.fieldId || 'value';\n if ((el as HTMLInputElement).type === 'checkbox') {\n data[id] = (el as HTMLInputElement).checked;\n } else {\n data[id] = (el as HTMLInputElement).value ?? '';\n }\n });\n // Persist state and keep form visible\n formStateRef.current.set(toolCallId, { submitted: true, skipped: false, values: data });\n (chatApiRef.current as any).addToolResult({\n tool: 'getFromUser',\n toolCallId,\n output: { success: true, submitted: true, values: data }\n });\n // Disable inputs and show submitted badge\n form.querySelectorAll('[data-field-id]').forEach((el) => {\n (el as HTMLInputElement).disabled = true;\n (el as HTMLInputElement).style.opacity = '0.7';\n });\n if (submitBtn) {\n submitBtn.textContent = `${trimmedSubmit || 'Submit'} ✓`;\n submitBtn.style.opacity = '0.8';\n submitBtn.disabled = true;\n }\n if (skipBtn) {\n skipBtn.disabled = true;\n }\n };\n if (skipBtn) {\n skipBtn.onclick = () => {\n // Persist state and keep form visible\n formStateRef.current.set(toolCallId, { submitted: false, skipped: true, values: undefined });\n (chatApiRef.current as any).addToolResult({\n tool: 'getFromUser',\n toolCallId,\n output: { success: true, submitted: false, skipped: true }\n });\n // Disable inputs and show skipped badge\n form.querySelectorAll('[data-field-id]').forEach((el) => {\n (el as HTMLInputElement).disabled = true;\n (el as HTMLInputElement).style.opacity = '0.7';\n });\n if (skipBtn) {\n skipBtn.textContent = `${trimmedSkip || 'Skip'} ✓`;\n skipBtn.style.opacity = '0.8';\n skipBtn.disabled = true;\n }\n if (submitBtn) submitBtn.disabled = true;\n };\n }\n\n // Status row (always visible after submit/skip)\n if (existingState.submitted || existingState.skipped) {\n const status = document.createElement('div');\n status.style.marginTop = '10px';\n status.style.fontSize = '12px';\n status.style.display = 'flex';\n status.style.alignItems = 'center';\n status.style.gap = '8px';\n const badge = document.createElement('span');\n badge.style.display = 'inline-flex';\n badge.style.alignItems = 'center';\n badge.style.padding = '2px 8px';\n badge.style.borderRadius = '999px';\n badge.style.fontWeight = '600';\n badge.style.fontSize = '11px';\n if (existingState.submitted) {\n badge.style.background = 'rgba(16,185,129,0.15)';\n badge.style.color = '#10b981';\n badge.textContent = 'Submitted';\n } else {\n badge.style.background = 'rgba(234,179,8,0.15)';\n badge.style.color = '#eab308';\n badge.textContent = 'Skipped';\n }\n status.appendChild(badge);\n // if (existingState.values && Object.keys(existingState.values).length > 0) {\n // const sum = document.createElement('div');\n // sum.style.opacity = '0.85';\n // sum.textContent = Object.entries(existingState.values)\n // .map(([k, v]) => `${k}: ${String(v)}`)\n // .join(' · ');\n // status.appendChild(sum);\n // }\n form.appendChild(status);\n }\n\n host.appendChild(form);\n }, []);\n\n // Ref to chatApi to use inside callbacks created before chatApi is defined\n const chatApiRef = useRef<any>(null);\n\n // Helper to extract actual tool function (supports both function and object with tool property)\n const getToolFunction = useCallback((toolName: string) => {\n const toolConfig = allTools[toolName];\n if (!toolConfig) return null;\n \n // If it's an object with a tool property, extract the function\n if (typeof toolConfig === 'object' && 'tool' in toolConfig) {\n return toolConfig.tool;\n }\n \n // Otherwise, it's the function itself\n return typeof toolConfig === 'function' ? toolConfig : null;\n }, [allTools]);\n\n // useChat hook from Vercel AI SDK v5\n const chatApi = useChat({\n transport,\n onFinish: onFinishCallback,\n onError: onErrorCallback,\n experimental_throttle: 10,\n // ✅ Auto-resubmit after all tool results are available\n sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,\n async onToolCall({ toolCall }) {\n // Handle custom frontend tools\n const toolFn = getToolFunction(toolCall.toolName);\n // Intercept get_from_user: render form and suppress default tool UI/result\n if (toolCall.toolName === 'getFromUser' || toolCall.toolName === 'get_from_user') {\n try {\n renderOrUpdateUserForm(toolCall.input, toolCall.toolCallId);\n } catch (e) {\n console.error('get_from_user render error', e);\n }\n return;\n }\n if (!toolFn) return;\n\n try {\n const result = await toolFn(toolCall.input);\n // ✅ Include the tool name; do not await - avoids potential deadlocks\n (chatApi as any).addToolResult({\n tool: toolCall.toolName,\n toolCallId: toolCall.toolCallId,\n output: result,\n });\n } catch (err: any) {\n // ✅ Use proper error format\n (chatApi as any).addToolResult({\n tool: toolCall.toolName,\n toolCallId: toolCall.toolCallId,\n state: \"output-error\",\n errorText: err?.message || String(err),\n });\n }\n },\n });\n const { messages: chatMessages, sendMessage, status, stop, error: chatError } = chatApi;\n chatApiRef.current = chatApi;\n\n // Execute frontend tools on each token (for tools with executeEachToken: true)\n const lastProcessedInputRef = useRef<Map<string, string>>(new Map());\n \n useEffect(() => {\n // Process each message for streaming tool inputs\n chatMessages.forEach((message: any) => {\n if (message.role !== 'assistant') return;\n \n // Check each part for tool-call with streaming input\n message.parts?.forEach((part: any) => {\n if (!part.toolCallId) return;\n \n // Extract tool name from type field (format: \"tool-{toolName}\")\n let toolName = part.toolName;\n if (!toolName && part.type?.startsWith('tool-')) {\n toolName = part.type.replace(/^tool-/, '');\n }\n \n if (!toolName) return;\n \n const toolConfig = allTools[toolName];\n \n // Check if this tool has executeEachToken enabled\n if (toolConfig && typeof toolConfig === 'object' && toolConfig.executeEachToken && toolConfig.tool) {\n // Use part.input (for streaming) or part.args (for final)\n const toolInput = part.input || part.args || {};\n const currentInput = JSON.stringify(toolInput);\n const lastInput = lastProcessedInputRef.current.get(part.toolCallId);\n \n // Only execute if input has changed and is not empty\n if (currentInput !== lastInput && currentInput !== '{}') {\n lastProcessedInputRef.current.set(part.toolCallId, currentInput);\n \n try {\n // Special handling: get_from_user → build or update a live form UI\n if (toolName === 'getFromUser' || toolName === 'get_from_user') {\n renderOrUpdateUserForm(toolInput, part.toolCallId);\n } else {\n // Execute the tool with current partial input\n toolConfig.tool(toolInput);\n }\n } catch (err) {\n console.error(`Error executing streaming tool ${toolName}:`, err);\n }\n }\n }\n });\n });\n }, [chatMessages, allTools]);\n\n // Hydrate get_from_user form states from persisted messages (tool outputs) on load and whenever messages change\n useEffect(() => {\n try {\n const seenIds = new Set<string>();\n const pendingRenders: Array<{ input: any; toolCallId: string }> = [];\n chatMessages.forEach((message: any) => {\n if (message.role !== 'assistant') return;\n (message.parts || []).forEach((part: any) => {\n const toolName = part?.toolName || (typeof part?.type === 'string' && part.type.startsWith('tool-') ? String(part.type.replace(/^tool-/, '')) : undefined);\n if (toolName !== 'getFromUser' && toolName !== 'get_from_user') return;\n const toolCallId = part?.toolCallId || '';\n if (!toolCallId) return;\n seenIds.add(toolCallId);\n const out = part?.output;\n if (out && (out.submitted || out.skipped || out.values)) {\n const hydrated = {\n submitted: !!out.submitted,\n skipped: !!out.skipped,\n values: out.values || undefined,\n } as { submitted?: boolean; skipped?: boolean; values?: Record<string, any> };\n formStateRef.current.set(toolCallId, hydrated);\n }\n // Schedule a render/update into the in-message host\n const inVal = part?.input || part?.args || {};\n pendingRenders.push({ input: inVal, toolCallId });\n });\n });\n\n // Remove any stale hosts not present in messages\n formHostRef.current.forEach((_, key) => {\n if (!seenIds.has(key)) {\n const node = formHostRef.current.get(key);\n try { node?.remove(); } catch {}\n formHostRef.current.delete(key);\n formStateRef.current.delete(key);\n }\n });\n\n // Defer actual DOM mounting until after React paints tool hosts\n if (pendingRenders.length > 0) {\n const raf = requestAnimationFrame(() => {\n pendingRenders.forEach(({ input, toolCallId }) => {\n try { renderOrUpdateUserForm(input, toolCallId); } catch {}\n });\n });\n return () => cancelAnimationFrame(raf);\n }\n } catch {}\n }, [chatMessages, renderOrUpdateUserForm]);\n\n // Deduplicate progressive data-items and data-tool-input parts\n\n // Load initial messages if provided\n useEffect(() => {\n if (initialMessages && initialMessages.length > 0 && chatMessages.length === 0) {\n // Initial messages would need to be handled through a different mechanism in v5\n console.log('Initial messages:', initialMessages);\n }\n }, [initialMessages, chatMessages.length]);\n\n // Handle messages change callback with proper memoization to prevent infinite loops\n const onMessagesChangeRef = useRef(onMessagesChange);\n useEffect(() => {\n onMessagesChangeRef.current = onMessagesChange;\n }, [onMessagesChange]);\n\n const prevMessagesRef = useRef<any[]>([]);\n useEffect(() => {\n // Only call onMessagesChange when messages actually change (compare by length and last message ID)\n const messagesChanged = \n chatMessages.length !== prevMessagesRef.current.length ||\n (chatMessages.length > 0 && prevMessagesRef.current.length > 0 && \n chatMessages[chatMessages.length - 1]?.id !== prevMessagesRef.current[prevMessagesRef.current.length - 1]?.id);\n \n if (messagesChanged && onMessagesChangeRef.current) {\n prevMessagesRef.current = chatMessages;\n onMessagesChangeRef.current(chatMessages);\n }\n }, [chatMessages]);\n\n const isLoading = status === 'submitted' || status === 'streaming';\n\n // Hsafa provider integration and header/history state\n const { setStreamingState, setChatOpenState } = useHsafa();\n const [isOpen, setIsOpen] = useState<boolean>(() => {\n try {\n const tmp = createChatStorage(agentId);\n return tmp.loadShowChatPreference(Boolean(defaultOpen));\n } catch {\n return Boolean(defaultOpen);\n }\n });\n const [historyOpen, setHistoryOpen] = useState(false);\n const [historySearch, setHistorySearch] = useState(\"\");\n const [historyRefreshKey, setHistoryRefreshKey] = useState(0);\n const historyBtnRef = useRef<HTMLButtonElement>(null);\n const historyPopupRef = useRef<HTMLDivElement>(null);\n const [openReasoningIds, setOpenReasoningIds] = useState<Set<string>>(new Set());\n const [editingMessageId, setEditingMessageId] = useState<string | null>(null);\n const [editingText, setEditingText] = useState<string>('');\n const [editAttachments, setEditAttachments] = useState<any[]>([]);\n const [editUploading, setEditUploading] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const editTextareaRef = useRef<HTMLTextAreaElement>(null);\n const scrollRef = useAutoScroll<HTMLDivElement>(isLoading);\n\n // Local storage: create/save chats on first user message and updates\n const storage = useMemo(() => createChatStorage(agentId), [agentId]);\n const createdChatRef = useRef<boolean>(false);\n const restoredOnMountRef = useRef<boolean>(false);\n\n // On mount: restore last opened chat and its messages\n useEffect(() => {\n if (restoredOnMountRef.current) return;\n try {\n const savedId = storage.loadCurrentChatId();\n if (savedId) {\n createdChatRef.current = true;\n setChatId(savedId);\n const saved = storage.loadChat(savedId);\n const msgs = (saved && Array.isArray((saved as any).messages)) ? (saved as any).messages : [];\n try { (chatApi as any)?.setMessages?.(msgs); } catch {}\n }\n } catch {}\n restoredOnMountRef.current = true;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [storage]);\n useEffect(() => {\n if (chatMessages.length === 0) return;\n if (!createdChatRef.current) {\n const firstUser = chatMessages.find((m: any) => m.role === 'user');\n if (firstUser) {\n let titleSource = '';\n if (Array.isArray((firstUser as any).parts)) {\n const textPart = (firstUser as any).parts.find((p: any) => p && p.type === 'text');\n titleSource = textPart && typeof textPart.text === 'string' ? textPart.text : '';\n }\n const title = (titleSource || 'New chat').slice(0, 80);\n const now = Date.now();\n storage.upsertChatMeta({ id: chatId, title, createdAt: now, updatedAt: now });\n storage.saveChat({ id: chatId, messages: chatMessages as any, agentId } as any);\n storage.saveCurrentChatId(chatId);\n createdChatRef.current = true;\n }\n } else if (!isLoading) {\n const now = Date.now();\n storage.saveChat({ id: chatId, messages: chatMessages as any, agentId } as any);\n const metas = storage.loadChatsIndex();\n const found = metas.find((m) => m.id === chatId);\n if (found) storage.upsertChatMeta({ ...found, updatedAt: now });\n }\n }, [chatMessages, agentId, chatId, storage, isLoading]);\n\n // On fast streams, persist once after streaming finishes to capture the final assistant message\n const wasLoadingRef = useRef<boolean>(false);\n useEffect(() => {\n if (isLoading) {\n wasLoadingRef.current = true;\n return;\n }\n if (wasLoadingRef.current) {\n wasLoadingRef.current = false;\n try {\n const now = Date.now();\n storage.saveChat({ id: chatId, messages: chatMessages as any, agentId } as any);\n const metas = storage.loadChatsIndex();\n const found = metas.find((m) => m.id === chatId);\n if (found) storage.upsertChatMeta({ ...found, updatedAt: now });\n } catch {}\n }\n }, [isLoading, chatMessages, chatId, agentId, storage]);\n\n // Reflect streaming/open state via provider\n useEffect(() => {\n try { setStreamingState(chatId, isLoading); } catch {}\n return () => {\n // Cleanup: remove streaming state when component unmounts or chatId changes\n try { setStreamingState(chatId, false); } catch {}\n };\n }, [chatId, isLoading, setStreamingState]);\n\n useEffect(() => {\n try { setChatOpenState(chatId, isOpen); } catch {}\n return () => {\n // Cleanup: remove open state when component unmounts or chatId changes\n try { setChatOpenState(chatId, false); } catch {}\n };\n }, [chatId, isOpen, setChatOpenState]);\n\n // Send message handler\n const handleSendMessage = useCallback(async () => {\n const trimmedInput = input.trim();\n if (!trimmedInput && attachments.length === 0) return;\n if (isLoading) return;\n\n try {\n // Send message with proper format for Vercel AI SDK v5\n // FileUIPart uses 'url' field, convertToModelMessages will convert to 'data' for the model\n await sendMessage({\n text: trimmedInput,\n files: attachments.map(att => ({\n type: 'file' as const,\n url: att.url,\n mediaType: att.mimeType || 'application/octet-stream',\n ...(att.name ? { name: att.name } : {}),\n ...(att.size ? { size: att.size } : {}),\n })),\n });\n\n // Clear input and attachments\n setInput('');\n clearAttachments();\n setUploadError(null);\n } catch (error) {\n console.error('Failed to send message:', error);\n setUploadError('Failed to send message. Please try again.');\n }\n }, [input, attachments, isLoading, sendMessage, clearAttachments]);\n\n // Header actions handlers\n const handleNewChat = useCallback(() => {\n if (isLoading) return;\n cleanupAllForms();\n setInput('');\n clearAttachments();\n setUploadError(null);\n setEditingMessageId(null);\n setEditingText('');\n setEditAttachments([]);\n try { (chatApi as any)?.setMessages?.([]); } catch {}\n createdChatRef.current = false;\n const newId = `chat_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n setChatId(newId);\n try { storage.saveCurrentChatId(newId); } catch {}\n }, [isLoading, clearAttachments, storage, chatApi, cleanupAllForms]);\n\n const handleToggleHistory = useCallback(() => {\n setHistoryOpen(v => !v);\n }, []);\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n try { storage.saveShowChatPreference(false); } catch {}\n }, [storage]);\n\n\n // Handle file input change\n const onFileInputChange = useCallback(async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files) {\n await handleFileSelection(files, setUploadError);\n }\n // Reset input value to allow selecting the same file again\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n }, [handleFileSelection, fileInputRef]);\n\n // Auto-resize textarea effect for main input\n useEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n \n // Reset height to initial value first\n textarea.style.height = '24px';\n // Force reflow\n textarea.offsetHeight;\n // Then calculate proper height\n textarea.style.height = 'auto';\n const newHeight = Math.min(textarea.scrollHeight, 200); // max height of 200px\n textarea.style.height = `${newHeight}px`;\n }, [input]);\n\n // Auto-resize textarea effect for edit message\n React.useEffect(() => {\n const textarea = editTextareaRef.current;\n if (!textarea) return;\n \n // Reset height to initial value first\n textarea.style.height = 'auto';\n // Force reflow\n textarea.offsetHeight;\n // Then calculate proper height based on content\n const newHeight = Math.min(Math.max(textarea.scrollHeight, 48), 300); // min 48px, max 300px\n textarea.style.height = `${newHeight}px`;\n }, [editingText]);\n\n const toggleReasoning = (id: string) => {\n setOpenReasoningIds(prev => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const formatDuration = (ms: number): string => {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n const minutes = Math.floor(ms / 60000);\n const seconds = Math.round((ms % 60000) / 1000);\n return `${minutes}m ${seconds}s`;\n };\n\n const getToolStatus = (status?: string) => {\n const statusMap = {\n input_streaming: { color: '#eab308', text: 'Inputting' },\n running: { color: '#3b82f6', text: 'Running' },\n error: { color: '#ef4444', text: 'Error' },\n finished: { color: '#10b981', text: 'Called' }\n };\n return statusMap[status as keyof typeof statusMap] || statusMap.finished;\n };\n\n // Handle edit attachments\n const handleAddEditAttachments = useCallback(async (files: FileList) => {\n setEditUploading(true);\n try {\n const newAttachments = await Promise.all(\n Array.from(files).map(async (file) => {\n // Upload file to server\n const formData = new FormData();\n formData.append('file', file);\n \n const response = await fetch(`${baseUrl}/api/upload`, {\n method: 'POST',\n body: formData,\n });\n \n if (!response.ok) {\n throw new Error(`Upload failed: ${response.statusText}`);\n }\n \n const data = await response.json();\n \n return {\n id: data.url || `${Date.now()}-${Math.random()}`,\n name: file.name,\n url: data.url,\n mimeType: file.type,\n size: file.size,\n };\n })\n );\n \n setEditAttachments(prev => [...prev, ...newAttachments]);\n } catch (error) {\n console.error('Failed to upload files:', error);\n setUploadError('Failed to upload files. Please try again.');\n } finally {\n setEditUploading(false);\n }\n }, [baseUrl]);\n\n const handleRemoveEditAttachment = useCallback((id: string) => {\n setEditAttachments(prev => prev.filter(att => att.id !== id));\n }, []);\n\n const handleUserMessageClick = useCallback((id: string, text: string, attachments?: any[]) => {\n setEditingMessageId(id);\n setEditingText(text);\n setEditAttachments(attachments || []);\n }, []);\n\n const handleCancelEdit = useCallback(() => {\n setEditingMessageId(null);\n setEditingText('');\n setEditAttachments([]);\n }, []);\n\n const handleSaveEdit = useCallback(async (messageId: string, text: string) => {\n if (isLoading) return;\n \n try {\n // Find the message index\n const messageIndex = chatMessages.findIndex((m: any) => m.id === messageId);\n if (messageIndex === -1) return;\n\n // Create updated messages array (keep messages up to the edited one)\n const updatedMessages = chatMessages.slice(0, messageIndex);\n \n // Clear the current messages and set to the point before the edited message\n try { (chatApi as any)?.setMessages?.(updatedMessages); } catch {}\n \n // Send the edited message\n await sendMessage({\n text: text.trim(),\n files: editAttachments.map(att => ({\n type: 'file' as const,\n url: att.url,\n mediaType: att.mimeType || 'application/octet-stream',\n ...(att.name ? { name: att.name } : {}),\n ...(att.size ? { size: att.size } : {}),\n })),\n });\n\n // Reset edit state\n setEditingMessageId(null);\n setEditingText('');\n setEditAttachments([]);\n } catch (error) {\n console.error('Failed to save edit:', error);\n setUploadError('Failed to save message. Please try again.');\n }\n }, [isLoading, chatMessages, sendMessage, chatApi, editAttachments]);\n\n \n\n const panel = (\n <div\n style={{\n position: 'fixed',\n right: 0,\n top: 0,\n bottom: 0,\n width: \"420px\",\n display: 'flex',\n flexDirection: 'column',\n padding: '24px 16px',\n color: resolvedColors.textColor,\n gap: '16px',\n zIndex: 1000,\n transform: isOpen ? 'translateX(0)' : 'translateX(100%)',\n transition: 'transform 0.25s ease-out, width 0.2s ease-out'\n }}\n >\n <ChatHeader \n title={t('general.agent')}\n alwaysOpen={false}\n streaming={isLoading}\n dir={(providerDir || 'ltr') as any}\n resolvedColors={resolvedColors as any}\n onNew={handleNewChat}\n onToggleHistory={handleToggleHistory}\n onClose={handleClose}\n historyBtnRef={historyBtnRef}\n t={t as any}\n />\n\n {/* MessageList */}\n <div\n ref={scrollRef}\n className=\"chat-scroll-container\"\n style={{\n flex: '1',\n overflowY: 'auto',\n overflowX: 'hidden',\n padding: '16px 4px 16px 4px',\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n scrollBehavior: 'smooth',\n // Theme variables for inline forms and controls\n ['--hsafa-primary' as any]: (resolvedColors as any).primaryColor,\n ['--hsafa-border' as any]: (resolvedColors as any).borderColor,\n ['--hsafa-card' as any]: (resolvedColors as any).cardBackground,\n ['--hsafa-text' as any]: (resolvedColors as any).textColor,\n ['--hsafa-muted' as any]: (resolvedColors as any).mutedTextColor,\n ['--hsafa-bg' as any]: (resolvedColors as any).backgroundColor,\n ['--hsafa-hover' as any]: (resolvedColors as any).hoverBackground,\n ['--hsafa-input-bg' as any]: (resolvedColors as any).inputBackground,\n ['--hsafa-accent' as any]: (resolvedColors as any).accentColor,\n }}\n >\n {chatMessages.length === 0 ? (\n <div style={{ \n padding: '32px', \n textAlign: 'center', \n color: resolvedColors.mutedTextColor,\n fontSize: '14px' \n }}>\n {t('messages.empty')}\n </div>\n ) : (\n <MessageList\n chatMessages={chatMessages as any}\n isLoading={isLoading}\n openReasoningIds={openReasoningIds}\n toggleReasoning={(id) => setOpenReasoningIds(prev => { const n = new Set(prev); n.has(id) ? n.delete(id) : n.add(id); return n; })}\n resolvedColors={resolvedColors as any}\n t={t}\n onUserMessageClick={handleUserMessageClick}\n editingMessageId={editingMessageId}\n editingText={editingText}\n onEditingTextChange={setEditingText}\n onCancelEdit={handleCancelEdit}\n onSaveEdit={handleSaveEdit}\n editAttachments={editAttachments}\n onRemoveEditAttachment={handleRemoveEditAttachment}\n onAddEditAttachments={handleAddEditAttachments}\n editUploading={editUploading}\n UIComponents={UIComponents}\n />\n )}\n </div>\n\n {/* ChatInput */}\n <div style={{ position: 'sticky', bottom: '0', marginTop: 'auto', paddingBottom: '8px', }}>\n {uploadError && (\n <div style={{ padding: '8px 12px', marginBottom: '8px', backgroundColor: '#ef4444', color: '#fff', borderRadius: '8px', fontSize: '13px', display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <span>{uploadError}</span>\n <button onClick={() => setUploadError(null)} style={{ background: 'none', border: 'none', color: '#fff', cursor: 'pointer', padding: '2px' }}>×</button>\n </div>\n )}\n\n {chatError && (\n <div style={{ padding: '8px 12px', marginBottom: '8px', backgroundColor: '#ef4444', color: '#fff', borderRadius: '8px', fontSize: '13px', display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <span>An error occurred: {chatError.message || 'Please try again.'}</span>\n <button onClick={() => window.location.reload()} style={{ background: 'none', border: '1px solid #fff', color: '#fff', cursor: 'pointer', padding: '4px 8px', borderRadius: '4px', fontSize: '12px' }}>Refresh</button>\n </div>\n )}\n\n <ChatInput\n input={input}\n setInput={setInput}\n textareaRef={textareaRef}\n fileInputRef={fileInputRef}\n isLoading={isLoading}\n uploading={uploading}\n attachments={attachments as any}\n formatBytes={formatBytes}\n handleRemoveAttachment={handleRemoveAttachment}\n onFileInputChange={onFileInputChange}\n onSend={handleSendMessage}\n onStop={() => stop()}\n status={status}\n t={t}\n resolvedColors={resolvedColors as any}\n />\n </div>\n\n {/* History Modal */}\n <ChatHistoryModal\n historyOpen={historyOpen}\n historySearch={historySearch}\n currentChatId={chatId}\n refreshKey={historyRefreshKey}\n resolvedColors={resolvedColors as any}\n onClose={() => setHistoryOpen(false)}\n onSearchChange={setHistorySearch}\n onChatSelect={(id) => {\n setHistoryOpen(false);\n if (id && id !== chatId) {\n createdChatRef.current = true;\n cleanupAllForms();\n setChatId(id);\n try { storage.saveCurrentChatId(id); } catch {}\n // Load stored messages for the selected chat\n try {\n const saved = storage.loadChat(id);\n const msgs = (saved && Array.isArray((saved as any).messages)) ? (saved as any).messages : [];\n try { (chatApi as any)?.setMessages?.(msgs); } catch {}\n } catch {}\n }\n }}\n onChatDelete={(id) => {\n try {\n storage.deleteChat(id);\n setHistoryRefreshKey((v) => v + 1);\n if (id === chatId) {\n handleNewChat();\n }\n } catch {}\n }}\n loadChatsIndex={() => storage.loadChatsIndex()}\n historyPopupRef={historyPopupRef}\n />\n\n {/* Animations */}\n <style>\n {`\n @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }\n @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }\n `}\n </style>\n </div>\n );\n\n if (typeof document !== 'undefined' && document.body) {\n return (\n <>\n {createPortal(panel, document.body)}\n <FloatingChatButton\n show={!isOpen}\n onClick={() => { setIsOpen(true); try { storage.saveShowChatPreference(true); } catch {} }}\n resolvedColors={resolvedColors as any}\n floatingButtonPosition={floatingButtonPosition}\n />\n </>\n );\n }\n\n return panel;\n}\n","// Theme color schemes\nexport const themeColors = {\n dark: {\n primaryColor: '#4D78FF',\n backgroundColor: '#0B0B0F',\n borderColor: '#2A2C33',\n textColor: '#EDEEF0',\n accentColor: '#17181C',\n mutedTextColor: '#9AA0A6',\n inputBackground: '#17181C',\n cardBackground: '#121318',\n hoverBackground: '#1c1e25',\n },\n light: {\n primaryColor: '#2563EB',\n backgroundColor: '#FFFFFF',\n borderColor: '#E5E7EB',\n textColor: '#111827',\n accentColor: '#F9FAFB',\n mutedTextColor: '#6B7280',\n inputBackground: '#F9FAFB',\n cardBackground: '#F3F4F6',\n hoverBackground: '#F3F4F6',\n }\n};\n\nexport type ThemeColors = typeof themeColors.dark;\n\nexport interface ThemeProps {\n theme?: 'light' | 'dark';\n primaryColor?: string;\n backgroundColor?: string;\n borderColor?: string;\n textColor?: string;\n accentColor?: string;\n}\n\nexport function resolveThemeColors(\n theme: 'light' | 'dark',\n overrides: Omit<ThemeProps, 'theme'> = {}\n): ThemeColors {\n const themeColorScheme = themeColors[theme];\n return {\n primaryColor: overrides.primaryColor || themeColorScheme.primaryColor,\n backgroundColor: overrides.backgroundColor || themeColorScheme.backgroundColor,\n borderColor: overrides.borderColor || themeColorScheme.borderColor,\n textColor: overrides.textColor || themeColorScheme.textColor,\n accentColor: overrides.accentColor || themeColorScheme.accentColor,\n mutedTextColor: themeColorScheme.mutedTextColor,\n inputBackground: themeColorScheme.inputBackground,\n cardBackground: themeColorScheme.cardBackground,\n hoverBackground: themeColorScheme.hoverBackground,\n };\n}\n\nexport function createContainerStyles(\n resolvedColors: ThemeColors,\n height: string,\n dir: string\n) {\n return {\n backgroundColor: resolvedColors.backgroundColor,\n color: resolvedColors.textColor,\n height,\n display: 'flex',\n width: '100%',\n fontFamily: 'Rubik, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif'\n };\n}\n\nexport function createChatPanelStyles(width: number | string, maxWidth: number | string) {\n return {\n width: typeof width === 'number' ? `${width}px` : width,\n maxWidth: typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth,\n display: 'flex',\n flexDirection: 'column' as const,\n transition: 'all 0.3s ease-out',\n overflow: 'hidden'\n };\n}\n\nexport function createFloatingButtonStyles(\n floatingButtonPosition: {\n bottom?: number | string;\n top?: number | string;\n left?: number | string;\n right?: number | string;\n }\n) {\n return {\n position: 'fixed' as const,\n bottom: typeof floatingButtonPosition.bottom === 'number' ? `${floatingButtonPosition.bottom}px` : floatingButtonPosition.bottom,\n right: floatingButtonPosition.right ? (typeof floatingButtonPosition.right === 'number' ? `${floatingButtonPosition.right}px` : floatingButtonPosition.right) : undefined,\n top: floatingButtonPosition.top ? (typeof floatingButtonPosition.top === 'number' ? `${floatingButtonPosition.top}px` : floatingButtonPosition.top) : undefined,\n left: floatingButtonPosition.left ? (typeof floatingButtonPosition.left === 'number' ? `${floatingButtonPosition.left}px` : floatingButtonPosition.left) : undefined,\n zIndex: 1000\n };\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { useHsafa } from \"../providers/HsafaProvider\";\nimport { ThemeColors, themeColors } from \"../utils/chat-theme\";\n\nexport interface ContentContainerProps {\n children: React.ReactNode;\n theme?: \"dark\" | \"light\";\n primaryColor?: string;\n backgroundColor?: string;\n borderColor?: string;\n textColor?: string;\n mutedTextColor?: string;\n enableBorderAnimation?: boolean;\n borderRadius?: number | string;\n enableContentBorder?: boolean;\n className?: string;\n enableMargin?: boolean; // Enable/disable margin when chat is open\n chatWidth?: number | string; // Width of the chat panel (default: 420)\n dir?: \"ltr\" | \"rtl\"; // Text direction for margin side\n}\n\n/**\n * ContentContainer component that wraps your content and applies animations\n * based on HsafaChat state (streaming and open state).\n *\n * Features:\n * - Detects if any chat under HsafaProvider is streaming and applies border animation\n * - Detects if any HsafaChat is open and applies radius, border, and margin with animation\n * - Automatically adjusts margin based on chat width and direction (RTL/LTR)\n *\n * @example\n * ```tsx\n * // Basic usage\n * <HsafaProvider baseUrl=\"http://localhost:3000\">\n * <ContentContainer theme=\"dark\" enableBorderAnimation>\n * <YourApp />\n * </ContentContainer>\n * <HsafaChat agentId=\"agent-1\" width={450} />\n * </HsafaProvider>\n *\n * // With custom chat width and RTL support\n * <HsafaProvider baseUrl=\"http://localhost:3000\">\n * <ContentContainer \n * theme=\"dark\" \n * chatWidth={450}\n * dir=\"rtl\"\n * enableMargin={true}\n * >\n * <YourApp />\n * </ContentContainer>\n * <HsafaChat agentId=\"agent-1\" width={450} dir=\"rtl\" />\n * </HsafaProvider>\n *\n * // Disable margin (content stays full width)\n * <HsafaProvider baseUrl=\"http://localhost:3000\">\n * <ContentContainer enableMargin={false}>\n * <YourApp />\n * </ContentContainer>\n * <HsafaChat agentId=\"agent-1\" />\n * </HsafaProvider>\n * ```\n */\nexport function ContentContainer({\n children,\n theme = \"dark\",\n primaryColor,\n backgroundColor,\n borderColor,\n textColor,\n mutedTextColor,\n enableBorderAnimation = true,\n borderRadius = 16,\n enableContentBorder = true,\n className = \"\",\n enableMargin = true,\n chatWidth = 420,\n dir = \"ltr\",\n}: ContentContainerProps) {\n const { isAnyStreaming, isAnyChatOpen, dir: providerDir, theme: providerTheme } = useHsafa();\n // Use provider defaults if props are not explicitly provided\n const effectiveDir = (dir ?? providerDir) || 'ltr';\n const effectiveTheme = (theme ?? providerTheme) || 'dark';\n const componentId = useRef(\n `content-container-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\n );\n \n // Track if this is the initial mount to prevent transition animation on load\n const [isMounted, setIsMounted] = useState(false);\n useEffect(() => {\n // Defer setting mounted to next frame to allow chat to report its state\n const timeout = setTimeout(() => setIsMounted(true), 50);\n return () => clearTimeout(timeout);\n }, []);\n\n // Theme resolution\n const themeColorScheme = themeColors[effectiveTheme as 'dark' | 'light'];\n const resolvedColors: ThemeColors = {\n primaryColor: primaryColor || themeColorScheme.primaryColor,\n backgroundColor: backgroundColor || themeColorScheme.backgroundColor,\n borderColor: borderColor || themeColorScheme.borderColor,\n textColor: textColor || themeColorScheme.textColor,\n accentColor: themeColorScheme.accentColor,\n mutedTextColor: mutedTextColor || themeColorScheme.mutedTextColor,\n inputBackground: themeColorScheme.inputBackground,\n cardBackground: themeColorScheme.cardBackground,\n hoverBackground: themeColorScheme.hoverBackground,\n };\n\n const contentBorderRadius =\n typeof borderRadius === \"number\" ? `${borderRadius}px` : borderRadius;\n\n // Calculate margin and width based on chat width and direction\n const chatWidthPx = typeof chatWidth === \"number\" ? `${chatWidth}px` : chatWidth;\n const marginStyle = enableMargin && isAnyChatOpen\n ? effectiveDir === \"rtl\"\n ? { marginLeft: chatWidthPx }\n : { marginRight: chatWidthPx }\n : {};\n \n const containerWidth = enableMargin && isAnyChatOpen \n ? `calc(100% - ${chatWidthPx})` \n : \"100%\";\n\n return (\n <>\n <div\n className={className}\n style={{\n width: containerWidth,\n height: \"100%\",\n transition: isMounted ? \"all 0.2s ease-out\" : \"none\",\n padding: isAnyChatOpen && enableContentBorder ? \"16px\" : \"0\",\n ...marginStyle,\n }}\n >\n <div\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n transition: isMounted ? 'all 0.2s ease-out' : 'none',\n borderRadius: isAnyChatOpen ? contentBorderRadius : '0',\n border: isAnyChatOpen && isAnyStreaming && enableBorderAnimation ? 'none' : isAnyChatOpen ? `1px solid ${resolvedColors.borderColor}` : 'none',\n padding: isAnyChatOpen && isAnyStreaming && enableBorderAnimation ? '1.5px' : '0',\n background: isAnyChatOpen && isAnyStreaming && enableBorderAnimation ?\n `linear-gradient(120deg, ${resolvedColors.primaryColor}dd 0%, ${resolvedColors.primaryColor}88 25%, ${resolvedColors.primaryColor}00 50%, ${resolvedColors.primaryColor}88 75%, ${resolvedColors.primaryColor}dd 100%)` :\n 'transparent',\n backgroundSize: isAnyChatOpen && isAnyStreaming && enableBorderAnimation ? '300% 300%' : 'auto',\n animation: isAnyChatOpen && isAnyStreaming && enableBorderAnimation ? `${componentId.current}-border-flow 3s ease-in-out infinite` : 'none',\n filter: isAnyChatOpen && isAnyStreaming && enableBorderAnimation ? `drop-shadow(0 0 10px ${resolvedColors.primaryColor}40)` : 'none'\n }}\n >\n <div\n className=\"hsafa-content-container\"\n style={{\n width: '100%',\n height: '100%',\n borderRadius: isAnyChatOpen && enableContentBorder ? contentBorderRadius : '0',\n backgroundColor: isAnyChatOpen && enableContentBorder ? resolvedColors.backgroundColor : 'transparent',\n overflow: 'auto',\n position: 'relative',\n isolation: 'isolate',\n contain: 'layout style paint',\n transform: 'translateZ(0)',\n scrollbarWidth: 'thin',\n scrollbarColor: `${resolvedColors.mutedTextColor}40 transparent`\n }}\n >\n {children}\n </div>\n </div>\n </div>\n <style>\n {`\n @keyframes ${componentId.current}-border-flow {\n 0% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n }\n `}\n </style>{\" \"}\n </>\n );\n}\n","/**\n * Component Registry for custom UI components\n * Allows users to register their own React components to be rendered in chat responses\n */\n\nimport { ComponentType } from 'react';\n\nexport interface UIComponentProps {\n props: any;\n resolvedColors?: any;\n}\n\ntype ComponentMap = Map<string, ComponentType<UIComponentProps>>;\n\nclass ComponentRegistry {\n private components: ComponentMap = new Map();\n\n /**\n * Register a custom UI component\n * @param name - The component name (should match the 'component' field from the agent response)\n * @param component - The React component to render\n */\n register(name: string, component: ComponentType<UIComponentProps>) {\n this.components.set(name, component);\n }\n\n /**\n * Unregister a component\n * @param name - The component name to remove\n */\n unregister(name: string) {\n this.components.delete(name);\n }\n\n /**\n * Get a registered component\n * @param name - The component name\n * @returns The component or undefined if not found\n */\n get(name: string): ComponentType<UIComponentProps> | undefined {\n return this.components.get(name);\n }\n\n /**\n * Check if a component is registered\n * @param name - The component name\n */\n has(name: string): boolean {\n return this.components.has(name);\n }\n\n /**\n * Clear all registered components\n */\n clear() {\n this.components.clear();\n }\n\n /**\n * Get all registered component names\n */\n getRegisteredNames(): string[] {\n return Array.from(this.components.keys());\n }\n}\n\n// Global singleton instance\nconst registry = new ComponentRegistry();\n\nexport { registry as componentRegistry };\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Button.module.css","../src/components/Button.tsx","../src/components/FloatingChatButton.tsx","../src/hooks/useAutoScroll.ts","../src/utils/file-upload.ts","../src/hooks/useFileUploadHook.ts","../src/providers/HsafaProvider.tsx","../src/components/IconWrapper.tsx","../src/components/IconButton.tsx","../src/components/hsafa-chat/ChatHeader.tsx","../src/components/MermaidDiagram.tsx","../src/utils/markdown.ts","../src/components/MarkdownRendererWithMermaid.tsx","../src/components/hsafa-chat/ReasoningAndTools.tsx","../src/components/hsafa-chat/FinalResponse.tsx","../src/utils/file.ts","../src/components/AttachmentItem.tsx","../src/components/AttachmentDisplay.tsx","../src/components/hsafa-chat/MessageEditor.tsx","../src/components/hsafa-chat/MessageList.tsx","../src/components/hsafa-chat/ChatInput.tsx","../src/utils/chat-storage.ts","../src/utils/time.ts","../src/components/hsafa-chat/ChatHistoryModal.tsx","../src/components/web-controler/getDomComponents.ts","../src/components/web-controler/guideCursor.ts","../src/components/web-controler/FillInput.ts","../src/components/web-controler/CursorController.tsx","../src/components/HsafaChat.tsx","../src/utils/chat-theme.ts","../src/components/ContentContainer.tsx","../src/utils/component-registry.ts"],"names":["Button_default","Button","variant","size","loading","disabled","children","className","props","buttonClasses","jsxs","jsx","FloatingChatButton","show","onClick","resolvedColors","floatingButtonPosition","floatingButtonStyles","e","useAutoScroll","shouldScroll","ref","useRef","shouldScrollRef","useEffect","el","observer","joinUrl","baseUrl","path","a","b","MAX_UPLOAD_SIZE","useFileUpload","attachments","setAttachments","useState","uploading","setUploading","fileInputRef","formatBytes","useCallback","bytes","units","exponent","uploadAttachment","file","formData","response","text","data","handleRemoveAttachment","id","prev","att","handleFileSelection","fileList","setError","files","uploaded","attachment","err","buildUserContent","parts","t","mt","clearAttachments","HsafaContext","createContext","HsafaProvider","dir","theme","actions","setActions","components","setComponents","streamingStates","setStreamingStates","chatOpenStates","setChatOpenStates","registerAction","name","handler","next","existing","unregisterAction","registerComponent","component","unregisterComponent","setStreamingState","chatId","isStreaming","setChatOpenState","isOpen","isAnyStreaming","useMemo","state","isAnyChatOpen","value","useHsafa","ctx","useContext","IconWrapper","IconComponent","React","IconButton","icon","ariaLabel","title","ChatHeader","alwaysOpen","streaming","onNew","onToggleHistory","onClose","historyBtnRef","Plus","History","ChevronRight","MermaidDiagram","chart","containerRef","error","setLoading","mounted","mermaid","svg","svgElement","borderColor","bgColor","errorBg","errorText","loadingText","escapeHtml","s","inlineFormat","renderMarkdownToHtmlSafe","input","lines","html","inCode","codeLang","codeBuffer","inUl","inOl","hasMermaid","codeBlockBg","codeTextColor","tableHeaderBg","tableHeaderTextColor","closeLists","nextNonEmptyIndex","start","k","splitTableCells","rawLine","trimmed","line","c","isTableHeaderRow","cells","isSeparatorRow","alignmentFromSep","cell","hasLeft","hasRight","parseTableBlock","startIndex","headerIdx","sepIdx","headerCells","sepCells","colCount","aligns","i","rows","normalized","tableHtml","content","textAlign","isFirst","isLast","row","raw","fenceMatch","mermaidCode","codeHtml","cls","h","level","endIndex","ulItem","olItem","MarkdownRendererWithMermaid","elements","part","index","match","getToolStatus","statusMap","ReasoningAndTools","messageId","openReasoningIds","toggleReasoning","groups","currentReasonings","reasoningStartDate","reasoningEndDate","reasoningCompleted","it","isDynamicTool","isPrefixedTool","derivedToolName","g","idx","itemId","isCompleted","hasText","handleClick","i2","color","isRunning","isGetFromUser","FinalResponse","items","UIComponents","item","componentName","Component","AttachmentItem","mode","onRemove","maxWidth","isImage","isEditable","isLink","containerStyle","Fragment","fileIcon","File","Eye","X","Download","AttachmentDisplay","MessageEditor","initialText","editingText","onEditingTextChange","onCancel","onSave","onRemoveAttachment","onAddAttachments","handleKeyDown","handleFileChange","MessageList","chatMessages","isLoading","onUserMessageClick","editingMessageId","onCancelEdit","onSaveEdit","editAttachments","onRemoveEditAttachment","onAddEditAttachments","editUploading","messageParts","messageText","p","messageAttachments","imgUrl","final","ChatInput","setInput","textareaRef","onFileInputChange","onSend","onStop","status","canStop","hasMessages","createChatStorage","agentId","LS_PREFIX","chatsIndexKey","chatKey","currentChatKey","showChatKey","loadChatsIndex","saveChatsIndex","list","loadChat","saveChat","upsertChatMeta","meta","x","deleteChatMeta","deleteChatData","defaultValue","savedShow","timeAgo","ts","diff","m","d","w","months","ChatHistoryModal","historyOpen","historySearch","currentChatId","refreshKey","onSearchChange","onChatSelect","onChatDelete","historyPopupRef","modalContent","q","Trash2","createPortal","isVisible","style","getElementLabel","label","parentLabel","clone","getElementText","getElementValue","type","opt","getUniqueSelector","current","selector","classes","parent","siblings","child","getDomComponents","options","includeHidden","what","limit","contentContainer","searchScope","selectors","visible","importance","total","maxItems","truncated","limited","guideCursor","target","cursorGuide","isHTMLElement","n","dispatch","setTextLike","setter","setCheckbox","setSelectSingle","setSelectMultiple","values","setVals","coerceDate","v","setFiles","dt","f","FillActiveInput","ce","tag","inp","alt","vStr","ta","sel","host","cursorReactRoot","cursorSvgCache","cursorStylesInjected","cursorHideTimer","cursorIsMoving","ensureCursorVisible","cursor","keepCursorVisibleWhileMoving","scheduleCursorHide","ms","stopMovingAndMaybeHide","getScrollableAncestors","scrollable","overflow","waitForScrollSettled","targetElement","timeoutMs","quietMs","scrollableElements","getScrollPositions","positions","getTargetPos","rect","lastScrollPos","lastTargetPos","lastChange","resolve","tick","now","curScrollPos","curTargetPos","changed","DEFAULT_ARROW_SVG","DEFAULT_POINTER_SVG","loadCursorSvgs","CursorVisual","arrowSvg","pointerSvg","getOrCreateCursor","svgs","styleId","createRoot","clamp","min","max","easeInOutCubic","cssColorToRgba","css","r","relativeLuminance","srgb","isDarkColor","rgba","getEffectiveBackgroundAtPoint","y","seen","bg","updateCursorColorAt","dark","strokeColor","animatePosition","from","to","durationMs","easing","curveStrength","curveDirection","onFrame","easeFn","useCurve","cp","dx","dy","dist","mx","my","nx","ny","sign","bend","frame","u","wobbleAmp","applyOffset","offset","dispatchMouseLike","point","extra","common","isDown","isUp","enriched","ev","isElement","obj","resolveWithin","within","byId","resolveTarget","all","getAnchoredPoint","anchor","ax","ay","clampToViewport","CursorController","stepsOrTarget","steps","results","curX","curY","highlight","cursorHotspot","dragTo","action","t0","resolved","targetPoint","ux","uy","overshoot","over","clickedId","hotspot","pageP","clickTarget","dest","destPoint","dst","startP","startTarget","moveTarget","moveP","endTarget","CursorController_default","HsafaChat","primaryColor","primaryColorDark","primaryColorLight","backgroundColor","textColor","accentColor","initialMessages","onMessagesChange","defaultOpen","HsafaTools","providerDir","providerTheme","providerBaseUrl","effectiveTheme","effectiveBaseUrl","key","uploadError","setUploadError","setChatId","transport","DefaultChatTransport","init","enhancedBody","onFinishCallback","message","onErrorCallback","builtInTools","res","last","clicked","act","_","allTools","formHostRef","formStateRef","cleanupAllForms","renderOrUpdateUserForm","toolCallId","currentParent","toolHost","description","submitLabel","skipLabel","fields","existingState","form","wrap","lab","inputEl","o","fieldId","savedVal","trimmedSubmit","trimmedSkip","showActions","submitBtn","skipBtn","chatApiRef","badge","getToolFunction","toolName","toolConfig","chatApi","useChat","lastAssistantMessageIsCompleteWithToolCalls","toolCall","toolFn","result","sendMessage","stop","chatError","lastProcessedInputRef","toolInput","currentInput","lastInput","seenIds","pendingRenders","out","hydrated","inVal","node","raf","onMessagesChangeRef","prevMessagesRef","setIsOpen","setHistoryOpen","setHistorySearch","historyRefreshKey","setHistoryRefreshKey","setOpenReasoningIds","setEditingMessageId","setEditingText","setEditAttachments","setEditUploading","editTextareaRef","scrollRef","storage","createdChatRef","restoredOnMountRef","savedId","saved","msgs","found","firstUser","titleSource","textPart","wasLoadingRef","handleSendMessage","trimmedInput","handleNewChat","newId","handleToggleHistory","handleClose","textarea","newHeight","handleAddEditAttachments","newAttachments","handleRemoveEditAttachment","handleUserMessageClick","handleCancelEdit","handleSaveEdit","messageIndex","updatedMessages","panel","themeColors","ContentContainer","mutedTextColor","enableBorderAnimation","borderRadius","enableContentBorder","enableMargin","chatWidth","effectiveDir","componentId","isMounted","setIsMounted","timeout","themeColorScheme","contentBorderRadius","chatWidthPx","marginStyle","containerWidth","ComponentRegistry","registry"],"mappings":"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","file":"index.cjs","sourcesContent":["/* Base button styles */\n.button {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n border: 1px solid transparent;\n border-radius: 0.75rem;\n font-weight: 600;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n text-decoration: none;\n white-space: nowrap;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n\n.button:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n/* Size variants */\n.sm {\n padding: 0.375rem 0.75rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.md {\n padding: 0.5rem 1rem;\n font-size: 1rem;\n line-height: 1.5rem;\n}\n\n.lg {\n padding: 0.75rem 1.5rem;\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n\n/* Color variants */\n.primary {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n border-color: transparent;\n}\n\n.primary:hover:not(:disabled) {\n background: linear-gradient(135deg, #5a67d8 0%, #6b46c1 100%);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);\n}\n\n.secondary {\n background-color: #f7fafc;\n color: #2d3748;\n border-color: #e2e8f0;\n}\n\n.secondary:hover:not(:disabled) {\n background-color: #edf2f7;\n border-color: #cbd5e0;\n}\n\n.outline {\n background-color: transparent;\n color: #667eea;\n border-color: #667eea;\n}\n\n.outline:hover:not(:disabled) {\n background-color: #667eea;\n color: white;\n}\n\n.ghost {\n background-color: transparent;\n color: #4a5568;\n border-color: transparent;\n}\n\n.ghost:hover:not(:disabled) {\n background-color: #f7fafc;\n color: #2d3748;\n}\n\n/* Loading state */\n.loading {\n pointer-events: none;\n}\n\n.hiddenText {\n opacity: 0;\n}\n\n.spinner {\n position: absolute;\n width: 1rem;\n height: 1rem;\n border: 2px solid transparent;\n border-top: 2px solid currentColor;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n","import React from \"react\";\nimport styles from \"./Button.module.css\";\n\n/**\n * Props for the Button component\n */\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Visual style variant of the button */\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\";\n /** Size of the button */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Whether the button is in a loading state */\n loading?: boolean;\n /** Content to be displayed inside the button */\n children: React.ReactNode;\n}\n\n/**\n * A versatile button component with multiple variants, sizes, and states.\n * \n * @example\n * ```tsx\n * // Basic usage\n * <Button>Click me</Button>\n * \n * // With variant and size\n * <Button variant=\"secondary\" size=\"lg\">Large Secondary Button</Button>\n * \n * // Loading state\n * <Button loading>Processing...</Button>\n * \n * // With click handler\n * <Button onClick={() => console.log('Clicked!')}>Click me</Button>\n * ```\n */\nexport const Button: React.FC<ButtonProps> = ({\n variant = \"primary\",\n size = \"md\",\n loading = false,\n disabled,\n children,\n className,\n ...props\n}) => {\n const buttonClasses = [\n styles.button,\n styles[variant],\n styles[size],\n loading && styles.loading,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n className={buttonClasses}\n disabled={disabled || loading}\n {...props}\n >\n {loading && <span className={styles.spinner} />}\n <span className={loading ? styles.hiddenText : undefined}>\n {children}\n </span>\n </button>\n );\n};\n","import React from 'react';\nimport { ThemeColors } from '../utils/chat-theme';\n\ninterface FloatingChatButtonProps {\n show: boolean;\n onClick: () => void;\n resolvedColors: ThemeColors;\n floatingButtonPosition: {\n bottom?: number | string;\n right?: number | string;\n top?: number | string;\n left?: number | string;\n };\n}\n\nexport function FloatingChatButton({\n show,\n onClick,\n resolvedColors,\n floatingButtonPosition\n}: FloatingChatButtonProps) {\n if (!show) return null;\n\n const floatingButtonStyles = {\n position: 'fixed' as const,\n bottom: typeof floatingButtonPosition.bottom === 'number' ? `${floatingButtonPosition.bottom}px` : floatingButtonPosition.bottom,\n right: floatingButtonPosition.right ? (typeof floatingButtonPosition.right === 'number' ? `${floatingButtonPosition.right}px` : floatingButtonPosition.right) : undefined,\n top: floatingButtonPosition.top ? (typeof floatingButtonPosition.top === 'number' ? `${floatingButtonPosition.top}px` : floatingButtonPosition.top) : undefined,\n left: floatingButtonPosition.left ? (typeof floatingButtonPosition.left === 'number' ? `${floatingButtonPosition.left}px` : floatingButtonPosition.left) : undefined,\n zIndex: 1000\n };\n\n return (\n <button\n aria-label=\"Open chat\"\n onClick={onClick}\n style={{\n ...floatingButtonStyles,\n borderColor: resolvedColors.borderColor,\n backgroundColor: resolvedColors.accentColor,\n color: resolvedColors.textColor,\n borderRadius: '50%',\n border: `1px solid ${resolvedColors.borderColor}`,\n padding: '12px',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n transition: 'all 0.2s',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = resolvedColors.primaryColor;\n e.currentTarget.style.backgroundColor = `${resolvedColors.accentColor}dd`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = resolvedColors.borderColor;\n e.currentTarget.style.backgroundColor = resolvedColors.accentColor;\n }}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n </button>\n );\n}\n","import { useEffect, useRef } from \"react\";\n\nexport function useAutoScroll<T extends HTMLElement>(shouldScroll: boolean = true) {\n const ref = useRef<T | null>(null);\n const shouldScrollRef = useRef(shouldScroll);\n\n // Update the ref when shouldScroll changes\n useEffect(() => {\n shouldScrollRef.current = shouldScroll;\n }, [shouldScroll]);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const observer = new MutationObserver(() => {\n // Only scroll if shouldScroll is true\n if (shouldScrollRef.current) {\n el.scrollTop = el.scrollHeight;\n }\n });\n\n observer.observe(el, { childList: true, subtree: true });\n \n // Initial scroll only if shouldScroll is true\n if (shouldScrollRef.current) {\n el.scrollTop = el.scrollHeight;\n }\n\n return () => observer.disconnect();\n }, []);\n\n return ref;\n}\n","import { Attachment } from '../types/chat';\n\n// File upload constants\nexport const MAX_UPLOAD_SIZE = 25 * 1024 * 1024; // 25MB\n\nexport function joinUrl(baseUrl: string | undefined, path: string): string {\n if (!baseUrl) return path;\n const a = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const b = path.startsWith('/') ? path : `/${path}`;\n return `${a}${b}`;\n}\n\nexport function buildUserContent(text: string, attachments: Attachment[]) {\n const parts: any[] = [];\n const t = (text || '').trim();\n if (t) parts.push({ type: 'text', text: t });\n for (const a of (attachments || [])) {\n const mt = a.mimeType || 'application/octet-stream';\n if (mt.startsWith('image/')) {\n parts.push({ type: 'image', image: new URL(a.url), mediaType: mt });\n } else {\n parts.push({ type: 'file', data: a.url, mediaType: mt, name: a.name });\n }\n }\n return parts;\n}\n\nexport async function uploadAttachment(file: File, baseUrl: string | undefined): Promise<Attachment> {\n const formData = new FormData();\n formData.append('file', file);\n\n const response = await fetch(joinUrl(baseUrl, '/api/uploads'), {\n method: 'POST',\n body: formData,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(text || `Failed to upload ${file.name}`);\n }\n\n const data = await response.json();\n return {\n id: data.id,\n name: data.name || file.name,\n url: data.url,\n mimeType: data.mimeType || file.type || 'application/octet-stream',\n size: typeof data.size === 'number' ? data.size : file.size,\n };\n}\n\nexport async function handleFileSelection(\n fileList: FileList | File[] | null,\n baseUrl: string | undefined,\n onError: (error: string) => void,\n onUploading: (uploading: boolean) => void\n): Promise<Attachment[]> {\n if (!fileList) return [];\n \n const files = Array.isArray(fileList) ? fileList : Array.from(fileList);\n onUploading(true);\n\n const uploaded: Attachment[] = [];\n try {\n for (const file of files) {\n if (file.size > MAX_UPLOAD_SIZE) {\n onError(`\"${file.name}\" exceeds the ${(MAX_UPLOAD_SIZE / (1024 * 1024)).toFixed(0)}MB limit.`);\n continue;\n }\n\n try {\n const attachment = await uploadAttachment(file, baseUrl);\n uploaded.push(attachment);\n } catch (err: any) {\n console.error('Failed to upload attachment:', err);\n onError(String(err?.message ?? `Failed to upload ${file.name}`));\n }\n }\n\n return uploaded;\n } finally {\n onUploading(false);\n }\n}\n","import { useState, useRef, useCallback } from 'react';\nimport { Attachment } from '../types/chat';\nimport { joinUrl } from '../utils/file-upload';\n\nconst MAX_UPLOAD_SIZE = 25 * 1024 * 1024; // 25MB\n\nexport function useFileUpload(baseUrl: string) {\n const [attachments, setAttachments] = useState<Attachment[]>([]);\n const [uploading, setUploading] = useState(false);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n\n const formatBytes = useCallback((bytes: number) => {\n if (!bytes || Number.isNaN(bytes)) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const exponent = Math.min(units.length - 1, Math.floor(Math.log(bytes) / Math.log(1024)));\n const value = bytes / Math.pow(1024, exponent);\n return `${value.toFixed(exponent === 0 ? 0 : 1)} ${units[exponent]}`;\n }, []);\n\n const uploadAttachment = useCallback(async (file: File): Promise<Attachment> => {\n const formData = new FormData();\n formData.append('file', file);\n\n const response = await fetch(joinUrl(baseUrl, '/api/uploads'), {\n method: 'POST',\n body: formData,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(text || `Failed to upload ${file.name}`);\n }\n\n const data = await response.json();\n return {\n id: data.id,\n name: data.name || file.name,\n url: data.url,\n mimeType: data.mimeType || file.type || 'application/octet-stream',\n size: typeof data.size === 'number' ? data.size : file.size,\n };\n }, [baseUrl]);\n\n const handleRemoveAttachment = useCallback((id: string) => {\n setAttachments(prev => prev.filter(att => att.id !== id));\n }, []);\n\n const handleFileSelection = useCallback(async (fileList: FileList | File[] | null, setError: (error: string | null) => void) => {\n if (!fileList) return;\n const files = Array.isArray(fileList) ? fileList : Array.from(fileList);\n setError(null);\n setUploading(true);\n\n const uploaded: Attachment[] = [];\n try {\n for (const file of files) {\n if (file.size > MAX_UPLOAD_SIZE) {\n setError(`\"${file.name}\" exceeds the ${formatBytes(MAX_UPLOAD_SIZE)} limit.`);\n continue;\n }\n\n try {\n const attachment = await uploadAttachment(file);\n uploaded.push(attachment);\n } catch (err: any) {\n console.error('Failed to upload attachment:', err);\n setError(String(err?.message ?? `Failed to upload ${file.name}`));\n }\n }\n\n if (uploaded.length) {\n setAttachments(prev => [...prev, ...uploaded]);\n }\n } finally {\n setUploading(false);\n }\n }, [uploadAttachment, formatBytes]);\n\n const buildUserContent = useCallback((text: string, attachments: Attachment[]) => {\n const parts: any[] = [];\n const t = (text || '').trim();\n if (t) parts.push({ type: 'text', text: t });\n for (const a of (attachments || [])) {\n const mt = a.mimeType || 'application/octet-stream';\n if (mt.startsWith('image/')) {\n parts.push({ type: 'image', image: new URL(a.url), mediaType: mt });\n } else {\n parts.push({ type: 'file', data: a.url, mediaType: mt, name: a.name });\n }\n }\n return parts;\n }, []);\n\n const clearAttachments = useCallback(() => {\n setAttachments([]);\n }, []);\n\n return {\n attachments,\n uploading,\n fileInputRef,\n formatBytes,\n handleRemoveAttachment,\n handleFileSelection,\n buildUserContent,\n clearAttachments,\n MAX_UPLOAD_SIZE\n };\n}\n","import React, { createContext, useCallback, useContext, useMemo, useState } from \"react\";\n\n/**\n * Handler function for custom actions that can be triggered by the AI agent\n */\nexport type HsafaActionHandler = (params: any, meta: {\n /** Name of the action being called */\n name: string;\n /** When the action is being triggered */\n trigger: 'partial' | 'final' | 'params_complete';\n /** Index of the action in the sequence */\n index: number;\n /** ID of the assistant message that triggered this action */\n assistantMessageId?: string;\n /** ID of the current chat session */\n chatId?: string;\n}) => Promise<any> | any;\n\n/**\n * Configuration options for the Hsafa SDK\n */\nexport interface HsafaConfig {\n /** Base URL for agent API calls, e.g. \"\" (same origin) or \"https://example.com\" */\n baseUrl?: string;\n /** Default text direction for SDK components */\n dir?: 'ltr' | 'rtl';\n /** Default theme for SDK components */\n theme?: 'dark' | 'light';\n}\n\n/**\n * Context value provided by HsafaProvider\n */\nexport interface HsafaContextValue extends HsafaConfig {\n /** Registered custom actions */\n actions: Map<string, HsafaActionHandler>;\n /** Registered custom components */\n components: Map<string, React.ComponentType<any>>;\n /** Register a custom action handler */\n registerAction: (name: string, handler: HsafaActionHandler) => () => void;\n /** Unregister a custom action handler */\n unregisterAction: (name: string, handler?: HsafaActionHandler) => void;\n /** Register a custom component */\n registerComponent: (name: string, component: React.ComponentType<any>) => () => void;\n /** Unregister a custom component */\n unregisterComponent: (name: string, component?: React.ComponentType<any>) => void;\n /** Global streaming state - true if any chat is streaming */\n isAnyStreaming: boolean;\n /** Set streaming state for a specific chat instance */\n setStreamingState: (chatId: string, isStreaming: boolean) => void;\n /** Global chat open state - true if any chat is open */\n isAnyChatOpen: boolean;\n /** Set chat open state for a specific chat instance */\n setChatOpenState: (chatId: string, isOpen: boolean) => void;\n}\n\nconst HsafaContext = createContext<HsafaContextValue | undefined>(undefined);\n\n/**\n * Props for the HsafaProvider component\n */\nexport interface HsafaProviderProps extends HsafaConfig {\n /** Child components that will have access to the Hsafa context */\n children: React.ReactNode;\n}\n\n/**\n * Provider component that sets up the Hsafa context for the SDK.\n * Wrap your app or chat components with this provider to enable Hsafa functionality.\n * \n * @example\n * ```tsx\n * <HsafaProvider baseUrl=\"https://api.example.com\">\n * <HsafaChat agentId=\"my-agent\" />\n * </HsafaProvider>\n * ```\n */\nexport function HsafaProvider({ baseUrl, dir = 'ltr', theme = 'dark', children }: HsafaProviderProps) {\n const [actions, setActions] = useState<Map<string, HsafaActionHandler>>(new Map());\n const [components, setComponents] = useState<Map<string, React.ComponentType<any>>>(new Map());\n const [streamingStates, setStreamingStates] = useState<Map<string, boolean>>(new Map());\n const [chatOpenStates, setChatOpenStates] = useState<Map<string, boolean>>(new Map());\n\n const registerAction = useCallback((name: string, handler: HsafaActionHandler) => {\n setActions(prev => {\n const next = new Map(prev);\n next.set(String(name), handler);\n return next;\n });\n return () => {\n setActions(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!handler || existing === handler) next.delete(String(name));\n return next;\n });\n };\n }, []);\n\n const unregisterAction = useCallback((name: string, handler?: HsafaActionHandler) => {\n setActions(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!handler || existing === handler) next.delete(String(name));\n return next;\n });\n }, []);\n\n const registerComponent = useCallback((name: string, component: React.ComponentType<any>) => {\n setComponents(prev => {\n const next = new Map(prev);\n next.set(String(name), component);\n return next;\n });\n return () => {\n setComponents(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!component || existing === component) next.delete(String(name));\n return next;\n });\n };\n }, []);\n\n const unregisterComponent = useCallback((name: string, component?: React.ComponentType<any>) => {\n setComponents(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!component || existing === component) next.delete(String(name));\n return next;\n });\n }, []);\n\n const setStreamingState = useCallback((chatId: string, isStreaming: boolean) => {\n setStreamingStates(prev => {\n const next = new Map(prev);\n if (isStreaming) {\n next.set(chatId, true);\n } else {\n next.delete(chatId);\n }\n return next;\n });\n }, []);\n\n const setChatOpenState = useCallback((chatId: string, isOpen: boolean) => {\n setChatOpenStates(prev => {\n const next = new Map(prev);\n if (isOpen) {\n next.set(chatId, true);\n } else {\n next.delete(chatId);\n }\n return next;\n });\n }, []);\n\n const isAnyStreaming = useMemo(() => {\n return Array.from(streamingStates.values()).some(state => state);\n }, [streamingStates]);\n\n const isAnyChatOpen = useMemo(() => {\n return Array.from(chatOpenStates.values()).some(state => state);\n }, [chatOpenStates]);\n\n const value: HsafaContextValue = useMemo(() => ({\n baseUrl,\n dir,\n theme,\n actions,\n components,\n registerAction,\n unregisterAction,\n registerComponent,\n unregisterComponent,\n isAnyStreaming,\n setStreamingState,\n isAnyChatOpen,\n setChatOpenState,\n }), [baseUrl, dir, theme, actions, components, registerAction, unregisterAction, registerComponent, unregisterComponent, isAnyStreaming, setStreamingState, isAnyChatOpen, setChatOpenState]);\n\n return (\n <HsafaContext.Provider value={value}>\n {children}\n </HsafaContext.Provider>\n );\n}\n\n/**\n * Hook to access the Hsafa context.\n * Must be used within a HsafaProvider.\n * \n * @returns The Hsafa context value with actions, components, and configuration\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const { registerAction, baseUrl } = useHsafa();\n * \n * useEffect(() => {\n * const unregister = registerAction('myAction', async (params) => {\n * console.log('Action called with:', params);\n * return { success: true };\n * });\n * \n * return unregister;\n * }, [registerAction]);\n * \n * return <div>My Component</div>;\n * }\n * ```\n */\nexport function useHsafa(): HsafaContextValue {\n const ctx = useContext(HsafaContext);\n if (!ctx) return {\n baseUrl: undefined,\n actions: new Map(),\n components: new Map(),\n registerAction: () => () => undefined,\n unregisterAction: () => undefined,\n registerComponent: () => () => undefined,\n unregisterComponent: () => undefined,\n isAnyStreaming: false,\n setStreamingState: () => undefined,\n isAnyChatOpen: false,\n setChatOpenState: () => undefined,\n };\n return ctx;\n}\n","import React from 'react';\n\nexport interface IconWrapperProps {\n IconComponent: any;\n [key: string]: any;\n}\n\n/**\n * React 19 compatibility wrapper for Lucide icons\n */\nexport function IconWrapper({ IconComponent, ...props }: IconWrapperProps) {\n return React.createElement(IconComponent, props);\n}\n","import React from 'react';\nimport { ThemeColors } from '../utils/chat-theme';\n\ninterface IconButtonProps {\n icon: React.ReactNode;\n onClick: () => void;\n ariaLabel: string;\n resolvedColors: ThemeColors;\n disabled?: boolean;\n title?: string;\n}\n\nexport function IconButton({\n icon,\n onClick,\n ariaLabel,\n resolvedColors,\n disabled = false,\n title\n}: IconButtonProps) {\n return (\n <button\n aria-label={ariaLabel}\n title={title}\n disabled={disabled}\n style={{\n backgroundColor: 'transparent',\n color: resolvedColors.mutedTextColor,\n border: 'none',\n borderRadius: '8px',\n padding: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.5 : 1,\n transition: 'all 0.2s ease-out',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n }}\n onMouseEnter={(e) => {\n if (!disabled) {\n e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground;\n e.currentTarget.style.color = resolvedColors.textColor;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = resolvedColors.mutedTextColor;\n }}\n onClick={onClick}\n >\n {icon}\n </button>\n );\n}\n","import React from 'react';\nimport { Maximize2, Plus, History, ChevronRight } from 'lucide-react';\nimport { IconWrapper } from '../IconWrapper';\nimport { ThemeColors } from '../../utils/chat-theme';\nimport type { TranslationKeys } from '../../i18n/translations';\nimport { IconButton } from '../IconButton';\n\ninterface ChatHeaderProps {\n title: string;\n alwaysOpen: boolean;\n streaming: boolean;\n dir: string;\n resolvedColors: ThemeColors;\n onNew: () => void;\n onToggleHistory: () => void;\n onClose: () => void;\n historyBtnRef: React.RefObject<HTMLButtonElement>;\n t: (key: keyof TranslationKeys) => string;\n}\n\nexport function ChatHeader({\n title,\n alwaysOpen,\n streaming,\n dir,\n resolvedColors,\n onNew,\n onToggleHistory,\n onClose,\n historyBtnRef,\n t\n}: ChatHeaderProps) {\n return (\n <div style={{\n marginBottom: '24px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n direction: dir === 'rtl' ? 'rtl' : 'ltr'\n }}>\n <div style={{ minWidth: '0' }}>\n <h1\n title={title}\n style={{\n color: resolvedColors.textColor,\n fontSize: '18px',\n fontWeight: '600',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n margin: '0'\n }}\n >\n {title}\n </h1>\n </div>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n position: 'relative',\n color: resolvedColors.mutedTextColor\n }}>\n \n \n <IconButton\n icon={<IconWrapper IconComponent={Plus} size=\"20\" strokeWidth=\"2\" />}\n onClick={() => { if (!streaming) onNew(); }}\n ariaLabel={t('header.new')}\n resolvedColors={resolvedColors}\n disabled={streaming}\n />\n \n <button\n ref={historyBtnRef}\n aria-label={t('header.history')}\n style={{ \n backgroundColor: 'transparent',\n color: resolvedColors.mutedTextColor,\n border: 'none',\n borderRadius: '8px',\n padding: '8px',\n cursor: 'pointer',\n transition: 'all 0.2s ease-out',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground;\n e.currentTarget.style.color = resolvedColors.textColor;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = resolvedColors.mutedTextColor;\n }}\n onClick={onToggleHistory}\n >\n <IconWrapper IconComponent={History} size=\"20\" strokeWidth=\"2\" />\n </button>\n \n {!alwaysOpen && (\n <IconButton\n icon={<IconWrapper IconComponent={ChevronRight} size=\"20\" strokeWidth=\"2\" style={{ transform: dir === 'rtl' ? 'rotate(180deg)' : 'none' }} />}\n onClick={onClose}\n ariaLabel={t('header.close')}\n resolvedColors={resolvedColors}\n />\n )}\n </div>\n </div>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\n\nexport interface MermaidDiagramProps {\n chart: string;\n theme: 'light' | 'dark';\n}\n\n/**\n * Simple MermaidDiagram component for SDK use\n */\nexport function MermaidDiagram({ chart, theme }: MermaidDiagramProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let mounted = true;\n \n const renderMermaid = async () => {\n try {\n setLoading(true);\n setError(null);\n \n // Dynamic import to avoid SSR issues - only try if mermaid is available\n let mermaid: any;\n try {\n mermaid = await import('mermaid');\n } catch {\n throw new Error('Mermaid library not available');\n }\n \n if (!mounted) return;\n \n // Configure mermaid\n mermaid.default?.initialize({\n startOnLoad: false,\n theme: theme === 'dark' ? 'dark' : 'default',\n themeVariables: {\n darkMode: theme === 'dark',\n primaryColor: theme === 'dark' ? '#3B82F6' : '#1D4ED8',\n primaryTextColor: theme === 'dark' ? '#F3F4F6' : '#1F2937',\n primaryBorderColor: theme === 'dark' ? '#374151' : '#D1D5DB',\n },\n flowchart: { useMaxWidth: true },\n sequence: { useMaxWidth: true },\n gantt: { useMaxWidth: true },\n });\n \n if (containerRef.current && mounted) {\n const id = `mermaid-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n const { svg } = await mermaid.default.render(id, chart);\n \n if (containerRef.current && mounted) {\n containerRef.current.innerHTML = svg;\n const svgElement = containerRef.current.querySelector('svg');\n if (svgElement) {\n svgElement.style.maxWidth = '100%';\n svgElement.style.height = 'auto';\n svgElement.style.display = 'block';\n }\n }\n }\n } catch (err) {\n if (mounted) {\n setError(err instanceof Error ? err.message : 'Failed to render diagram');\n }\n } finally {\n if (mounted) {\n setLoading(false);\n }\n }\n };\n \n renderMermaid();\n \n return () => { mounted = false; };\n }, [chart, theme]);\n \n const borderColor = theme === 'dark' ? '#374151' : '#D1D5DB';\n const bgColor = theme === 'dark' ? '#1F2937' : '#F9FAFB';\n const errorBg = theme === 'dark' ? '#7F1D1D' : '#FEF2F2';\n const errorText = theme === 'dark' ? '#FCA5A5' : '#DC2626';\n const loadingText = theme === 'dark' ? '#9CA3AF' : '#6B7280';\n \n if (error) {\n return (\n <div style={{\n borderRadius: '12px',\n border: `1px solid ${borderColor}`,\n backgroundColor: errorBg,\n padding: '16px',\n margin: '8px 0'\n }}>\n <div style={{\n fontSize: '14px',\n color: errorText,\n marginBottom: '8px',\n fontWeight: '500'\n }}>\n Failed to render diagram\n </div>\n <div style={{\n fontSize: '12px',\n color: errorText,\n opacity: 0.8\n }}>\n {error}\n </div>\n </div>\n );\n }\n \n return (\n <div style={{\n borderRadius: '12px',\n border: `1px solid ${borderColor}`,\n backgroundColor: bgColor,\n padding: '16px',\n margin: '8px 0',\n overflow: 'hidden'\n }}>\n {loading && (\n <div style={{\n fontSize: '14px',\n color: loadingText,\n textAlign: 'center',\n padding: '32px'\n }}>\n Rendering diagram...\n </div>\n )}\n <div \n ref={containerRef}\n style={{\n display: loading ? 'none' : 'block',\n textAlign: 'center',\n minHeight: loading ? '0' : '50px'\n }}\n />\n </div>\n );\n}\n","/**\n * Markdown rendering utilities for the HsafaChat component\n */\n\n/**\n * Escape HTML characters\n */\nexport function escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Apply inline formatting (links, bold, italic, code)\n */\nexport function inlineFormat(s: string): string {\n s = s.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline; color: inherit; opacity: 0.8;\">$1</a>');\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n s = s.replace(/\\*([^*\\n]+)\\*/g, '<em>$1</em>');\n s = s.replace(/`([^`]+)`/g, '<code style=\"padding: 2px 4px; border-radius: 4px; background-color: rgba(0,0,0,0.1); font-family: monospace;\">$1</code>');\n return s;\n}\n\n/**\n * Render markdown to HTML with mermaid detection\n */\nexport function renderMarkdownToHtmlSafe(input: string, theme: 'light' | 'dark' = 'dark'): { html: string; hasMermaid: boolean } {\n const lines = (input || '').replace(/\\r\\n/g, '\\n').split('\\n');\n let html = '';\n let inCode = false;\n let codeLang = '';\n let codeBuffer: string[] = [];\n let inUl = false;\n let inOl = false;\n let hasMermaid = false;\n\n const borderColor = theme === 'dark' ? '#374151' : '#D1D5DB';\n const bgColor = theme === 'dark' ? '#1F2937' : '#F9FAFB';\n const codeBlockBg = theme === 'dark' ? '#111827' : '#F3F4F6';\n const codeTextColor = theme === 'dark' ? '#E5E7EB' : '#374151';\n\n const closeLists = () => {\n if (inUl) { html += '</ul>'; inUl = false; }\n if (inOl) { html += '</ol>'; inOl = false; }\n };\n\n for (let i = 0; i < lines.length; i++) {\n let raw = lines[i];\n const fenceMatch = raw.match(/^```\\s*(\\w+)?\\s*$/);\n \n if (fenceMatch) {\n if (!inCode) {\n closeLists();\n inCode = true;\n codeLang = fenceMatch[1] ? String(fenceMatch[1]) : '';\n codeBuffer = [];\n } else {\n // Check if this is a mermaid diagram\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n inCode = false;\n codeLang = '';\n codeBuffer = [];\n }\n continue;\n }\n\n if (inCode) {\n codeBuffer.push(raw);\n continue;\n }\n\n // Horizontal rules\n if (/^\\s*(---|\\*\\*\\*|___)\\s*$/.test(raw)) {\n closeLists();\n html += '<hr style=\"margin: 12px 0; opacity: 0.6; border: none; border-top: 1px solid currentColor;\" />';\n continue;\n }\n\n // Headers\n const h = raw.match(/^(#{1,6})\\s+(.+)$/);\n if (h) {\n closeLists();\n const level = h[1].length;\n const content = inlineFormat(escapeHtml(h[2].trim()));\n const size = level <= 2 ? '18px' : level === 3 ? '16px' : '14px';\n html += `<h${level} style=\"font-size: ${size}; font-weight: 600; margin: 8px 0 4px 0;\">${content}</h${level}>`;\n continue;\n }\n\n // Lists\n const ulItem = raw.match(/^\\s*[-*]\\s+(.+)$/);\n const olItem = raw.match(/^\\s*\\d+\\.\\s+(.+)$/);\n if (ulItem) {\n if (!inUl) { closeLists(); html += '<ul style=\"list-style-type: disc; padding-left: 24px; margin: 4px 0;\">'; inUl = true; }\n const content = inlineFormat(escapeHtml(ulItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n if (olItem) {\n if (!inOl) { closeLists(); html += '<ol style=\"list-style-type: decimal; padding-left: 24px; margin: 4px 0;\">'; inOl = true; }\n const content = inlineFormat(escapeHtml(olItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n\n // Empty lines\n if (raw.trim().length === 0) {\n closeLists();\n html += '<div style=\"height: 8px;\"></div>';\n } else {\n closeLists();\n const content = inlineFormat(escapeHtml(raw));\n html += `<p style=\"line-height: 1.6; margin: 4px 0; word-break: break-word;\">${content}</p>`;\n }\n }\n\n // Handle unclosed code blocks\n if (inCode) {\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n }\n if (inUl) html += '</ul>';\n if (inOl) html += '</ol>';\n \n return { html, hasMermaid };\n}\n","import React, { useMemo } from 'react';\nimport { MermaidDiagram } from './MermaidDiagram';\nimport { escapeHtml } from '../utils/markdown';\n\nfunction inlineFormat(s: string) {\n s = s.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline; color: inherit; opacity: 0.8;\">$1</a>');\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n s = s.replace(/\\*([^*\\n]+)\\*/g, '<em>$1</em>');\n s = s.replace(/`([^`]+)`/g, '<code style=\"padding: 2px 4px; border-radius: 4px; background-color: rgba(0,0,0,0.1); font-family: monospace;\">$1</code>');\n return s;\n}\n\nfunction renderMarkdownToHtmlSafe(input: string, theme: 'light' | 'dark' = 'dark'): { html: string; hasMermaid: boolean } {\n const lines = (input || '').replace(/\\r\\n/g, '\\n').split('\\n');\n let html = '';\n let inCode = false;\n let codeLang = '';\n let codeBuffer: string[] = [];\n let inUl = false;\n let inOl = false;\n let hasMermaid = false;\n\n const borderColor = theme === 'dark' ? '#374151' : '#D1D5DB';\n const bgColor = theme === 'dark' ? '#1F2937' : '#F9FAFB';\n const codeBlockBg = theme === 'dark' ? '#111827' : '#F3F4F6';\n const codeTextColor = theme === 'dark' ? '#E5E7EB' : '#374151';\n const tableHeaderBg = theme === 'dark' ? '#374151' : '#F3F4F6';\n const tableHeaderTextColor = theme === 'dark' ? '#F9FAFB' : '#111827';\n\n const closeLists = () => {\n if (inUl) { html += '</ul>'; inUl = false; }\n if (inOl) { html += '</ol>'; inOl = false; }\n };\n\n // Helpers for table parsing\n const nextNonEmptyIndex = (start: number) => {\n for (let k = start; k < lines.length; k++) {\n if (lines[k].trim().length > 0) return k;\n }\n return -1;\n };\n\n const splitTableCells = (rawLine: string) => {\n const trimmed = rawLine.trim();\n const line = trimmed.startsWith('|') ? trimmed.slice(1) : trimmed;\n const sanitized = line.endsWith('|') ? line.slice(0, -1) : line;\n return sanitized.split('|').map(c => c.trim());\n };\n\n const isTableHeaderRow = (rawLine: string) => {\n const t = rawLine.trim();\n if (!t.startsWith('|')) return false;\n const cells = splitTableCells(t);\n return cells.length >= 2 && cells.some(c => c.length > 0);\n };\n\n const isSeparatorRow = (rawLine: string) => {\n const cells = splitTableCells(rawLine);\n if (cells.length === 0) return false;\n return cells.every(c => /^:?-{3,}:?$/.test(c));\n };\n\n const alignmentFromSep = (cell: string): 'left' | 'center' | 'right' => {\n const hasLeft = cell.startsWith(':');\n const hasRight = cell.endsWith(':');\n if (hasLeft && hasRight) return 'center';\n if (!hasLeft && hasRight) return 'right';\n return 'left';\n };\n\n const parseTableBlock = (startIndex: number): { tableHtml: string; endIndex: number } => {\n const headerIdx = startIndex;\n const sepIdx = nextNonEmptyIndex(headerIdx + 1);\n if (sepIdx === -1) {\n return { tableHtml: '', endIndex: startIndex };\n }\n const headerCells = splitTableCells(lines[headerIdx]);\n const sepCells = splitTableCells(lines[sepIdx]);\n const colCount = Math.max(headerCells.length, sepCells.length);\n const aligns: Array<'left' | 'center' | 'right'> = [];\n for (let i = 0; i < colCount; i++) {\n const cell = sepCells[i] || '---';\n aligns.push(alignmentFromSep(cell));\n }\n\n const rows: string[][] = [];\n let k = sepIdx + 1;\n while (k < lines.length) {\n const t = lines[k].trim();\n if (t.length === 0) { k++; continue; }\n if (!t.startsWith('|')) break;\n const cells = splitTableCells(lines[k]);\n const normalized: string[] = [];\n for (let i = 0; i < colCount; i++) {\n normalized.push(cells[i] ?? '');\n }\n rows.push(normalized);\n k++;\n }\n\n // Build table HTML\n let tableHtml = `<div style=\"overflow: auto; max-width: 100%; max-height: 60vh; border-radius: 10px; margin: 8px 0;\"> \n<table style=\"width: 100%; min-width: max-content; border-collapse: separate; border-spacing: 0; margin: 0;\">`;\n // Header\n tableHtml += '<thead><tr>';\n for (let i = 0; i < colCount; i++) {\n const content = inlineFormat(escapeHtml(headerCells[i] ?? ''));\n const textAlign = aligns[i];\n const isFirst = i === 0;\n const isLast = i === colCount - 1;\n const radiusStyles = `${isFirst ? 'border-top-left-radius: 10px;' : ''}${isLast ? 'border-top-right-radius: 10px;' : ''}`;\n tableHtml += `<th style=\"text-align: ${textAlign}; padding: 10px 12px; border-bottom: 1px solid ${borderColor}; background-color: ${tableHeaderBg}; color: ${tableHeaderTextColor}; position: sticky; top: 0; z-index: 1; ${radiusStyles}\">${content}</th>`;\n }\n tableHtml += '</tr></thead>';\n // Body\n tableHtml += '<tbody>';\n for (const row of rows) {\n tableHtml += '<tr>';\n for (let i = 0; i < colCount; i++) {\n const content = inlineFormat(escapeHtml(row[i] ?? ''));\n const textAlign = aligns[i];\n const isFirst = i === 0;\n const isLast = i === colCount - 1;\n tableHtml += `<td style=\"text-align: ${textAlign}; padding: 10px 12px; border-bottom: 1px solid ${borderColor}; ${isFirst ? `border-left: 1px solid ${borderColor};` : ''} border-right: 1px solid ${borderColor};\">${content}</td>`;\n }\n tableHtml += '</tr>';\n }\n tableHtml += '</tbody></table></div>';\n\n return { tableHtml, endIndex: k - 1 };\n };\n\n for (let i = 0; i < lines.length; i++) {\n let raw = lines[i];\n const fenceMatch = raw.match(/^```\\s*(\\w+)?\\s*$/);\n \n if (fenceMatch) {\n if (!inCode) {\n closeLists();\n inCode = true;\n codeLang = fenceMatch[1] ? String(fenceMatch[1]) : '';\n codeBuffer = [];\n } else {\n // Check if this is a mermaid diagram\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n inCode = false;\n codeLang = '';\n codeBuffer = [];\n }\n continue;\n }\n\n if (inCode) {\n codeBuffer.push(raw);\n continue;\n }\n\n // Horizontal rules\n if (/^\\s*(---|\\*\\*\\*|___)\\s*$/.test(raw)) {\n closeLists();\n html += '<hr style=\"margin: 12px 0; opacity: 0.6; border: none; border-top: 1px solid currentColor;\" />';\n continue;\n }\n\n // Headers\n const h = raw.match(/^(#{1,6})\\s+(.+)$/);\n if (h) {\n closeLists();\n const level = h[1].length;\n const content = inlineFormat(escapeHtml(h[2].trim()));\n const size = level <= 2 ? '18px' : level === 3 ? '16px' : '14px';\n html += `<h${level} style=\"font-size: ${size}; font-weight: 600; margin: 8px 0 4px 0;\">${content}</h${level}>`;\n continue;\n }\n\n // Tables (GitHub-style)\n if (isTableHeaderRow(raw)) {\n const sepIdx = nextNonEmptyIndex(i + 1);\n if (sepIdx !== -1 && isSeparatorRow(lines[sepIdx])) {\n closeLists();\n const { tableHtml, endIndex } = parseTableBlock(i);\n if (tableHtml) {\n html += tableHtml;\n i = endIndex;\n continue;\n }\n }\n }\n\n // Lists\n const ulItem = raw.match(/^\\s*[-*]\\s+(.+)$/);\n const olItem = raw.match(/^\\s*\\d+\\.\\s+(.+)$/);\n if (ulItem) {\n if (!inUl) { closeLists(); html += '<ul style=\"list-style-type: disc; padding-left: 24px; margin: 4px 0;\">'; inUl = true; }\n const content = inlineFormat(escapeHtml(ulItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n if (olItem) {\n if (!inOl) { closeLists(); html += '<ol style=\"list-style-type: decimal; padding-left: 24px; margin: 4px 0;\">'; inOl = true; }\n const content = inlineFormat(escapeHtml(olItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n\n // Empty lines\n if (raw.trim().length === 0) {\n closeLists();\n html += '<div style=\"height: 8px;\"></div>';\n } else {\n closeLists();\n const content = inlineFormat(escapeHtml(raw));\n html += `<p style=\"line-height: 1.6; margin: 4px 0; word-break: break-word;\">${content}</p>`;\n }\n }\n\n // Handle unclosed code blocks\n if (inCode) {\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n }\n if (inUl) html += '</ul>';\n if (inOl) html += '</ol>';\n \n return { html, hasMermaid };\n}\n\n// Markdown component that handles both regular markdown and mermaid diagrams\nexport function MarkdownRendererWithMermaid({ content, theme }: { content: string; theme: 'light' | 'dark' }) {\n const { html, hasMermaid } = useMemo(() => renderMarkdownToHtmlSafe(content, theme), [content, theme]);\n \n if (!hasMermaid) {\n return (\n <div\n style={{\n fontSize: '14px',\n lineHeight: '1.6',\n wordBreak: 'break-word',\n maxWidth: '100%',\n overflow: 'hidden'\n }}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n }\n\n // Parse HTML and replace mermaid placeholders with components\n const parts = html.split(/(<div class=\"mermaid-placeholder\"[^>]*><\\/div>)/g);\n const elements: React.ReactNode[] = [];\n \n parts.forEach((part, index) => {\n if (part.includes('mermaid-placeholder')) {\n // Extract mermaid code from data attribute\n const match = part.match(/data-mermaid=\"([^\"]*)\"/); \n if (match) {\n const mermaidCode = match[1]\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/&/g, '&')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n \n elements.push(\n React.createElement(MermaidDiagram, {\n key: `mermaid-${index}`,\n chart: mermaidCode,\n theme: theme\n })\n );\n }\n } else if (part.trim()) {\n // Regular HTML content\n elements.push(\n React.createElement('div', {\n key: `html-${index}`,\n style: {\n fontSize: '14px',\n lineHeight: '1.6',\n wordBreak: 'break-word',\n maxWidth: '100%',\n overflow: 'hidden'\n },\n dangerouslySetInnerHTML: { __html: part }\n })\n );\n }\n });\n\n return React.createElement(React.Fragment, {}, ...elements);\n}\n","import React from \"react\";\nimport { MarkdownRendererWithMermaid } from \"../MarkdownRendererWithMermaid\";\n\ntype ThemeColors = {\n mutedTextColor: string;\n inputBackground: string;\n borderColor: string;\n textColor: string;\n};\n\ninterface ReasoningAndToolsProps {\n parts: any[];\n messageId: string;\n openReasoningIds: Set<string>;\n toggleReasoning: (id: string) => void;\n resolvedColors: ThemeColors;\n}\n\nconst getToolStatus = (state?: string) => {\n const statusMap: Record<string, { color: string; text: string }> = {\n 'input-streaming': { color: '#eab308', text: 'Inputting' },\n 'input-available': { color: '#3b82f6', text: 'Running' },\n 'error': { color: '#ef4444', text: 'Error' },\n 'output-available': { color: '#10b981', text: 'Called' },\n 'finished': { color: '#10b981', text: 'Called' }\n };\n return statusMap[state || 'output-available'] || statusMap['output-available'];\n};\n\n\nexport function ReasoningAndTools({ parts, messageId, openReasoningIds, toggleReasoning, resolvedColors }: ReasoningAndToolsProps) {\n const groups: Array<\n { type: 'reasoning'; texts: string[]; startDate?: number; endDate?: number; isCompleted?: boolean } |\n { type: 'tool'; toolName?: string; status?: string; input?: any; output?: any; startDate?: number; endDate?: number }\n > = [];\n\n let currentReasonings: string[] = [];\n let reasoningStartDate: number | undefined;\n let reasoningEndDate: number | undefined;\n let reasoningCompleted = false;\n\n for (const it of Array.isArray(parts) ? parts : []) {\n if (!it) continue;\n // Reasoning chunks\n if (it.type === 'reasoning' && typeof it.text === 'string') {\n currentReasonings.push(it.text);\n if (!reasoningStartDate) reasoningStartDate = it.startDate;\n reasoningEndDate = it.endDate;\n // Check if this reasoning part is marked as done\n if (it.state === 'done') {\n reasoningCompleted = true;\n }\n continue;\n }\n\n // Tool calls: support both \"tool-*\" and \"dynamic-tool\"\n const isDynamicTool = it.type === 'dynamic-tool';\n const isPrefixedTool = typeof it.type === 'string' && it.type.startsWith('tool-');\n if (isDynamicTool || isPrefixedTool || it.type === 'tool-call') {\n if (currentReasonings.length) {\n groups.push({ \n type: 'reasoning', \n texts: currentReasonings, \n startDate: reasoningStartDate, \n endDate: reasoningEndDate,\n isCompleted: reasoningCompleted\n });\n currentReasonings = [];\n reasoningStartDate = undefined;\n reasoningEndDate = undefined;\n reasoningCompleted = false;\n }\n\n const derivedToolName = isDynamicTool\n ? String(it.toolName || 'dynamic-tool')\n : isPrefixedTool\n ? String(it.type?.slice('tool-'.length) || 'tool')\n : String(it.toolName || 'tool');\n\n if (derivedToolName === 'getFromUser' || derivedToolName === 'get_from_user') {\n // Render a placeholder host so inline form mounts in the tool area\n groups.push({\n type: 'tool',\n toolName: derivedToolName,\n status: it.state || it.status,\n input: it.input,\n output: it.output,\n startDate: it.startDate,\n endDate: it.endDate,\n toolCallId: it.toolCallId,\n } as any);\n } else {\n groups.push({\n type: 'tool',\n toolName: derivedToolName,\n status: it.state || it.status, // Use 'state' field, fallback to 'status'\n input: it.input,\n output: it.output,\n startDate: it.startDate,\n endDate: it.endDate\n });\n }\n continue;\n }\n }\n\n if (currentReasonings.length) {\n groups.push({ \n type: 'reasoning', \n texts: currentReasonings, \n startDate: reasoningStartDate, \n endDate: reasoningEndDate,\n isCompleted: reasoningCompleted\n });\n }\n\n if (!groups.length) return null;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {groups.map((g, idx) => {\n const itemId = `${messageId}-${idx}`;\n const isOpen = openReasoningIds.has(itemId);\n\n if (g.type === 'reasoning') {\n const isCompleted = g.isCompleted || (typeof g.startDate === 'number' && typeof g.endDate === 'number');\n const hasText = g.texts && g.texts.length > 0 && g.texts.some(t => t.trim().length > 0);\n \n const handleClick = () => {\n if (hasText) {\n toggleReasoning(itemId);\n }\n };\n if (isCompleted && !hasText) {\n return null;\n }\n\n return (\n <div key={itemId} onClick={handleClick} style={{ cursor: hasText ? 'pointer' : 'default', padding: '0' }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n <div style={{ fontSize: '13px', color: resolvedColors.mutedTextColor, fontWeight: 500, display: 'flex', alignItems: 'center', gap: '6px', overflow: 'hidden', maxWidth: '100%', minWidth: 0, width: '100%' }}>\n \n <span style={{ display: 'inline-flex', alignItems: 'center', gap: '6px' }}>\n {!isCompleted && (\n <span style={{ display: 'inline-block', height: '6px', width: '6px', borderRadius: '50%', backgroundColor: resolvedColors.mutedTextColor, animation: 'pulse 1.5s ease-in-out infinite' }} />\n )}\n <span \n style={{ \n color: resolvedColors.textColor, \n fontWeight: 600, \n opacity: 0.9,\n background: !isCompleted ? `linear-gradient(90deg, ${resolvedColors.textColor}, ${resolvedColors.mutedTextColor}, ${resolvedColors.mutedTextColor})` : 'none',\n backgroundSize: !isCompleted ? '200% 100%' : 'auto',\n backgroundClip: !isCompleted ? 'text' : 'unset',\n WebkitBackgroundClip: !isCompleted ? 'text' : 'unset',\n WebkitTextFillColor: !isCompleted? 'transparent' : resolvedColors.mutedTextColor,\n animation: !isCompleted ? 'shimmer 2s ease-in-out infinite' : undefined\n }}\n >\n {isCompleted ? 'Finish Thinking' : 'Thinking'}\n </span>\n </span>\n \n {hasText && (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0, transform: isOpen ? 'rotate(90deg)' : 'rotate(0deg)', transition: 'transform 0.2s ease-out' }}>\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n )}\n </div>\n <div style={{ display: 'grid', gridTemplateRows: (isOpen || !isCompleted) ? '1fr' : '0fr', transition: 'grid-template-rows 0.2s ease-out', overflow: 'hidden' }}>\n <div style={{ minHeight: 0 }}>\n {g.texts && g.texts.length > 0 ? (\n <div style={{ fontSize: '13px', color: resolvedColors.mutedTextColor, lineHeight: '1.6', maxWidth: '100%' }}>\n {/* While expanded and streaming, show all reasoning; otherwise, show only the latest or all if completed and expanded */}\n {(\n (!isCompleted && isOpen)\n ? g.texts\n : (!isCompleted\n ? [g.texts[g.texts.length - 1]]\n : (isOpen ? g.texts : [])\n )\n ).map((t, i2) => (\n <div key={`rg-line-${idx}-${i2}`} style={{ marginBottom: '6px' }}>\n <MarkdownRendererWithMermaid content={t} theme={'dark'} />\n </div>\n ))}\n </div>\n ) : (\n <div style={{ fontSize: '12px', color: resolvedColors.mutedTextColor, opacity: 0.7, display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span style={{ display: 'inline-block', height: '6px', width: '6px', borderRadius: '50%', backgroundColor: resolvedColors.mutedTextColor, animation: 'pulse 1.5s ease-in-out infinite' }} />\n <span style={{ letterSpacing: '2px', animation: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite' }}>...</span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n const { color, text } = getToolStatus(g.status);\n const isRunning = g.status === 'input-streaming' || g.status === 'input-available';\n \n const isGetFromUser = g.toolName === 'getFromUser' || g.toolName === 'get_from_user';\n return (\n <div key={itemId} style={{ display: 'flex', gap: '12px', position: 'relative' }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: '13px', color: resolvedColors.mutedTextColor, display: 'flex', alignItems: 'center', gap: '8px', flexWrap: 'wrap' }}>\n <span style={{ \n fontWeight: 600, \n color,\n display: 'flex',\n alignItems: 'center',\n gap: '6px'\n }}>\n <span style={{ \n display: 'inline-block', \n height: '6px', \n width: '6px', \n borderRadius: '50%', \n backgroundColor: color,\n animation: isRunning ? 'pulse 1.5s ease-in-out infinite' : undefined\n }} />\n {text}\n </span>\n <span style={{ fontWeight: 500, color: resolvedColors.textColor }}>{g.toolName || 'tool'}</span>\n </div>\n {isGetFromUser ? (\n <div style={{ marginTop: '8px' }}>\n <div \n data-get-from-user-host={(g as any).toolCallId || itemId}\n style={{\n width: '100%',\n }}\n />\n </div>\n ) : null}\n </div>\n </div>\n );\n })}\n <style>\n {`\n @keyframes shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n }\n `}\n </style>\n </div>\n );\n}\n\n\n","import React from \"react\";\nimport { MarkdownRendererWithMermaid } from \"../MarkdownRendererWithMermaid\";\n\ntype ThemeColors = {\n textColor: string;\n mutedTextColor: string;\n borderColor: string;\n cardBackground: string;\n};\n\ninterface FinalResponseProps {\n items: any[] | undefined;\n resolvedColors: ThemeColors;\n UIComponents?: Record<string, React.ComponentType<any>>;\n}\n\nexport function FinalResponse({ items, resolvedColors, UIComponents = {} }: FinalResponseProps) {\n if (!Array.isArray(items) || items.length === 0) return null;\n\n return (\n <div style={{ }}>\n <div style={{ margin: 0, color: resolvedColors.textColor, display: 'flex', flexDirection: 'column', gap: '12px' }}>\n {items.map((item, i) => {\n // Check if item is a UI component object\n if (typeof item === 'object' && item !== null && item.type === 'ui') {\n const { component: componentName, props } = item;\n \n // Look up the component in the passed UIComponents prop\n const Component = UIComponents[componentName];\n \n if (Component) {\n // Render the custom component\n return (\n <div key={i} style={{ \n padding: '16px', \n borderRadius: '12px',\n backgroundColor: resolvedColors.cardBackground,\n border: `1px solid ${resolvedColors.borderColor}`\n }}>\n <Component props={props} resolvedColors={resolvedColors} />\n </div>\n );\n } else {\n return (\n <div></div>\n );\n }\n }\n \n // For plain text items, render as markdown\n const text = typeof item === 'string' ? item : JSON.stringify(item);\n return (\n <div key={i} style={{ whiteSpace: 'pre-wrap', lineHeight: 1.6 }}>\n <MarkdownRendererWithMermaid content={text} theme={'dark'} />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n\n","/**\n * File utility functions for the HsafaChat component\n */\n\n/**\n * Format bytes to human-readable format\n */\nexport function formatBytes(bytes: number): string {\n if (!bytes || Number.isNaN(bytes)) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const exponent = Math.min(units.length - 1, Math.floor(Math.log(bytes) / Math.log(1024)));\n const value = bytes / Math.pow(1024, exponent);\n return `${value.toFixed(exponent === 0 ? 0 : 1)} ${units[exponent]}`;\n}\n\n/**\n * Join URL paths safely\n */\nexport function joinUrl(baseUrl: string | undefined, path: string): string {\n if (!baseUrl) return path;\n const a = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const b = path.startsWith('/') ? path : `/${path}`;\n return `${a}${b}`;\n}\n","import React from 'react';\nimport { File, Eye, X, Download } from 'lucide-react';\nimport { IconWrapper } from './IconWrapper';\nimport { Attachment } from '../types/chat';\nimport { formatBytes } from '../utils/file';\nimport { ThemeColors } from '../utils/chat-theme';\n\ninterface AttachmentItemProps {\n attachment: Attachment;\n resolvedColors: ThemeColors;\n mode: 'editable' | 'viewable' | 'input';\n onRemove?: (id: string) => void;\n maxWidth?: string;\n}\n\nexport function AttachmentItem({\n attachment,\n resolvedColors,\n mode,\n onRemove,\n maxWidth = '200px'\n}: AttachmentItemProps) {\n const isImage = attachment.mimeType?.startsWith('image/');\n const isEditable = mode === 'editable' || mode === 'input';\n const isLink = mode === 'viewable';\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: mode === 'input' ? '8px' : '6px',\n padding: mode === 'input' ? '8px 12px' : '6px 10px',\n backgroundColor: resolvedColors.inputBackground,\n borderRadius: mode === 'input' ? '10px' : '8px',\n border: `1px solid ${resolvedColors.borderColor}`,\n fontSize: mode === 'input' ? '12px' : '11px',\n color: resolvedColors.textColor,\n transition: 'all 0.2s ease-out',\n cursor: isLink ? 'pointer' : 'default',\n maxWidth: mode === 'input' ? '140px' : maxWidth,\n position: 'relative'\n };\n\n const content = (\n <>\n {/* Thumbnail or icon */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: mode === 'input' ? '20px' : '16px',\n height: mode === 'input' ? '20px' : '16px',\n borderRadius: mode === 'input' ? '4px' : '3px',\n backgroundColor: isImage ? 'transparent' : resolvedColors.accentColor,\n flexShrink: 0\n }}>\n {isImage ? (\n <img \n src={attachment.url} \n alt={attachment.name}\n style={{\n width: mode === 'input' ? '20px' : '16px',\n height: mode === 'input' ? '20px' : '16px',\n borderRadius: mode === 'input' ? '4px' : '3px',\n objectFit: 'cover'\n }}\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n const fileIcon = (e.target as HTMLImageElement).nextElementSibling as HTMLElement;\n if (fileIcon) fileIcon.style.display = 'block';\n }}\n />\n ) : null}\n <IconWrapper IconComponent={File}\n size={mode === 'input' ? 14 : 10} \n strokeWidth=\"2\" \n style={{ \n display: isImage ? 'none' : 'block',\n color: resolvedColors.mutedTextColor \n }} \n />\n </div>\n \n {/* File name and size */}\n <div style={{\n minWidth: '0',\n flex: '1',\n display: 'flex',\n flexDirection: 'column'\n }}>\n <span \n title={attachment.name}\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontWeight: '500'\n }}\n >\n {attachment.name}\n </span>\n <span style={{\n fontSize: mode === 'input' ? '10px' : '9px',\n color: resolvedColors.mutedTextColor,\n marginTop: mode === 'input' ? '2px' : '1px'\n }}>\n {formatBytes(attachment.size)}\n </span>\n </div>\n \n {/* Action buttons */}\n {mode === 'input' && isImage && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n window.open(attachment.url, '_blank');\n }}\n style={{\n background: 'none',\n border: 'none',\n color: resolvedColors.mutedTextColor,\n cursor: 'pointer',\n padding: '2px',\n display: 'flex',\n alignItems: 'center',\n borderRadius: '4px',\n transition: 'all 0.2s'\n }}\n title=\"Preview image\"\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground;\n e.currentTarget.style.color = resolvedColors.textColor;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = resolvedColors.mutedTextColor;\n }}\n >\n <IconWrapper IconComponent={Eye} size=\"12\" strokeWidth=\"2\" />\n </button>\n )}\n \n {isEditable && onRemove && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove(attachment.id);\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: mode === 'input' ? 'auto' : '16px',\n height: mode === 'input' ? 'auto' : '16px',\n padding: mode === 'input' ? '2px' : '0',\n borderRadius: '4px',\n border: 'none',\n backgroundColor: 'transparent',\n color: resolvedColors.mutedTextColor,\n cursor: 'pointer',\n transition: 'all 0.2s',\n flexShrink: 0\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#ef444420';\n e.currentTarget.style.color = '#ef4444';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = resolvedColors.mutedTextColor;\n }}\n >\n <IconWrapper IconComponent={X} size=\"12\" strokeWidth=\"2\" />\n </button>\n )}\n \n {isLink && (\n <IconWrapper IconComponent={Download}\n size=\"10\" \n strokeWidth=\"2\" \n style={{ \n color: resolvedColors.mutedTextColor,\n flexShrink: 0\n }} \n />\n )}\n </>\n );\n\n if (isLink) {\n return (\n <a\n href={attachment.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{\n ...containerStyle,\n textDecoration: 'none'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground;\n e.currentTarget.style.borderColor = resolvedColors.primaryColor;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = resolvedColors.inputBackground;\n e.currentTarget.style.borderColor = resolvedColors.borderColor;\n }}\n >\n {content}\n </a>\n );\n }\n\n return <div style={containerStyle}>{content}</div>;\n}\n","import React from 'react';\nimport { Attachment } from '../types/chat';\nimport { ThemeColors } from '../utils/chat-theme';\nimport { AttachmentItem } from './AttachmentItem';\n\ninterface AttachmentDisplayProps {\n attachments: Attachment[];\n resolvedColors: ThemeColors;\n onRemove?: (id: string) => void;\n}\n\nexport function AttachmentDisplay({ attachments, resolvedColors, onRemove }: AttachmentDisplayProps) {\n if (!Array.isArray(attachments) || attachments.length === 0) {\n return null;\n }\n\n const mode = typeof onRemove === 'function' ? 'editable' : 'viewable';\n\n return (\n <div style={{\n marginTop: '12px',\n display: 'flex',\n flexWrap: 'wrap',\n gap: '8px'\n }}>\n {attachments.map((att) => (\n <AttachmentItem\n key={att.id}\n attachment={att}\n resolvedColors={resolvedColors}\n mode={mode}\n onRemove={onRemove}\n />\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport { Plus } from 'lucide-react';\nimport { Attachment } from '../../types/chat';\nimport { AttachmentDisplay } from '../AttachmentDisplay';\n\ntype ThemeColors = {\n primaryColor: string;\n accentColor: string;\n textColor: string;\n mutedTextColor: string;\n borderColor: string;\n inputBackground: string;\n cardBackground: string;\n};\n\ninterface MessageEditorProps {\n messageId: string;\n initialText: string;\n editingText: string;\n onEditingTextChange: (text: string) => void;\n onCancel: () => void;\n onSave: (messageId: string, text: string) => void;\n streaming: boolean;\n resolvedColors: ThemeColors;\n attachments?: Attachment[];\n onRemoveAttachment?: (id: string) => void;\n onAddAttachments?: (files: FileList) => void;\n uploading?: boolean;\n t: (key: string) => string;\n}\n\nexport function MessageEditor({\n messageId,\n initialText,\n editingText,\n onEditingTextChange,\n onCancel,\n onSave,\n streaming,\n resolvedColors,\n attachments,\n onRemoveAttachment,\n onAddAttachments,\n uploading,\n t\n}: MessageEditorProps) {\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onCancel();\n } else if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (!streaming) {\n onSave(messageId, editingText || initialText);\n }\n }\n };\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0 && onAddAttachments) {\n onAddAttachments(files);\n }\n // Reset the input so the same file can be selected again\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n return (\n <div style={{\n maxWidth: '720px',\n borderRadius: '16px',\n padding: '8px',\n fontSize: '15px',\n border: `2px solid ${resolvedColors.primaryColor}`,\n backgroundColor: resolvedColors.accentColor,\n color: resolvedColors.textColor,\n marginBottom: '16px',\n marginTop: '16px'\n }}>\n <textarea\n autoFocus\n style={{\n width: '100%',\n resize: 'none',\n backgroundColor: 'transparent',\n padding: '8px',\n lineHeight: '1.6',\n outline: 'none',\n border: 'none',\n color: 'inherit',\n fontFamily: 'inherit',\n fontSize: 'inherit'\n }}\n rows={Math.max(2, Math.min(10, Math.ceil((editingText || initialText).length / 60)))}\n value={editingText}\n onChange={(e) => onEditingTextChange(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n \n {attachments && attachments.length > 0 && (\n <div style={{ padding: '8px' }}>\n <AttachmentDisplay\n attachments={attachments}\n resolvedColors={resolvedColors}\n onRemove={onRemoveAttachment}\n />\n </div>\n )}\n \n {uploading && (\n <div style={{\n padding: '8px 16px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '13px',\n color: resolvedColors.mutedTextColor\n }}>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ animation: 'spin 1s linear infinite' }}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n <span>{t('input.uploadingFiles')}</span>\n </div>\n )}\n \n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n padding: '8px 8px 8px 0'\n }}>\n {/* File upload button */}\n {onAddAttachments && (\n <div>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n onChange={handleFileChange}\n style={{ display: 'none' }}\n />\n <button\n onClick={() => fileInputRef.current?.click()}\n disabled={uploading || streaming}\n title={uploading ? t('input.uploadingFiles') : t('input.attachFiles')}\n style={{\n display: 'flex',\n margin: '0 10px',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '50%',\n width: '28px',\n height: '28px',\n transition: 'all 0.2s',\n border: `1px solid ${resolvedColors.borderColor}`,\n color: resolvedColors.mutedTextColor,\n backgroundColor: 'transparent',\n cursor: uploading || streaming ? 'not-allowed' : 'pointer',\n opacity: uploading || streaming ? 0.5 : 1\n }}\n onMouseEnter={(e) => {\n if (!uploading && !streaming) {\n e.currentTarget.style.backgroundColor = resolvedColors.inputBackground;\n e.currentTarget.style.borderColor = resolvedColors.primaryColor;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.borderColor = resolvedColors.borderColor;\n }}\n >\n <Plus size={16} strokeWidth={2} />\n </button>\n </div>\n )}\n \n {/* Action buttons container */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px'\n }}>\n <button\n style={{\n borderRadius: '8px',\n padding: '4px 12px',\n fontSize: '14px',\n transition: 'background-color 0.2s',\n border: `1px solid ${resolvedColors.borderColor}`,\n color: resolvedColors.mutedTextColor,\n backgroundColor: 'transparent',\n cursor: 'pointer'\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = resolvedColors.inputBackground}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = 'transparent'}\n onClick={onCancel}\n >\n {t('editor.cancel')}\n </button>\n <button\n style={{\n borderRadius: '8px',\n padding: '4px 12px',\n fontSize: '14px',\n transition: 'border-color 0.2s',\n border: `1px solid ${resolvedColors.borderColor}`,\n backgroundColor: resolvedColors.cardBackground,\n color: resolvedColors.textColor,\n cursor: 'pointer'\n }}\n onMouseEnter={(e) => e.currentTarget.style.borderColor = resolvedColors.primaryColor}\n onMouseLeave={(e) => e.currentTarget.style.borderColor = resolvedColors.borderColor}\n onClick={() => { if (!streaming) onSave(messageId, editingText || initialText); }}\n >\n {t('editor.saveAndRegenerate')}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { ReasoningAndTools } from \"./ReasoningAndTools\";\nimport { FinalResponse } from \"./FinalResponse\";\nimport { MessageEditor } from \"./MessageEditor\";\nimport { Attachment } from \"../../types/chat\";\nimport { AttachmentDisplay } from \"../AttachmentDisplay\";\n\ntype ThemeColors = {\n textColor: string;\n mutedTextColor: string;\n borderColor: string;\n accentColor: string;\n hoverBackground: string;\n inputBackground: string;\n cardBackground: string;\n primaryColor: string;\n backgroundColor: string;\n};\n\ninterface MessageListProps {\n chatMessages: any[];\n isLoading: boolean;\n openReasoningIds: Set<string>;\n toggleReasoning: (id: string) => void;\n resolvedColors: ThemeColors;\n t: (k: string) => string;\n onUserMessageClick: (id: string, text: string, attachments?: Attachment[]) => void;\n editingMessageId: string | null;\n editingText: string;\n onEditingTextChange: (text: string) => void;\n onCancelEdit: () => void;\n onSaveEdit: (messageId: string, text: string) => void;\n editAttachments?: Attachment[];\n onRemoveEditAttachment?: (id: string) => void;\n onAddEditAttachments?: (files: FileList) => void;\n editUploading?: boolean;\n UIComponents?: Record<string, React.ComponentType<any>>;\n}\n\nexport function MessageList({ \n chatMessages, \n isLoading, \n openReasoningIds, \n toggleReasoning, \n resolvedColors, \n t, \n onUserMessageClick,\n editingMessageId,\n editingText,\n onEditingTextChange,\n onCancelEdit,\n onSaveEdit,\n editAttachments,\n onRemoveEditAttachment,\n onAddEditAttachments,\n editUploading,\n UIComponents = {}\n}: MessageListProps) {\n return (\n <>\n <style>\n {`\n @keyframes jumpingDots {\n 0%, 80%, 100% { \n transform: translateY(0);\n }\n 40% { \n transform: translateY(-5px);\n }\n }\n `}\n </style>\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n \n }}>\n {chatMessages.map((m: any, i: number) => {\n const messageParts = Array.isArray(m.parts) ? m.parts : [];\n const messageText = messageParts\n .filter((p: any) => p.type === 'text')\n .map((p: any) => (p && typeof p.text === 'string' ? p.text : ''))\n .join('\\n');\n\n // Extract file and image attachments from message parts\n const messageAttachments: Attachment[] = messageParts\n .filter((p: any) => p.type === 'file' || p.type === 'image')\n .map((p: any) => {\n if (p.type === 'image') {\n const imgUrl = typeof p.image === 'string' ? p.image : p.image?.toString?.() || '';\n return {\n id: imgUrl || `${m.id}-img-${Date.now()}`,\n name: p.name || 'image',\n url: imgUrl,\n mimeType: p.mediaType || 'image/jpeg',\n size: p.size || 0\n };\n } else {\n return {\n id: p.url || `${m.id}-file-${Date.now()}`,\n name: p.name || 'file',\n url: p.url || '',\n mimeType: p.mediaType || 'application/octet-stream',\n size: p.size || 0\n };\n }\n });\n\n return (\n <div key={m.id} style={{ padding: '0 4px' }}>\n {m.role === 'user' ? (\n editingMessageId === m.id ? (\n <MessageEditor\n messageId={m.id}\n initialText={messageText}\n editingText={editingText}\n onEditingTextChange={onEditingTextChange}\n onCancel={onCancelEdit}\n onSave={onSaveEdit}\n streaming={isLoading}\n resolvedColors={resolvedColors}\n attachments={editAttachments}\n onRemoveAttachment={onRemoveEditAttachment}\n onAddAttachments={onAddEditAttachments}\n uploading={editUploading}\n t={t}\n />\n ) : (\n <div>\n <div\n title={t('editor.clickToEdit')}\n onClick={() => onUserMessageClick(m.id, messageText, messageAttachments)}\n style={{\n maxWidth: '720px',\n borderRadius: '16px',\n padding: '16px',\n fontSize: '15px',\n lineHeight: '1.6',\n whiteSpace: 'pre-wrap',\n cursor: 'pointer',\n transition: 'background-color 0.2s',\n backgroundColor: resolvedColors.accentColor,\n color: resolvedColors.textColor,\n marginBottom: '16px',\n marginTop: '16px'\n }}\n onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground)}\n onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = resolvedColors.accentColor)}\n >\n {messageText}\n {messageAttachments.length > 0 && (\n <AttachmentDisplay\n attachments={messageAttachments}\n resolvedColors={resolvedColors}\n />\n )}\n </div>\n </div>\n )\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\n {/* Reasoning + Tools from parts, supporting tool-* and dynamic-tool */}\n <ReasoningAndTools\n parts={messageParts}\n messageId={m.id}\n openReasoningIds={openReasoningIds}\n toggleReasoning={toggleReasoning}\n resolvedColors={resolvedColors}\n />\n\n {/* Final response list from data-final-response */}\n {(() => {\n const final = messageParts.find((p: any) => p.type === 'data-final-response' && p.data && Array.isArray(p.data.items));\n if (!final) return null;\n return (\n <FinalResponse items={final.data.items} resolvedColors={resolvedColors} UIComponents={UIComponents} />\n );\n })()}\n </div>\n )}\n </div>\n );\n })}\n\n {/* Jumping dots loading indicator - appears immediately after user submits */}\n {isLoading && (\n <div style={{ \n display: 'flex', \n alignItems: 'center', \n gap: '4px', \n padding: '0 4px',\n height: '20px'\n }}>\n <span \n style={{ \n display: 'inline-block', \n width: '4px', \n height: '4px', \n borderRadius: '50%', \n backgroundColor: resolvedColors.mutedTextColor,\n animation: 'jumpingDots 1s infinite ease-in-out',\n animationDelay: '0s'\n }} \n />\n <span \n style={{ \n display: 'inline-block', \n width: '4px', \n height: '4px', \n borderRadius: '50%', \n backgroundColor: resolvedColors.mutedTextColor,\n animation: 'jumpingDots 1s infinite ease-in-out',\n animationDelay: '0.2s'\n }} \n />\n <span \n style={{ \n display: 'inline-block', \n width: '4px', \n height: '4px', \n borderRadius: '50%', \n backgroundColor: resolvedColors.mutedTextColor,\n animation: 'jumpingDots 1s infinite ease-in-out',\n animationDelay: '0.4s'\n }} \n />\n </div>\n )}\n </div>\n </>\n );\n}\n\n\n","import React from \"react\";\n\ntype ThemeColors = {\n textColor: string;\n mutedTextColor: string;\n borderColor: string;\n inputBackground: string;\n cardBackground: string;\n primaryColor: string;\n};\n\ninterface ChatInputProps {\n input: string;\n setInput: (v: string) => void;\n textareaRef: React.RefObject<HTMLTextAreaElement>;\n fileInputRef: React.RefObject<HTMLInputElement>;\n isLoading: boolean;\n uploading: boolean;\n attachments: Array<{ id: string; name: string; url: string; mimeType: string; size: number }>;\n formatBytes: (n: number) => string;\n handleRemoveAttachment: (id: string) => void;\n onFileInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onSend: () => void;\n onStop: () => void;\n status?: 'ready' | 'streaming' | 'submitted' | 'error';\n t: (k: string) => string;\n resolvedColors: ThemeColors;\n}\n\nexport function ChatInput({ input, setInput, textareaRef, fileInputRef, isLoading, uploading, attachments, formatBytes, handleRemoveAttachment, onFileInputChange, onSend, onStop, status, t, resolvedColors }: ChatInputProps) {\n const canStop = status === 'streaming' || status === 'submitted';\n const hasMessages = attachments.length > 0 || input.trim().length > 0;\n\n return (\n <div style={{ position: 'sticky', bottom: '0', marginTop: 'auto', paddingBottom: '8px', paddingTop: '4px', }}>\n <div style={{ position: 'relative', flex: 1 }}>\n <div style={{ position: 'relative', width: '100%', borderRadius: '16px', paddingBottom: '48px', paddingTop: '16px', border: `1px solid ${resolvedColors.borderColor}`, backgroundColor: resolvedColors.cardBackground }}>\n {attachments.length > 0 && (\n <div style={{ padding: '0px 16px 12px 16px', display: 'flex', flexWrap: 'wrap', gap: '10px' }}>\n {attachments.map((att) => {\n const isImage = att.mimeType.startsWith('image/');\n return (\n <div key={att.id} style={{ display: 'flex', alignItems: 'center', gap: '8px', padding: '8px 12px', backgroundColor: resolvedColors.inputBackground, borderRadius: '10px', border: `1px solid ${resolvedColors.borderColor}`, fontSize: '12px', color: resolvedColors.textColor, position: 'relative' }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', width: '20px', height: '20px', borderRadius: '4px', backgroundColor: isImage ? 'transparent' : resolvedColors.cardBackground }}>\n {isImage ? (\n <img src={att.url} alt={att.name} style={{ width: '20px', height: '20px', borderRadius: '4px', objectFit: 'cover' }} />\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"20\" rx=\"2\" ry=\"2\" />\n </svg>\n )}\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', minWidth: 0, flex: 1 }}>\n <span title={att.name} style={{ maxWidth: '140px', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', fontWeight: 500 }}>{att.name}</span>\n <span style={{ color: resolvedColors.mutedTextColor, fontSize: '10px', marginTop: '2px' }}>{formatBytes(att.size)}</span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', marginLeft: '8px' }}>\n {isImage && (\n <a href={att.url} target=\"_blank\" rel=\"noopener noreferrer\" style={{ background: 'none', border: 'none', color: resolvedColors.mutedTextColor, cursor: 'pointer', padding: '2px', display: 'flex', alignItems: 'center', borderRadius: '4px', textDecoration: 'none' }} title={t('input.previewImage')}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n </a>\n )}\n <button onClick={() => handleRemoveAttachment(att.id)} style={{ background: 'none', border: 'none', color: resolvedColors.mutedTextColor, cursor: 'pointer', padding: '2px', display: 'flex', alignItems: 'center', borderRadius: '4px' }} title={t('input.removeFile')}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {uploading && (\n <div style={{\n padding: '0px 16px 12px 16px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '13px',\n color: resolvedColors.mutedTextColor\n }}>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ animation: 'spin 1s linear infinite' }}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n <span>{t('input.uploadingFiles')}</span>\n </div>\n )}\n\n <div style={{ padding: '0 16px' }}>\n <textarea\n ref={textareaRef}\n aria-label=\"Prompt\"\n rows={1}\n placeholder={t('input.placeholder')}\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n onSend();\n }\n }}\n disabled={isLoading || uploading}\n style={{\n height: '24px',\n maxHeight: '200px',\n width: '100%',\n resize: 'none',\n backgroundColor: 'transparent',\n fontSize: '15px',\n lineHeight: '1.6',\n outline: 'none',\n border: 'none',\n color: resolvedColors.textColor,\n fontFamily: 'inherit',\n overflow: 'auto'\n }}\n />\n </div>\n\n <input ref={fileInputRef} type=\"file\" multiple onChange={onFileInputChange} style={{ display: 'none' }} accept=\"*/*\" />\n\n <div style={{ position: 'absolute', bottom: '8px', left: '8px', display: 'flex', alignItems: 'center', gap: '4px', color: resolvedColors.mutedTextColor }}>\n <button onClick={() => fileInputRef.current?.click()} disabled={isLoading || uploading} style={{ borderRadius: '8px', padding: '8px', transition: 'all 0.2s', backgroundColor: 'transparent', border: 'none', cursor: isLoading || uploading ? 'not-allowed' : 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', color: 'inherit', opacity: isLoading || uploading ? 0.5 : 1 }} aria-label={t('input.attachFiles')}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 1 1 5.66 5.66l-9.2 9.19a2 2 0 1 1-2.83-2.83l8.49-8.49\" />\n </svg>\n </button>\n </div>\n\n <div style={{ position: 'absolute', bottom: '8px', right: '8px' }}>\n {/* Stop button - shows when streaming or submitted */}\n {isLoading ? (\n <button \n onClick={onStop} \n disabled={!canStop}\n aria-label={t('input.stop')} \n title=\"Stop generation\"\n style={{\n borderRadius: '12px',\n padding: '12px',\n transition: 'all 0.2s ease-out',\n border: `1px solid #ef4444`,\n backgroundColor: '#ef444420',\n color: '#ef4444',\n opacity: canStop ? 1 : 0.4,\n cursor: canStop ? 'pointer' : 'not-allowed',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n }}\n onMouseEnter={(e) => {\n if (canStop) {\n e.currentTarget.style.backgroundColor = '#ef444430';\n e.currentTarget.style.transform = 'scale(1.02)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#ef444420';\n e.currentTarget.style.transform = 'scale(1)';\n }}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/>\n </svg>\n </button>\n ) : (\n <button \n onClick={onSend} \n disabled={(!hasMessages) || uploading} \n aria-label={t('input.send')} \n title=\"Send message\"\n style={{ \n borderRadius: '12px', \n padding: '12px',\n transition: 'all 0.2s ease-out', \n border: `1px solid ${resolvedColors.borderColor}`, \n backgroundColor: resolvedColors.cardBackground, \n color: (!hasMessages) || uploading ? resolvedColors.mutedTextColor : resolvedColors.primaryColor, \n cursor: (!hasMessages) || uploading ? 'not-allowed' : 'pointer', \n display: 'flex', \n alignItems: 'center', \n justifyContent: 'center', \n opacity: (!hasMessages) || uploading ? 0.5 : 1 \n }}\n onMouseEnter={(e) => {\n if (hasMessages && !uploading) {\n e.currentTarget.style.borderColor = resolvedColors.primaryColor;\n e.currentTarget.style.transform = 'scale(1.02)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = resolvedColors.borderColor;\n e.currentTarget.style.transform = 'scale(1)';\n }}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m5 12 7-7 7 7\"/>\n <path d=\"M12 19V5\"/>\n </svg>\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n\n","import { ChatMessage } from '../types/chat';\n\nexport interface ChatMeta {\n id: string;\n title: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface ChatData {\n id: string;\n messages: ChatMessage[];\n agentId?: string;\n}\n\nexport function createChatStorage(agentId: string) {\n const LS_PREFIX = `hsafaChat_${agentId}`;\n const chatsIndexKey = `${LS_PREFIX}.chats`;\n const chatKey = (id: string) => `${LS_PREFIX}.chat.${id}`;\n const currentChatKey = `${LS_PREFIX}.currentChatId`;\n const showChatKey = `${LS_PREFIX}.showChat`;\n\n const loadChatsIndex = (): ChatMeta[] => {\n try {\n const raw = localStorage.getItem(chatsIndexKey);\n return raw ? JSON.parse(raw) : [];\n } catch { return []; }\n };\n\n const saveChatsIndex = (list: ChatMeta[]) => {\n try { localStorage.setItem(chatsIndexKey, JSON.stringify(list)); } catch {}\n };\n\n const loadChat = (id: string): ChatData | null => {\n try { \n const raw = localStorage.getItem(chatKey(id)); \n return raw ? JSON.parse(raw) : null; \n } catch { return null; }\n };\n\n const saveChat = (data: ChatData) => {\n try { localStorage.setItem(chatKey(data.id), JSON.stringify(data)); } catch {}\n };\n\n const upsertChatMeta = (meta: ChatMeta) => {\n const list = loadChatsIndex();\n const idx = list.findIndex(x => x.id === meta.id);\n if (idx >= 0) list[idx] = meta; else list.unshift(meta);\n saveChatsIndex(list);\n };\n\n const deleteChatMeta = (id: string) => {\n const list = loadChatsIndex();\n const next = list.filter(x => x.id !== id);\n saveChatsIndex(next);\n };\n\n const deleteChatData = (id: string) => {\n try { localStorage.removeItem(chatKey(id)); } catch {}\n };\n\n const deleteChat = (id: string) => {\n deleteChatData(id);\n deleteChatMeta(id);\n };\n\n const loadShowChatPreference = (defaultValue: boolean): boolean => {\n try {\n const savedShow = localStorage.getItem(showChatKey);\n return savedShow !== null ? savedShow === 'true' : defaultValue;\n } catch {\n return defaultValue;\n }\n };\n\n const saveShowChatPreference = (value: boolean) => {\n try { localStorage.setItem(showChatKey, String(value)); } catch {}\n };\n\n const loadCurrentChatId = (): string | null => {\n try {\n return localStorage.getItem(currentChatKey);\n } catch {\n return null;\n }\n };\n\n const saveCurrentChatId = (chatId: string) => {\n try { localStorage.setItem(currentChatKey, chatId); } catch {}\n };\n\n const removeCurrentChatId = () => {\n try { localStorage.removeItem(currentChatKey); } catch {}\n };\n\n return {\n loadChatsIndex,\n saveChatsIndex,\n loadChat,\n saveChat,\n upsertChatMeta,\n deleteChatMeta,\n deleteChatData,\n deleteChat,\n loadShowChatPreference,\n saveShowChatPreference,\n loadCurrentChatId,\n saveCurrentChatId,\n removeCurrentChatId\n };\n}\n\nexport function genId() {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n","/**\n * Time utility functions for the HsafaChat component\n */\n\n/**\n * Lightweight relative time helper (e.g., 1m, 6h, 7h)\n */\nexport function timeAgo(ts: number): string {\n const diff = Date.now() - ts;\n const s = Math.max(1, Math.floor(diff / 1000));\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h}h`;\n const d = Math.floor(h / 24);\n if (d < 7) return `${d}d`;\n const w = Math.floor(d / 7);\n if (w < 4) return `${w}w`;\n const months = Math.floor(d / 30);\n if (months < 12) return `${months}mo`;\n const y = Math.floor(months / 12);\n return `${y}y`;\n}\n\n/**\n * Generate unique ID\n */\nexport function genId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n","import React from 'react';\nimport { createPortal } from 'react-dom';\nimport { Trash2 } from 'lucide-react';\nimport { IconWrapper } from '../IconWrapper';\nimport { ThemeColors } from '../../utils/chat-theme';\nimport { timeAgo } from '../../utils/time';\n\ninterface ChatMeta {\n id: string;\n title: string;\n createdAt: number;\n updatedAt: number;\n}\n\ninterface ChatHistoryModalProps {\n historyOpen: boolean;\n historySearch: string;\n currentChatId: string | null;\n refreshKey?: number;\n resolvedColors: ThemeColors;\n onClose: () => void;\n onSearchChange: (search: string) => void;\n onChatSelect: (chatId: string) => void;\n onChatDelete: (chatId: string) => void;\n loadChatsIndex: () => ChatMeta[];\n historyPopupRef: React.RefObject<HTMLDivElement>;\n}\n\nexport function ChatHistoryModal({\n historyOpen,\n historySearch,\n currentChatId,\n refreshKey,\n resolvedColors,\n onClose,\n onSearchChange,\n onChatSelect,\n onChatDelete,\n loadChatsIndex,\n historyPopupRef\n}: ChatHistoryModalProps) {\n if (!historyOpen) return null;\n\n const modalContent = (\n <>\n {/* Backdrop with blur */}\n <div\n style={{\n position: 'fixed',\n inset: '0',\n zIndex: 1100,\n backgroundColor: 'rgba(0, 0, 0, 0.4)',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)'\n }}\n onClick={onClose}\n />\n {/* Command palette panel */}\n <div\n ref={historyPopupRef}\n style={{\n position: 'fixed',\n left: '50%',\n top: '64px',\n transform: 'translateX(-50%)',\n zIndex: 1101,\n width: '680px',\n maxWidth: '94vw',\n overflow: 'hidden',\n borderRadius: '16px',\n border: `1px solid ${resolvedColors.borderColor}`,\n backgroundColor: `${resolvedColors.backgroundColor}f0`,\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n backdropFilter: 'blur(16px)',\n WebkitBackdropFilter: 'blur(16px)'\n }}\n >\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n borderBottom: `1px solid ${resolvedColors.borderColor}`,\n padding: '12px 16px'\n }}>\n <div style={{ flex: '1' }}>\n <input\n autoFocus\n value={historySearch}\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder=\"Search\"\n style={{\n width: '100%',\n borderRadius: '8px',\n backgroundColor: resolvedColors.inputBackground,\n padding: '8px 12px',\n fontSize: '14px',\n color: resolvedColors.textColor,\n border: `1px solid ${resolvedColors.borderColor}`,\n outline: 'none'\n }}\n onFocus={(e) => e.currentTarget.style.borderColor = resolvedColors.primaryColor}\n onBlur={(e) => e.currentTarget.style.borderColor = resolvedColors.borderColor}\n />\n </div>\n </div>\n <div style={{\n maxHeight: '60vh',\n overflowY: 'auto'\n }}>\n {(() => {\n const q = historySearch.toLowerCase().trim();\n let list = loadChatsIndex();\n if (q) list = list.filter(m => (m.title || '').toLowerCase().includes(q));\n if (!list || list.length === 0) return (\n <div style={{\n padding: '24px',\n color: resolvedColors.mutedTextColor,\n textAlign: 'center'\n }}>No chats found.</div>\n );\n return (\n <div>\n {list.map((meta, index) => (\n <div key={meta.id} style={{\n borderTop: index > 0 ? `1px solid ${resolvedColors.borderColor}` : 'none'\n }}>\n <div style={{\n display: 'flex',\n width: '100%',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n padding: '12px',\n backgroundColor: meta.id === currentChatId ? resolvedColors.cardBackground : 'transparent'\n }}>\n <button\n style={{\n flex: '1',\n textAlign: 'left',\n transition: 'background-color 0.2s',\n borderRadius: '8px',\n padding: '8px',\n border: 'none',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n color: resolvedColors.textColor\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = 'transparent'}\n onClick={() => onChatSelect(meta.id)}\n >\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px'\n }}>\n <div style={{ minWidth: '0', flex: '1' }}>\n <div style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontSize: '14px',\n color: resolvedColors.textColor\n }}>{meta.title || 'Untitled chat'}</div>\n </div>\n <div style={{\n flexShrink: 0,\n fontSize: '12px',\n color: resolvedColors.mutedTextColor\n }}>{timeAgo(meta.updatedAt)}</div>\n </div>\n </button>\n <button\n style={{\n flexShrink: 0,\n borderRadius: '6px',\n padding: '8px',\n color: resolvedColors.mutedTextColor,\n border: '1px solid transparent',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n transition: 'all 0.2s'\n }}\n title=\"Delete chat\"\n onMouseEnter={(e) => {\n e.currentTarget.style.color = '#ef4444';\n e.currentTarget.style.backgroundColor = 'rgba(239, 68, 68, 0.1)';\n e.currentTarget.style.borderColor = 'rgba(239, 68, 68, 0.3)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = resolvedColors.mutedTextColor;\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.borderColor = 'transparent';\n }}\n onClick={(e) => {\n e.stopPropagation();\n onChatDelete(meta.id);\n }}\n >\n <IconWrapper IconComponent={Trash2} size=\"16\" strokeWidth=\"2\" />\n </button>\n </div>\n </div>\n ))}\n </div>\n );\n })()}\n </div>\n </div>\n </>\n );\n \n // Only use portal if document.body is available\n if (typeof document !== 'undefined' && document.body) {\n return createPortal(modalContent, document.body);\n }\n \n // Fallback to inline rendering\n return modalContent;\n}\n","\"use client\";\n\n/**\n * getDomComponents - Scan and analyze all interactive DOM elements inside ContentContainer\n * \n * Returns a structured list of all inputs, buttons, links, and interactive elements\n * that the agent can interact with using the web controller tools.\n */\n\nexport interface DomComponent {\n id: string | null;\n tag: string;\n type?: string;\n name?: string;\n label?: string;\n placeholder?: string;\n value?: string | boolean | string[];\n options?: Array<{ value: string; label: string; selected: boolean; disabled: boolean }>; // for selects\n checked?: boolean;\n disabled?: boolean;\n required?: boolean;\n className?: string;\n text?: string;\n href?: string;\n role?: string;\n ariaLabel?: string;\n selector?: string;\n isVisible: boolean;\n isInteractive: boolean;\n}\n\nexport interface GetDomComponentsOptions {\n includeHidden?: boolean;\n selector?: string;\n what?: 'inputs' | 'content';\n limit?: number; // max number of components to return (default 50)\n}\n\nexport interface GetDomComponentsResult {\n ok: boolean;\n components: DomComponent[];\n count: number;\n total: number; // total components before limiting\n truncated?: boolean; // true if limited\n containerFound: boolean;\n error?: string;\n}\n\nfunction isVisible(el: Element): boolean {\n if (!(el instanceof HTMLElement)) return true;\n const style = window.getComputedStyle(el);\n return (\n style.display !== 'none' &&\n style.visibility !== 'hidden' &&\n style.opacity !== '0' &&\n el.offsetParent !== null\n );\n}\n\nfunction getElementLabel(el: Element): string | undefined {\n // Check for associated label\n if (el.id) {\n const label = document.querySelector(`label[for=\"${el.id}\"]`);\n if (label) return label.textContent?.trim();\n }\n \n // Check for parent label\n const parentLabel = el.closest('label');\n if (parentLabel) {\n // Get label text excluding the input's own text\n const clone = parentLabel.cloneNode(true) as HTMLElement;\n const input = clone.querySelector('input, select, textarea');\n if (input) input.remove();\n return clone.textContent?.trim();\n }\n \n return undefined;\n}\n\nfunction getElementText(el: Element): string | undefined {\n if (el.textContent && el.textContent.trim()) {\n return el.textContent.trim().slice(0, 100); // Limit to 100 chars\n }\n return undefined;\n}\n\nfunction getElementValue(el: Element): string | boolean | string[] | undefined {\n if (el instanceof HTMLInputElement) {\n const type = el.type.toLowerCase();\n if (type === 'checkbox' || type === 'radio') {\n return el.checked;\n }\n return el.value;\n }\n \n if (el instanceof HTMLTextAreaElement) {\n return el.value;\n }\n \n if (el instanceof HTMLSelectElement) {\n if (el.multiple) {\n return Array.from(el.selectedOptions).map(opt => opt.value);\n }\n return el.value;\n }\n \n if (el instanceof HTMLElement && el.isContentEditable) {\n return el.textContent || undefined;\n }\n \n return undefined;\n}\n\nfunction getUniqueSelector(el: Element): string {\n if (el.id) return `#${el.id}`;\n \n // Build a path-based selector\n const path: string[] = [];\n let current: Element | null = el;\n \n while (current && current !== document.body) {\n let selector = current.tagName.toLowerCase();\n \n if (current.className && typeof current.className === 'string') {\n const classes = current.className.split(' ').filter(c => c.trim()).slice(0, 2);\n if (classes.length > 0) {\n selector += '.' + classes.join('.');\n }\n }\n \n // Add nth-child if needed for uniqueness\n const parent: Element | null = current.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n (child: Element) => child.tagName === (current as Element).tagName\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(current) + 1;\n selector += `:nth-child(${index})`;\n }\n }\n \n path.unshift(selector);\n current = parent;\n }\n \n return path.slice(-3).join(' > '); // Last 3 levels for brevity\n}\n\nexport async function getDomComponents(options: GetDomComponentsOptions = {}): Promise<GetDomComponentsResult> {\n try {\n const { includeHidden = false, selector, what = 'content', limit } = options;\n \n // Find ContentContainer\n const contentContainer = document.querySelector('.hsafa-content-container');\n \n if (!contentContainer) {\n return {\n ok: false,\n components: [],\n count: 0,\n total: 0,\n containerFound: false,\n error: 'ContentContainer not found on page. Make sure you have wrapped your app with <ContentContainer>.'\n };\n }\n \n // Determine search scope\n const searchScope = selector \n ? contentContainer.querySelector(selector) || contentContainer\n : contentContainer;\n \n const components: DomComponent[] = [];\n \n // Build selectors based on requested scope\n let selectors: string[] = [];\n if (what === 'inputs') {\n selectors = [\n 'input', 'textarea', 'select', '[contenteditable=\"true\"]', '[contenteditable=\"\"]'\n ];\n } else {\n // content (default): semantic structure + rich content + interactive elements\n selectors = [\n // Structural regions\n 'header','nav','main','section','article','aside','footer',\n // Headings and text\n 'h1','h2','h3','h4','h5','h6','p',\n // Media and lists\n 'img[alt]','ul','ol','li',\n // Tables\n 'table','thead','tbody','tr','td','th',\n // Forms and labels\n 'form','label',\n // Inputs and editable content\n 'input','textarea','select','[contenteditable=\"true\"]','[contenteditable=\"\"]',\n // Interactive\n 'a[href]','button','[role=\"button\"]','[role=\"link\"]','[onclick]','[tabindex]',\n // Containers (last to avoid flooding low-importance items)\n 'div'\n ];\n }\n \n const elements = searchScope.querySelectorAll(selectors.join(', '));\n \n elements.forEach((el) => {\n const visible = isVisible(el);\n \n // Skip hidden elements unless requested\n if (!visible && !includeHidden) return;\n \n const component: DomComponent = {\n id: el.id || null,\n tag: el.tagName.toLowerCase(),\n className: el.className && typeof el.className === 'string' ? el.className : undefined,\n isVisible: visible,\n isInteractive: true,\n selector: getUniqueSelector(el)\n };\n \n // Add type-specific properties\n if (el instanceof HTMLInputElement) {\n component.type = el.type;\n component.name = el.name || undefined;\n component.placeholder = el.placeholder || undefined;\n component.value = getElementValue(el);\n component.checked = el.type === 'checkbox' || el.type === 'radio' ? el.checked : undefined;\n component.disabled = el.disabled;\n component.required = el.required;\n } else if (el instanceof HTMLTextAreaElement) {\n component.name = el.name || undefined;\n component.placeholder = el.placeholder || undefined;\n component.value = getElementValue(el);\n component.disabled = el.disabled;\n component.required = el.required;\n } else if (el instanceof HTMLSelectElement) {\n component.name = el.name || undefined;\n component.value = getElementValue(el);\n component.disabled = el.disabled;\n component.required = el.required;\n component.options = Array.from(el.options).map(opt => ({\n value: opt.value,\n label: opt.text,\n selected: opt.selected,\n disabled: opt.disabled\n }));\n } else if (el instanceof HTMLButtonElement) {\n component.type = el.type;\n component.disabled = el.disabled;\n component.text = getElementText(el);\n } else if (el instanceof HTMLAnchorElement) {\n component.href = el.href;\n component.text = getElementText(el);\n } else if (el instanceof HTMLImageElement) {\n component.text = el.alt || undefined;\n component.label = el.alt || component.label;\n } else {\n component.text = getElementText(el);\n }\n \n // Add label and ARIA\n component.label = getElementLabel(el);\n component.role = el.getAttribute('role') || undefined;\n component.ariaLabel = el.getAttribute('aria-label') || undefined;\n \n components.push(component);\n });\n \n // Sort: tailor importance based on requested 'what'\n const importance = (c: DomComponent) => {\n if (!c.isVisible) return 0;\n if (what === 'inputs') {\n if (c.tag === 'input' || c.tag === 'textarea' || c.tag === 'select' || c.role === 'textbox') return 3;\n if (c.tag === 'button' || c.tag === 'a') return 2;\n return 1;\n }\n // content (default)\n if (['header','nav','main','footer'].includes(c.tag)) return 5;\n if (['section','article','aside'].includes(c.tag)) return 4;\n if (['h1','h2','h3'].includes(c.tag)) return 4;\n if (['h4','h5','h6'].includes(c.tag)) return 3;\n if (c.tag === 'form') return 4;\n if (c.tag === 'label') return 3;\n if (c.tag === 'input' || c.tag === 'textarea' || c.tag === 'select') return 4;\n if (c.tag === 'p' || c.tag === 'img') return 3;\n if (c.tag === 'button' || c.tag === 'a') return 3;\n return 1;\n };\n \n components.sort((a, b) => importance(b) - importance(a));\n const total = components.length;\n const defaultLimit = what === 'inputs' ? 100 : 150;\n const maxItems = Math.max(1, Math.min(200, typeof limit === 'number' ? Math.floor(limit) : defaultLimit));\n const truncated = total > maxItems;\n const limited = truncated ? components.slice(0, maxItems) : components;\n return {\n ok: true,\n components: limited,\n count: limited.length,\n total,\n truncated,\n containerFound: true\n };\n } catch (error: any) {\n return {\n ok: false,\n components: [],\n count: 0,\n total: 0,\n containerFound: false,\n error: error?.message || String(error)\n };\n }\n}\n\n// Expose globally for console testing\nif (typeof window !== 'undefined') {\n (window as any).getDomComponents = getDomComponents;\n}\n\n","\"use client\";\n\n/**\n * guideCursor - Wrapper for window.__cursorGuide\n * \n * Move the visual cursor to elements and perform click/drag actions.\n * Requires CursorController component to be mounted on the page.\n */\n\nimport type { GuideTarget, GuideOptions, GuideRunResult } from './CursorController';\n\nexport interface GuideCursorOptions extends GuideOptions {}\n\n/**\n * Guide the cursor to a target element or position\n * \n * @example\n * ```ts\n * // Move to an element and click it\n * await guideCursor('#submitBtn', { action: 'click' });\n * \n * // Move to a position\n * await guideCursor({ position: { x: 100, y: 200 } });\n * \n * // Drag from one element to another\n * await guideCursor('#item1', { action: 'drag', dragTo: '#dropzone' });\n * ```\n */\nexport async function guideCursor(\n target: GuideTarget,\n options: GuideCursorOptions = {}\n): Promise<GuideRunResult> {\n if (typeof window === 'undefined') {\n return {\n ok: false,\n steps: [{\n ok: false,\n action: 'none',\n targetKind: 'position',\n durationMs: 0,\n error: 'guideCursor only works in browser environment'\n }]\n };\n }\n\n const cursorGuide = (window as any).__cursorGuide;\n \n if (!cursorGuide) {\n return {\n ok: false,\n steps: [{\n ok: false,\n action: 'none',\n targetKind: 'position',\n durationMs: 0,\n error: 'CursorController not initialized. Make sure to mount <CursorController /> component.'\n }]\n };\n }\n\n try {\n return await cursorGuide(target, options);\n } catch (error: any) {\n return {\n ok: false,\n steps: [{\n ok: false,\n action: options.action || 'none',\n targetKind: 'position',\n durationMs: 0,\n error: error?.message || String(error)\n }]\n };\n }\n}\n\n// Expose globally for console testing\nif (typeof window !== 'undefined') {\n (window as any).guideCursor = guideCursor;\n}\n\n","\"use client\";\n\n/**\n * FillInput utilities\n *\n * Exports two helpers for programmatically filling inputs while dispatching the\n * same DOM events a user would normally trigger (input/change/click):\n *\n * - FillInput(inputId, value, options?)\n * Fill a single field by its element id with the provided value.\n *\n * - FillActiveInput(value, options?)\n * Fill the currently focused field without needing its id.\n *\n * Basic example:\n * ```ts\n * import { FillInput, FillActiveInput } from \"./FillInput\";\n *\n * // Fill individual fields by id\n * await FillInput(\"fi_name\", \"Jane Doe\");\n * await FillInput(\"fi_email\", \"jane@example.com\");\n * await FillInput(\"fi_role_admin\", true); // radio -> check this option\n * await FillInput(\"fi_country2\", \"sa\"); // select value\n * await FillInput(\"fi_tags\", [\"a\", \"c\"]); // multi-select values\n * await FillInput(\"fi_newsletter\", true); // checkbox\n * await FillInput(\"fi_dob\", \"1995-05-15\"); // date input\n * await FillInput(\"about\", \"Hello there\"); // contenteditable by id\n *\n * // Fill the currently focused field\n * (document.getElementById(\"fi_name\") as HTMLElement)?.focus();\n * await FillActiveInput(\"Alice\");\n * ```\n *\n * Notes:\n * - Scrolling is disabled; these helpers will not scroll the page.\n * - typingDelayMs is ignored; filling is instantaneous.\n * - For file inputs, pass a File or File[]; browsers may restrict programmatic assignment.\n */\n\n// Utility to fill a form (or any container) by id with data, firing realistic events\n// Supported fields: input (text, email, password, number, range, date, time, color, checkbox, radio, file),\n// textarea, select (single/multiple), and contenteditable elements.\n\nexport type FillInputOptions = {\n typingDelayMs?: number; // deprecated: ignored; filling is instantaneous\n scrollIntoView?: boolean; // deprecated: ignored; no scrolling performed\n};\n\nexport type FillResult = {\n ok: boolean;\n filled: Array<{ key: string; status: \"ok\" | \"skipped\" | \"error\"; message?: string }>;\n errors?: string[];\n};\n\nfunction isHTMLElement(n: Element | null | undefined): n is HTMLElement {\n return !!n && n.nodeType === 1;\n}\n\nfunction looksLikeSelector(key: string) {\n return /[#.\\[\\] :]/.test(key);\n}\n\nfunction delay(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction dispatch(el: Element, type: string) {\n el.dispatchEvent(new Event(type, { bubbles: true }));\n}\n\nfunction setTextLike(el: HTMLInputElement | HTMLTextAreaElement, value: string) {\n const setter = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(el), \"value\")?.set;\n if (setter) setter.call(el, value);\n else (el as any).value = value;\n dispatch(el, \"input\");\n}\n\nasync function typeText(el: HTMLInputElement | HTMLTextAreaElement, value: string, delayMs: number) {\n el.focus();\n // clear existing value by selecting and deleting\n setTextLike(el, \"\");\n for (const ch of value.split(\"\")) {\n const prev = (el as any).value as string;\n setTextLike(el, prev + ch);\n if (delayMs > 0) await delay(delayMs);\n }\n dispatch(el, \"change\");\n (el as any).blur?.();\n}\n\n// scrolling intentionally disabled in FillInput/FillActiveInput\n\n// findFields no longer needed for single-element FillInput\n\nfunction setCheckbox(el: HTMLInputElement, value: boolean) {\n if (el.checked !== value) {\n el.click(); // clicking fires the right sequence (pointer/mouse/input/change)\n }\n}\n\nfunction setRadio(group: HTMLInputElement[], value: string) {\n const target = group.find((r) => r.value === String(value));\n if (target && !target.checked) target.click();\n}\n\nfunction setSelectSingle(el: HTMLSelectElement, value: string | number | { label?: string; index?: number }) {\n if (typeof value === \"object\" && value && \"index\" in value && typeof value.index === \"number\") {\n el.selectedIndex = Math.max(0, Math.min(el.options.length - 1, value.index));\n } else if (typeof value === \"object\" && value && \"label\" in value && typeof value.label === \"string\") {\n const i = Array.from(el.options).findIndex((o) => o.text === value.label);\n el.selectedIndex = i >= 0 ? i : 0;\n } else {\n el.value = String(value);\n }\n dispatch(el, \"input\");\n dispatch(el, \"change\");\n}\n\nfunction setSelectMultiple(el: HTMLSelectElement, values: Array<string | number>) {\n const setVals = new Set(values.map(String));\n Array.from(el.options).forEach((opt) => {\n opt.selected = setVals.has(opt.value) || setVals.has(opt.text);\n });\n dispatch(el, \"input\");\n dispatch(el, \"change\");\n}\n\nfunction coerceDate(v: any): string {\n if (!v) return \"\";\n if (v instanceof Date) return v.toISOString().slice(0, 10);\n // assume string 'YYYY-MM-DD' or other\n return String(v);\n}\n\nfunction setFiles(el: HTMLInputElement, files: File | File[]) {\n const list = Array.isArray(files) ? files : [files];\n const dt = new DataTransfer();\n for (const f of list) dt.items.add(f);\n Object.defineProperty(el, \"files\", { value: dt.files, configurable: true });\n dispatch(el, \"input\");\n dispatch(el, \"change\");\n}\n\n// The FillInput function has been removed to enforce using FillActiveInput only.\n\nexport async function FillActiveInput(value: any, options: FillInputOptions = {}): Promise<FillResult> {\n let el = (document.activeElement as Element | null) || null;\n // If focus is within a shadow root or child, try to find the nearest contenteditable host\n if (el && isHTMLElement(el)) {\n const ce = (el as HTMLElement).closest('[contenteditable=\"true\"], [contenteditable=\"\"]') as HTMLElement | null;\n if (ce) el = ce;\n }\n\n if (!el || el === document.body) {\n return { ok: false, filled: [{ key: \"active\", status: \"skipped\", message: \"No active input element\" }], errors: [\"No active input element\"] };\n }\n\n try {\n const tag = el.tagName.toLowerCase();\n\n if (tag === \"input\") {\n const inp = el as HTMLInputElement;\n const type = (inp.type || \"text\").toLowerCase();\n if (type === \"checkbox\") {\n setCheckbox(inp, Boolean(value));\n } else if (type === \"radio\") {\n const name = inp.name;\n if (name && value != null && String(inp.value) !== String(value)) {\n const alt = document.querySelector(`input[type=\"radio\"][name=\"${CSS.escape(name)}\"][value=\"${CSS.escape(String(value))}\"]`) as HTMLInputElement | null;\n if (alt) alt.click();\n else inp.click(); // fallback to clicking the active one\n } else {\n inp.click();\n }\n } else if (type === \"file\") {\n if (value instanceof File || (Array.isArray(value) && value.every((v) => v instanceof File))) {\n setFiles(inp, value as any);\n } else {\n return { ok: false, filled: [{ key: \"active\", status: \"skipped\", message: \"Provide File or File[] for file input\" }], errors: [\"Provide File or File[] for file input\"] };\n }\n } else {\n const vStr = type === \"date\" ? coerceDate(value) : String(value ?? \"\");\n setTextLike(inp, vStr);\n dispatch(inp, \"change\");\n }\n return { ok: true, filled: [{ key: \"active\", status: \"ok\" }] };\n }\n\n if (tag === \"textarea\") {\n const ta = el as HTMLTextAreaElement;\n const vStr = String(value ?? \"\");\n setTextLike(ta, vStr);\n dispatch(ta, \"change\");\n return { ok: true, filled: [{ key: \"active\", status: \"ok\" }] };\n }\n\n if (tag === \"select\") {\n const sel = el as HTMLSelectElement;\n if (sel.multiple) setSelectMultiple(sel, Array.isArray(value) ? value : [value]);\n else setSelectSingle(sel, value);\n return { ok: true, filled: [{ key: \"active\", status: \"ok\" }] };\n }\n\n // contenteditable\n if (isHTMLElement(el) && (el as HTMLElement).isContentEditable) {\n const host = el as HTMLElement;\n host.focus();\n host.textContent = String(value ?? \"\");\n dispatch(host, \"input\");\n dispatch(host, \"change\");\n (host as any).blur?.();\n return { ok: true, filled: [{ key: \"active\", status: \"ok\" }] };\n }\n\n return { ok: false, filled: [{ key: \"active\", status: \"skipped\", message: `Unsupported active element: ${tag}` }], errors: [`Unsupported active element: ${tag}`] };\n } catch (e: any) {\n return { ok: false, filled: [{ key: \"active\", status: \"error\", message: e?.message ?? String(e) }], errors: [e?.message ?? String(e)] };\n }\n}\n\n// Optional: expose globally for easy console testing in the demo\nif (typeof window !== \"undefined\") {\n (window as any).FillActiveInput = FillActiveInput;\n}\n","\"use client\";\n\nimport React, { useEffect } from \"react\";\nimport { createRoot, Root } from \"react-dom/client\";\n\n/**\n * CursorController\n *\n * Mount this component once on a page (e.g. in the demo at `/demo`). It registers a\n * global function `window.__cursorGuide(stepsOrTarget, options?)` that moves a fake\n * cursor to a target and optionally performs actions (click, drag).\n *\n * In `app/demo/page.tsx`, a convenience wrapper `guideCursorTo(targetOrSteps, options?)`\n * is also exported and exposed globally as `window.guideCursorTo`.\n *\n * Quick examples (run in DevTools on /demo):\n * ```js\n * // Move to a screen position\n * await window.guideCursorTo({ position: { x: 140, y: 160 } }, { durationMs: 700 });\n *\n * // Click an element by selector or id\n * await window.guideCursorTo('#submitBtn', { action: 'click', anchor: 'center' });\n *\n * // Drag from one element to another\n * await window.guideCursorTo({ selector: '#cardBacklog0' }, { action: 'drag', dragTo: '#doingDrop' });\n *\n * // Multi-step sequence\n * await window.guideCursorTo([\n * { target: '#tabStats', action: 'click', options: { durationMs: 600 } },\n * { target: { position: { x: 100, y: 120 } } },\n * { target: '#progressStartBtn', action: 'click' },\n * ]);\n * ```\n *\n * Options highlights (see `GuideOptions`):\n * - action: 'none' | 'click' | 'drag'\n * - durationMs, easing: control motion speed/curve\n * - path: 'straight' | 'curve', curveStrength, curveDirection\n * - anchor: where inside the element to aim (e.g. 'center', 'top-left' or {x:0..1,y:0..1})\n * - cursorHotspot: px offset to the click location\n * - dragTo: target for drag action\n */\n\n// Types for the public API\nexport type GuideAction = \"none\" | \"click\" | \"drag\";\n\nexport type GuideTarget =\n | string // id or selector (resolved as id first)\n | Element\n | { selector: string; nth?: number; within?: Element | string }\n | { position: { x: number; y: number } };\n\nexport type Anchor = \"center\" | \"top-left\" | \"bottom-right\" | { x: number; y: number };\n\nexport type GuideOptions = {\n action?: GuideAction;\n durationMs?: number; // total travel duration\n easing?: \"ease\" | \"ease-in\" | \"ease-out\" | \"ease-in-out\" | \"linear\";\n offset?: { x?: number; y?: number };\n highlight?: boolean; // briefly highlight target when reached\n // Path options\n path?: \"straight\" | \"curve\"; // default curve\n curveStrength?: number; // 0..1, fraction of distance used as bend magnitude (default 0.25)\n curveDirection?: \"auto\" | \"left\" | \"right\"; // default auto\n // New options\n anchor?: Anchor; // where inside the element to aim\n cursorHotspot?: { x?: number; y?: number }; // px offset added to click/press location\n dragTo?: GuideTarget; // destination target for action='drag'\n};\n\nexport type GuideStep = { target: GuideTarget; action?: GuideAction; options?: GuideOptions };\nexport type GuideStepResult = { ok: boolean; action: GuideAction; targetKind: \"element\" | \"position\"; durationMs: number; clickedElementId?: string | null; error?: string };\nexport type GuideRunResult = { ok: boolean; steps: GuideStepResult[] };\n\n// Cursor controller state (DOM-based, no React re-renders)\nlet cursorReactRoot: Root | null = null;\nlet cursorSvgCache: { arrow?: string; pointer?: string } = {};\nlet cursorStylesInjected = false;\n\n// Visibility/idle management so the cursor never disappears while moving\nlet cursorHideTimer: number | null = null;\nlet cursorIsMoving = false;\n\nfunction ensureCursorVisible(cursor: HTMLElement) {\n cursor.classList.add(\"visible\");\n}\n\nfunction keepCursorVisibleWhileMoving() {\n cursorIsMoving = true;\n if (cursorHideTimer != null) {\n clearTimeout(cursorHideTimer);\n cursorHideTimer = null;\n }\n}\n\nfunction scheduleCursorHide(cursor: HTMLElement, ms = 1500) {\n if (cursorIsMoving) return;\n if (cursorHideTimer != null) {\n clearTimeout(cursorHideTimer);\n }\n cursorHideTimer = window.setTimeout(() => {\n if (!cursorIsMoving) cursor.classList.remove(\"visible\");\n }, ms);\n}\n\nfunction stopMovingAndMaybeHide(cursor: HTMLElement, ms = 1200) {\n cursorIsMoving = false;\n scheduleCursorHide(cursor, ms);\n}\n\n// Get all scrollable ancestors of an element\nfunction getScrollableAncestors(el: Element | null): Element[] {\n const scrollable: Element[] = [];\n let current = el?.parentElement;\n while (current) {\n const style = getComputedStyle(current);\n const overflow = style.overflow + style.overflowY + style.overflowX;\n if (/(auto|scroll)/.test(overflow)) {\n scrollable.push(current);\n }\n current = current.parentElement;\n }\n return scrollable;\n}\n\n// Wait until element position and all scroll positions are settled\nasync function waitForScrollSettled(targetElement?: Element | null, timeoutMs = 1500, quietMs = 160) {\n const start = performance.now();\n \n // Monitor window scroll and all scrollable ancestors\n const scrollableElements = targetElement ? getScrollableAncestors(targetElement) : [];\n \n const getScrollPositions = () => {\n const positions: number[] = [\n window.scrollX || document.documentElement.scrollLeft || 0,\n window.scrollY || document.documentElement.scrollTop || 0,\n ];\n scrollableElements.forEach(el => {\n positions.push(el.scrollLeft, el.scrollTop);\n });\n return positions;\n };\n \n // Also monitor target element's position if provided\n const getTargetPos = () => {\n if (!targetElement) return { x: 0, y: 0 };\n const rect = targetElement.getBoundingClientRect();\n return { x: rect.left, y: rect.top };\n };\n \n let lastScrollPos = getScrollPositions();\n let lastTargetPos = getTargetPos();\n let lastChange = performance.now();\n \n return new Promise<void>((resolve) => {\n function tick(now: number) {\n const curScrollPos = getScrollPositions();\n const curTargetPos = getTargetPos();\n \n // Check if any scroll position or target position changed\n let changed = false;\n for (let i = 0; i < curScrollPos.length; i++) {\n if (curScrollPos[i] !== lastScrollPos[i]) {\n changed = true;\n break;\n }\n }\n if (!changed && targetElement) {\n if (curTargetPos.x !== lastTargetPos.x || curTargetPos.y !== lastTargetPos.y) {\n changed = true;\n }\n }\n \n if (changed) {\n lastScrollPos = curScrollPos;\n lastTargetPos = curTargetPos;\n lastChange = now;\n }\n \n if (now - lastChange >= quietMs || now - start >= timeoutMs) {\n resolve();\n return;\n }\n requestAnimationFrame(tick);\n }\n requestAnimationFrame(tick);\n });\n}\n\n// Inline SVG assets (use provided cursor images)\nconst DEFAULT_ARROW_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\" width=\"32px\" height=\"32px\"><path d=\"M 7.2304688 4.9863281 C 5.9215232 4.8276681 4.8053213 6.0177722 5.0234375 7.3066406 A 1.0001 1.0001 0 0 0 5.0253906 7.3085938 C 5.9996339 12.981516 7.7205826 18.716222 10 24.515625 A 1.0001 1.0001 0 0 0 10 24.517578 C 10.26886 25.199332 10.914322 25.653844 11.5625 25.738281 C 12.210678 25.822721 12.879213 25.592031 13.359375 25.09375 C 14.505165 23.921134 15.214424 22.695429 15.90625 21.498047 C 17.56565 23.217848 19.256845 24.909775 21.0625 26.484375 L 21.060547 26.480469 C 21.799528 27.12933 22.841378 27.205969 23.673828 26.78125 A 1.0001 1.0001 0 0 0 23.691406 26.771484 C 24.987999 26.077693 26.028685 25.052256 26.71875 23.746094 L 26.71875 23.744141 C 27.174557 22.900924 27.06954 21.854242 26.439453 21.119141 A 1.0001 1.0001 0 0 0 26.433594 21.113281 C 24.867416 19.313474 23.193611 17.633865 21.488281 15.986328 C 22.714141 15.237691 23.933938 14.51508 25.158203 13.414062 A 1.0001 1.0001 0 0 0 25.162109 13.410156 C 26.052979 12.600274 25.977319 11.169141 25.101562 10.404297 A 1.0001 1.0001 0 0 0 24.669922 10.042969 C 18.793373 7.4738953 12.973806 5.6931843 7.2324219 4.9882812 A 1.0001 1.0001 0 0 0 7.2304688 4.9863281 z M 6.9960938 6.9746094 C 12.468883 7.6474978 18.081513 9.3573116 23.796875 11.849609 A 1.0001 1.0001 0 0 0 23.867188 11.884766 C 23.901248 11.899796 23.884276 11.867987 23.816406 11.929688 C 22.403891 13.198979 20.999383 14.076858 19.457031 14.976562 A 1.0001 1.0001 0 0 0 19.275391 16.568359 C 21.250864 18.425305 23.134972 20.36916 24.919922 22.419922 C 25.009402 22.524309 25.024026 22.676488 24.960938 22.792969 A 1.0001 1.0001 0 0 0 24.955078 22.804688 C 24.446951 23.770198 23.730542 24.476149 22.755859 25 C 22.611605 25.06851 22.457885 25.047856 22.378906 24.978516 A 1.0001 1.0001 0 0 0 22.376953 24.976562 C 20.293628 23.159824 18.307991 21.233373 16.419922 19.216797 A 1.0001 1.0001 0 0 0 14.835938 19.378906 C 13.841812 21.004716 13.152668 22.447221 11.925781 23.701172 A 1.0001 1.0001 0 0 0 11.919922 23.707031 C 11.883822 23.744501 11.865156 23.739957 11.847656 23.742188 C 9.6161121 18.057657 7.9395914 12.46667 6.9960938 6.9746094 z\"/></svg>`;\nconst DEFAULT_POINTER_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\" width=\"32px\" height=\"32px\"><path d=\"M 22.5 3 C 19.480226 3 17 5.4802259 17 8.5 L 17 23.412109 L 14.871094 22.697266 C 13.308963 22.172461 11.892528 22 10.703125 22 C 9.5908429 22 8.5540295 22.197475 7.640625 22.65625 C 5.2906802 23.831199 3.9427678 26.197397 4.0019531 28.90625 C 4.0019531 28.90625 4.0019531 28.908203 4.0019531 28.908203 C 4.0019531 28.908203 4.0019531 28.910156 4.0019531 28.910156 C 4.0184171 29.660452 4.4596385 30.354695 5.1328125 30.6875 A 1.50015 1.50015 0 0 0 5.1367188 30.689453 C 5.1367188 30.689453 9.4097266 32.789754 11.599609 33.949219 C 12.445613 34.397848 13.696939 34.926046 15.210938 36.09375 C 16.724935 37.261454 18.423179 39.012543 19.826172 41.792969 C 21.023611 44.165544 23.672779 45.195669 26.144531 44.955078 A 1.50015 1.50015 0 0 0 26.146484 44.955078 C 31.427085 44.439215 32.081856 44.381732 35.59375 44.023438 C 37.044229 43.875625 38.276993 43.213524 39.111328 42.289062 C 39.945663 41.364602 40.422895 40.257718 40.798828 39.125 C 41.561218 36.826116 42.933037 33.169846 43.671875 30.599609 C 45.018525 25.913269 41.884024 21.194549 37.246094 19.953125 L 37.242188 19.951172 C 36.99827 19.885452 36.756736 19.832884 36.521484 19.789062 A 1.50015 1.50015 0 0 0 36.513672 19.787109 L 28 18.248047 L 28 8.5 C 28 5.4802259 25.519774 3 22.5 3 z M 22.5 6 C 23.898226 6 25 7.1017741 25 8.5 L 25 19.5 A 1.50015 1.50015 0 0 0 26.232422 20.976562 L 35.980469 22.740234 C 36.14895 22.771804 36.312663 22.808524 36.464844 22.849609 A 1.50015 1.50015 0 0 0 36.46875 22.849609 C 39.614436 23.689967 41.641993 26.803286 40.789062 29.771484 C 40.115901 32.113248 38.752735 35.768572 37.953125 38.179688 C 37.641059 39.119968 37.279727 39.837554 36.882812 40.277344 C 36.485898 40.717133 36.095584 40.956874 35.289062 41.039062 C 31.783676 41.396695 31.135884 41.452908 25.855469 41.96875 C 24.423221 42.108159 23.024467 41.472831 22.503906 40.441406 C 20.887905 37.238832 18.854971 35.116296 17.042969 33.71875 C 15.230967 32.321204 13.560902 31.594199 13.003906 31.298828 C 10.939171 30.205625 7.8041786 28.665144 7.1035156 28.320312 C 7.1954033 26.8809 7.6810328 25.989859 8.9824219 25.339844 A 1.50015 1.50015 0 0 0 8.9863281 25.337891 C 9.3949198 25.132713 9.9434071 25 10.703125 25 C 11.605722 25 12.680146 25.12582 13.916016 25.541016 L 18.021484 26.921875 A 1.50015 1.50015 0 0 0 20 25.5 L 20 8.5 C 20 7.1017741 21.101774 6 22.5 6 z\"/></svg>`;\n\nasync function loadCursorSvgs() {\n if (!cursorSvgCache.arrow) {\n try {\n cursorSvgCache.arrow = DEFAULT_ARROW_SVG;\n cursorSvgCache.pointer = DEFAULT_POINTER_SVG;\n } catch (e) {\n console.warn(\"Failed to set cursor SVGs\", e);\n }\n }\n return cursorSvgCache;\n}\n\nfunction CursorVisual({ arrowSvg, pointerSvg }: { arrowSvg?: string; pointerSvg?: string }) {\n return (\n <>\n {arrowSvg && (\n <div className=\"arrow\" dangerouslySetInnerHTML={{ __html: arrowSvg }} />\n )}\n {pointerSvg && (\n <div className=\"pointer\" dangerouslySetInnerHTML={{ __html: pointerSvg }} />\n )}\n </>\n );\n}\n\nasync function getOrCreateCursor(): Promise<HTMLDivElement> {\n const id = \"demo-fake-cursor\";\n let cursor = document.getElementById(id) as HTMLDivElement | null;\n const svgs = await loadCursorSvgs();\n\n // Inject CSS once to toggle arrow/pointer visibility\n if (!cursorStylesInjected) {\n const styleId = \"cursor-controller-styles\";\n if (!document.getElementById(styleId)) {\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = `\n .fake-cursor { pointer-events: none; opacity: 0; transition: opacity 0.2s ease; z-index: 2147483647; }\n .fake-cursor.visible { opacity: 1; }\n .fake-cursor .arrow { display: none; }\n .fake-cursor .pointer { display: none; }\n .fake-cursor.as-arrow .arrow { display: block; }\n .fake-cursor.as-arrow .pointer { display: none; }\n .fake-cursor.as-pointer .arrow { display: none; }\n .fake-cursor.as-pointer .pointer { display: block; }\n .fake-cursor.pressing .pointer svg path { filter: brightness(0.9); }\n `;\n document.head.appendChild(style);\n }\n cursorStylesInjected = true;\n }\n\n if (!cursor) {\n cursor = document.createElement(\"div\");\n cursor.id = id;\n cursor.className = \"fake-cursor as-arrow\";\n cursor.style.position = \"fixed\";\n cursor.style.left = \"20px\";\n cursor.style.top = \"20px\";\n document.body.appendChild(cursor);\n // mount React visuals\n cursorReactRoot = createRoot(cursor);\n cursorReactRoot.render(<CursorVisual arrowSvg={svgs.arrow} pointerSvg={svgs.pointer} />);\n } else {\n cursor.classList.add(\"as-arrow\");\n if (!cursorReactRoot) {\n cursorReactRoot = createRoot(cursor);\n cursorReactRoot.render(<CursorVisual arrowSvg={svgs.arrow} pointerSvg={svgs.pointer} />);\n }\n }\n return cursor;\n}\n\nfunction clamp(n: number, min: number, max: number) {\n return Math.max(min, Math.min(max, n));\n}\n\nfunction easeInOutCubic(t: number) {\n return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n}\n\n// Background color sampling and contrast\nfunction cssColorToRgba(css: string): { r: number; g: number; b: number; a: number } | null {\n if (!css) return null;\n const ctx = document.createElement(\"canvas\").getContext(\"2d\");\n if (!ctx) return null;\n ctx.fillStyle = \"#000\";\n ctx.fillStyle = css; // triggers parsing\n // computed value will be in rgb/rgba\n const parsed = ctx.fillStyle as string;\n const m = parsed.match(/rgba?\\(([^)]+)\\)/i);\n if (!m) return null;\n const parts = m[1].split(/\\s*,\\s*/).map(Number);\n const [r, g, b, a = 1] = parts;\n return { r, g, b, a };\n}\n\nfunction relativeLuminance({ r, g, b }: { r: number; g: number; b: number }) {\n const srgb = [r, g, b]\n .map((v) => v / 255)\n .map((v) => (v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4)));\n return 0.2126 * srgb[0] + 0.7152 * srgb[1] + 0.0722 * srgb[2];\n}\n\nfunction isDarkColor(css: string | null) {\n const rgba = css ? cssColorToRgba(css) : null;\n if (!rgba) return false;\n // Consider fully transparent as light (to prefer dark cursor)\n if (rgba.a === 0) return false;\n return relativeLuminance(rgba) < 0.5;\n}\n\nfunction getEffectiveBackgroundAtPoint(x: number, y: number): string | null {\n let el = document.elementFromPoint(x, y) as HTMLElement | null;\n const seen = new Set<HTMLElement>();\n while (el && !seen.has(el)) {\n seen.add(el);\n const cs = getComputedStyle(el);\n const bg = cs.backgroundColor;\n const rgba = cssColorToRgba(bg);\n if (rgba && rgba.a > 0) return bg;\n el = el.parentElement as HTMLElement | null;\n }\n const bodyBg = getComputedStyle(document.body).backgroundColor;\n return bodyBg || \"rgb(255,255,255)\";\n}\n\nfunction updateCursorColorAt(cursor: HTMLElement, x: number, y: number) {\n const bg = getEffectiveBackgroundAtPoint(x, y);\n const dark = isDarkColor(bg);\n const strokeColor = dark ? \"#ffffff\" : \"#000000\";\n\n // Update all path elements in the cursor SVGs\n const paths = cursor.querySelectorAll(\"svg path\");\n paths.forEach((path) => {\n (path as SVGPathElement).style.fill = \"white\";\n (path as SVGPathElement).style.stroke = strokeColor;\n (path as SVGPathElement).style.strokeWidth = \"1\";\n });\n\n // Add contrasting shadow for extra visibility\n cursor.style.filter = dark\n ? \"drop-shadow(0 1px 2px rgba(0,0,0,0.8))\"\n : \"drop-shadow(0 1px 2px rgba(255,255,255,0.9))\";\n}\n\nasync function animatePosition(\n el: HTMLElement,\n from: { x: number; y: number },\n to: { x: number; y: number },\n durationMs: number,\n easing: GuideOptions[\"easing\"] = \"ease-in-out\",\n path: GuideOptions[\"path\"] = \"curve\",\n curveStrength: number = 0.25,\n curveDirection: GuideOptions[\"curveDirection\"] = \"auto\",\n onFrame?: (p: { x: number; y: number; t: number; now: number }) => void\n) {\n // Keep the cursor visible for the entire duration of this animation\n keepCursorVisibleWhileMoving();\n ensureCursorVisible(el);\n\n const start = performance.now();\n const easeFn = easing === \"linear\" ? (t: number) => t : easeInOutCubic;\n\n // Precompute control point for a quadratic Bezier if using curve\n const useCurve = path !== \"straight\";\n let cp = { x: 0, y: 0 };\n if (useCurve) {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const dist = Math.hypot(dx, dy) || 1;\n const mx = (from.x + to.x) / 2;\n const my = (from.y + to.y) / 2;\n // Perpendicular normal (clockwise)\n let nx = -dy / dist;\n let ny = dx / dist;\n let sign = 1;\n if (curveDirection === \"left\") sign = -1;\n else if (curveDirection === \"right\") sign = 1;\n else {\n // auto: randomize direction for variety\n sign = Math.random() < 0.5 ? -1 : 1;\n }\n const bend = clamp(curveStrength, 0, 1) * dist;\n cp = { x: mx + sign * nx * bend, y: my + sign * ny * bend };\n }\n\n return new Promise<void>((resolve) => {\n function frame(now: number) {\n const t = clamp((now - start) / durationMs, 0, 1);\n const k = easeFn(t);\n let x: number, y: number;\n if (useCurve) {\n // Quadratic Bezier: B(t) = (1-t)^2 P0 + 2(1-t)t P1 + t^2 P2\n const u = 1 - k;\n x = u * u * from.x + 2 * u * k * cp.x + k * k * to.x;\n y = u * u * from.y + 2 * u * k * cp.y + k * k * to.y;\n } else {\n x = from.x + (to.x - from.x) * k;\n y = from.y + (to.y - from.y) * k;\n }\n // Add subtle wobble for realism (very small amplitude), taper to 0 near end\n const wobbleBase = 0.35;\n const wobbleAmp = wobbleBase * (1 - k);\n const nx = Math.sin(now * 0.02) * wobbleAmp;\n const ny = Math.cos(now * 0.018) * wobbleAmp;\n el.style.left = `${x + nx}px`;\n el.style.top = `${y + ny}px`;\n updateCursorColorAt(el, x + nx, y + ny);\n if (onFrame) onFrame({ x: x + nx, y: y + ny, t, now });\n if (t < 1) requestAnimationFrame(frame);\n else resolve();\n }\n requestAnimationFrame(frame);\n });\n}\n\nfunction getCenterPoint(el: Element) {\n const r = el.getBoundingClientRect();\n return { x: r.left + r.width / 2, y: r.top + r.height / 2 };\n}\n\nfunction applyOffset(p: { x: number; y: number }, offset?: { x?: number; y?: number }) {\n return { x: p.x + (offset?.x ?? 0), y: p.y + (offset?.y ?? 0) };\n}\n\nfunction dispatchMouseLike(\n target: Element,\n type: string,\n point: { x: number; y: number },\n extra?: any\n) {\n const common = {\n bubbles: true,\n cancelable: true,\n view: window,\n clientX: point.x,\n clientY: point.y,\n ...extra,\n };\n\n try {\n const isDown = type === \"pointerdown\" || type === \"mousedown\";\n const isUp = type === \"pointerup\" || type === \"mouseup\";\n const enriched = {\n button: 0,\n buttons: isDown ? 1 : 0,\n isPrimary: true,\n ...common,\n };\n if (\"PointerEvent\" in window) {\n // @ts-ignore - PointerEvent init differs slightly\n const ev = new PointerEvent(type, { pointerId: 1, pointerType: \"mouse\", ...enriched });\n target.dispatchEvent(ev);\n } else {\n const ev = new MouseEvent(type, enriched as MouseEventInit);\n target.dispatchEvent(ev);\n }\n } catch {\n const ev = new MouseEvent(type, common);\n target.dispatchEvent(ev);\n }\n}\n\nfunction isElement(obj: any): obj is Element {\n return obj && typeof obj === \"object\" && obj.nodeType === 1;\n}\n\nfunction resolveWithin(within?: Element | string | null): Element | Document {\n if (!within) return document;\n if (isElement(within)) return within;\n if (typeof within === \"string\") {\n const byId = document.getElementById(within);\n if (byId) return byId;\n const q = document.querySelector(within);\n if (q) return q as Element;\n }\n return document;\n}\n\nfunction resolveTarget(target: GuideTarget): { kind: \"element\" | \"position\"; element?: Element | null; point?: { x: number; y: number } } {\n if (isElement(target)) return { kind: \"element\", element: target };\n if (typeof target === \"string\") {\n const byId = document.getElementById(target);\n if (byId) return { kind: \"element\", element: byId };\n const q = document.querySelector(target);\n return { kind: q ? \"element\" : \"position\", element: q ?? null };\n }\n if (typeof target === \"object\" && \"position\" in target) {\n return { kind: \"position\", point: target.position };\n }\n if (typeof target === \"object\" && \"selector\" in target) {\n const scope = resolveWithin(target.within ?? null);\n const all = (scope as Element | Document).querySelectorAll(target.selector);\n const idx = Math.max(0, Math.min(all.length - 1, target.nth ?? 0));\n const el = all[idx] ?? null;\n return { kind: el ? \"element\" : \"position\", element: el };\n }\n return { kind: \"position\", point: { x: 0, y: 0 } };\n}\n\nfunction getAnchoredPoint(el: Element, anchor?: Anchor) {\n const r = el.getBoundingClientRect();\n if (!anchor || anchor === \"center\") return { x: r.left + r.width / 2, y: r.top + r.height / 2 };\n if (anchor === \"top-left\") return { x: r.left, y: r.top };\n if (anchor === \"bottom-right\") return { x: r.right, y: r.bottom };\n const ax = clamp(anchor.x, 0, 1);\n const ay = clamp(anchor.y, 0, 1);\n return { x: r.left + r.width * ax, y: r.top + r.height * ay };\n}\n\nfunction clampToViewport(p: { x: number; y: number }) {\n return { x: clamp(p.x, 0, window.innerWidth), y: clamp(p.y, 0, window.innerHeight) };\n}\n\n \n\nfunction CursorController() {\n useEffect(() => {\n (window as any).__cursorGuide = async (\n stepsOrTarget: GuideTarget | GuideStep[],\n options: GuideOptions = {}\n ): Promise<GuideRunResult> => {\n const steps: GuideStep[] = Array.isArray(stepsOrTarget)\n ? stepsOrTarget\n : [{ target: stepsOrTarget, action: options.action ?? \"none\", options }];\n\n const results: GuideStepResult[] = [];\n const cursor = await getOrCreateCursor();\n cursor.classList.add(\"visible\", \"as-arrow\");\n cursor.classList.remove(\"as-pointer\", \"pressing\");\n ensureCursorVisible(cursor);\n keepCursorVisibleWhileMoving();\n const curX = parseFloat(cursor.style.left || \"20\") || 20;\n const curY = parseFloat(cursor.style.top || \"20\") || 20;\n updateCursorColorAt(cursor, curX, curY);\n\n for (const s of steps) {\n const {\n durationMs = 800,\n easing = \"ease-in-out\",\n offset,\n highlight = true,\n path = \"curve\",\n curveStrength = 0.25,\n curveDirection = \"auto\",\n anchor,\n cursorHotspot,\n dragTo,\n } = s.options ?? {};\n\n const action: GuideAction = s.action ?? (s.options?.action ?? \"none\");\n const t0 = performance.now();\n\n const resolved = resolveTarget(s.target);\n let targetPoint: { x: number; y: number } | null = null;\n let targetElement: Element | null = null;\n if (resolved.kind === \"element\" && resolved.element) {\n targetElement = resolved.element;\n \n // Hide cursor during scroll to avoid confusion\n cursor.classList.remove(\"visible\");\n \n // Scroll the element into view\n targetElement.scrollIntoView({ behavior: \"smooth\", block: \"center\", inline: \"center\" });\n \n // Wait for ALL scrolling (window and containers) to settle\n await waitForScrollSettled(targetElement, 1500, 180);\n \n // Show cursor again after scroll is complete\n ensureCursorVisible(cursor);\n \n // Get target point AFTER scroll has settled\n targetPoint = getAnchoredPoint(targetElement, anchor);\n } else if (resolved.kind === \"position\" && resolved.point) {\n targetPoint = resolved.point;\n }\n if (!targetPoint) {\n results.push({ ok: false, action, targetKind: resolved.kind, durationMs: Math.round(performance.now() - t0), error: \"Target not found\" });\n continue;\n }\n\n // Get cursor's current position AFTER scroll has settled\n const from = {\n x: parseFloat(cursor.style.left || \"20\") || 20,\n y: parseFloat(cursor.style.top || \"20\") || 20,\n };\n const to = clampToViewport(applyOffset(targetPoint, offset));\n\n await animatePosition(cursor, from, to, durationMs, easing, path, curveStrength, curveDirection);\n\n // Small overshoot and settle\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const dist = Math.hypot(dx, dy) || 1;\n const ux = dx / dist;\n const uy = dy / dist;\n const overshoot = Math.min(6, Math.max(3, dist * 0.02));\n const over = { x: to.x + ux * overshoot, y: to.y + uy * overshoot };\n await animatePosition(cursor, to, over, Math.max(70, durationMs * 0.1), \"ease-out\", \"straight\", 0, \"right\");\n await animatePosition(cursor, over, to, 120, \"ease-out\", \"straight\", 0, \"left\");\n\n if (highlight) {\n (cursor as any).classList?.add(\"click\");\n setTimeout(() => (cursor as any).classList?.remove(\"click\"), 180);\n }\n\n let clickedId: string | null = null;\n try {\n if (action === \"click\") {\n cursor.classList.remove(\"as-arrow\");\n cursor.classList.add(\"as-pointer\", \"pressing\");\n const hotspot = { x: cursorHotspot?.x ?? 0, y: cursorHotspot?.y ?? 0 };\n // Convert viewport coords to page coords for elementFromPoint stability after scroll\n const pageP = { x: to.x + hotspot.x, y: to.y + hotspot.y };\n cursor.style.left = `${pageP.x}px`;\n cursor.style.top = `${pageP.y}px`;\n updateCursorColorAt(cursor, pageP.x, pageP.y);\n const clickTarget = targetElement ?? document.elementFromPoint(pageP.x, pageP.y) ?? document.body;\n dispatchMouseLike(clickTarget, \"pointerdown\", pageP);\n dispatchMouseLike(clickTarget, \"mousedown\", pageP);\n await new Promise((r) => setTimeout(r, 90));\n cursor.classList.remove(\"pressing\");\n dispatchMouseLike(clickTarget, \"mouseup\", pageP);\n dispatchMouseLike(clickTarget, \"click\", pageP);\n setTimeout(() => {\n cursor.classList.remove(\"as-pointer\");\n cursor.classList.add(\"as-arrow\");\n }, 140);\n if (clickTarget instanceof HTMLElement) clickTarget.focus?.();\n clickedId = (clickTarget as HTMLElement)?.id ?? null;\n } else if (action === \"drag\") {\n if (!dragTo) throw new Error(\"dragTo is required for action 'drag'\");\n const dest = resolveTarget(dragTo);\n let destPoint: { x: number; y: number } | null = null;\n if (dest.kind === \"element\" && dest.element) destPoint = getAnchoredPoint(dest.element, anchor);\n if (dest.kind === \"position\" && dest.point) destPoint = dest.point;\n if (!destPoint) throw new Error(\"dragTo target not found\");\n const dst = clampToViewport(applyOffset(destPoint, offset));\n\n const startP = { x: to.x, y: to.y };\n const startTarget = targetElement ?? document.elementFromPoint(startP.x, startP.y) ?? document.body;\n cursor.classList.remove(\"as-arrow\");\n cursor.classList.add(\"as-pointer\", \"pressing\");\n dispatchMouseLike(startTarget, \"pointerdown\", startP);\n dispatchMouseLike(startTarget, \"mousedown\", startP);\n\n await animatePosition(cursor, startP, dst, Math.max(200, durationMs), easing, path, curveStrength, curveDirection, ({ x, y }) => {\n const moveTarget = document.elementFromPoint(x, y) ?? document.body;\n const moveP = { x, y };\n dispatchMouseLike(moveTarget, \"pointermove\", moveP);\n dispatchMouseLike(moveTarget, \"mousemove\", moveP);\n });\n\n const endTarget = document.elementFromPoint(dst.x, dst.y) ?? document.body;\n cursor.classList.remove(\"pressing\");\n dispatchMouseLike(endTarget, \"pointerup\", dst);\n dispatchMouseLike(endTarget, \"mouseup\", dst);\n }\n\n results.push({ ok: true, action, targetKind: resolved.kind, durationMs: Math.round(performance.now() - t0), clickedElementId: clickedId });\n } catch (e: any) {\n results.push({ ok: false, action, targetKind: resolved.kind, durationMs: Math.round(performance.now() - t0), error: e?.message ?? String(e) });\n }\n }\n\n stopMovingAndMaybeHide(cursor, 2000);\n return { ok: results.every(r => r.ok), steps: results };\n };\n return () => {\n try {\n delete (window as any).__cursorGuide;\n } catch {\n (window as any).__cursorGuide = undefined;\n }\n };\n }, []);\n\n return null;\n}\n\nexport default CursorController;\n","import React, { useState, useRef, useCallback, useEffect, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport, lastAssistantMessageIsCompleteWithToolCalls } from \"ai\";\nimport { ChatHeader } from \"./hsafa-chat/ChatHeader\";\nimport { useFileUpload } from \"../hooks/useFileUploadHook\";\nimport { useAutoScroll } from \"../hooks/useAutoScroll\";\nimport { HsafaChatProps } from \"../types/chat\";\nimport { buildUserContent } from \"../utils/file-upload\";\nimport { MessageList } from \"./hsafa-chat\";\nimport { ChatInput } from \"./hsafa-chat\";\nimport { createChatStorage } from \"../utils/chat-storage\";\nimport { ChatHistoryModal } from \"./hsafa-chat/ChatHistoryModal\";\nimport { useHsafa } from \"../providers/HsafaProvider\";\nimport { FloatingChatButton } from \"./FloatingChatButton\";\nimport { getDomComponents, guideCursor, FillActiveInput } from \"./web-controler\";\nimport CursorController from \"./web-controler/CursorController\";\n\nexport function HsafaChat({\n agentId,\n theme,\n primaryColor,\n primaryColorDark,\n primaryColorLight,\n backgroundColor,\n borderColor,\n textColor,\n accentColor,\n baseUrl = '',\n initialMessages = [],\n onMessagesChange,\n defaultOpen = true,\n floatingButtonPosition = { bottom: 24, right: 24 },\n UIComponents = {},\n HsafaTools = {},\n}: HsafaChatProps & { \n baseUrl?: string;\n initialMessages?: any[];\n onMessagesChange?: (messages: any[]) => void;\n}) {\n const { dir: providerDir, theme: providerTheme, baseUrl: providerBaseUrl } = useHsafa();\n const effectiveTheme = (theme || providerTheme || 'dark');\n const effectiveBaseUrl = (baseUrl && baseUrl.length > 0) ? baseUrl : (providerBaseUrl || '');\n \n // Determine the primary color based on theme\n const effectivePrimaryColor = effectiveTheme === 'dark' \n ? (primaryColorDark || primaryColor || '#ffffff')\n : (primaryColorLight || primaryColor || '#000000');\n \n const themeColors = {\n primaryColor: effectivePrimaryColor,\n backgroundColor: backgroundColor || (effectiveTheme === 'dark' ? '#0B0B0F' : '#FFFFFF'),\n borderColor: borderColor || (effectiveTheme === 'dark' ? '#2A2C33' : '#E5E7EB'),\n textColor: textColor || (effectiveTheme === 'dark' ? '#EDEEF0' : '#111827'),\n accentColor: accentColor || (effectiveTheme === 'dark' ? '#17181C' : '#F9FAFB'),\n mutedTextColor: effectiveTheme === 'dark' ? '#9AA0A6' : '#6B7280',\n inputBackground: effectiveTheme === 'dark' ? '#17181C' : '#F3F4F6',\n cardBackground: effectiveTheme === 'dark' ? '#121318' : '#FFFFFF',\n hoverBackground: effectiveTheme === 'dark' ? '#1c1e25' : '#F3F4F6',\n };\n\n const resolvedColors = themeColors;\n const t = (key: string) => ({\n 'header.new': 'New',\n 'header.history': 'History',\n 'header.close': 'Close chat',\n 'input.placeholder': 'Ask your question...',\n 'input.attachFiles': 'Attach files',\n 'input.insertLink': 'Insert link',\n 'input.send': 'Send',\n 'input.stop': 'Stop',\n 'input.uploadingFiles': 'Uploading files...',\n 'input.previewImage': 'Preview image',\n 'input.removeFile': 'Remove file',\n 'messages.empty': 'Start by sending a message to the agent.',\n 'general.agent': 'Agent',\n 'editor.cancel': 'Cancel',\n 'editor.saveAndRegenerate': 'Save & Regenerate',\n 'editor.clickToEdit': 'Click to edit',\n } as Record<string, string>)[key] || key;\n\n // File upload hook\n const {\n attachments,\n uploading,\n fileInputRef,\n formatBytes,\n handleRemoveAttachment,\n handleFileSelection,\n clearAttachments,\n } = useFileUpload(effectiveBaseUrl);\n\n const [uploadError, setUploadError] = useState<string | null>(null);\n\n // Local state for input\n const [input, setInput] = useState<string>('');\n \n // Generate chat ID for the session\n const [chatId, setChatId] = useState(() => `chat_${Date.now()}_${Math.random().toString(36).slice(2)}`);\n \n // Configure transport to fetch from the correct endpoint\n const transport = useMemo(() => {\n return new DefaultChatTransport({\n api: `${effectiveBaseUrl}/api/run/${agentId}`,\n // Custom fetch to include chatId in request body\n fetch: async (input: RequestInfo | URL, init?: RequestInit) => {\n // Add chatId to the request body\n const body = init?.body ? JSON.parse(init.body as string) : {};\n const enhancedBody = {\n ...body,\n chatId,\n };\n \n return fetch(input, {\n ...init,\n body: JSON.stringify(enhancedBody),\n });\n },\n });\n }, [providerBaseUrl, baseUrl, agentId, chatId]);\n \n // Memoize callbacks to prevent infinite loops\n const onFinishCallback = useCallback((message: any) => {\n console.log('Message finished:', message);\n // Don't call onMessagesChange here as it causes infinite loops\n // The parent can track messages through other means if needed\n }, []);\n\n const onErrorCallback = useCallback((error: Error) => {\n console.error('Chat error:', error);\n }, []);\n\n // Built-in Web Controller Tools\n const builtInTools: Record<string, any> = useMemo(() => ({\n // Tool 1: Get DOM Components (read-only)\n getDomComponents: {\n tool: async ({ includeHidden, selector }: any) => {\n return await getDomComponents({ includeHidden, selector });\n },\n executeEachToken: false,\n },\n // Tool 2: Control Cursor\n controlCursor: {\n tool: async ({ target, action, anchor, durationMs, dragTo }: any) => {\n const res = await guideCursor(target, { action, anchor, durationMs, dragTo });\n // Normalize a friendly message for the agent, especially after clicks\n if (res && res.ok) {\n const last = Array.isArray(res.steps) && res.steps.length ? res.steps[res.steps.length - 1] : undefined;\n const clicked = last?.clickedElementId ? ` (clicked element id: ${last.clickedElementId})` : '';\n const act = action || last?.action || 'none';\n return {\n success: true,\n message: act === 'click' ? `Cursor moved and clicked successfully${clicked}` : act === 'drag' ? `Cursor dragged successfully` : `Cursor moved successfully`,\n details: res,\n };\n }\n return {\n success: false,\n message: 'Cursor action failed',\n details: res,\n };\n },\n executeEachToken: false,\n },\n // Tool 3: Fill Active Input (with streaming)\n fillActiveInput: {\n tool: async ({ value }: any) => {\n const res = await FillActiveInput(value);\n return {\n success: !!res?.ok,\n message: res?.ok ? 'Active input filled successfully' : (res?.errors?.[0] || 'Failed to fill active input'),\n details: res,\n };\n },\n executeEachToken: true, // Enable character-by-character streaming\n },\n // Frontend-only: Get From User (dynamic form). We declare a stub so streaming handler can detect it.\n getFromUser: {\n tool: async (_: any) => ({ ok: true }),\n executeEachToken: true,\n },\n }), []);\n\n // Merge built-in tools with user-provided HsafaTools\n const allTools: Record<string, any> = useMemo(() => ({\n ...builtInTools,\n ...HsafaTools, // User tools can override built-in tools if needed\n }), [builtInTools, HsafaTools]);\n\n // Ephemeral in-chat form rendering for get_from_user\n const formHostRef = useRef<Map<string, HTMLDivElement>>(new Map());\n const formStateRef = useRef<Map<string, { submitted?: boolean; skipped?: boolean; values?: Record<string, any> }>>(new Map());\n const cleanupAllForms = useCallback(() => {\n try {\n formHostRef.current.forEach((el) => { try { el.remove(); } catch {} });\n formHostRef.current.clear();\n formStateRef.current.clear();\n } catch {}\n }, []);\n const renderOrUpdateUserForm = useCallback((input: any, toolCallId: string) => {\n // Find the latest assistant message container to mount the form under\n // We avoid modifying the default tool-call UI by taking over rendering here\n let host = formHostRef.current.get(toolCallId);\n if (!host) {\n host = document.createElement('div');\n host.className = 'hsafa-inline-form';\n // Prefer to mount into the tool area placeholder when available\n const toolHost = document.querySelector(`[data-get-from-user-host=\"${toolCallId}\"]`) as HTMLElement | null;\n if (toolHost) {\n toolHost.innerHTML = '';\n toolHost.appendChild(host);\n } else {\n // Fallback to chat panel container\n const chatEl = document.querySelector('.chat-scroll-container');\n (chatEl || document.body).appendChild(host);\n }\n formHostRef.current.set(toolCallId, host);\n } else {\n // If host exists but not inside placeholder yet, try to relocate it\n const currentParent = host.parentElement;\n const toolHost = document.querySelector(`[data-get-from-user-host=\"${toolCallId}\"]`) as HTMLElement | null;\n if (toolHost && currentParent !== toolHost) {\n try { currentParent?.removeChild(host); } catch {}\n toolHost.innerHTML = '';\n toolHost.appendChild(host);\n }\n }\n\n // Build form from input incrementally\n const title = input?.title || 'Provide input';\n const description = input?.description || '';\n const submitLabel = input?.submitLabel || 'Submit';\n const skipLabel = input?.skipLabel || 'Skip';\n // Allow zero-field forms (e.g., Accept/Reject only)\n const fields = Array.isArray(input?.fields)\n ? input.fields\n : (input?.label || input?.placeholder)\n ? [{ id: 'value', label: input?.label || 'Value', type: 'text', placeholder: input?.placeholder || '' }]\n : [];\n\n const existingState = formStateRef.current.get(toolCallId) || { submitted: false, skipped: false, values: undefined };\n\n host.innerHTML = '';\n const form = document.createElement('form');\n form.style.margin = '12px 0';\n form.style.padding = '14px';\n form.style.border = '1px solid var(--hsafa-border, #2A2C33)';\n form.style.borderRadius = '12px';\n form.style.background = 'var(--hsafa-card, #121318)';\n form.style.color = 'var(--hsafa-text, #EDEEF0)';\n form.style.boxShadow = '0 6px 20px rgba(0,0,0,0.25)';\n\n const h = document.createElement('div');\n h.style.fontWeight = '600';\n h.style.marginBottom = '6px';\n h.textContent = title;\n form.appendChild(h);\n\n if (description) {\n const d = document.createElement('div');\n d.style.fontSize = '12px';\n d.style.opacity = '0.8';\n d.style.marginBottom = '10px';\n d.textContent = description;\n form.appendChild(d);\n }\n\n fields.forEach((f: any) => {\n const wrap = document.createElement('div');\n wrap.style.margin = '10px 0';\n if (f.label) {\n const lab = document.createElement('label');\n lab.style.display = 'block';\n lab.style.fontSize = '12px';\n lab.style.marginBottom = '6px';\n lab.style.opacity = '0.9';\n lab.textContent = f.label;\n wrap.appendChild(lab);\n }\n let inputEl: HTMLElement;\n const type = (f.type || 'text').toLowerCase();\n if (type === 'textarea') {\n const el = document.createElement('textarea');\n el.placeholder = f.placeholder || '';\n (el as any).value = f.value ?? '';\n el.style.width = '100%';\n el.style.minHeight = '72px';\n el.style.padding = '10px 12px';\n el.style.border = '1px solid var(--hsafa-border, #2A2C33)';\n el.style.borderRadius = '10px';\n el.style.background = 'var(--hsafa-input-bg, #17181C)';\n el.style.color = 'inherit';\n inputEl = el;\n } else if (type === 'select' && Array.isArray(f.options)) {\n const el = document.createElement('select');\n el.style.width = '100%';\n el.style.padding = '10px 12px';\n el.style.border = '1px solid var(--hsafa-border, #2A2C33)';\n el.style.borderRadius = '10px';\n el.style.background = 'var(--hsafa-input-bg, #17181C)';\n el.style.color = 'inherit';\n f.options.forEach((opt: any) => {\n const o = document.createElement('option');\n o.value = String(opt.value);\n o.text = String(opt.label ?? opt.value);\n el.appendChild(o);\n });\n (el as any).value = f.value ?? '';\n inputEl = el;\n } else if (type === 'checkbox') {\n const el = document.createElement('input');\n el.type = 'checkbox';\n (el as any).checked = !!f.value;\n el.style.transform = 'scale(1.1)';\n inputEl = el;\n } else {\n const el = document.createElement('input');\n el.type = type as any;\n el.placeholder = f.placeholder || '';\n (el as any).value = f.value ?? '';\n el.style.width = '100%';\n el.style.padding = '10px 12px';\n el.style.border = '1px solid var(--hsafa-border, #2A2C33)';\n el.style.borderRadius = '10px';\n el.style.background = 'var(--hsafa-input-bg, #17181C)';\n el.style.color = 'inherit';\n inputEl = el;\n }\n const fieldId = f.id || 'value';\n (inputEl as any).dataset.fieldId = fieldId;\n // Prefill from existing state values when present (hydrated from messages)\n const savedVal = existingState.values && Object.prototype.hasOwnProperty.call(existingState.values, fieldId)\n ? (existingState.values as any)[fieldId]\n : undefined;\n if (typeof savedVal !== 'undefined') {\n if ((inputEl as HTMLInputElement).type === 'checkbox') {\n (inputEl as HTMLInputElement).checked = !!savedVal;\n } else {\n (inputEl as HTMLInputElement).value = String(savedVal);\n }\n }\n if (existingState.submitted || existingState.skipped) {\n (inputEl as any).setAttribute('disabled', 'true');\n (inputEl as any).style.opacity = '0.7';\n }\n wrap.appendChild(inputEl);\n form.appendChild(wrap);\n });\n\n const trimmedSubmit = String(submitLabel || '').trim();\n const trimmedSkip = String(skipLabel || '').trim();\n const showActions = Boolean(trimmedSubmit || trimmedSkip);\n let submitBtn: HTMLButtonElement | null = null;\n let skipBtn: HTMLButtonElement | null = null;\n if (showActions) {\n const actions = document.createElement('div');\n actions.style.display = 'flex';\n actions.style.gap = '8px';\n actions.style.marginTop = '10px';\n submitBtn = document.createElement('button');\n submitBtn.type = 'submit';\n submitBtn.textContent = trimmedSubmit || 'Submit';\n submitBtn.style.padding = '6px 10px';\n submitBtn.style.borderRadius = '8px';\n submitBtn.style.background = 'var(--hsafa-button-bg, var(--hsafa-primary, #2563eb))';\n submitBtn.style.color = '#000000';\n skipBtn = document.createElement('button');\n skipBtn.type = 'button';\n skipBtn.textContent = trimmedSkip || 'Skip';\n skipBtn.style.padding = '6px 10px';\n skipBtn.style.borderRadius = '8px';\n skipBtn.style.background = 'transparent';\n skipBtn.style.border = '1px solid var(--hsafa-border, #2A2C33)';\n skipBtn.style.color = 'inherit';\n if (existingState.submitted) {\n submitBtn.textContent = `${trimmedSubmit || 'Submit'} ✓`;\n submitBtn.style.opacity = '0.8';\n submitBtn.disabled = true;\n }\n if (existingState.skipped) {\n skipBtn.textContent = `${trimmedSkip || 'Skip'} ✓`;\n skipBtn.style.opacity = '0.8';\n skipBtn.disabled = true;\n }\n actions.appendChild(submitBtn);\n actions.appendChild(skipBtn);\n form.appendChild(actions);\n }\n\n form.onsubmit = (e) => {\n e.preventDefault();\n const data: Record<string, any> = {};\n form.querySelectorAll('[data-field-id]').forEach((el) => {\n const id = (el as HTMLElement).dataset.fieldId || 'value';\n if ((el as HTMLInputElement).type === 'checkbox') {\n data[id] = (el as HTMLInputElement).checked;\n } else {\n data[id] = (el as HTMLInputElement).value ?? '';\n }\n });\n // Persist state and keep form visible\n formStateRef.current.set(toolCallId, { submitted: true, skipped: false, values: data });\n (chatApiRef.current as any).addToolResult({\n tool: 'getFromUser',\n toolCallId,\n output: { success: true, submitted: true, values: data }\n });\n // Disable inputs and show submitted badge\n form.querySelectorAll('[data-field-id]').forEach((el) => {\n (el as HTMLInputElement).disabled = true;\n (el as HTMLInputElement).style.opacity = '0.7';\n });\n if (submitBtn) {\n submitBtn.textContent = `${trimmedSubmit || 'Submit'} ✓`;\n submitBtn.style.opacity = '0.8';\n submitBtn.disabled = true;\n }\n if (skipBtn) {\n skipBtn.disabled = true;\n }\n };\n if (skipBtn) {\n skipBtn.onclick = () => {\n // Persist state and keep form visible\n formStateRef.current.set(toolCallId, { submitted: false, skipped: true, values: undefined });\n (chatApiRef.current as any).addToolResult({\n tool: 'getFromUser',\n toolCallId,\n output: { success: true, submitted: false, skipped: true }\n });\n // Disable inputs and show skipped badge\n form.querySelectorAll('[data-field-id]').forEach((el) => {\n (el as HTMLInputElement).disabled = true;\n (el as HTMLInputElement).style.opacity = '0.7';\n });\n if (skipBtn) {\n skipBtn.textContent = `${trimmedSkip || 'Skip'} ✓`;\n skipBtn.style.opacity = '0.8';\n skipBtn.disabled = true;\n }\n if (submitBtn) submitBtn.disabled = true;\n };\n }\n\n // Status row (always visible after submit/skip)\n if (existingState.submitted || existingState.skipped) {\n const status = document.createElement('div');\n status.style.marginTop = '10px';\n status.style.fontSize = '12px';\n status.style.display = 'flex';\n status.style.alignItems = 'center';\n status.style.gap = '8px';\n const badge = document.createElement('span');\n badge.style.display = 'inline-flex';\n badge.style.alignItems = 'center';\n badge.style.padding = '2px 8px';\n badge.style.borderRadius = '999px';\n badge.style.fontWeight = '600';\n badge.style.fontSize = '11px';\n if (existingState.submitted) {\n badge.style.background = 'rgba(16,185,129,0.15)';\n badge.style.color = '#10b981';\n badge.textContent = 'Submitted';\n } else {\n badge.style.background = 'rgba(234,179,8,0.15)';\n badge.style.color = '#eab308';\n badge.textContent = 'Skipped';\n }\n status.appendChild(badge);\n // if (existingState.values && Object.keys(existingState.values).length > 0) {\n // const sum = document.createElement('div');\n // sum.style.opacity = '0.85';\n // sum.textContent = Object.entries(existingState.values)\n // .map(([k, v]) => `${k}: ${String(v)}`)\n // .join(' · ');\n // status.appendChild(sum);\n // }\n form.appendChild(status);\n }\n\n host.appendChild(form);\n }, []);\n\n // Ref to chatApi to use inside callbacks created before chatApi is defined\n const chatApiRef = useRef<any>(null);\n\n // Helper to extract actual tool function (supports both function and object with tool property)\n const getToolFunction = useCallback((toolName: string) => {\n const toolConfig = allTools[toolName];\n if (!toolConfig) return null;\n \n // If it's an object with a tool property, extract the function\n if (typeof toolConfig === 'object' && 'tool' in toolConfig) {\n return toolConfig.tool;\n }\n \n // Otherwise, it's the function itself\n return typeof toolConfig === 'function' ? toolConfig : null;\n }, [allTools]);\n\n // useChat hook from Vercel AI SDK v5\n const chatApi = useChat({\n transport,\n onFinish: onFinishCallback,\n onError: onErrorCallback,\n experimental_throttle: 10,\n // ✅ Auto-resubmit after all tool results are available\n sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,\n async onToolCall({ toolCall }) {\n // Handle custom frontend tools\n const toolFn = getToolFunction(toolCall.toolName);\n // Intercept get_from_user: render form and suppress default tool UI/result\n if (toolCall.toolName === 'getFromUser' || toolCall.toolName === 'get_from_user') {\n try {\n renderOrUpdateUserForm(toolCall.input, toolCall.toolCallId);\n } catch (e) {\n console.error('get_from_user render error', e);\n }\n return;\n }\n if (!toolFn) return;\n\n try {\n const result = await toolFn(toolCall.input);\n // ✅ Include the tool name; do not await - avoids potential deadlocks\n (chatApi as any).addToolResult({\n tool: toolCall.toolName,\n toolCallId: toolCall.toolCallId,\n output: result,\n });\n } catch (err: any) {\n // ✅ Use proper error format\n (chatApi as any).addToolResult({\n tool: toolCall.toolName,\n toolCallId: toolCall.toolCallId,\n state: \"output-error\",\n errorText: err?.message || String(err),\n });\n }\n },\n });\n const { messages: chatMessages, sendMessage, status, stop, error: chatError } = chatApi;\n chatApiRef.current = chatApi;\n\n // Execute frontend tools on each token (for tools with executeEachToken: true)\n const lastProcessedInputRef = useRef<Map<string, string>>(new Map());\n \n useEffect(() => {\n // Process each message for streaming tool inputs\n chatMessages.forEach((message: any) => {\n if (message.role !== 'assistant') return;\n \n // Check each part for tool-call with streaming input\n message.parts?.forEach((part: any) => {\n if (!part.toolCallId) return;\n \n // Extract tool name from type field (format: \"tool-{toolName}\")\n let toolName = part.toolName;\n if (!toolName && part.type?.startsWith('tool-')) {\n toolName = part.type.replace(/^tool-/, '');\n }\n \n if (!toolName) return;\n \n const toolConfig = allTools[toolName];\n \n // Check if this tool has executeEachToken enabled\n if (toolConfig && typeof toolConfig === 'object' && toolConfig.executeEachToken && toolConfig.tool) {\n // Use part.input (for streaming) or part.args (for final)\n const toolInput = part.input || part.args || {};\n const currentInput = JSON.stringify(toolInput);\n const lastInput = lastProcessedInputRef.current.get(part.toolCallId);\n \n // Only execute if input has changed and is not empty\n if (currentInput !== lastInput && currentInput !== '{}') {\n lastProcessedInputRef.current.set(part.toolCallId, currentInput);\n \n try {\n // Special handling: get_from_user → build or update a live form UI\n if (toolName === 'getFromUser' || toolName === 'get_from_user') {\n renderOrUpdateUserForm(toolInput, part.toolCallId);\n } else {\n // Execute the tool with current partial input\n toolConfig.tool(toolInput);\n }\n } catch (err) {\n console.error(`Error executing streaming tool ${toolName}:`, err);\n }\n }\n }\n });\n });\n }, [chatMessages, allTools]);\n\n // Hydrate get_from_user form states from persisted messages (tool outputs) on load and whenever messages change\n useEffect(() => {\n try {\n const seenIds = new Set<string>();\n const pendingRenders: Array<{ input: any; toolCallId: string }> = [];\n chatMessages.forEach((message: any) => {\n if (message.role !== 'assistant') return;\n (message.parts || []).forEach((part: any) => {\n const toolName = part?.toolName || (typeof part?.type === 'string' && part.type.startsWith('tool-') ? String(part.type.replace(/^tool-/, '')) : undefined);\n if (toolName !== 'getFromUser' && toolName !== 'get_from_user') return;\n const toolCallId = part?.toolCallId || '';\n if (!toolCallId) return;\n seenIds.add(toolCallId);\n const out = part?.output;\n if (out && (out.submitted || out.skipped || out.values)) {\n const hydrated = {\n submitted: !!out.submitted,\n skipped: !!out.skipped,\n values: out.values || undefined,\n } as { submitted?: boolean; skipped?: boolean; values?: Record<string, any> };\n formStateRef.current.set(toolCallId, hydrated);\n }\n // Schedule a render/update into the in-message host\n const inVal = part?.input || part?.args || {};\n pendingRenders.push({ input: inVal, toolCallId });\n });\n });\n\n // Remove any stale hosts not present in messages\n formHostRef.current.forEach((_, key) => {\n if (!seenIds.has(key)) {\n const node = formHostRef.current.get(key);\n try { node?.remove(); } catch {}\n formHostRef.current.delete(key);\n formStateRef.current.delete(key);\n }\n });\n\n // Defer actual DOM mounting until after React paints tool hosts\n if (pendingRenders.length > 0) {\n const raf = requestAnimationFrame(() => {\n pendingRenders.forEach(({ input, toolCallId }) => {\n try { renderOrUpdateUserForm(input, toolCallId); } catch {}\n });\n });\n return () => cancelAnimationFrame(raf);\n }\n } catch {}\n }, [chatMessages, renderOrUpdateUserForm]);\n\n // Deduplicate progressive data-items and data-tool-input parts\n\n // Load initial messages if provided\n useEffect(() => {\n if (initialMessages && initialMessages.length > 0 && chatMessages.length === 0) {\n // Initial messages would need to be handled through a different mechanism in v5\n console.log('Initial messages:', initialMessages);\n }\n }, [initialMessages, chatMessages.length]);\n\n // Handle messages change callback with proper memoization to prevent infinite loops\n const onMessagesChangeRef = useRef(onMessagesChange);\n useEffect(() => {\n onMessagesChangeRef.current = onMessagesChange;\n }, [onMessagesChange]);\n\n const prevMessagesRef = useRef<any[]>([]);\n useEffect(() => {\n // Only call onMessagesChange when messages actually change (compare by length and last message ID)\n const messagesChanged = \n chatMessages.length !== prevMessagesRef.current.length ||\n (chatMessages.length > 0 && prevMessagesRef.current.length > 0 && \n chatMessages[chatMessages.length - 1]?.id !== prevMessagesRef.current[prevMessagesRef.current.length - 1]?.id);\n \n if (messagesChanged && onMessagesChangeRef.current) {\n prevMessagesRef.current = chatMessages;\n onMessagesChangeRef.current(chatMessages);\n }\n }, [chatMessages]);\n\n const isLoading = status === 'submitted' || status === 'streaming';\n\n // Hsafa provider integration and header/history state\n const { setStreamingState, setChatOpenState } = useHsafa();\n const [isOpen, setIsOpen] = useState<boolean>(() => {\n try {\n const tmp = createChatStorage(agentId);\n return tmp.loadShowChatPreference(Boolean(defaultOpen));\n } catch {\n return Boolean(defaultOpen);\n }\n });\n const [historyOpen, setHistoryOpen] = useState(false);\n const [historySearch, setHistorySearch] = useState(\"\");\n const [historyRefreshKey, setHistoryRefreshKey] = useState(0);\n const historyBtnRef = useRef<HTMLButtonElement>(null);\n const historyPopupRef = useRef<HTMLDivElement>(null);\n const [openReasoningIds, setOpenReasoningIds] = useState<Set<string>>(new Set());\n const [editingMessageId, setEditingMessageId] = useState<string | null>(null);\n const [editingText, setEditingText] = useState<string>('');\n const [editAttachments, setEditAttachments] = useState<any[]>([]);\n const [editUploading, setEditUploading] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const editTextareaRef = useRef<HTMLTextAreaElement>(null);\n const scrollRef = useAutoScroll<HTMLDivElement>(isLoading);\n\n // Local storage: create/save chats on first user message and updates\n const storage = useMemo(() => createChatStorage(agentId), [agentId]);\n const createdChatRef = useRef<boolean>(false);\n const restoredOnMountRef = useRef<boolean>(false);\n\n // On mount: restore last opened chat and its messages\n useEffect(() => {\n if (restoredOnMountRef.current) return;\n try {\n const savedId = storage.loadCurrentChatId();\n if (savedId) {\n createdChatRef.current = true;\n setChatId(savedId);\n const saved = storage.loadChat(savedId);\n const msgs = (saved && Array.isArray((saved as any).messages)) ? (saved as any).messages : [];\n try { (chatApi as any)?.setMessages?.(msgs); } catch {}\n }\n } catch {}\n restoredOnMountRef.current = true;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [storage]);\n useEffect(() => {\n if (chatMessages.length === 0) return;\n if (!createdChatRef.current) {\n const firstUser = chatMessages.find((m: any) => m.role === 'user');\n if (firstUser) {\n let titleSource = '';\n if (Array.isArray((firstUser as any).parts)) {\n const textPart = (firstUser as any).parts.find((p: any) => p && p.type === 'text');\n titleSource = textPart && typeof textPart.text === 'string' ? textPart.text : '';\n }\n const title = (titleSource || 'New chat').slice(0, 80);\n const now = Date.now();\n storage.upsertChatMeta({ id: chatId, title, createdAt: now, updatedAt: now });\n storage.saveChat({ id: chatId, messages: chatMessages as any, agentId } as any);\n storage.saveCurrentChatId(chatId);\n createdChatRef.current = true;\n }\n } else if (!isLoading) {\n const now = Date.now();\n storage.saveChat({ id: chatId, messages: chatMessages as any, agentId } as any);\n const metas = storage.loadChatsIndex();\n const found = metas.find((m) => m.id === chatId);\n if (found) storage.upsertChatMeta({ ...found, updatedAt: now });\n }\n }, [chatMessages, agentId, chatId, storage, isLoading]);\n\n // On fast streams, persist once after streaming finishes to capture the final assistant message\n const wasLoadingRef = useRef<boolean>(false);\n useEffect(() => {\n if (isLoading) {\n wasLoadingRef.current = true;\n return;\n }\n if (wasLoadingRef.current) {\n wasLoadingRef.current = false;\n try {\n const now = Date.now();\n storage.saveChat({ id: chatId, messages: chatMessages as any, agentId } as any);\n const metas = storage.loadChatsIndex();\n const found = metas.find((m) => m.id === chatId);\n if (found) storage.upsertChatMeta({ ...found, updatedAt: now });\n } catch {}\n }\n }, [isLoading, chatMessages, chatId, agentId, storage]);\n\n // Reflect streaming/open state via provider\n useEffect(() => {\n try { setStreamingState(chatId, isLoading); } catch {}\n return () => {\n // Cleanup: remove streaming state when component unmounts or chatId changes\n try { setStreamingState(chatId, false); } catch {}\n };\n }, [chatId, isLoading, setStreamingState]);\n\n useEffect(() => {\n try { setChatOpenState(chatId, isOpen); } catch {}\n return () => {\n // Cleanup: remove open state when component unmounts or chatId changes\n try { setChatOpenState(chatId, false); } catch {}\n };\n }, [chatId, isOpen, setChatOpenState]);\n\n // Send message handler\n const handleSendMessage = useCallback(async () => {\n const trimmedInput = input.trim();\n if (!trimmedInput && attachments.length === 0) return;\n if (isLoading) return;\n\n try {\n // Send message with proper format for Vercel AI SDK v5\n // FileUIPart uses 'url' field, convertToModelMessages will convert to 'data' for the model\n await sendMessage({\n text: trimmedInput,\n files: attachments.map(att => ({\n type: 'file' as const,\n url: att.url,\n mediaType: att.mimeType || 'application/octet-stream',\n ...(att.name ? { name: att.name } : {}),\n ...(att.size ? { size: att.size } : {}),\n })),\n });\n\n // Clear input and attachments\n setInput('');\n clearAttachments();\n setUploadError(null);\n } catch (error) {\n console.error('Failed to send message:', error);\n setUploadError('Failed to send message. Please try again.');\n }\n }, [input, attachments, isLoading, sendMessage, clearAttachments]);\n\n // Header actions handlers\n const handleNewChat = useCallback(() => {\n if (isLoading) return;\n cleanupAllForms();\n setInput('');\n clearAttachments();\n setUploadError(null);\n setEditingMessageId(null);\n setEditingText('');\n setEditAttachments([]);\n try { (chatApi as any)?.setMessages?.([]); } catch {}\n createdChatRef.current = false;\n const newId = `chat_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n setChatId(newId);\n try { storage.saveCurrentChatId(newId); } catch {}\n }, [isLoading, clearAttachments, storage, chatApi, cleanupAllForms]);\n\n const handleToggleHistory = useCallback(() => {\n setHistoryOpen(v => !v);\n }, []);\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n try { storage.saveShowChatPreference(false); } catch {}\n }, [storage]);\n\n\n // Handle file input change\n const onFileInputChange = useCallback(async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files) {\n await handleFileSelection(files, setUploadError);\n }\n // Reset input value to allow selecting the same file again\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n }, [handleFileSelection, fileInputRef]);\n\n // Auto-resize textarea effect for main input\n useEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n \n // Reset height to initial value first\n textarea.style.height = '24px';\n // Force reflow\n textarea.offsetHeight;\n // Then calculate proper height\n textarea.style.height = 'auto';\n const newHeight = Math.min(textarea.scrollHeight, 200); // max height of 200px\n textarea.style.height = `${newHeight}px`;\n }, [input]);\n\n // Auto-resize textarea effect for edit message\n React.useEffect(() => {\n const textarea = editTextareaRef.current;\n if (!textarea) return;\n \n // Reset height to initial value first\n textarea.style.height = 'auto';\n // Force reflow\n textarea.offsetHeight;\n // Then calculate proper height based on content\n const newHeight = Math.min(Math.max(textarea.scrollHeight, 48), 300); // min 48px, max 300px\n textarea.style.height = `${newHeight}px`;\n }, [editingText]);\n\n const toggleReasoning = (id: string) => {\n setOpenReasoningIds(prev => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const formatDuration = (ms: number): string => {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n const minutes = Math.floor(ms / 60000);\n const seconds = Math.round((ms % 60000) / 1000);\n return `${minutes}m ${seconds}s`;\n };\n\n const getToolStatus = (status?: string) => {\n const statusMap = {\n input_streaming: { color: '#eab308', text: 'Inputting' },\n running: { color: '#3b82f6', text: 'Running' },\n error: { color: '#ef4444', text: 'Error' },\n finished: { color: '#10b981', text: 'Called' }\n };\n return statusMap[status as keyof typeof statusMap] || statusMap.finished;\n };\n\n // Handle edit attachments\n const handleAddEditAttachments = useCallback(async (files: FileList) => {\n setEditUploading(true);\n try {\n const newAttachments = await Promise.all(\n Array.from(files).map(async (file) => {\n // Upload file to server\n const formData = new FormData();\n formData.append('file', file);\n \n const response = await fetch(`${effectiveBaseUrl}/api/upload`, {\n method: 'POST',\n body: formData,\n });\n \n if (!response.ok) {\n throw new Error(`Upload failed: ${response.statusText}`);\n }\n \n const data = await response.json();\n \n return {\n id: data.url || `${Date.now()}-${Math.random()}`,\n name: file.name,\n url: data.url,\n mimeType: file.type,\n size: file.size,\n };\n })\n );\n \n setEditAttachments(prev => [...prev, ...newAttachments]);\n } catch (error) {\n console.error('Failed to upload files:', error);\n setUploadError('Failed to upload files. Please try again.');\n } finally {\n setEditUploading(false);\n }\n }, [effectiveBaseUrl]);\n\n const handleRemoveEditAttachment = useCallback((id: string) => {\n setEditAttachments(prev => prev.filter(att => att.id !== id));\n }, []);\n\n const handleUserMessageClick = useCallback((id: string, text: string, attachments?: any[]) => {\n setEditingMessageId(id);\n setEditingText(text);\n setEditAttachments(attachments || []);\n }, []);\n\n const handleCancelEdit = useCallback(() => {\n setEditingMessageId(null);\n setEditingText('');\n setEditAttachments([]);\n }, []);\n\n const handleSaveEdit = useCallback(async (messageId: string, text: string) => {\n if (isLoading) return;\n \n try {\n // Find the message index\n const messageIndex = chatMessages.findIndex((m: any) => m.id === messageId);\n if (messageIndex === -1) return;\n\n // Create updated messages array (keep messages up to the edited one)\n const updatedMessages = chatMessages.slice(0, messageIndex);\n \n // Clear the current messages and set to the point before the edited message\n try { (chatApi as any)?.setMessages?.(updatedMessages); } catch {}\n \n // Send the edited message\n await sendMessage({\n text: text.trim(),\n files: editAttachments.map(att => ({\n type: 'file' as const,\n url: att.url,\n mediaType: att.mimeType || 'application/octet-stream',\n ...(att.name ? { name: att.name } : {}),\n ...(att.size ? { size: att.size } : {}),\n })),\n });\n\n // Reset edit state\n setEditingMessageId(null);\n setEditingText('');\n setEditAttachments([]);\n } catch (error) {\n console.error('Failed to save edit:', error);\n setUploadError('Failed to save message. Please try again.');\n }\n }, [isLoading, chatMessages, sendMessage, chatApi, editAttachments]);\n\n \n\n const panel = (\n <div\n style={{\n position: 'fixed',\n right: 0,\n top: 0,\n bottom: 0,\n width: \"420px\",\n display: 'flex',\n flexDirection: 'column',\n padding: '24px 16px',\n color: resolvedColors.textColor,\n gap: '16px',\n zIndex: 1000,\n transform: isOpen ? 'translateX(0)' : 'translateX(100%)',\n transition: 'transform 0.25s ease-out, width 0.2s ease-out'\n }}\n >\n <ChatHeader \n title={t('general.agent')}\n alwaysOpen={false}\n streaming={isLoading}\n dir={(providerDir || 'ltr') as any}\n resolvedColors={resolvedColors as any}\n onNew={handleNewChat}\n onToggleHistory={handleToggleHistory}\n onClose={handleClose}\n historyBtnRef={historyBtnRef}\n t={t as any}\n />\n\n {/* MessageList */}\n <div\n ref={scrollRef}\n className=\"chat-scroll-container\"\n style={{\n flex: '1',\n overflowY: 'auto',\n overflowX: 'hidden',\n padding: '16px 4px 16px 4px',\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n scrollBehavior: 'smooth',\n // Theme variables for inline forms and controls\n ['--hsafa-primary' as any]: (resolvedColors as any).primaryColor,\n ['--hsafa-border' as any]: (resolvedColors as any).borderColor,\n ['--hsafa-card' as any]: (resolvedColors as any).cardBackground,\n ['--hsafa-text' as any]: (resolvedColors as any).textColor,\n ['--hsafa-muted' as any]: (resolvedColors as any).mutedTextColor,\n ['--hsafa-bg' as any]: (resolvedColors as any).backgroundColor,\n ['--hsafa-hover' as any]: (resolvedColors as any).hoverBackground,\n ['--hsafa-input-bg' as any]: (resolvedColors as any).inputBackground,\n ['--hsafa-accent' as any]: (resolvedColors as any).accentColor,\n }}\n >\n {chatMessages.length === 0 ? (\n <div style={{ \n padding: '32px', \n textAlign: 'center', \n color: resolvedColors.mutedTextColor,\n fontSize: '14px' \n }}>\n {t('messages.empty')}\n </div>\n ) : (\n <MessageList\n chatMessages={chatMessages as any}\n isLoading={isLoading}\n openReasoningIds={openReasoningIds}\n toggleReasoning={(id) => setOpenReasoningIds(prev => { const n = new Set(prev); n.has(id) ? n.delete(id) : n.add(id); return n; })}\n resolvedColors={resolvedColors as any}\n t={t}\n onUserMessageClick={handleUserMessageClick}\n editingMessageId={editingMessageId}\n editingText={editingText}\n onEditingTextChange={setEditingText}\n onCancelEdit={handleCancelEdit}\n onSaveEdit={handleSaveEdit}\n editAttachments={editAttachments}\n onRemoveEditAttachment={handleRemoveEditAttachment}\n onAddEditAttachments={handleAddEditAttachments}\n editUploading={editUploading}\n UIComponents={UIComponents}\n />\n )}\n </div>\n\n {/* ChatInput */}\n <div style={{ position: 'sticky', bottom: '0', marginTop: 'auto', paddingBottom: '8px', }}>\n {uploadError && (\n <div style={{ padding: '8px 12px', marginBottom: '8px', backgroundColor: '#ef4444', color: '#fff', borderRadius: '8px', fontSize: '13px', display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <span>{uploadError}</span>\n <button onClick={() => setUploadError(null)} style={{ background: 'none', border: 'none', color: '#fff', cursor: 'pointer', padding: '2px' }}>×</button>\n </div>\n )}\n\n {chatError && (\n <div style={{ padding: '8px 12px', marginBottom: '8px', backgroundColor: '#ef4444', color: '#fff', borderRadius: '8px', fontSize: '13px', display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <span>An error occurred: {chatError.message || 'Please try again.'}</span>\n <button onClick={() => window.location.reload()} style={{ background: 'none', border: '1px solid #fff', color: '#fff', cursor: 'pointer', padding: '4px 8px', borderRadius: '4px', fontSize: '12px' }}>Refresh</button>\n </div>\n )}\n\n <ChatInput\n input={input}\n setInput={setInput}\n textareaRef={textareaRef}\n fileInputRef={fileInputRef}\n isLoading={isLoading}\n uploading={uploading}\n attachments={attachments as any}\n formatBytes={formatBytes}\n handleRemoveAttachment={handleRemoveAttachment}\n onFileInputChange={onFileInputChange}\n onSend={handleSendMessage}\n onStop={() => stop()}\n status={status}\n t={t}\n resolvedColors={resolvedColors as any}\n />\n </div>\n\n {/* History Modal */}\n <ChatHistoryModal\n historyOpen={historyOpen}\n historySearch={historySearch}\n currentChatId={chatId}\n refreshKey={historyRefreshKey}\n resolvedColors={resolvedColors as any}\n onClose={() => setHistoryOpen(false)}\n onSearchChange={setHistorySearch}\n onChatSelect={(id) => {\n setHistoryOpen(false);\n if (id && id !== chatId) {\n createdChatRef.current = true;\n cleanupAllForms();\n setChatId(id);\n try { storage.saveCurrentChatId(id); } catch {}\n // Load stored messages for the selected chat\n try {\n const saved = storage.loadChat(id);\n const msgs = (saved && Array.isArray((saved as any).messages)) ? (saved as any).messages : [];\n try { (chatApi as any)?.setMessages?.(msgs); } catch {}\n } catch {}\n }\n }}\n onChatDelete={(id) => {\n try {\n storage.deleteChat(id);\n setHistoryRefreshKey((v) => v + 1);\n if (id === chatId) {\n handleNewChat();\n }\n } catch {}\n }}\n loadChatsIndex={() => storage.loadChatsIndex()}\n historyPopupRef={historyPopupRef}\n />\n\n {/* Animations */}\n <style>\n {`\n @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }\n @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }\n `}\n </style>\n </div>\n );\n\n if (typeof document !== 'undefined' && document.body) {\n return (\n <>\n <CursorController />\n {createPortal(panel, document.body)}\n <FloatingChatButton\n show={!isOpen}\n onClick={() => { setIsOpen(true); try { storage.saveShowChatPreference(true); } catch {} }}\n resolvedColors={resolvedColors as any}\n floatingButtonPosition={floatingButtonPosition}\n />\n </>\n );\n }\n\n return panel;\n}\n","// Theme color schemes\nexport const themeColors = {\n dark: {\n primaryColor: '#4D78FF',\n backgroundColor: '#0B0B0F',\n borderColor: '#2A2C33',\n textColor: '#EDEEF0',\n accentColor: '#17181C',\n mutedTextColor: '#9AA0A6',\n inputBackground: '#17181C',\n cardBackground: '#121318',\n hoverBackground: '#1c1e25',\n },\n light: {\n primaryColor: '#2563EB',\n backgroundColor: '#FFFFFF',\n borderColor: '#E5E7EB',\n textColor: '#111827',\n accentColor: '#F9FAFB',\n mutedTextColor: '#6B7280',\n inputBackground: '#F9FAFB',\n cardBackground: '#F3F4F6',\n hoverBackground: '#F3F4F6',\n }\n};\n\nexport type ThemeColors = typeof themeColors.dark;\n\nexport interface ThemeProps {\n theme?: 'light' | 'dark';\n primaryColor?: string;\n backgroundColor?: string;\n borderColor?: string;\n textColor?: string;\n accentColor?: string;\n}\n\nexport function resolveThemeColors(\n theme: 'light' | 'dark',\n overrides: Omit<ThemeProps, 'theme'> = {}\n): ThemeColors {\n const themeColorScheme = themeColors[theme];\n return {\n primaryColor: overrides.primaryColor || themeColorScheme.primaryColor,\n backgroundColor: overrides.backgroundColor || themeColorScheme.backgroundColor,\n borderColor: overrides.borderColor || themeColorScheme.borderColor,\n textColor: overrides.textColor || themeColorScheme.textColor,\n accentColor: overrides.accentColor || themeColorScheme.accentColor,\n mutedTextColor: themeColorScheme.mutedTextColor,\n inputBackground: themeColorScheme.inputBackground,\n cardBackground: themeColorScheme.cardBackground,\n hoverBackground: themeColorScheme.hoverBackground,\n };\n}\n\nexport function createContainerStyles(\n resolvedColors: ThemeColors,\n height: string,\n dir: string\n) {\n return {\n backgroundColor: resolvedColors.backgroundColor,\n color: resolvedColors.textColor,\n height,\n display: 'flex',\n width: '100%',\n fontFamily: 'Rubik, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif'\n };\n}\n\nexport function createChatPanelStyles(width: number | string, maxWidth: number | string) {\n return {\n width: typeof width === 'number' ? `${width}px` : width,\n maxWidth: typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth,\n display: 'flex',\n flexDirection: 'column' as const,\n transition: 'all 0.3s ease-out',\n overflow: 'hidden'\n };\n}\n\nexport function createFloatingButtonStyles(\n floatingButtonPosition: {\n bottom?: number | string;\n top?: number | string;\n left?: number | string;\n right?: number | string;\n }\n) {\n return {\n position: 'fixed' as const,\n bottom: typeof floatingButtonPosition.bottom === 'number' ? `${floatingButtonPosition.bottom}px` : floatingButtonPosition.bottom,\n right: floatingButtonPosition.right ? (typeof floatingButtonPosition.right === 'number' ? `${floatingButtonPosition.right}px` : floatingButtonPosition.right) : undefined,\n top: floatingButtonPosition.top ? (typeof floatingButtonPosition.top === 'number' ? `${floatingButtonPosition.top}px` : floatingButtonPosition.top) : undefined,\n left: floatingButtonPosition.left ? (typeof floatingButtonPosition.left === 'number' ? `${floatingButtonPosition.left}px` : floatingButtonPosition.left) : undefined,\n zIndex: 1000\n };\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { useHsafa } from \"../providers/HsafaProvider\";\nimport { ThemeColors, themeColors } from \"../utils/chat-theme\";\n\nexport interface ContentContainerProps {\n children: React.ReactNode;\n theme?: \"dark\" | \"light\";\n primaryColor?: string;\n backgroundColor?: string;\n borderColor?: string;\n textColor?: string;\n mutedTextColor?: string;\n enableBorderAnimation?: boolean;\n borderRadius?: number | string;\n enableContentBorder?: boolean;\n className?: string;\n enableMargin?: boolean; // Enable/disable margin when chat is open\n chatWidth?: number | string; // Width of the chat panel (default: 420)\n dir?: \"ltr\" | \"rtl\"; // Text direction for margin side\n}\n\n/**\n * ContentContainer component that wraps your content and applies animations\n * based on HsafaChat state (streaming and open state).\n *\n * Features:\n * - Detects if any chat under HsafaProvider is streaming and applies border animation\n * - Detects if any HsafaChat is open and applies radius, border, and margin with animation\n * - Automatically adjusts margin based on chat width and direction (RTL/LTR)\n *\n * @example\n * ```tsx\n * // Basic usage\n * <HsafaProvider baseUrl=\"http://localhost:3000\">\n * <ContentContainer theme=\"dark\" enableBorderAnimation>\n * <YourApp />\n * </ContentContainer>\n * <HsafaChat agentId=\"agent-1\" width={450} />\n * </HsafaProvider>\n *\n * // With custom chat width and RTL support\n * <HsafaProvider baseUrl=\"http://localhost:3000\">\n * <ContentContainer \n * theme=\"dark\" \n * chatWidth={450}\n * dir=\"rtl\"\n * enableMargin={true}\n * >\n * <YourApp />\n * </ContentContainer>\n * <HsafaChat agentId=\"agent-1\" width={450} dir=\"rtl\" />\n * </HsafaProvider>\n *\n * // Disable margin (content stays full width)\n * <HsafaProvider baseUrl=\"http://localhost:3000\">\n * <ContentContainer enableMargin={false}>\n * <YourApp />\n * </ContentContainer>\n * <HsafaChat agentId=\"agent-1\" />\n * </HsafaProvider>\n * ```\n */\nexport function ContentContainer({\n children,\n theme = \"dark\",\n primaryColor,\n backgroundColor,\n borderColor,\n textColor,\n mutedTextColor,\n enableBorderAnimation = true,\n borderRadius = 16,\n enableContentBorder = true,\n className = \"\",\n enableMargin = true,\n chatWidth = 420,\n dir = \"ltr\",\n}: ContentContainerProps) {\n const { isAnyStreaming, isAnyChatOpen, dir: providerDir, theme: providerTheme } = useHsafa();\n // Use provider defaults if props are not explicitly provided\n const effectiveDir = (dir ?? providerDir) || 'ltr';\n const effectiveTheme = (theme ?? providerTheme) || 'dark';\n const componentId = useRef(\n `content-container-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\n );\n \n // Track if this is the initial mount to prevent transition animation on load\n const [isMounted, setIsMounted] = useState(false);\n useEffect(() => {\n // Defer setting mounted to next frame to allow chat to report its state\n const timeout = setTimeout(() => setIsMounted(true), 50);\n return () => clearTimeout(timeout);\n }, []);\n\n // Theme resolution\n const themeColorScheme = themeColors[effectiveTheme as 'dark' | 'light'];\n const resolvedColors: ThemeColors = {\n primaryColor: primaryColor || themeColorScheme.primaryColor,\n backgroundColor: backgroundColor || themeColorScheme.backgroundColor,\n borderColor: borderColor || themeColorScheme.borderColor,\n textColor: textColor || themeColorScheme.textColor,\n accentColor: themeColorScheme.accentColor,\n mutedTextColor: mutedTextColor || themeColorScheme.mutedTextColor,\n inputBackground: themeColorScheme.inputBackground,\n cardBackground: themeColorScheme.cardBackground,\n hoverBackground: themeColorScheme.hoverBackground,\n };\n\n const contentBorderRadius =\n typeof borderRadius === \"number\" ? `${borderRadius}px` : borderRadius;\n\n // Calculate margin and width based on chat width and direction\n const chatWidthPx = typeof chatWidth === \"number\" ? `${chatWidth}px` : chatWidth;\n const marginStyle = enableMargin && isAnyChatOpen\n ? effectiveDir === \"rtl\"\n ? { marginLeft: chatWidthPx }\n : { marginRight: chatWidthPx }\n : {};\n \n const containerWidth = enableMargin && isAnyChatOpen \n ? `calc(100% - ${chatWidthPx})` \n : \"100%\";\n\n return (\n <>\n <div\n className={className}\n style={{\n width: containerWidth,\n height: \"100%\",\n transition: isMounted ? \"all 0.2s ease-out\" : \"none\",\n padding: isAnyChatOpen && enableContentBorder ? \"16px\" : \"0\",\n ...marginStyle,\n }}\n >\n <div\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n transition: isMounted ? 'all 0.2s ease-out' : 'none',\n borderRadius: isAnyChatOpen ? contentBorderRadius : '0',\n border: isAnyChatOpen && isAnyStreaming && enableBorderAnimation ? 'none' : isAnyChatOpen ? `1px solid ${resolvedColors.borderColor}` : 'none',\n padding: isAnyChatOpen && isAnyStreaming && enableBorderAnimation ? '1.5px' : '0',\n background: isAnyChatOpen && isAnyStreaming && enableBorderAnimation ?\n `linear-gradient(120deg, ${resolvedColors.primaryColor}dd 0%, ${resolvedColors.primaryColor}88 25%, ${resolvedColors.primaryColor}00 50%, ${resolvedColors.primaryColor}88 75%, ${resolvedColors.primaryColor}dd 100%)` :\n 'transparent',\n backgroundSize: isAnyChatOpen && isAnyStreaming && enableBorderAnimation ? '300% 300%' : 'auto',\n animation: isAnyChatOpen && isAnyStreaming && enableBorderAnimation ? `${componentId.current}-border-flow 3s ease-in-out infinite` : 'none',\n filter: isAnyChatOpen && isAnyStreaming && enableBorderAnimation ? `drop-shadow(0 0 10px ${resolvedColors.primaryColor}40)` : 'none'\n }}\n >\n <div\n className=\"hsafa-content-container\"\n style={{\n width: '100%',\n height: '100%',\n borderRadius: isAnyChatOpen && enableContentBorder ? contentBorderRadius : '0',\n backgroundColor: isAnyChatOpen && enableContentBorder ? resolvedColors.backgroundColor : 'transparent',\n overflow: 'auto',\n position: 'relative',\n isolation: 'isolate',\n contain: 'layout style paint',\n transform: 'translateZ(0)',\n scrollbarWidth: 'thin',\n scrollbarColor: `${resolvedColors.mutedTextColor}40 transparent`\n }}\n >\n {children}\n </div>\n </div>\n </div>\n <style>\n {`\n @keyframes ${componentId.current}-border-flow {\n 0% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n }\n `}\n </style>{\" \"}\n </>\n );\n}\n","/**\n * Component Registry for custom UI components\n * Allows users to register their own React components to be rendered in chat responses\n */\n\nimport { ComponentType } from 'react';\n\nexport interface UIComponentProps {\n props: any;\n resolvedColors?: any;\n}\n\ntype ComponentMap = Map<string, ComponentType<UIComponentProps>>;\n\nclass ComponentRegistry {\n private components: ComponentMap = new Map();\n\n /**\n * Register a custom UI component\n * @param name - The component name (should match the 'component' field from the agent response)\n * @param component - The React component to render\n */\n register(name: string, component: ComponentType<UIComponentProps>) {\n this.components.set(name, component);\n }\n\n /**\n * Unregister a component\n * @param name - The component name to remove\n */\n unregister(name: string) {\n this.components.delete(name);\n }\n\n /**\n * Get a registered component\n * @param name - The component name\n * @returns The component or undefined if not found\n */\n get(name: string): ComponentType<UIComponentProps> | undefined {\n return this.components.get(name);\n }\n\n /**\n * Check if a component is registered\n * @param name - The component name\n */\n has(name: string): boolean {\n return this.components.has(name);\n }\n\n /**\n * Clear all registered components\n */\n clear() {\n this.components.clear();\n }\n\n /**\n * Get all registered component names\n */\n getRegisteredNames(): string[] {\n return Array.from(this.components.keys());\n }\n}\n\n// Global singleton instance\nconst registry = new ComponentRegistry();\n\nexport { registry as componentRegistry };\n\n"]}
|