@hsafa/ui-sdk 5.5.8 → 5.5.9

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.
@@ -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/providers/HsafaProvider.tsx","../src/hooks/useFileUploadHook.ts","../src/components/hsafa-chat/utils/transport.ts","../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/hsafa-chat/utils/builtInTools.ts","../src/components/XMarkdownRenderer.tsx","../src/components/hsafa-chat/utils/builtInUI.tsx","../src/components/hsafa-chat/utils/renderUserForm.ts","../src/components/hsafa-chat/hooks/useStreamingToolInput.ts","../src/hooks/useHsafaAgent.ts","../src/utils/chat-storage.ts","../src/hooks/useChatStorage.ts","../src/hooks/useMessageEditor.ts","../src/hooks/useHsafaActiveChatId.ts","../src/hooks/useChatArtifact.ts","../src/hooks/useChatArtifactVersioning.ts","../src/components/IconWrapper.tsx","../src/components/IconButton.tsx","../src/components/hsafa-chat/ChatHeader.tsx","../src/components/hsafa-chat/UIErrorBoundary.tsx","../src/components/hsafa-chat/AssistantMassage.tsx","../src/utils/file.ts","../src/components/AttachmentItem.tsx","../src/components/AttachmentDisplay.tsx","../src/components/hsafa-chat/MessageList.tsx","../src/components/hsafa-chat/ChatInput.tsx","../src/components/hsafa-chat/PresetPrompts.tsx","../src/utils/time.ts","../src/components/hsafa-chat/ChatHistoryModal.tsx","../src/components/hsafa-chat/ConfirmEditModal.tsx","../src/components/HsafaChat.tsx","../src/utils/chat-theme.ts","../src/components/ContentContainer.tsx","../src/utils/opfs.ts","../src/utils/artifact-store.ts","../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","HsafaContext","createContext","HsafaProvider","dir","theme","initialTools","initialUIComponents","actions","setActions","useState","components","setComponents","tools","setTools","uiComponents","setUIComponents","streamingStates","setStreamingStates","chatOpenStates","setChatOpenStates","currentChatId","setCurrentChatId","registerAction","useCallback","name","handler","prev","next","existing","unregisterAction","registerComponent","component","unregisterComponent","registerTool","tool","unregisterTool","registerUIComponent","unregisterUIComponent","setStreamingState","chatId","isStreaming","setChatOpenState","isOpen","isAnyStreaming","useMemo","state","isAnyChatOpen","value","useHsafa","ctx","useContext","MAX_UPLOAD_SIZE","useFileUpload","providerBaseUrl","effectiveBaseUrl","attachments","setAttachments","uploading","setUploading","fileInputRef","formatBytes","bytes","units","exponent","uploadAttachment","file","formData","response","text","data","handleRemoveAttachment","id","att","handleFileSelection","fileList","setError","files","uploaded","attachment","err","buildUserContent","parts","t","mt","clearAttachments","createHsafaTransport","agentId","templateParams","DefaultChatTransport","input","init","reqInit","body","mergedParams","enhancedBody","isVisible","style","getElementLabel","label","parentLabel","clone","getElementText","getElementValue","type","opt","getUniqueSelector","current","selector","classes","c","parent","siblings","child","index","getDomComponents","options","includeHidden","what","limit","contentContainer","searchScope","selectors","visible","importance","total","maxItems","truncated","limited","error","guideCursor","target","cursorGuide","isHTMLElement","n","dispatch","setTextLike","setter","setCheckbox","setSelectSingle","i","o","setSelectMultiple","values","setVals","coerceDate","v","setFiles","list","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","start","scrollableElements","getScrollPositions","positions","getTargetPos","rect","lastScrollPos","lastTargetPos","lastChange","resolve","tick","now","curScrollPos","curTargetPos","changed","DEFAULT_ARROW_SVG","DEFAULT_POINTER_SVG","loadCursorSvgs","CursorVisual","arrowSvg","pointerSvg","Fragment","getOrCreateCursor","svgs","styleId","createRoot","clamp","min","max","easeInOutCubic","cssColorToRgba","css","m","r","g","relativeLuminance","srgb","isDarkColor","rgba","getEffectiveBackgroundAtPoint","x","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","k","u","wobbleAmp","applyOffset","p","offset","dispatchMouseLike","point","extra","common","isDown","isUp","enriched","ev","isElement","obj","resolveWithin","within","byId","q","resolveTarget","all","idx","getAnchoredPoint","anchor","ax","ay","clampToViewport","CursorController","stepsOrTarget","steps","results","curX","curY","s","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","createBuiltInTools","res","last","clicked","act","_","XMarkdownRenderer","content","streaming","XMarkdown","PlainText","createBuiltInUI","renderOrUpdateUserForm","toolCallId","hosts","states","addToolResult","colors","currentParent","toolHost","title","description","submitLabel","skipLabel","fields","existingState","form","h","wrap","lab","inputEl","fieldId","savedVal","trimmedSubmit","trimmedSkip","showActions","submitBtn","skipBtn","status","badge","isRecord","useStreamingToolInput","chatMessages","allTools","lastProcessedInputRef","lastProcessedStateRef","toolCallCounterRef","allToolsRef","renderOrUpdateUserFormRef","message","part","toolName","partType","toolConfig","lastState","toolInput","tc","currentInput","lastInput","newCount","useHsafaAgent","config","configBaseUrl","customTools","customUIComponents","onStart","onFinish","onError","initialMessages","onMessagesChange","controlledChatId","onChatIdChange","setInput","internalChatId","setInternalChatId","setChatId","newChatId","transport","onFinishCallback","payload","assistantMessageId","onErrorCallback","builtInTools","builtInUI","allUI","formHostRef","formStateRef","cleanupAllForms","chatApiRef","pendingUIToolsRef","handleUIError","handleUISuccess","getToolFunction","chatApi","useChat","lastAssistantMessageIsCompleteWithToolCalls","toolCall","toolFn","isUiTool","toolNameIsUIComponent","result","sendMessage","stop","chatError","seenIds","pendingRenders","out","hydrated","inVal","key","node","raf","isLoading","notifyMessagesChange","handleSendMessage","messageText","messageFiles","trimmedInput","userMessage","handleNewChat","newId","handleSetMessages","messages","createChatStorage","LS_PREFIX","chatsIndexKey","chatKey","currentChatKey","showChatKey","loadChatsIndex","raw","saveChatsIndex","loadChat","saveChat","upsertChatMeta","meta","deleteChatMeta","deleteChatData","defaultValue","savedShow","useChatStorage","autoSave","autoRestore","storage","chatList","setChatList","currentChatMeta","setCurrentChatMeta","createdChatRef","restoredOnMountRef","refreshChatList","chats","found","firstUser","titleSource","textPart","wasLoadingRef","chat","saveCurrentChat","deleteChat","switchToChat","setMessages","saved","msgs","createNewChat","onNewChat","searchChats","query","lowerQuery","useMessageEditor","editingMessageId","setEditingMessageId","editingText","setEditingText","editAttachments","setEditAttachments","editUploading","setEditUploading","startEdit","messageId","cancelEdit","saveEdit","messageIndex","updatedMessages","isEditing","addEditAttachments","uploadPromises","newAttachments","removeEditAttachment","safeLoadChatIdFromStorage","useHsafaActiveChatId","prefer","storageChatId","setStorageChatId","storageReady","setStorageReady","ctxId","preferredId","preferredSource","useChatArtifact","initial","store","autoLoad","saveDebounceMs","active","resolvedChatId","setValue","setStatus","hydratedRef","lastChatIdRef","saveTimerRef","pendingSavePromiseRef","cancelPendingSave","doSave","flushSave","reload","loaded","cancelled","getAssistantMessageIdFromPayload","getChatIdFromPayload","getAssistantMessageIds","ids","useChatArtifactVersioning","valueRef","prevMessagesRef","cbChatId","wasTruncated","assistantIds","version","IconWrapper","IconComponent","React","IconButton","icon","ariaLabel","ChatHeader","alwaysOpen","onNew","onToggleHistory","onClose","historyBtnRef","Plus","History","ChevronRight","UIErrorBoundary","Component","onSuccess","errorInfo","componentName","getToolStatus","statusMap","parseMCPToolName","fullToolName","mcpPattern","match","originalToolName","formatToolName","char","AssistantMassage","openReasoningIds","toggleReasoning","HsafaUI","onUIError","onUISuccess","groups","currentReasonings","reasoningStartDate","reasoningEndDate","reasoningCompleted","it","isDynamicTool","isPrefixedTool","derivedToolName","itemId","isCompleted","hasText","handleClick","i2","isStreamingText","color","isRunning","UIByToolName","parsedTool","AttachmentItem","mode","onRemove","maxWidth","isImage","isEditable","isLink","containerStyle","fileIcon","File","Eye","X","Download","AttachmentDisplay","MessageList","onUserMessageClick","editableMessageIcon","messageParts","messageAttachments","imgUrl","Pencil","ChatInput","textareaRef","onFileInputChange","onSend","onStop","canStop","hasMessages","PresetPrompts","prompts","onSelect","expandedId","setExpandedId","preset","isExpanded","isLongPrompt","truncatedPrompt","timeAgo","ts","diff","d","w","months","ChatHistoryModal","historyOpen","historySearch","refreshKey","onSearchChange","onChatSelect","onChatDelete","historyPopupRef","modalContent","Trash2","createPortal","ConfirmEditModal","onConfirm","onCancel","editProcessContent","submitButtonLabel","cancelButtonLabel","CustomIcon","isContentComponent","ContentComponent","HsafaChat","primaryColor","primaryColorDark","primaryColorLight","backgroundColor","borderColor","textColor","accentColor","defaultOpen","HsafaTools","componentAboveInput","presetPrompts","currentChat","onChatChanged","providerDir","providerTheme","providerTools","providerUI","effectiveTheme","mergedTools","mergedUI","agent","uploadError","setUploadError","setIsOpen","setHistoryOpen","setHistorySearch","historyRefreshKey","setHistoryRefreshKey","setOpenReasoningIds","isConfirmEditOpen","setIsConfirmEditOpen","messageToEdit","setMessageToEdit","scrollRef","chatStorage","lastLoadedChatRef","savedId","currentAttachments","handleToggleHistory","handleClose","textarea","newHeight","handleUserMessageClick","handleConfirmEdit","handleCancelEdit","panel","prompt","themeColors","ContentContainer","mutedTextColor","enableBorderAnimation","borderRadius","enableContentBorder","enableMargin","chatWidth","effectiveDir","componentId","isMounted","setIsMounted","timeout","themeColorScheme","contentBorderRadius","chatWidthPx","marginStyle","containerWidth","nav","isOpfsAvailable","getOpfsRootDir","fileExists","writeTextFile","handle","writable","readTextFile","isFileSystemDirectoryHandle","safeJsonParse","createLocalStorageKeys","namespace","prefix","versionId","getDirectory","create","readOpfsFile","fileName","fileHandle","writeOpfsFile","createHsafaArtifactStore","serialize","deserialize","storageOrder","legacyDecode","keys","encodeRecord","record","decodeRecord","legacy","normalized","backend","root","nsDir","chatDir","decoded","versionsDir","bestChatId","bestTime","entries","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 React, { createContext, useCallback, useContext, useMemo, useState } from \"react\";\nimport type { HsafaTool } from \"../types/chat\";\n\n/**\n * Handler function for custom actions that can be triggered by the AI agent\n */\nexport type HsafaActionHandler = (params: unknown, 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<unknown> | unknown;\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<Record<string, unknown>>>;\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<Record<string, unknown>>) => () => void;\n /** Unregister a custom component */\n unregisterComponent: (name: string, component?: React.ComponentType<Record<string, unknown>>) => 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 /** Currently active chat id (set by HsafaChat) */\n currentChatId?: string;\n /** Setter for current chat id */\n setCurrentChatId: (chatId: string) => void;\n\n tools: Map<string, HsafaTool>;\n uiComponents: Map<string, React.ComponentType<Record<string, unknown>>>;\n registerTool: (name: string, tool: HsafaTool) => () => void;\n unregisterTool: (name: string, tool?: HsafaTool) => void;\n registerUIComponent: (name: string, component: React.ComponentType<Record<string, unknown>>) => () => void;\n unregisterUIComponent: (name: string, component?: React.ComponentType<Record<string, unknown>>) => 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 tools?: Record<string, HsafaTool>;\n uiComponents?: Record<string, React.ComponentType<Record<string, unknown>>>;\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, tools: initialTools, uiComponents: initialUIComponents }: HsafaProviderProps) {\n const [actions, setActions] = useState<Map<string, HsafaActionHandler>>(new Map());\n const [components, setComponents] = useState<Map<string, React.ComponentType<Record<string, unknown>>>>(new Map());\n const [tools, setTools] = useState<Map<string, HsafaTool>>(() => new Map(Object.entries(initialTools || {})));\n const [uiComponents, setUIComponents] = useState<Map<string, React.ComponentType<Record<string, unknown>>>>(() => new Map(Object.entries(initialUIComponents || {})));\n const [streamingStates, setStreamingStates] = useState<Map<string, boolean>>(new Map());\n const [chatOpenStates, setChatOpenStates] = useState<Map<string, boolean>>(new Map());\n const [currentChatId, setCurrentChatId] = useState<string | undefined>(undefined);\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<Record<string, unknown>>) => {\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<Record<string, unknown>>) => {\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 registerTool = useCallback((name: string, tool: HsafaTool) => {\n setTools(prev => {\n const next = new Map(prev);\n next.set(String(name), tool);\n return next;\n });\n return () => {\n setTools(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!tool || existing === tool) next.delete(String(name));\n return next;\n });\n };\n }, []);\n\n const unregisterTool = useCallback((name: string, tool?: HsafaTool) => {\n setTools(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!tool || existing === tool) next.delete(String(name));\n return next;\n });\n }, []);\n\n const registerUIComponent = useCallback((name: string, component: React.ComponentType<Record<string, unknown>>) => {\n setUIComponents(prev => {\n const next = new Map(prev);\n next.set(String(name), component);\n return next;\n });\n return () => {\n setUIComponents(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 unregisterUIComponent = useCallback((name: string, component?: React.ComponentType<Record<string, unknown>>) => {\n setUIComponents(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 next.set(chatId, isOpen);\n return next;\n });\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 tools,\n uiComponents,\n registerAction,\n unregisterAction,\n registerComponent,\n unregisterComponent,\n registerTool,\n unregisterTool,\n registerUIComponent,\n unregisterUIComponent,\n isAnyStreaming,\n setStreamingState,\n isAnyChatOpen,\n setChatOpenState,\n currentChatId,\n setCurrentChatId,\n }), [baseUrl, dir, theme, actions, components, tools, uiComponents, registerAction, unregisterAction, registerComponent, unregisterComponent, registerTool, unregisterTool, registerUIComponent, unregisterUIComponent, isAnyStreaming, setStreamingState, isAnyChatOpen, setChatOpenState, currentChatId]);\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 * 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 tools: new Map(),\n uiComponents: new Map(),\n registerAction: () => () => undefined,\n unregisterAction: () => undefined,\n registerComponent: () => () => undefined,\n unregisterComponent: () => undefined,\n registerTool: () => () => undefined,\n unregisterTool: () => undefined,\n registerUIComponent: () => () => undefined,\n unregisterUIComponent: () => undefined,\n isAnyStreaming: false,\n setStreamingState: () => undefined,\n isAnyChatOpen: false,\n setChatOpenState: () => undefined,\n currentChatId: undefined,\n setCurrentChatId: () => undefined,\n };\n return ctx;\n}\n","import { useState, useRef, useCallback } from 'react';\nimport { Attachment } from '../types/chat';\nimport { joinUrl } from '../utils/file-upload';\nimport { useHsafa } from '../providers/HsafaProvider';\n\nconst MAX_UPLOAD_SIZE = 25 * 1024 * 1024; // 25MB\n\nexport function useFileUpload(baseUrl?: string) {\n const { baseUrl: providerBaseUrl } = useHsafa();\n const effectiveBaseUrl = baseUrl || providerBaseUrl || '';\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(effectiveBaseUrl, '/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 }, [effectiveBaseUrl]);\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 setAttachments,\n MAX_UPLOAD_SIZE\n };\n}\n","import { DefaultChatTransport } from \"ai\";\n\nexport function createHsafaTransport(\n baseUrl: string,\n agentId: string,\n chatId: string,\n templateParams?: Record<string, unknown>\n) {\n console.log('🚀 [SDK] createHsafaTransport called with templateParams:', templateParams);\n return new DefaultChatTransport({\n api: `${baseUrl}/api/run/${agentId}`,\n fetch: async (input: unknown, init?: unknown) => {\n const reqInit = (init as { body?: any }) || {};\n const body = reqInit?.body ? JSON.parse(reqInit.body as string) : {};\n const mergedParams = templateParams && typeof templateParams === 'object' ? templateParams : {};\n console.log('🚀 [SDK] Before merge - body:', body);\n console.log('🚀 [SDK] Before merge - mergedParams:', mergedParams);\n const enhancedBody = { ...mergedParams, ...body, chatId } as Record<string, unknown>;\n console.log('🚀 [SDK] After merge - enhancedBody:', enhancedBody);\n return fetch(input as any, { ...(init as any), body: JSON.stringify(enhancedBody) });\n },\n });\n}\n\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 { getDomComponents, guideCursor, FillActiveInput } from \"../../web-controler\";\n\nexport function createBuiltInTools() {\n return {\n getDomComponents: {\n tool: async ({ includeHidden, selector }: any) => {\n return await getDomComponents({ includeHidden, selector });\n },\n executeEachToken: false,\n },\n controlCursor: {\n tool: async ({ target, action, anchor, durationMs, dragTo }: any) => {\n const res = await guideCursor(target, { action, anchor, durationMs, dragTo });\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 { success: true, message: act === 'click' ? `Cursor moved and clicked successfully${clicked}` : act === 'drag' ? `Cursor dragged successfully` : `Cursor moved successfully`, details: res };\n }\n return { success: false, message: 'Cursor action failed', details: res };\n },\n executeEachToken: false,\n },\n fillActiveInput: {\n tool: async ({ value }: any) => {\n const res = await FillActiveInput(value);\n return { success: !!res?.ok, message: res?.ok ? 'Active input filled successfully' : (res?.errors?.[0] || 'Failed to fill active input'), details: res };\n },\n executeEachToken: true,\n },\n requestInput: {\n tool: async (_: any) => ({ ok: true }),\n executeEachToken: true,\n },\n } as Record<string, any>;\n}\n\n\n","import React from 'react';\nimport { XMarkdown } from '@ant-design/x-markdown';\nimport '@ant-design/x-markdown/themes/light.css';\nimport '@ant-design/x-markdown/themes/dark.css';\n\ninterface XMarkdownRendererProps {\n content: string;\n theme?: 'light' | 'dark';\n streaming?: boolean;\n}\n\nexport function XMarkdownRenderer({ \n content, \n theme = 'dark',\n streaming = false,\n}: XMarkdownRendererProps) {\n // Type assertion to handle React 18 compatibility\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const MarkdownComponent = XMarkdown as React.ComponentType<any>;\n \n \n return (\n <MarkdownComponent\n content={content}\n className={theme === 'dark' ? 'x-markdown-dark' : 'x-markdown-light'}\n streaming={{\n hasNextChunk: streaming,\n enableAnimation: true,\n animationConfig: {\n fadeDuration: 200,\n },\n // Map incomplete markdown tokens to loading components\n incompleteMarkdownComponentMap: {\n html: 'IncompleteBlock', // For incomplete HTML/custom tags\n link: 'IncompleteBlock', // For incomplete links\n image: 'IncompleteBlock', // For incomplete images\n },\n }}\n openLinksInNewTab={true}\n config={{\n gfm: true, // GitHub Flavored Markdown\n }}\n dompurifyConfig={{\n // Allow custom HTML tags for components\n ADD_TAGS: ['data-chart', 'welcome', 'user-card', 'mermaid'],\n ADD_ATTR: ['data-source', 'data-spec', 'data-icon', 'data-description', 'data-raw'],\n }}\n style={{\n fontSize: '14px',\n lineHeight: '1.6',\n wordBreak: 'break-word',\n maxWidth: '100%',\n overflow: 'hidden',\n }}\n />\n );\n}\n","import React from 'react';\nimport { XMarkdownRenderer } from '../../XMarkdownRenderer';\n\n/**\n * PlainText - Built-in UI component that renders text with markdown support\n * Always available to agents without needing to be added to HsafaUI\n * \n * @param text - The text content to render with markdown\n */\nfunction PlainText({ input }: { input: any }) {\n return (\n <div style={{ \n fontSize: '14px', \n lineHeight: '1.6',\n width: '100%'\n }}>\n <XMarkdownRenderer content={input?.text || ''} theme=\"dark\" />\n </div>\n );\n}\n\n/**\n * Creates built-in UI components that are always available to agents\n * These components don't need to be explicitly added to HsafaUI prop\n */\nexport function createBuiltInUI(): Record<string, React.ComponentType<any>> {\n return {\n plainText: PlainText,\n };\n}\n\n","export type FormState = { submitted?: boolean; skipped?: boolean; values?: Record<string, any> };\n\nexport function renderOrUpdateUserForm(\n input: any,\n toolCallId: string,\n hosts: Map<string, HTMLDivElement>,\n states: Map<string, FormState>,\n addToolResult: (payload: { tool: string; toolCallId: string; output: any }) => void,\n colors?: Record<string, string>\n) {\n let host = hosts.get(toolCallId);\n if (!host) {\n host = document.createElement('div');\n host.className = 'hsafa-inline-form';\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 const chatEl = document.querySelector('.chat-scroll-container');\n (chatEl || document.body).appendChild(host);\n }\n hosts.set(toolCallId, host);\n } else {\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 const title = input?.title || 'Provide input';\n const description = input?.description || '';\n const submitLabel = input?.submitLabel || 'Submit';\n const skipLabel = input?.skipLabel || 'Skip';\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 = states.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 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 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') data[id] = (el as HTMLInputElement).checked;\n else data[id] = (el as HTMLInputElement).value ?? '';\n });\n states.set(toolCallId, { submitted: true, skipped: false, values: data });\n addToolResult({ tool: 'requestInput', toolCallId, output: { success: true, submitted: true, values: data } });\n form.querySelectorAll('[data-field-id]').forEach((el) => { (el as HTMLInputElement).disabled = true; (el as HTMLInputElement).style.opacity = '0.7'; });\n if (submitBtn) { submitBtn.textContent = `${trimmedSubmit || 'Submit'} ✓`; submitBtn.style.opacity = '0.8'; (submitBtn as any).disabled = true; }\n if (skipBtn) (skipBtn as any).disabled = true;\n };\n if (skipBtn) {\n skipBtn.onclick = () => {\n states.set(toolCallId, { submitted: false, skipped: true, values: undefined });\n addToolResult({ tool: 'requestInput', toolCallId, output: { success: true, submitted: false, skipped: true } });\n form.querySelectorAll('[data-field-id]').forEach((el) => { (el as HTMLInputElement).disabled = true; (el as HTMLInputElement).style.opacity = '0.7'; });\n if (skipBtn) { skipBtn.textContent = `${trimmedSkip || 'Skip'} ✓`; skipBtn.style.opacity = '0.8'; (skipBtn as any).disabled = true; }\n if (submitBtn) (submitBtn as any).disabled = true;\n };\n }\n\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) { badge.style.background = 'rgba(16,185,129,0.15)'; badge.style.color = '#10b981'; badge.textContent = 'Submitted'; }\n else { badge.style.background = 'rgba(234,179,8,0.15)'; badge.style.color = '#eab308'; badge.textContent = 'Skipped'; }\n status.appendChild(badge);\n form.appendChild(status);\n\n // Ensure action buttons are disabled and labels updated on hydration\n try {\n if (submitBtn) {\n (submitBtn as any).disabled = true;\n submitBtn.style.opacity = '0.8';\n if (existingState.submitted) submitBtn.textContent = `${trimmedSubmit || 'Submit'} ✓`;\n }\n if (skipBtn) {\n (skipBtn as any).disabled = true;\n skipBtn.style.opacity = '0.8';\n if (existingState.skipped) skipBtn.textContent = `${trimmedSkip || 'Skip'} ✓`;\n }\n } catch {}\n }\n host.appendChild(form);\n}\n\n\n","import { useEffect, useRef } from 'react';\n\ntype AnyRecord = Record<string, unknown>;\n\nfunction isRecord(v: unknown): v is AnyRecord {\n return !!v && typeof v === 'object';\n}\n\nexport function useStreamingToolInput(\n chatMessages: unknown[],\n allTools: Record<string, unknown>,\n renderOrUpdateUserForm: (input: unknown, toolCallId: string) => void\n) {\n const lastProcessedInputRef = useRef<Map<string, string>>(new Map());\n const lastProcessedStateRef = useRef<Map<string, string>>(new Map());\n const toolCallCounterRef = useRef<Map<string, number>>(new Map());\n const allToolsRef = useRef(allTools);\n const renderOrUpdateUserFormRef = useRef(renderOrUpdateUserForm);\n\n // Update refs without triggering re-render\n allToolsRef.current = allTools;\n renderOrUpdateUserFormRef.current = renderOrUpdateUserForm;\n\n useEffect(() => {\n \n\n chatMessages.forEach((message) => {\n if (!isRecord(message) || message.role !== 'assistant') return;\n const parts = Array.isArray(message.parts) ? (message.parts as unknown[]) : [];\n parts.forEach((part) => {\n if (!isRecord(part)) return;\n if (typeof part.toolCallId !== 'string' || !part.toolCallId) return;\n \n let toolName = typeof part.toolName === 'string' ? part.toolName : undefined;\n const partType = typeof part.type === 'string' ? part.type : '';\n if (!toolName && partType.startsWith('tool-')) toolName = partType.replace(/^tool-/, '');\n if (!toolName) return;\n\n const toolConfig = (allToolsRef.current as Record<string, unknown>)[toolName];\n\n // Fire lifecycle callbacks when tool state changes\n try {\n const state = String((part as AnyRecord).state || (part as AnyRecord).status || '');\n const lastState = lastProcessedStateRef.current.get(part.toolCallId);\n if (state && state !== lastState && toolConfig && typeof toolConfig === 'object') {\n lastProcessedStateRef.current.set(part.toolCallId, state);\n const toolInput = (part as AnyRecord).input ?? (part as AnyRecord).args ?? {};\n const ctx = { toolCallId: part.toolCallId, toolName };\n const tc = toolConfig as AnyRecord;\n if (state === 'input-streaming' && typeof tc.inputting_start === 'function') {\n (tc.inputting_start as (input: unknown, ctx: { toolCallId: string; toolName: string }) => void)(toolInput, ctx);\n }\n if (state === 'input-available' && typeof tc.running_start === 'function') {\n (tc.running_start as (input: unknown, ctx: { toolCallId: string; toolName: string }) => void)(toolInput, ctx);\n }\n }\n } catch {\n void 0;\n }\n\n // Increment tool call number for each valid tool call\n if (toolConfig && typeof toolConfig === 'object' && (toolConfig as AnyRecord).executeEachToken && (toolConfig as AnyRecord).tool) {\n const toolInput = (part as AnyRecord).input ?? (part as AnyRecord).args ?? {};\n const currentInput = JSON.stringify(toolInput);\n const lastInput = lastProcessedInputRef.current.get(part.toolCallId);\n if (currentInput !== lastInput && currentInput !== '{}') {\n lastProcessedInputRef.current.set(part.toolCallId, currentInput);\n try {\n if (toolName === 'requestInput') {\n renderOrUpdateUserFormRef.current(toolInput, part.toolCallId);\n } else {\n // Increment tool call number for this specific toolCallId\n const currentCount = toolCallCounterRef.current.get(part.toolCallId) || 0;\n const newCount = currentCount + 1;\n toolCallCounterRef.current.set(part.toolCallId, newCount);\n if(newCount > 1){\n ((toolConfig as AnyRecord).tool as (input: unknown) => unknown)({ ...(toolInput as AnyRecord), toolCallNumber: newCount - 1 });\n }\n }\n } catch {\n void 0;\n }\n }\n }\n });\n });\n }, [chatMessages]);\n}\n","/**\n * useHsafaAgent - The main headless hook for Hsafa Agent\n * \n * This hook provides all the logic needed to integrate an AI agent into your custom UI.\n * It handles chat state, tool execution, message streaming, and more.\n * \n * @example\n * ```tsx\n * function MyCustomChat() {\n * const agent = useHsafaAgent({\n * agentId: 'my-agent',\n * baseUrl: 'http://localhost:3000',\n * tools: {\n * customTool: async (input) => {\n * return { result: 'Custom tool executed!' };\n * }\n * }\n * });\n * \n * return (\n * <div>\n * {agent.messages.map(msg => (\n * <div key={msg.id}>{msg.content}</div>\n * ))}\n * <input \n * value={agent.input} \n * onChange={(e) => agent.setInput(e.target.value)}\n * onKeyPress={(e) => e.key === 'Enter' && agent.sendMessage()}\n * />\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useRef, useCallback, useEffect, useMemo } from 'react';\nimport { useChat } from '@ai-sdk/react';\nimport { useHsafa } from '../providers/HsafaProvider';\nimport { createHsafaTransport } from '../components/hsafa-chat/utils/transport';\nimport { createBuiltInTools } from '../components/hsafa-chat/utils/builtInTools';\nimport { createBuiltInUI } from '../components/hsafa-chat/utils/builtInUI';\nimport { renderOrUpdateUserForm as renderOrUpdateUserFormUtil } from '../components/hsafa-chat/utils/renderUserForm';\nimport { useStreamingToolInput } from '../components/hsafa-chat/hooks/useStreamingToolInput';\nimport { lastAssistantMessageIsCompleteWithToolCalls } from 'ai';\n\nexport interface UseHsafaAgentConfig {\n /** The agent ID to connect to */\n agentId: string;\n /** Base URL of your backend server */\n baseUrl?: string;\n /** Custom tools that the agent can use */\n tools?: Record<string, any>;\n /** Custom UI components for rendering tool results */\n uiComponents?: Record<string, React.ComponentType<any>>;\n /** Callback when a message starts */\n onStart?: (message: any) => void;\n /** Callback when a message finishes */\n onFinish?: (message: any) => void;\n /** Callback when an error occurs */\n onError?: (error: Error) => void;\n /** Initial messages to load */\n initialMessages?: any[];\n /** Callback when messages change */\n onMessagesChange?: (messages: any[], chatId?: string) => void;\n /** Optional controlled chat id */\n controlledChatId?: string;\n /** Optional callback when chat id changes */\n onChatIdChange?: (chatId: string) => void;\n /** Optional templating parameters merged into request body for server-side templating */\n templateParams?: Record<string, any>;\n}\n\nexport interface HsafaAgentAPI {\n // Core state\n /** Current input text */\n input: string;\n /** Set the input text */\n setInput: (value: string) => void;\n /** All chat messages */\n messages: any[];\n /** Whether the agent is currently processing */\n isLoading: boolean;\n /** Current chat status */\n status: 'idle' | 'submitted' | 'streaming' | 'error' | 'ready';\n /** Any error that occurred */\n error: Error | undefined;\n \n // Actions\n /** Send the current input as a message */\n sendMessage: (options?: { text?: string; files?: any[] }) => Promise<void>;\n /** Stop the current generation */\n stop: () => void;\n /** Clear all messages and start a new chat */\n newChat: () => void;\n /** Set messages directly (for loading history) */\n setMessages: (messages: any[]) => void;\n /** Notify that messages have changed (for edit operations) */\n notifyMessagesChange: () => void;\n \n // Advanced\n /** Direct access to the underlying chat API */\n chatApi: any;\n /** Current chat ID */\n chatId: string;\n /** Set the chat ID (for switching chats) */\n setChatId: (chatId: string) => void;\n /** All available tools (built-in + custom + dynamic page) */\n tools: Record<string, any>;\n /** All available UI components */\n uiComponents: Record<string, any>;\n \n // Form handling\n /** Ref to form host elements (for requestInput tool) */\n formHostRef: React.MutableRefObject<Map<string, HTMLDivElement>>;\n /** Ref to form state (for requestInput tool) */\n formStateRef: React.MutableRefObject<Map<string, { submitted?: boolean; skipped?: boolean; values?: Record<string, any> }>>;\n /** Cleanup all active forms */\n cleanupForms: () => void;\n \n // UI tool handling\n /** Callback when a UI component renders successfully */\n onUISuccess: (toolCallId: string, toolName: string) => void;\n /** Callback when a UI component encounters an error */\n onUIError: (toolCallId: string, toolName: string, error: Error) => void;\n}\n\nexport function useHsafaAgent(config: UseHsafaAgentConfig): HsafaAgentAPI {\n const {\n agentId,\n baseUrl: configBaseUrl = '',\n tools: customTools = {},\n uiComponents: customUIComponents = {},\n onStart,\n onFinish,\n onError,\n initialMessages = [],\n onMessagesChange,\n controlledChatId,\n onChatIdChange,\n templateParams,\n } = config;\n\n const { baseUrl: providerBaseUrl, setCurrentChatId } = useHsafa();\n const effectiveBaseUrl = (configBaseUrl && configBaseUrl.length > 0) ? configBaseUrl : (providerBaseUrl || '');\n\n const [input, setInput] = useState<string>('');\n \n // Generate chat ID for the session (internal, can be controlled via props)\n const [internalChatId, setInternalChatId] = useState(() => `chat_${Date.now()}_${Math.random().toString(36).slice(2)}`);\n const chatId = controlledChatId ?? internalChatId;\n const setChatId = useCallback((newChatId: string) => {\n if (controlledChatId === undefined) {\n setInternalChatId(newChatId);\n }\n if (onChatIdChange) onChatIdChange(newChatId);\n }, [controlledChatId, onChatIdChange]);\n \n useEffect(() => {\n try { setCurrentChatId(chatId); } catch {}\n return () => { try { setCurrentChatId(undefined as any); } catch {} };\n }, [chatId, setCurrentChatId]);\n\n // Configure transport to fetch from the correct endpoint\n const transport = useMemo(() => createHsafaTransport(effectiveBaseUrl, agentId, chatId, templateParams), [effectiveBaseUrl, agentId, chatId, templateParams]);\n \n // Memoize callbacks to prevent infinite loops\n const onFinishCallback = useCallback((payload: any) => {\n console.log('Message finished:', payload);\n let assistantMessageId: string | undefined = payload?.message?.id;\n if (!assistantMessageId && Array.isArray(payload?.messages)) {\n for (let i = payload.messages.length - 1; i >= 0; i--) {\n const m = payload.messages[i];\n if (m && m.role === 'assistant' && m.id) { assistantMessageId = m.id; break; }\n }\n }\n onFinish?.({\n ...payload,\n chatId,\n assistantMessageId,\n });\n }, [onFinish, chatId]);\n\n const onErrorCallback = useCallback((error: Error) => {\n console.error('Chat error:', error);\n onError?.(error);\n }, [onError]);\n\n // Built-in Web Controller Tools\n const builtInTools: Record<string, any> = useMemo(() => createBuiltInTools(), []);\n\n // Merge built-in tools and user-provided tools\n const allTools: Record<string, any> = useMemo(() => ({\n ...builtInTools,\n ...customTools,\n }), [builtInTools, customTools]);\n\n // Built-in UI Components\n const builtInUI: Record<string, any> = useMemo(() => createBuiltInUI(), []);\n\n // Merge built-in UI with user-provided UI components\n const allUI: Record<string, any> = useMemo(() => ({\n ...builtInUI,\n ...customUIComponents,\n }), [builtInUI, customUIComponents]);\n\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 \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 \n const renderOrUpdateUserForm = useCallback((input: any, toolCallId: string) => {\n renderOrUpdateUserFormUtil(\n input,\n toolCallId,\n formHostRef.current,\n formStateRef.current,\n (payload) => (chatApiRef.current as any).addToolResult(payload),\n undefined\n );\n }, []);\n\n // Ref to chatApi to use inside callbacks created before chatApi is defined\n const chatApiRef = useRef<any>(null);\n \n // Track UI tool calls that haven't sent results yet\n const pendingUIToolsRef = useRef<Set<string>>(new Set());\n\n // Handler for UI component errors - reports back to agent\n const handleUIError = useCallback((toolCallId: string, toolName: string, error: Error) => {\n console.error(`UI Error [${toolName}]:`, error);\n if (chatApiRef.current && pendingUIToolsRef.current.has(toolCallId)) {\n pendingUIToolsRef.current.delete(toolCallId);\n (chatApiRef.current as any).addToolResult({\n tool: toolName,\n toolCallId: toolCallId,\n state: 'output-error',\n errorText: error?.message || String(error),\n });\n }\n }, []);\n \n // Handler for UI component success - reports back to agent\n const handleUISuccess = useCallback((toolCallId: string, toolName: string) => {\n if (chatApiRef.current && pendingUIToolsRef.current.has(toolCallId)) {\n pendingUIToolsRef.current.delete(toolCallId);\n (chatApiRef.current as any).addToolResult({\n tool: toolName,\n toolCallId: toolCallId,\n output: {\n status: 'ok',\n rendered: true,\n component: toolName,\n logs: [],\n },\n });\n }\n }, []);\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 sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,\n // Removed sendAutomaticallyWhen to prevent infinite loops with Claude models\n // Tool results will still trigger continuation via explicit addToolResult calls\n async onToolCall({ toolCall }) {\n // Handle custom frontend tools\n const toolFn = getToolFunction(toolCall.toolName);\n\n // Special: requestInput renders a form and waits for user; no immediate tool result\n if (toolCall.toolName === 'requestInput') {\n try {\n renderOrUpdateUserForm(toolCall.input, toolCall.toolCallId);\n } catch (e) {\n console.error('requestInput render error', e);\n }\n return;\n }\n\n // Special: UI tools — check if this is a UI tool\n const isUiTool = toolCall.toolName === 'ui';\n const toolNameIsUIComponent = allUI && toolCall.toolName in allUI;\n const isUIOnlyToolCall = (isUiTool || toolNameIsUIComponent) && !toolFn;\n \n if (isUIOnlyToolCall) {\n // UI-only tool calls rely on the UI layer to provide addToolResult.\n // If a tool function exists for the same name, we must execute it.\n pendingUIToolsRef.current.add(toolCall.toolCallId);\n return;\n }\n\n if (!toolFn) return;\n\n try {\n const result = await toolFn(toolCall.input);\n (chatApi as any).addToolResult({\n tool: toolCall.toolName,\n toolCallId: toolCall.toolCallId,\n output: result,\n });\n } catch (err: any) {\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 \n const { messages: chatMessages, sendMessage, status, stop, error: chatError } = chatApi;\n chatApiRef.current = chatApi;\n\n useStreamingToolInput(chatMessages as any[], allTools, renderOrUpdateUserForm);\n\n // Hydrate request_input form states from persisted messages\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 !== 'requestInput') 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 };\n formStateRef.current.set(toolCallId, hydrated);\n }\n const inVal = part?.input || part?.args || {};\n pendingRenders.push({ input: inVal, toolCallId });\n });\n });\n\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 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 // Load initial messages if provided\n useEffect(() => {\n if (initialMessages && initialMessages.length > 0 && chatMessages.length === 0) {\n console.log('Initial messages:', initialMessages);\n }\n }, [initialMessages, chatMessages.length]);\n\n const isLoading = status === 'submitted' || status === 'streaming';\n\n // Create a callback that can be called externally to notify about message changes\n const notifyMessagesChange = useCallback(() => {\n if (onMessagesChange) {\n onMessagesChange(chatMessages, chatId);\n }\n }, [onMessagesChange, chatMessages, chatId]);\n\n // Send message handler\n const handleSendMessage = useCallback(async (options?: { text?: string; files?: any[] }) => {\n const messageText = options?.text !== undefined ? options.text : input;\n const messageFiles = options?.files || [];\n \n const trimmedInput = messageText.trim();\n if (!trimmedInput && messageFiles.length === 0) return;\n if (isLoading) return;\n\n // Clear input if using default input\n if (options?.text === undefined) {\n setInput('');\n }\n\n try {\n // Call onStart when user sends a message\n if (onStart) {\n // Create a temporary user message object for the callback\n const userMessage = {\n role: 'user',\n content: trimmedInput,\n createdAt: Date.now(),\n chatId,\n };\n onStart(userMessage);\n }\n\n await sendMessage({\n text: trimmedInput,\n files: messageFiles,\n });\n } catch (error) {\n console.error('Failed to send message:', error);\n throw error;\n }\n }, [input, isLoading, sendMessage, onStart, chatId]);\n\n // New chat handler\n const handleNewChat = useCallback(() => {\n if (isLoading) return;\n cleanupAllForms();\n setInput('');\n try { (chatApi as any)?.setMessages?.([]); } catch {}\n const newId = `chat_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n setChatId(newId);\n }, [isLoading, chatApi, cleanupAllForms, setChatId]);\n\n // Set messages handler\n const handleSetMessages = useCallback((messages: any[]) => {\n try { (chatApi as any)?.setMessages?.(messages); } catch {}\n }, [chatApi]);\n\n return {\n // Core state\n input,\n setInput,\n messages: chatMessages,\n isLoading,\n status,\n error: chatError,\n \n // Actions\n sendMessage: handleSendMessage,\n stop,\n newChat: handleNewChat,\n setMessages: handleSetMessages,\n notifyMessagesChange,\n \n // Advanced\n chatApi,\n chatId,\n setChatId,\n tools: allTools,\n uiComponents: allUI,\n \n // Form handling\n formHostRef,\n formStateRef,\n cleanupForms: cleanupAllForms,\n \n // UI tool handling\n onUISuccess: handleUISuccess,\n onUIError: handleUIError,\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 * useChatStorage - Hook for managing chat history persistence\n * \n * This hook provides utilities for saving and loading chat conversations\n * to/from localStorage. It handles chat metadata, message persistence,\n * and chat history management.\n * \n * @example\n * ```tsx\n * function MyChat() {\n * const agent = useHsafaAgent({ agentId: 'my-agent' });\n * const storage = useChatStorage({\n * agentId: 'my-agent',\n * chatId: agent.chatId,\n * messages: agent.messages,\n * isLoading: agent.isLoading,\n * });\n * \n * return (\n * <div>\n * <button onClick={() => {\n * const chat = storage.loadChat(chatId);\n * if (chat) agent.setMessages(chat.messages);\n * }}>\n * Load Chat\n * </button>\n * <select onChange={(e) => storage.switchToChat(e.target.value, agent.setMessages)}>\n * {storage.chatList.map(chat => (\n * <option key={chat.id} value={chat.id}>{chat.title}</option>\n * ))}\n * </select>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useEffect, useRef, useCallback, useMemo } from 'react';\nimport { createChatStorage } from '../utils/chat-storage';\n\nexport interface UseChatStorageConfig {\n /** The agent ID (used as storage namespace) */\n agentId: string;\n /** Current chat ID */\n chatId: string;\n /** Current messages to auto-save */\n messages: any[];\n /** Whether chat is currently loading (skip saving during load) */\n isLoading?: boolean;\n /** Whether to auto-save messages (default: true) */\n autoSave?: boolean;\n /** Whether to auto-restore last chat on mount (default: true) */\n autoRestore?: boolean;\n}\n\nexport interface ChatMetadata {\n id: string;\n title: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface SavedChat {\n id: string;\n messages: any[];\n agentId: string;\n}\n\nexport interface ChatStorageAPI {\n /** List of all saved chats */\n chatList: ChatMetadata[];\n /** Current chat metadata */\n currentChatMeta: ChatMetadata | null;\n /** Refresh the chat list */\n refreshChatList: () => void;\n /** Load a specific chat */\n loadChat: (chatId: string) => SavedChat | null;\n /** Save the current chat */\n saveCurrentChat: () => void;\n /** Delete a chat */\n deleteChat: (chatId: string) => void;\n /** Switch to a different chat */\n switchToChat: (chatId: string, setMessages: (messages: any[]) => void) => void;\n /** Create a new chat */\n createNewChat: (onNewChat: () => void) => void;\n /** Search chats by title */\n searchChats: (query: string) => ChatMetadata[];\n /** The underlying storage utility */\n storage: ReturnType<typeof createChatStorage>;\n}\n\nexport function useChatStorage(config: UseChatStorageConfig): ChatStorageAPI {\n const {\n agentId,\n chatId,\n messages,\n isLoading = false,\n autoSave = true,\n autoRestore = true,\n } = config;\n\n const storage = useMemo(() => createChatStorage(agentId), [agentId]);\n \n const [chatList, setChatList] = useState<ChatMetadata[]>([]);\n const [currentChatMeta, setCurrentChatMeta] = useState<ChatMetadata | null>(null);\n \n const createdChatRef = useRef<boolean>(false);\n const restoredOnMountRef = useRef<boolean>(false);\n\n // Refresh chat list from storage\n const refreshChatList = useCallback(() => {\n try {\n const chats = storage.loadChatsIndex();\n setChatList(chats);\n const current = chats.find(c => c.id === chatId);\n setCurrentChatMeta(current || null);\n } catch (error) {\n console.error('Failed to refresh chat list:', error);\n }\n }, [storage, chatId]);\n\n // Load chat list on mount and when chatId changes\n useEffect(() => {\n refreshChatList();\n }, [refreshChatList]);\n\n // Auto-restore last chat on mount\n useEffect(() => {\n if (!autoRestore || restoredOnMountRef.current) return;\n \n try {\n const savedId = storage.loadCurrentChatId();\n if (savedId) {\n createdChatRef.current = true;\n }\n } catch (error) {\n console.error('Failed to restore chat:', error);\n }\n \n restoredOnMountRef.current = true;\n }, [storage, autoRestore]);\n\n // Auto-save messages when they change\n useEffect(() => {\n if (!autoSave || messages.length === 0) return;\n\n // Create chat metadata on first user message\n if (!createdChatRef.current) {\n const firstUser = messages.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 \n try {\n storage.upsertChatMeta({ id: chatId, title, createdAt: now, updatedAt: now });\n storage.saveChat({ id: chatId, messages: messages as any, agentId } as any);\n storage.saveCurrentChatId(chatId);\n createdChatRef.current = true;\n refreshChatList();\n } catch (error) {\n console.error('Failed to create chat:', error);\n }\n }\n } else if (!isLoading) {\n // Update existing chat\n const now = Date.now();\n try {\n storage.saveChat({ id: chatId, messages: messages as any, agentId } as any);\n const metas = storage.loadChatsIndex();\n const found = metas.find((m) => m.id === chatId);\n if (found) {\n storage.upsertChatMeta({ ...found, updatedAt: now });\n refreshChatList();\n }\n } catch (error) {\n console.error('Failed to save chat:', error);\n }\n }\n }, []);\n\n // Save chat on stream completion\n const wasLoadingRef = useRef<boolean>(false);\n useEffect(() => {\n if (isLoading) {\n wasLoadingRef.current = true;\n return;\n }\n if (wasLoadingRef.current && autoSave) {\n wasLoadingRef.current = false;\n try {\n const now = Date.now();\n // Always persist the latest messages for this chat\n storage.saveChat({ id: chatId, messages: messages as any, agentId } as any);\n\n // Upsert metadata; if it doesn't exist yet, create it now\n const metas = storage.loadChatsIndex();\n const found = metas.find((m) => m.id === chatId);\n if (found) {\n storage.upsertChatMeta({ ...found, updatedAt: now });\n } else {\n // Create metadata on the first successful turn (after user sends a message)\n let titleSource = '';\n const firstUser = Array.isArray(messages)\n ? (messages as any[]).find((m: any) => m && m.role === 'user')\n : undefined;\n if (firstUser && 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 storage.upsertChatMeta({ id: chatId, title, createdAt: now, updatedAt: now });\n try { storage.saveCurrentChatId(chatId); } catch {}\n createdChatRef.current = true;\n }\n\n refreshChatList();\n } catch (error) {\n console.error('Failed to save chat on completion:', error);\n }\n }\n }, [isLoading, messages, chatId, agentId, storage, autoSave, refreshChatList]);\n\n // Load a specific chat\n const loadChat = useCallback((chatId: string): SavedChat | null => {\n try {\n const chat = storage.loadChat(chatId);\n if (!chat) return null;\n \n // Ensure agentId is present\n return {\n id: chat.id,\n messages: chat.messages,\n agentId: chat.agentId || agentId, // Use current agentId if not present\n };\n } catch (error) {\n console.error('Failed to load chat:', error);\n return null;\n }\n }, [storage, agentId]);\n\n // Save current chat manually\n const saveCurrentChat = useCallback(() => {\n if (messages.length === 0) return;\n \n try {\n const now = Date.now();\n storage.saveChat({ id: chatId, messages: messages as any, agentId } as any);\n const metas = storage.loadChatsIndex();\n const found = metas.find((m) => m.id === chatId);\n if (found) {\n storage.upsertChatMeta({ ...found, updatedAt: now });\n refreshChatList();\n }\n } catch (error) {\n console.error('Failed to save chat:', error);\n }\n }, [storage, chatId, messages, agentId, refreshChatList]);\n\n // Delete a chat\n const deleteChat = useCallback((chatId: string) => {\n try {\n storage.deleteChat(chatId);\n refreshChatList();\n } catch (error) {\n console.error('Failed to delete chat:', error);\n }\n }, [storage, refreshChatList]);\n\n // Switch to a different chat\n const switchToChat = useCallback((newChatId: string, setMessages: (messages: any[]) => void) => {\n if (newChatId === chatId) return;\n \n try {\n createdChatRef.current = true;\n storage.saveCurrentChatId(newChatId);\n const saved = storage.loadChat(newChatId);\n const msgs = (saved && Array.isArray((saved as any).messages)) ? (saved as any).messages : [];\n setMessages(msgs);\n refreshChatList();\n } catch (error) {\n console.error('Failed to switch chat:', error);\n }\n }, [storage, chatId, refreshChatList]);\n\n // Create a new chat\n const createNewChat = useCallback((onNewChat: () => void) => {\n createdChatRef.current = false;\n onNewChat();\n }, []);\n\n // Search chats\n const searchChats = useCallback((query: string): ChatMetadata[] => {\n if (!query.trim()) return chatList;\n \n const lowerQuery = query.toLowerCase();\n return chatList.filter(chat => \n chat.title.toLowerCase().includes(lowerQuery)\n );\n }, [chatList]);\n\n return {\n chatList,\n currentChatMeta,\n refreshChatList,\n loadChat,\n saveCurrentChat,\n deleteChat,\n switchToChat,\n createNewChat,\n searchChats,\n storage,\n };\n}","/**\n * useMessageEditor - Hook for editing and regenerating messages\n * \n * This hook provides functionality to edit user messages and regenerate\n * responses from a specific point in the conversation.\n * \n * @example\n * ```tsx\n * function MyChat() {\n * const agent = useHsafaAgent({ agentId: 'my-agent' });\n * const editor = useMessageEditor({\n * messages: agent.messages,\n * isLoading: agent.isLoading,\n * sendMessage: agent.sendMessage,\n * setMessages: agent.setMessages,\n * });\n * \n * return (\n * <div>\n * {agent.messages.map(msg => (\n * <div key={msg.id}>\n * {editor.isEditing(msg.id) ? (\n * <div>\n * <textarea \n * value={editor.editingText} \n * onChange={(e) => editor.setEditingText(e.target.value)}\n * />\n * <button onClick={() => editor.saveEdit(msg.id)}>Save</button>\n * <button onClick={editor.cancelEdit}>Cancel</button>\n * </div>\n * ) : (\n * <div>\n * {msg.content}\n * <button onClick={() => editor.startEdit(msg.id, msg.content)}>\n * Edit\n * </button>\n * </div>\n * )}\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback } from 'react';\nimport { useHsafa } from '../providers/HsafaProvider';\n\nexport interface UseMessageEditorConfig {\n /** Current messages array */\n messages: any[];\n /** Whether chat is currently loading */\n isLoading: boolean;\n /** Function to send a message */\n sendMessage: (options: { text: string; files?: any[] }) => Promise<void>;\n /** Function to update messages array */\n setMessages: (messages: any[]) => void;\n /** Base URL for file uploads (if editing messages with attachments) */\n baseUrl?: string;\n}\n\nexport interface MessageEditorAPI {\n /** ID of the message currently being edited */\n editingMessageId: string | null;\n /** Current edit text */\n editingText: string;\n /** Set the edit text */\n setEditingText: (text: string) => void;\n /** Attachments for the edited message */\n editAttachments: any[];\n /** Set edit attachments */\n setEditAttachments: (attachments: any[]) => void;\n /** Whether files are currently uploading */\n editUploading: boolean;\n /** Start editing a message */\n startEdit: (messageId: string, text: string, attachments?: any[]) => void;\n /** Cancel editing */\n cancelEdit: () => void;\n /** Save the edit and regenerate from that point */\n saveEdit: (messageId: string) => Promise<void>;\n /** Check if a message is being edited */\n isEditing: (messageId: string) => boolean;\n /** Add attachments to the edit */\n addEditAttachments: (files: FileList) => Promise<void>;\n /** Remove an attachment from the edit */\n removeEditAttachment: (id: string) => void;\n}\n\nexport function useMessageEditor(config: UseMessageEditorConfig): MessageEditorAPI {\n const {\n messages,\n isLoading,\n sendMessage,\n setMessages,\n baseUrl,\n } = config;\n\n const { baseUrl: providerBaseUrl } = useHsafa();\n const effectiveBaseUrl = baseUrl || providerBaseUrl || '';\n\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\n // Start editing a message\n const startEdit = useCallback((messageId: string, text: string, attachments: any[] = []) => {\n setEditingMessageId(messageId);\n setEditingText(text);\n setEditAttachments(attachments);\n }, []);\n\n // Cancel editing\n const cancelEdit = useCallback(() => {\n setEditingMessageId(null);\n setEditingText('');\n setEditAttachments([]);\n }, []);\n\n // Save edit and regenerate\n const saveEdit = useCallback(async (messageId: string) => {\n if (isLoading) return;\n \n try {\n // Find the message index\n const messageIndex = messages.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 = messages.slice(0, messageIndex);\n \n // Clear the current messages and set to the point before the edited message\n setMessages(updatedMessages);\n \n // Send the edited message\n await sendMessage({\n text: editingText.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 cancelEdit();\n } catch (error) {\n console.error('Failed to save edit:', error);\n throw error;\n }\n }, [isLoading, messages, sendMessage, editingText, editAttachments, setMessages, cancelEdit]);\n\n // Check if a message is being edited\n const isEditing = useCallback((messageId: string) => {\n return editingMessageId === messageId;\n }, [editingMessageId]);\n\n // Add attachments to edit\n const addEditAttachments = useCallback(async (files: FileList) => {\n if (!effectiveBaseUrl) {\n console.warn('baseUrl not provided, cannot upload attachments');\n return;\n }\n\n setEditUploading(true);\n try {\n const uploadPromises = Array.from(files).map(async (file) => {\n if (file.size > 25 * 1024 * 1024) throw new Error(`${file.name} is too large (max 25MB)`);\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 const newAttachments = await Promise.all(uploadPromises);\n setEditAttachments(prev => [...prev, ...newAttachments]);\n } catch (error) {\n console.error('Failed to upload files:', error);\n throw error;\n } finally {\n setEditUploading(false);\n }\n }, [effectiveBaseUrl]);\n\n // Remove attachment from edit\n const removeEditAttachment = useCallback((id: string) => {\n setEditAttachments(prev => prev.filter(att => att.id !== id));\n }, []);\n\n return {\n editingMessageId,\n editingText,\n setEditingText,\n editAttachments,\n setEditAttachments,\n editUploading,\n startEdit,\n cancelEdit,\n saveEdit,\n isEditing,\n addEditAttachments,\n removeEditAttachment,\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { useHsafa } from '../providers/HsafaProvider';\nimport { createChatStorage } from '../utils/chat-storage';\n\nexport type HsafaActiveChatIdSource = 'context' | 'storage' | 'none';\n\nexport interface UseHsafaActiveChatIdOptions {\n agentId: string;\n prefer?: 'context' | 'storage';\n}\n\nexport interface HsafaActiveChatIdResult {\n chatId?: string;\n isReady: boolean;\n source: HsafaActiveChatIdSource;\n}\n\nfunction safeLoadChatIdFromStorage(agentId: string): string | undefined {\n if (typeof window === 'undefined') return undefined;\n try {\n const storage = createChatStorage(agentId);\n const id = storage.loadCurrentChatId();\n return id || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function useHsafaActiveChatId(options: UseHsafaActiveChatIdOptions): HsafaActiveChatIdResult {\n const { agentId, prefer = 'context' } = options;\n\n const { currentChatId } = useHsafa();\n\n const [storageChatId, setStorageChatId] = useState<string | undefined>(undefined);\n const [storageReady, setStorageReady] = useState(false);\n\n useEffect(() => {\n setStorageReady(false);\n const id = safeLoadChatIdFromStorage(agentId);\n setStorageChatId(id);\n setStorageReady(true);\n }, [agentId]);\n\n return useMemo((): HsafaActiveChatIdResult => {\n const ctxId = currentChatId || undefined;\n\n const preferredId = prefer === 'context' ? ctxId : storageChatId;\n const preferredSource: HsafaActiveChatIdSource = prefer === 'context' ? 'context' : 'storage';\n\n if (preferredId) {\n return {\n chatId: preferredId,\n isReady: prefer === 'storage' ? storageReady : true,\n source: preferredSource,\n };\n }\n\n if (ctxId) {\n return { chatId: ctxId, isReady: true, source: 'context' };\n }\n\n if (storageChatId) {\n return { chatId: storageChatId, isReady: storageReady, source: 'storage' };\n }\n\n return { chatId: undefined, isReady: storageReady, source: 'none' };\n }, [currentChatId, prefer, storageChatId, storageReady]);\n}\n","import { Dispatch, SetStateAction, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { HsafaArtifactStore } from '../utils/artifact-store';\nimport { useHsafaActiveChatId } from './useHsafaActiveChatId';\n\nexport type ChatArtifactStatus = 'idle' | 'loading' | 'ready' | 'error';\n\nexport interface UseChatArtifactOptions<T> {\n agentId: string;\n chatId?: string;\n initial: T;\n store: HsafaArtifactStore<T>;\n autoLoad?: boolean;\n autoSave?: boolean;\n saveDebounceMs?: number;\n}\n\nexport interface ChatArtifactResult<T> {\n value: T;\n setValue: Dispatch<SetStateAction<T>>;\n status: ChatArtifactStatus;\n error?: unknown;\n reload: () => Promise<void>;\n flushSave: () => Promise<void>;\n}\n\nexport function useChatArtifact<T>(options: UseChatArtifactOptions<T>): ChatArtifactResult<T> {\n const {\n agentId,\n chatId: controlledChatId,\n initial,\n store,\n autoLoad = true,\n autoSave = true,\n saveDebounceMs = 800,\n } = options;\n\n const active = useHsafaActiveChatId({ agentId });\n const resolvedChatId = controlledChatId ?? active.chatId;\n\n const [value, setValue] = useState<T>(initial);\n const [status, setStatus] = useState<ChatArtifactStatus>('idle');\n const [error, setError] = useState<unknown>(undefined);\n\n const hydratedRef = useRef(false);\n const lastChatIdRef = useRef<string | undefined>(undefined);\n\n const saveTimerRef = useRef<number | undefined>(undefined);\n const pendingSavePromiseRef = useRef<Promise<void> | null>(null);\n\n const cancelPendingSave = useCallback(() => {\n if (typeof window === 'undefined') return;\n if (saveTimerRef.current) {\n window.clearTimeout(saveTimerRef.current);\n saveTimerRef.current = undefined;\n }\n }, []);\n\n const doSave = useCallback(async (): Promise<void> => {\n if (!resolvedChatId) return;\n try {\n await store.saveLatest(resolvedChatId, value);\n } catch (e) {\n setError(e);\n }\n }, [resolvedChatId, store, value]);\n\n const flushSave = useCallback(async (): Promise<void> => {\n cancelPendingSave();\n const p = doSave();\n pendingSavePromiseRef.current = p;\n await p;\n }, [cancelPendingSave, doSave]);\n\n const reload = useCallback(async (): Promise<void> => {\n if (!resolvedChatId) return;\n\n setStatus('loading');\n setError(undefined);\n\n try {\n const loaded = autoLoad ? await store.loadLatest(resolvedChatId) : null;\n setValue(loaded ?? initial);\n setStatus('ready');\n hydratedRef.current = true;\n lastChatIdRef.current = resolvedChatId;\n } catch (e) {\n setError(e);\n setStatus('error');\n }\n }, [autoLoad, initial, resolvedChatId, store]);\n\n useEffect(() => {\n if (!active.isReady && !controlledChatId) return;\n\n if (!resolvedChatId) {\n hydratedRef.current = false;\n lastChatIdRef.current = undefined;\n setStatus('idle');\n setError(undefined);\n setValue(initial);\n cancelPendingSave();\n return;\n }\n\n if (lastChatIdRef.current === resolvedChatId && hydratedRef.current) return;\n\n hydratedRef.current = false;\n lastChatIdRef.current = resolvedChatId;\n\n let cancelled = false;\n\n (async () => {\n setStatus(autoLoad ? 'loading' : 'ready');\n setError(undefined);\n\n try {\n const loaded = autoLoad ? await store.loadLatest(resolvedChatId) : null;\n if (cancelled) return;\n\n setValue(loaded ?? initial);\n setStatus('ready');\n hydratedRef.current = true;\n } catch (e) {\n if (cancelled) return;\n setError(e);\n setStatus('error');\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [active.isReady, autoLoad, cancelPendingSave, controlledChatId, initial, resolvedChatId, store]);\n\n useEffect(() => {\n if (!autoSave) return;\n if (!resolvedChatId) return;\n if (!hydratedRef.current) return;\n if (typeof window === 'undefined') return;\n\n cancelPendingSave();\n\n saveTimerRef.current = window.setTimeout(() => {\n const p = doSave();\n pendingSavePromiseRef.current = p;\n }, saveDebounceMs);\n\n return () => {\n cancelPendingSave();\n };\n }, [autoSave, cancelPendingSave, doSave, resolvedChatId, saveDebounceMs, value]);\n\n return useMemo(() => {\n return {\n value,\n setValue,\n status,\n error,\n reload,\n flushSave,\n };\n }, [error, flushSave, reload, status, value]);\n}\n","import { Dispatch, SetStateAction, useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { HsafaArtifactStore } from '../utils/artifact-store';\n\nexport interface UseChatArtifactVersioningOptions<T> {\n chatId?: string;\n store: HsafaArtifactStore<T>;\n value: T;\n setValue: Dispatch<SetStateAction<T>>;\n initial: T;\n}\n\nexport interface ChatArtifactVersioningAPI {\n onFinish: (payload: unknown) => Promise<void>;\n onMessagesChange: (messages: unknown[], chatId?: string) => Promise<void>;\n}\n\nfunction getAssistantMessageIdFromPayload(payload: unknown): string | undefined {\n if (!payload || typeof payload !== 'object') return undefined;\n const p = payload as {\n assistantMessageId?: unknown;\n message?: { id?: unknown };\n messages?: Array<{ id?: unknown; role?: unknown }>;\n };\n\n if (typeof p.assistantMessageId === 'string' && p.assistantMessageId.length > 0) return p.assistantMessageId;\n if (typeof p.message?.id === 'string' && p.message.id.length > 0) return p.message.id;\n\n const msgs = p.messages;\n if (!Array.isArray(msgs)) return undefined;\n\n for (let i = msgs.length - 1; i >= 0; i--) {\n const m = msgs[i];\n if (m && m.role === 'assistant' && typeof m.id === 'string' && m.id.length > 0) return m.id;\n }\n\n return undefined;\n}\n\nfunction getChatIdFromPayload(payload: unknown): string | undefined {\n if (!payload || typeof payload !== 'object') return undefined;\n const p = payload as { chatId?: unknown };\n if (typeof p.chatId === 'string' && p.chatId.length > 0) return p.chatId;\n return undefined;\n}\n\nfunction getAssistantMessageIds(messages: unknown[]): string[] {\n const ids: string[] = [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const m = messages[i] as { id?: unknown; role?: unknown } | null;\n if (!m) continue;\n if (m.role !== 'assistant') continue;\n if (typeof m.id !== 'string' || m.id.length === 0) continue;\n ids.push(m.id);\n }\n return ids;\n}\n\nexport function useChatArtifactVersioning<T>(options: UseChatArtifactVersioningOptions<T>): ChatArtifactVersioningAPI {\n const { chatId, store, value, setValue, initial } = options;\n\n const valueRef = useRef(value);\n useEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n const lastChatIdRef = useRef<string | undefined>(undefined);\n const prevMessagesRef = useRef<unknown[] | null>(null);\n\n const onFinish = useCallback(\n async (payload: unknown) => {\n const resolvedChatId = getChatIdFromPayload(payload) ?? chatId;\n if (!resolvedChatId) return;\n\n const assistantMessageId = getAssistantMessageIdFromPayload(payload);\n if (!assistantMessageId) return;\n\n await store.saveVersion(resolvedChatId, assistantMessageId, valueRef.current);\n },\n [chatId, store]\n );\n\n const onMessagesChange = useCallback(\n async (messages: unknown[], cbChatId?: string) => {\n const resolvedChatId = cbChatId ?? chatId;\n\n if (lastChatIdRef.current !== resolvedChatId) {\n lastChatIdRef.current = resolvedChatId;\n prevMessagesRef.current = Array.isArray(messages) ? messages : [];\n return;\n }\n\n const prev = prevMessagesRef.current;\n const next = Array.isArray(messages) ? messages : [];\n const wasTruncated = Array.isArray(prev) && next.length < prev.length;\n\n if (!resolvedChatId) {\n prevMessagesRef.current = next;\n return;\n }\n\n if (wasTruncated) {\n const assistantIds = getAssistantMessageIds(next);\n for (const id of assistantIds) {\n try {\n const exists = await store.hasVersion(resolvedChatId, id);\n if (!exists) continue;\n const version = await store.loadVersion(resolvedChatId, id);\n if (version) {\n setValue(version);\n prevMessagesRef.current = next;\n return;\n }\n } catch {\n continue;\n }\n }\n\n setValue(initial);\n }\n\n prevMessagesRef.current = next;\n },\n [chatId, initial, setValue, store]\n );\n\n return useMemo(() => {\n return { onFinish, onMessagesChange };\n }, [onFinish, onMessagesChange]);\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, { Component, ReactNode } from 'react';\n\ninterface Props {\n children: ReactNode;\n componentName: string;\n resolvedColors: {\n textColor: string;\n mutedTextColor: string;\n borderColor: string;\n inputBackground: string;\n };\n toolCallId?: string;\n toolName?: string;\n onError?: (toolCallId: string, toolName: string, error: Error) => void;\n onSuccess?: (toolCallId: string, toolName: string) => void;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n errorInfo: React.ErrorInfo | null;\n}\n\nexport class UIErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = { hasError: false, error: null, errorInfo: null };\n }\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error, errorInfo: null };\n }\n\n componentDidMount() {\n // Report success if component mounted without errors\n const { toolCallId, toolName, onSuccess } = this.props;\n if (toolCallId && toolName && onSuccess && !this.state.hasError) {\n // Use setTimeout to ensure this happens after the render completes\n setTimeout(() => {\n if (!this.state.hasError) {\n onSuccess(toolCallId, toolName);\n }\n }, 0);\n }\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error(`UI Component Error (${this.props.componentName}):`, error, errorInfo);\n this.setState({ error, errorInfo });\n \n // Report error back to agent if callback provided\n const { toolCallId, toolName, onError } = this.props;\n if (toolCallId && toolName && onError) {\n onError(toolCallId, toolName, error);\n }\n }\n\n render() {\n if (this.state.hasError && this.state.error) {\n const { resolvedColors, componentName } = this.props;\n return (\n <div\n style={{\n padding: '16px',\n backgroundColor: '#fee2e2',\n border: '2px solid #ef4444',\n borderRadius: '12px',\n color: '#991b1b',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginBottom: '8px' }}>\n <span style={{ fontSize: '20px' }}>⚠️</span>\n <strong style={{ fontSize: '16px' }}>Component Error: {componentName}</strong>\n </div>\n <div style={{ fontSize: '14px', marginBottom: '8px', fontFamily: 'monospace' }}>\n {this.state.error.message}\n </div>\n {this.state.errorInfo && (\n <details style={{ fontSize: '12px', marginTop: '8px' }}>\n <summary style={{ cursor: 'pointer', fontWeight: 'bold' }}>\n Stack Trace\n </summary>\n <pre\n style={{\n marginTop: '8px',\n padding: '8px',\n backgroundColor: '#fef2f2',\n borderRadius: '4px',\n overflow: 'auto',\n maxHeight: '200px',\n fontSize: '11px',\n }}\n >\n {this.state.errorInfo.componentStack}\n </pre>\n </details>\n )}\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\n","import React from \"react\";\nimport { XMarkdownRenderer } from \"../XMarkdownRenderer\";\nimport { UIErrorBoundary } from \"./UIErrorBoundary\";\n\ntype ThemeColors = {\n mutedTextColor: string;\n inputBackground: string;\n borderColor: string;\n textColor: string;\n};\n\ninterface AssistantMassageProps {\n parts: any[];\n messageId: string;\n openReasoningIds: Set<string>;\n toggleReasoning: (id: string) => void;\n resolvedColors: ThemeColors;\n HsafaUI?: Record<string, React.ComponentType<any>>;\n onUIError?: (toolCallId: string, toolName: string, error: Error) => void;\n onUISuccess?: (toolCallId: string, toolName: string) => void;\n addToolResult?: (payload: any) => void;\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/**\n * Parse MCP tool name format: {label}_{hash}_{originalToolName}\n * Returns { isMCP: true, mcpName, toolName } if it's an MCP tool\n * Otherwise returns { isMCP: false, toolName: original }\n */\nconst parseMCPToolName = (fullToolName: string): { isMCP: boolean; mcpName?: string; toolName: string } => {\n // MCP tools follow pattern: {label}_{6-char-hash}_{toolName}\n // Example: PostgreSQL_26e10d_execute_sql\n const mcpPattern = /^(.+?)_([a-f0-9]{6})_(.+)$/;\n const match = fullToolName.match(mcpPattern);\n \n if (match) {\n const [, label, , originalToolName] = match;\n return {\n isMCP: true,\n mcpName: label.replace(/_/g, ' '), // Convert underscores to spaces in MCP name\n toolName: originalToolName.replace(/_/g, ' ') // Convert underscores to spaces in tool name\n };\n }\n \n return { isMCP: false, toolName: fullToolName };\n};\n\n/**\n * Format tool name to be more readable\n * Converts camelCase, snake_case, kebab-case to readable text\n */\nconst formatToolName = (toolName: string): string => {\n return toolName\n // Handle snake_case\n .replace(/_/g, ' ')\n // Handle kebab-case\n .replace(/-/g, ' ')\n // Handle camelCase (insert space before capitals)\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n // Capitalize first letter of each word\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n};\n\n\nexport function AssistantMassage({ parts, messageId, openReasoningIds, toggleReasoning, resolvedColors, HsafaUI, onUIError, onUISuccess, addToolResult }: AssistantMassageProps) {\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; toolCallId?: string } |\n { type: 'text'; text: string; 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 // Text content (e.g., from plainText tool)\n if (it.type === 'text' && typeof it.text === 'string') {\n // Flush any pending reasoning first\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 groups.push({\n type: 'text',\n text: it.text,\n startDate: it.startDate,\n endDate: it.endDate\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 === 'requestInput') {\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 toolCallId: it.toolCallId\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: isOpen ? '4px' : '0px' }}>\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', opacity: 0.5 }}>\n <XMarkdownRenderer content={t} theme={'dark'} streaming={!isCompleted} />\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 // Handle text content\n if (g.type === 'text') {\n const isStreamingText = typeof g.endDate !== 'number';\n return (\n <div key={itemId} style={{ fontSize: '15px', color: resolvedColors.textColor, lineHeight: '1.6' }}>\n <XMarkdownRenderer content={g.text} theme={'dark'} streaming={isStreamingText} />\n </div>\n );\n }\n\n // Handle tool calls - g.type is 'tool' at this point\n const { color, text } = getToolStatus(g.status);\n const isRunning = g.status === 'input-streaming' || g.status === 'input-available';\n \n // Special case: requestInput\n if (g.toolName === 'requestInput') {\n return <div key={itemId} style={{ display: 'block', position: 'relative' }}>\n <div \n data-get-from-user-host={(g as any).toolCallId || itemId}\n style={{ width: '100%' }}\n />\n </div>\n }\n \n // Check if a UI component exists for this tool name\n const UIByToolName = HsafaUI?.[g.toolName || ''];\n if (UIByToolName) {\n return (\n <div key={itemId} style={{ \n display: 'block', \n position: 'relative',\n }}>\n <UIErrorBoundary \n componentName={g.toolName || 'Unknown'} \n resolvedColors={resolvedColors}\n toolCallId={g.toolCallId}\n toolName={g.toolName || 'unknown'}\n onError={onUIError}\n onSuccess={onUISuccess}\n >\n <UIByToolName \n toolName={g.toolName || ''}\n toolCallId={g.toolCallId || ''}\n input={g.input}\n output={g.output}\n status={g.status}\n addToolResult={addToolResult}\n />\n </UIErrorBoundary>\n </div>\n );\n }\n\n // Default tool UI - Parse and format tool name\n const parsedTool = parseMCPToolName(g.toolName || 'tool');\n \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 {parsedTool.isMCP ? (\n <span style={{ fontWeight: 500, color: resolvedColors.textColor }}>\n <span style={{ fontWeight: 600 }}>{parsedTool.toolName}</span>\n <span style={{ opacity: 0.7, margin: '0 4px' }}>from</span>\n <span style={{ fontWeight: 600, opacity: 0.85 }}>{parsedTool.mcpName}</span>\n </span>\n ) : (\n <span style={{ fontWeight: 500, color: resolvedColors.textColor }}>\n {formatToolName(parsedTool.toolName)}\n </span>\n )}\n </div>\n </div>\n </div>\n );\n \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","/**\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 { AssistantMassage } from \"./AssistantMassage\";\nimport { Attachment } from \"../../types/chat\";\nimport { AttachmentDisplay } from \"../AttachmentDisplay\";\nimport { Pencil } from \"lucide-react\";\nimport { IconWrapper } from \"../IconWrapper\";\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: (message: any, id: string, text: string, attachments?: Attachment[]) => void;\n HsafaUI?: Record<string, React.ComponentType<any>>;\n onUIError?: (toolCallId: string, toolName: string, error: Error) => void;\n onUISuccess?: (toolCallId: string, toolName: string) => void;\n addToolResult?: (payload: any) => void;\n editableMessageIcon?: React.ComponentType<any>;\n}\n\nexport function MessageList({ \n chatMessages, \n isLoading, \n openReasoningIds, \n toggleReasoning, \n resolvedColors, \n t, \n onUserMessageClick,\n HsafaUI,\n onUIError,\n onUISuccess,\n addToolResult,\n editableMessageIcon\n}: MessageListProps) {\n\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 <div>\n <div\n title={t('editor.clickToEdit')}\n onClick={() => onUserMessageClick(m, 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 position: 'relative'\n }}\n onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground)}\n onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = resolvedColors.accentColor)}\n >\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: '8px' }}>\n <div style={{ flex: 1 }}>\n {messageText}\n {messageAttachments.length > 0 && (\n <AttachmentDisplay\n attachments={messageAttachments}\n resolvedColors={resolvedColors}\n />\n )}\n </div>\n <div style={{ \n flexShrink: 0,\n opacity: 0.5,\n transition: 'opacity 0.2s'\n }}>\n <IconWrapper IconComponent={editableMessageIcon || Pencil} size=\"14\" strokeWidth=\"2\" />\n </div>\n </div>\n </div>\n </div>\n ) : (\n <AssistantMassage\n parts={messageParts}\n messageId={m.id}\n openReasoningIds={openReasoningIds}\n toggleReasoning={toggleReasoning}\n resolvedColors={resolvedColors}\n HsafaUI={HsafaUI}\n onUIError={onUIError}\n onUISuccess={onUISuccess}\n addToolResult={addToolResult}\n />\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 React, { useState } from \"react\";\n\ntype ThemeColors = {\n textColor: string;\n mutedTextColor: string;\n borderColor: string;\n inputBackground: string;\n cardBackground: string;\n primaryColor: string;\n hoverBackground: string;\n};\n\ninterface PresetPromptsProps {\n prompts: Array<{ label: string; prompt: string }>;\n onSelect: (prompt: string) => void;\n resolvedColors: ThemeColors;\n disabled?: boolean;\n}\n\nexport function PresetPrompts({ \n prompts, \n onSelect, \n resolvedColors, \n disabled = false \n}: PresetPromptsProps) {\n const [expandedId, setExpandedId] = useState<number | null>(null);\n\n if (!prompts || prompts.length === 0) return null;\n\n return (\n <div style={{ \n padding: '12px 0',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px'\n }}>\n <div style={{\n fontSize: '12px',\n fontWeight: 600,\n color: resolvedColors.mutedTextColor,\n paddingLeft: '4px',\n textTransform: 'uppercase',\n letterSpacing: '0.5px'\n }}>\n Suggested Prompts\n </div>\n <div style={{ \n display: 'flex',\n flexDirection: 'column',\n gap: '8px'\n }}>\n {prompts.map((preset, index) => {\n const isExpanded = expandedId === index;\n const isLongPrompt = preset.prompt.length > 80;\n const truncatedPrompt = isLongPrompt && !isExpanded \n ? preset.prompt.slice(0, 80) + '...' \n : preset.prompt;\n\n return (\n <button\n key={index}\n onClick={() => {\n if (!disabled) {\n onSelect(preset.prompt);\n }\n }}\n disabled={disabled}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n padding: '12px',\n backgroundColor: resolvedColors.cardBackground,\n border: `1px solid ${resolvedColors.borderColor}`,\n borderRadius: '12px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s ease',\n textAlign: 'left',\n opacity: disabled ? 0.5 : 1,\n position: 'relative',\n overflow: 'hidden'\n }}\n onMouseEnter={(e) => {\n if (!disabled) {\n e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground;\n e.currentTarget.style.borderColor = resolvedColors.primaryColor;\n e.currentTarget.style.transform = 'translateX(2px)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = resolvedColors.cardBackground;\n e.currentTarget.style.borderColor = resolvedColors.borderColor;\n e.currentTarget.style.transform = 'translateX(0)';\n }}\n >\n {/* Label */}\n <div style={{\n fontSize: '13px',\n fontWeight: 600,\n color: resolvedColors.textColor,\n marginBottom: '6px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px'\n }}>\n <svg \n width=\"14\" \n height=\"14\" \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n stroke={resolvedColors.primaryColor}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ flexShrink: 0 }}\n >\n <path d=\"M12 20h9\"/>\n <path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\"/>\n </svg>\n {preset.label}\n </div>\n\n {/* Prompt text */}\n <div style={{\n fontSize: '12px',\n color: resolvedColors.mutedTextColor,\n lineHeight: '1.5',\n width: '100%',\n wordWrap: 'break-word',\n whiteSpace: 'pre-wrap'\n }}>\n {truncatedPrompt}\n </div>\n\n {/* Expand/Collapse button for long prompts */}\n {isLongPrompt && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n setExpandedId(isExpanded ? null : index);\n }}\n style={{\n marginTop: '8px',\n padding: '4px 8px',\n fontSize: '11px',\n color: resolvedColors.primaryColor,\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontWeight: 500\n }}\n >\n {isExpanded ? 'Show less' : 'Show more'}\n <svg \n width=\"10\" \n height=\"10\" \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n transform: isExpanded ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s'\n }}\n >\n <polyline points=\"6 9 12 15 18 9\"/>\n </svg>\n </button>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\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","import React from 'react';\nimport { createPortal } from 'react-dom';\nimport { ThemeColors } from '../../utils/chat-theme';\nimport { EditProcessContent } from '../../types/chat';\nimport { Pencil } from 'lucide-react';\nimport { IconWrapper } from '../IconWrapper';\n\ninterface ConfirmEditModalProps {\n isOpen: boolean;\n resolvedColors: ThemeColors;\n onConfirm: () => void;\n onCancel: () => void;\n editProcessContent?: EditProcessContent;\n}\n\nexport function ConfirmEditModal({\n isOpen,\n resolvedColors,\n onConfirm,\n onCancel,\n editProcessContent\n}: ConfirmEditModalProps) {\n if (!isOpen) return null;\n\n // Use custom content or defaults\n const title = editProcessContent?.title || 'Edit Message';\n const content = editProcessContent?.content || 'This will remove this message and all messages after it, and place its content in the input field for editing. Do you want to continue?';\n const submitButtonLabel = editProcessContent?.submit_button_label || 'Edit';\n const cancelButtonLabel = editProcessContent?.cancel_button_label || 'Cancel';\n const CustomIcon = editProcessContent?.icon;\n \n // Check if content is a React component or string\n const isContentComponent = typeof content === 'function';\n const ContentComponent = isContentComponent ? content as React.ComponentType<any> : 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={onCancel}\n />\n {/* Modal panel */}\n <div\n style={{\n position: 'fixed',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 1101,\n width: '420px',\n maxWidth: '94vw',\n overflow: 'hidden',\n borderRadius: '16px',\n border: `1px solid ${resolvedColors.borderColor}`,\n backgroundColor: resolvedColors.backgroundColor,\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n backdropFilter: 'blur(16px)',\n WebkitBackdropFilter: 'blur(16px)'\n }}\n >\n {/* Header */}\n <div style={{\n padding: '20px 24px',\n borderBottom: `1px solid ${resolvedColors.borderColor}`,\n display: 'flex',\n alignItems: 'center',\n gap: '12px'\n }}>\n {CustomIcon ? (\n <div style={{ flexShrink: 0 }}>\n <IconWrapper IconComponent={CustomIcon} size=\"20\" strokeWidth=\"2\" />\n </div>\n ) : (\n <div style={{ flexShrink: 0, color: resolvedColors.mutedTextColor }}>\n <IconWrapper IconComponent={Pencil} size=\"20\" strokeWidth=\"2\" />\n </div>\n )}\n <h3 style={{\n margin: 0,\n fontSize: '18px',\n fontWeight: '600',\n color: resolvedColors.textColor,\n flex: 1\n }}>\n {title}\n </h3>\n </div>\n\n {/* Content */}\n <div style={{\n padding: '24px',\n color: resolvedColors.textColor,\n fontSize: '14px',\n lineHeight: '1.6'\n }}>\n {isContentComponent && ContentComponent ? (\n <ContentComponent />\n ) : (\n <p style={{ margin: 0 }}>\n {content as string}\n </p>\n )}\n </div>\n\n {/* Actions */}\n <div style={{\n display: 'flex',\n gap: '12px',\n padding: '16px 24px',\n borderTop: `1px solid ${resolvedColors.borderColor}`,\n justifyContent: 'flex-end'\n }}>\n <button\n onClick={onCancel}\n style={{\n padding: '8px 16px',\n borderRadius: '8px',\n fontSize: '14px',\n fontWeight: '500',\n border: `1px solid ${resolvedColors.borderColor}`,\n backgroundColor: 'transparent',\n color: resolvedColors.textColor,\n cursor: 'pointer',\n transition: 'all 0.2s'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {cancelButtonLabel}\n </button>\n <button\n onClick={onConfirm}\n style={{\n padding: '8px 16px',\n borderRadius: '8px',\n fontSize: '14px',\n fontWeight: '500',\n border: 'none',\n backgroundColor: resolvedColors.primaryColor,\n color: resolvedColors.backgroundColor,\n cursor: 'pointer',\n transition: 'all 0.2s',\n opacity: 1\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '0.9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '1';\n }}\n >\n {submitButtonLabel}\n </button>\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","import React, { useState, useRef, useCallback, useEffect, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ChatHeader } from \"./hsafa-chat/ChatHeader\";\nimport { useFileUpload } from \"../hooks/useFileUploadHook\";\nimport { useAutoScroll } from \"../hooks/useAutoScroll\";\nimport { useHsafaAgent } from \"../hooks/useHsafaAgent\";\nimport { useChatStorage } from \"../hooks/useChatStorage\";\nimport { HsafaChatProps } from \"../types/chat\";\nimport { MessageList } from \"./hsafa-chat\";\nimport { ChatInput } from \"./hsafa-chat\";\nimport { PresetPrompts } from \"./hsafa-chat\";\nimport { createChatStorage } from \"../utils/chat-storage\";\nimport { ChatHistoryModal } from \"./hsafa-chat/ChatHistoryModal\";\nimport { ConfirmEditModal } from \"./hsafa-chat/ConfirmEditModal\";\nimport { useHsafa } from \"../providers/HsafaProvider\";\nimport { FloatingChatButton } from \"./FloatingChatButton\";\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 \n HsafaTools = {},\n HsafaUI = {},\n componentAboveInput,\n editProcessContent,\n presetPrompts,\n onStart,\n onFinish,\n currentChat,\n onChatChanged,\n templateParams,\n}: HsafaChatProps & { \n baseUrl?: string;\n initialMessages?: any[];\n onMessagesChange?: (messages: any[], chatId?: string) => void;\n HsafaUI?: Record<string, React.ComponentType<any>>;\n}) {\n const {\n dir: providerDir,\n theme: providerTheme,\n baseUrl: providerBaseUrl,\n setStreamingState,\n setChatOpenState,\n tools: providerTools,\n uiComponents: providerUI,\n } = 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' ? '#6f7276' : '#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 const mergedTools = useMemo(() => {\n const fromProvider = providerTools && providerTools.size > 0\n ? Object.fromEntries(providerTools.entries())\n : {};\n return {\n ...fromProvider,\n ...(HsafaTools || {}),\n };\n }, [HsafaTools, providerTools]);\n\n const mergedUI = useMemo(() => {\n const fromProvider = providerUI && providerUI.size > 0\n ? Object.fromEntries(providerUI.entries())\n : {};\n return {\n ...fromProvider,\n ...(HsafaUI || {}),\n };\n }, [HsafaUI, providerUI]);\n\n // Use the agent hook for all agent-related logic\n const agent = useHsafaAgent({\n agentId,\n baseUrl: effectiveBaseUrl,\n tools: mergedTools,\n uiComponents: mergedUI,\n templateParams,\n controlledChatId: currentChat,\n onChatIdChange: currentChat === undefined\n ? (id: string) => {\n if (onChatChanged) onChatChanged(id);\n }\n : undefined,\n onStart: useCallback((message: any) => {\n if (onStart) onStart(message);\n }, [onStart]),\n onFinish: useCallback((message: any) => {\n if (onFinish) onFinish(message);\n }, [onFinish]),\n onError: useCallback((error: Error) => {\n console.error('Chat error:', error);\n }, []),\n initialMessages,\n onMessagesChange,\n });\n\n // Destructure what we need from agent\n const {\n input,\n setInput,\n messages: chatMessages,\n isLoading,\n status,\n error: chatError,\n sendMessage,\n stop,\n setMessages,\n notifyMessagesChange,\n chatId: internalChatId,\n setChatId: setInternalChatId,\n tools: allTools,\n uiComponents: allUI,\n formHostRef,\n formStateRef,\n cleanupForms: cleanupAllForms,\n onUISuccess: handleUISuccess,\n onUIError: handleUIError,\n chatApi,\n } = agent;\n\n // Use controlled chatId if provided, otherwise use internal state\n const chatId = currentChat !== undefined ? currentChat : internalChatId;\n \n // Wrapper for setChatId that calls onChatChanged if provided\n const setChatId = useCallback((newChatId: string) => {\n if (currentChat === undefined) {\n // Uncontrolled mode: update internal state\n setInternalChatId(newChatId);\n }\n // Always notify parent if callback provided\n if (onChatChanged) {\n onChatChanged(newChatId);\n }\n }, [currentChat, setInternalChatId, onChatChanged]);\n\n // Sync internal chatId with controlled prop when it changes externally\n useEffect(() => {\n if (currentChat !== undefined && currentChat !== internalChatId) {\n setInternalChatId(currentChat);\n }\n }, [currentChat, internalChatId, setInternalChatId]);\n\n // File upload hook\n const {\n attachments,\n uploading,\n fileInputRef,\n formatBytes,\n handleRemoveAttachment,\n handleFileSelection,\n clearAttachments,\n setAttachments,\n } = useFileUpload(effectiveBaseUrl);\n\n const [uploadError, setUploadError] = useState<string | null>(null);\n\n // Hsafa provider integration and header/history state\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 [isConfirmEditOpen, setIsConfirmEditOpen] = useState(false);\n const [messageToEdit, setMessageToEdit] = useState<{ id: string; text: string; attachments: any[] } | null>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const scrollRef = useAutoScroll<HTMLDivElement>(isLoading);\n\n // Use chat storage hook for automatic persistence\n const chatStorage = useChatStorage({\n agentId,\n chatId,\n messages: chatMessages,\n isLoading,\n autoSave: true,\n autoRestore: false, // We handle restore manually to set chatId\n });\n \n // Keep reference to raw storage for UI preferences\n const storage = chatStorage.storage;\n \n // On mount: restore last opened chat and its messages (uncontrolled only)\n const restoredOnMountRef = useRef<boolean>(false);\n const lastLoadedChatRef = useRef<string | null>(null);\n \n useEffect(() => {\n if (restoredOnMountRef.current) return;\n if (currentChat !== undefined) {\n // Controlled mode: restore messages for the provided chatId without changing chatId\n try {\n const saved = storage.loadChat(currentChat);\n const msgs = (saved && Array.isArray((saved as any).messages)) ? (saved as any).messages : [];\n if (msgs.length > 0) { try { setMessages(msgs); } catch {} }\n lastLoadedChatRef.current = currentChat;\n } catch {}\n try { storage.saveCurrentChatId(currentChat); } catch {}\n restoredOnMountRef.current = true;\n return;\n }\n try {\n const savedId = storage.loadCurrentChatId();\n if (savedId) {\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 { setMessages(msgs); } catch {}\n lastLoadedChatRef.current = savedId;\n }\n } catch {}\n restoredOnMountRef.current = true;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentChat]);\n\n // In controlled mode: reload messages when currentChat changes (for switching)\n useEffect(() => {\n if (!restoredOnMountRef.current) return; // Wait for initial restore\n if (currentChat === undefined) return; // Only for controlled mode\n if (currentChat === lastLoadedChatRef.current) return; // Already loaded\n \n // Chat switched: load new chat's messages\n try {\n const saved = storage.loadChat(currentChat);\n const msgs = (saved && Array.isArray((saved as any).messages)) ? (saved as any).messages : [];\n try { setMessages(msgs); } catch {}\n lastLoadedChatRef.current = currentChat;\n try { storage.saveCurrentChatId(currentChat); } catch {}\n } catch {}\n }, [currentChat, storage, setMessages]);\n\n // After restore: persist current chatId so it is used on next reload\n useEffect(() => {\n if (!restoredOnMountRef.current) return;\n try { storage.saveCurrentChatId(chatId); } catch {}\n }, [chatId, 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 // Capture current state before clearing\n const currentAttachments = [...attachments];\n\n // Clear input and attachments immediately for better UX\n setInput('');\n clearAttachments();\n setUploadError(null);\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: currentAttachments.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 } 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 try { setMessages([]); } catch {}\n const newId = `chat_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n // Reset the loaded chat ref so the new chat is tracked\n lastLoadedChatRef.current = newId;\n // Use storage hook to mark a new chat session; actual metadata is created on first send\n try {\n chatStorage.createNewChat(() => {\n setChatId(newId);\n try { storage.saveCurrentChatId(newId); } catch {}\n });\n } catch {\n // Fallback: still set id to avoid being stuck\n setChatId(newId);\n try { storage.saveCurrentChatId(newId); } catch {}\n }\n }, [isLoading, clearAttachments, storage, setMessages, setChatId, cleanupAllForms, chatStorage]);\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\n const handleUserMessageClick = useCallback((message: any, id: string, text: string, attachments?: any[]) => {\n setMessageToEdit({ id, text, attachments: attachments || [] });\n setIsConfirmEditOpen(true);\n }, []);\n\n const handleConfirmEdit = useCallback(() => {\n if (!messageToEdit || isLoading) return;\n \n try {\n // Find the message index\n const messageIndex = chatMessages.findIndex((m: any) => m.id === messageToEdit.id);\n if (messageIndex === -1) return;\n\n // Remove messages from the edited message onwards\n const updatedMessages = chatMessages.slice(0, messageIndex);\n try { setMessages(updatedMessages); } catch {}\n \n // Set the message content in the main input\n setInput(messageToEdit.text);\n \n // Set the message attachments in the main input\n setAttachments(messageToEdit.attachments);\n \n // Close modal and reset state\n setIsConfirmEditOpen(false);\n setMessageToEdit(null);\n \n // Notify about messages change after edit\n notifyMessagesChange();\n } catch (error) {\n console.error('Failed to edit message:', error);\n setUploadError('Failed to edit message. Please try again.');\n }\n }, [messageToEdit, isLoading, chatMessages, setMessages, setAttachments, notifyMessagesChange]);\n\n const handleCancelEdit = useCallback(() => {\n setIsConfirmEditOpen(false);\n setMessageToEdit(null);\n }, []);\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')+2}\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 display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n padding: '16px 0'\n }}>\n {presetPrompts && presetPrompts.length > 0 ? (\n <PresetPrompts\n prompts={presetPrompts}\n onSelect={(prompt) => setInput(prompt)}\n resolvedColors={resolvedColors as any}\n disabled={isLoading}\n />\n ) : (\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 </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 HsafaUI={allUI}\n onUIError={handleUIError}\n onUISuccess={handleUISuccess}\n addToolResult={(payload: any) => (chatApi as any)?.addToolResult?.(payload)}\n editableMessageIcon={editProcessContent?.message_icon}\n />\n )}\n </div>\n\n \n\n {/* ChatInput */}\n <div style={{ position: 'sticky', bottom: '0', marginTop: 'auto', paddingBottom: '8px', }}>\n {/* Component Above Input */}\n {componentAboveInput && React.createElement(componentAboveInput, {})}\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 as 'ready' | 'streaming' | 'submitted' | 'error' | undefined}\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 cleanupAllForms();\n setChatId(id);\n // In controlled mode, messages will be loaded by the effect above\n // In uncontrolled mode, load messages here\n if (currentChat === undefined) {\n try { storage.saveCurrentChatId(id); } catch {}\n try {\n const saved = storage.loadChat(id);\n const msgs = (saved && Array.isArray((saved as any).messages)) ? (saved as any).messages : [];\n try { setMessages(msgs); } catch {}\n } catch {}\n }\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 {/* Confirm Edit Modal */}\n <ConfirmEditModal\n isOpen={isConfirmEditOpen}\n resolvedColors={resolvedColors as any}\n onConfirm={handleConfirmEdit}\n onCancel={handleCancelEdit}\n editProcessContent={editProcessContent}\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","type FileHandleWritable = FileSystemFileHandle & {\n createWritable: () => Promise<FileSystemWritableFileStream>;\n};\n\ntype NavigatorWithOpfs = Navigator & {\n storage?: {\n getDirectory?: () => Promise<FileSystemDirectoryHandle>;\n };\n};\n\nconst nav: NavigatorWithOpfs | undefined =\n typeof navigator !== 'undefined' ? (navigator as unknown as NavigatorWithOpfs) : undefined;\n\nexport function isOpfsAvailable(): boolean {\n return Boolean(nav?.storage?.getDirectory);\n}\n\nexport async function getOpfsRootDir(): Promise<FileSystemDirectoryHandle | null> {\n if (!isOpfsAvailable() || !nav?.storage?.getDirectory) return null;\n try {\n return await nav.storage.getDirectory();\n } catch {\n return null;\n }\n}\n\nexport async function getOrCreateDirectory(\n parent: FileSystemDirectoryHandle,\n name: string\n): Promise<FileSystemDirectoryHandle> {\n return await parent.getDirectoryHandle(name, { create: true });\n}\n\nexport async function getOrCreateFile(\n parent: FileSystemDirectoryHandle,\n name: string\n): Promise<FileSystemFileHandle> {\n return await parent.getFileHandle(name, { create: true });\n}\n\nexport async function fileExists(parent: FileSystemDirectoryHandle, name: string): Promise<boolean> {\n try {\n await parent.getFileHandle(name, { create: false });\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function writeTextFile(handle: FileSystemFileHandle, text: string): Promise<void> {\n const writable = await (handle as FileHandleWritable).createWritable();\n await writable.write(new Blob([text], { type: 'application/json' }));\n await writable.close();\n}\n\nexport async function readTextFile(handle: FileSystemFileHandle): Promise<string> {\n const file = await handle.getFile();\n return await file.text();\n}\n","import {\n fileExists,\n getOpfsRootDir,\n isOpfsAvailable,\n readTextFile,\n writeTextFile,\n} from './opfs';\n\nfunction isFileSystemDirectoryHandle(handle: FileSystemHandle): handle is FileSystemDirectoryHandle {\n return handle.kind === 'directory';\n}\n\ntype DirectoryHandleWithEntries = FileSystemDirectoryHandle & {\n entries: () => AsyncIterableIterator<[string, FileSystemHandle]>;\n};\n\nexport type HsafaArtifactStoreBackend = 'opfs' | 'localStorage';\n\nexport interface HsafaArtifactStoreConfig<T> {\n namespace: string;\n serialize?: (value: T) => string;\n deserialize?: (raw: string) => T;\n storageOrder?: HsafaArtifactStoreBackend[];\n legacyDecode?: (\n raw: string\n ) =>\n | {\n value: T;\n chatId: string;\n versionId: string;\n updatedAt?: string;\n }\n | null;\n}\n\nexport interface HsafaArtifactStore<T> {\n saveLatest: (chatId: string, value: T) => Promise<void>;\n loadLatest: (chatId: string) => Promise<T | null>;\n saveVersion: (chatId: string, versionId: string, value: T) => Promise<void>;\n loadVersion: (chatId: string, versionId: string) => Promise<T | null>;\n hasVersion: (chatId: string, versionId: string) => Promise<boolean>;\n findMostRecentChatId: () => Promise<string | null>;\n}\n\ntype StoredArtifactRecord = {\n chatId: string;\n versionId: string;\n updatedAt: string;\n data: string;\n};\n\nfunction safeJsonParse<T>(raw: string): T | null {\n try {\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\nfunction createLocalStorageKeys(namespace: string) {\n const prefix = `hsafa:${namespace}`;\n return {\n latest: (chatId: string) => `${prefix}:${chatId}:latest`,\n version: (chatId: string, versionId: string) => `${prefix}:${chatId}:versions:${versionId}`,\n latestPrefix: `${prefix}:`,\n };\n}\n\nasync function getDirectory(\n parent: FileSystemDirectoryHandle,\n name: string,\n create: boolean\n): Promise<FileSystemDirectoryHandle | null> {\n try {\n return await parent.getDirectoryHandle(name, { create });\n } catch {\n return null;\n }\n}\n\nasync function readOpfsFile(handle: FileSystemDirectoryHandle, fileName: string): Promise<string | null> {\n try {\n const fileHandle = await handle.getFileHandle(fileName, { create: false });\n return await readTextFile(fileHandle);\n } catch {\n return null;\n }\n}\n\nasync function writeOpfsFile(handle: FileSystemDirectoryHandle, fileName: string, text: string): Promise<boolean> {\n try {\n const fileHandle = await handle.getFileHandle(fileName, { create: true });\n await writeTextFile(fileHandle, text);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function createHsafaArtifactStore<T>(config: HsafaArtifactStoreConfig<T>): HsafaArtifactStore<T> {\n const {\n namespace,\n serialize = (value: T) => JSON.stringify(value),\n deserialize = (raw: string) => JSON.parse(raw) as T,\n storageOrder = ['opfs', 'localStorage'],\n legacyDecode,\n } = config;\n\n const keys = createLocalStorageKeys(namespace);\n\n const encodeRecord = (chatId: string, versionId: string, value: T): string => {\n const record: StoredArtifactRecord = {\n chatId,\n versionId,\n updatedAt: new Date().toISOString(),\n data: serialize(value),\n };\n return JSON.stringify(record);\n };\n\n const decodeRecord = (raw: string): { value: T; record: StoredArtifactRecord } | null => {\n const record = safeJsonParse<StoredArtifactRecord>(raw);\n if (record && typeof record.chatId === 'string' && typeof record.versionId === 'string') {\n if (typeof record.updatedAt !== 'string' || typeof record.data !== 'string') return null;\n\n try {\n const value = deserialize(record.data);\n return { value, record };\n } catch {\n return null;\n }\n }\n\n if (legacyDecode) {\n try {\n const legacy = legacyDecode(raw);\n if (!legacy) return null;\n if (typeof legacy.chatId !== 'string' || typeof legacy.versionId !== 'string') return null;\n\n const normalized: StoredArtifactRecord = {\n chatId: legacy.chatId,\n versionId: legacy.versionId,\n updatedAt: typeof legacy.updatedAt === 'string' ? legacy.updatedAt : new Date().toISOString(),\n data: serialize(legacy.value),\n };\n\n return { value: legacy.value, record: normalized };\n } catch {\n return null;\n }\n }\n\n return null;\n };\n\n const saveLatest = async (chatId: string, value: T): Promise<void> => {\n const raw = encodeRecord(chatId, '__latest', value);\n\n for (const backend of storageOrder) {\n if (backend === 'opfs') {\n if (!isOpfsAvailable()) continue;\n const root = await getOpfsRootDir();\n if (!root) continue;\n\n const nsDir = await getDirectory(root, namespace, true);\n if (!nsDir) continue;\n\n const chatDir = await getDirectory(nsDir, chatId, true);\n if (!chatDir) continue;\n\n const ok = await writeOpfsFile(chatDir, 'latest.json', raw);\n if (ok) return;\n }\n\n if (backend === 'localStorage') {\n try {\n localStorage.setItem(keys.latest(chatId), raw);\n return;\n } catch {\n continue;\n }\n }\n }\n };\n\n const loadLatest = async (chatId: string): Promise<T | null> => {\n for (const backend of storageOrder) {\n if (backend === 'opfs') {\n if (!isOpfsAvailable()) continue;\n const root = await getOpfsRootDir();\n if (!root) continue;\n\n const nsDir = await getDirectory(root, namespace, false);\n if (!nsDir) continue;\n\n const chatDir = await getDirectory(nsDir, chatId, false);\n if (!chatDir) continue;\n\n const raw = await readOpfsFile(chatDir, 'latest.json');\n if (!raw) continue;\n const decoded = decodeRecord(raw);\n if (!decoded) continue;\n return decoded.value;\n }\n\n if (backend === 'localStorage') {\n try {\n const raw = localStorage.getItem(keys.latest(chatId));\n if (!raw) continue;\n const decoded = decodeRecord(raw);\n if (!decoded) continue;\n return decoded.value;\n } catch {\n continue;\n }\n }\n }\n\n return null;\n };\n\n const saveVersion = async (chatId: string, versionId: string, value: T): Promise<void> => {\n const raw = encodeRecord(chatId, versionId, value);\n\n for (const backend of storageOrder) {\n if (backend === 'opfs') {\n if (!isOpfsAvailable()) continue;\n const root = await getOpfsRootDir();\n if (!root) continue;\n\n const nsDir = await getDirectory(root, namespace, true);\n if (!nsDir) continue;\n\n const chatDir = await getDirectory(nsDir, chatId, true);\n if (!chatDir) continue;\n\n const versionsDir = await getDirectory(chatDir, 'versions', true);\n if (!versionsDir) continue;\n\n const okVersion = await writeOpfsFile(versionsDir, `${versionId}.json`, raw);\n if (!okVersion) continue;\n\n const okLatest = await writeOpfsFile(chatDir, 'latest.json', raw);\n if (okLatest) return;\n }\n\n if (backend === 'localStorage') {\n try {\n localStorage.setItem(keys.version(chatId, versionId), raw);\n localStorage.setItem(keys.latest(chatId), raw);\n return;\n } catch {\n continue;\n }\n }\n }\n };\n\n const loadVersion = async (chatId: string, versionId: string): Promise<T | null> => {\n for (const backend of storageOrder) {\n if (backend === 'opfs') {\n if (!isOpfsAvailable()) continue;\n const root = await getOpfsRootDir();\n if (!root) continue;\n\n const nsDir = await getDirectory(root, namespace, false);\n if (!nsDir) continue;\n\n const chatDir = await getDirectory(nsDir, chatId, false);\n if (!chatDir) continue;\n\n const versionsDir = await getDirectory(chatDir, 'versions', false);\n if (!versionsDir) continue;\n\n const raw = await readOpfsFile(versionsDir, `${versionId}.json`);\n if (!raw) continue;\n\n const decoded = decodeRecord(raw);\n if (!decoded) continue;\n\n return decoded.value;\n }\n\n if (backend === 'localStorage') {\n try {\n const raw = localStorage.getItem(keys.version(chatId, versionId));\n if (!raw) continue;\n const decoded = decodeRecord(raw);\n if (!decoded) continue;\n return decoded.value;\n } catch {\n continue;\n }\n }\n }\n\n return null;\n };\n\n const hasVersion = async (chatId: string, versionId: string): Promise<boolean> => {\n for (const backend of storageOrder) {\n if (backend === 'opfs') {\n if (!isOpfsAvailable()) continue;\n const root = await getOpfsRootDir();\n if (!root) continue;\n\n const nsDir = await getDirectory(root, namespace, false);\n if (!nsDir) continue;\n\n const chatDir = await getDirectory(nsDir, chatId, false);\n if (!chatDir) continue;\n\n const versionsDir = await getDirectory(chatDir, 'versions', false);\n if (!versionsDir) continue;\n\n const exists = await fileExists(versionsDir, `${versionId}.json`);\n if (exists) return true;\n }\n\n if (backend === 'localStorage') {\n try {\n const exists = localStorage.getItem(keys.version(chatId, versionId)) != null;\n if (exists) return true;\n } catch {\n continue;\n }\n }\n }\n\n return false;\n };\n\n const findMostRecentChatId = async (): Promise<string | null> => {\n for (const backend of storageOrder) {\n if (backend === 'opfs') {\n if (!isOpfsAvailable()) continue;\n const root = await getOpfsRootDir();\n if (!root) continue;\n\n const nsDir = await getDirectory(root, namespace, false);\n if (!nsDir) continue;\n\n let bestChatId: string | null = null;\n let bestTime = 0;\n\n try {\n const entries = (nsDir as DirectoryHandleWithEntries).entries?.();\n if (!entries) continue;\n\n for await (const [name, handle] of entries) {\n if (!isFileSystemDirectoryHandle(handle)) continue;\n\n const chatDir = handle;\n const raw = await readOpfsFile(chatDir, 'latest.json');\n if (!raw) continue;\n\n const decoded = decodeRecord(raw);\n if (!decoded) continue;\n\n const t = Date.parse(decoded.record.updatedAt);\n if (!Number.isNaN(t) && t > bestTime) {\n bestTime = t;\n bestChatId = decoded.record.chatId || name;\n }\n }\n\n if (bestChatId) return bestChatId;\n } catch {\n continue;\n }\n }\n\n if (backend === 'localStorage') {\n try {\n let bestChatId: string | null = null;\n let bestTime = 0;\n\n for (let i = 0; i < localStorage.length; i++) {\n const k = localStorage.key(i);\n if (!k) continue;\n if (!k.startsWith(keys.latestPrefix) || !k.endsWith(':latest')) continue;\n\n const raw = localStorage.getItem(k);\n if (!raw) continue;\n\n const decoded = decodeRecord(raw);\n if (!decoded) continue;\n\n const t = Date.parse(decoded.record.updatedAt);\n if (!Number.isNaN(t) && t > bestTime) {\n bestTime = t;\n bestChatId = decoded.record.chatId;\n }\n }\n\n if (bestChatId) return bestChatId;\n } catch {\n continue;\n }\n }\n }\n\n return null;\n };\n\n return {\n saveLatest,\n loadLatest,\n saveVersion,\n loadVersion,\n hasVersion,\n findMostRecentChatId,\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/providers/HsafaProvider.tsx","../src/hooks/useFileUploadHook.ts","../src/components/hsafa-chat/utils/transport.ts","../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/hsafa-chat/utils/builtInTools.ts","../src/components/XMarkdownRenderer.tsx","../src/components/hsafa-chat/utils/builtInUI.tsx","../src/components/hsafa-chat/utils/renderUserForm.ts","../src/components/hsafa-chat/hooks/useStreamingToolInput.ts","../src/hooks/useHsafaAgent.ts","../src/utils/chat-storage.ts","../src/hooks/useChatStorage.ts","../src/hooks/useMessageEditor.ts","../src/hooks/useHsafaActiveChatId.ts","../src/hooks/useChatArtifact.ts","../src/hooks/useChatArtifactVersioning.ts","../src/hooks/useHsafaTools.ts","../src/components/IconWrapper.tsx","../src/components/IconButton.tsx","../src/components/hsafa-chat/ChatHeader.tsx","../src/components/hsafa-chat/UIErrorBoundary.tsx","../src/components/hsafa-chat/AssistantMassage.tsx","../src/utils/file.ts","../src/components/AttachmentItem.tsx","../src/components/AttachmentDisplay.tsx","../src/components/hsafa-chat/MessageList.tsx","../src/components/hsafa-chat/ChatInput.tsx","../src/components/hsafa-chat/PresetPrompts.tsx","../src/utils/time.ts","../src/components/hsafa-chat/ChatHistoryModal.tsx","../src/components/hsafa-chat/ConfirmEditModal.tsx","../src/components/HsafaChat.tsx","../src/utils/chat-theme.ts","../src/components/ContentContainer.tsx","../src/utils/opfs.ts","../src/utils/artifact-store.ts","../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","HsafaContext","createContext","HsafaProvider","dir","theme","initialTools","initialUIComponents","actions","setActions","useState","components","setComponents","tools","setTools","uiComponents","setUIComponents","streamingStates","setStreamingStates","chatOpenStates","setChatOpenStates","currentChatId","setCurrentChatId","registerAction","useCallback","name","handler","prev","next","existing","unregisterAction","registerComponent","component","unregisterComponent","registerTool","tool","unregisterTool","registerUIComponent","unregisterUIComponent","setStreamingState","chatId","isStreaming","setChatOpenState","isOpen","isAnyStreaming","useMemo","state","isAnyChatOpen","value","useHsafa","ctx","useContext","MAX_UPLOAD_SIZE","useFileUpload","providerBaseUrl","effectiveBaseUrl","attachments","setAttachments","uploading","setUploading","fileInputRef","formatBytes","bytes","units","exponent","uploadAttachment","file","formData","response","text","data","handleRemoveAttachment","id","att","handleFileSelection","fileList","setError","files","uploaded","attachment","err","buildUserContent","parts","t","mt","clearAttachments","createHsafaTransport","agentId","templateParams","DefaultChatTransport","input","init","reqInit","body","mergedParams","enhancedBody","isVisible","style","getElementLabel","label","parentLabel","clone","getElementText","getElementValue","type","opt","getUniqueSelector","current","selector","classes","c","parent","siblings","child","index","getDomComponents","options","includeHidden","what","limit","contentContainer","searchScope","selectors","visible","importance","total","maxItems","truncated","limited","error","guideCursor","target","cursorGuide","isHTMLElement","n","dispatch","setTextLike","setter","setCheckbox","setSelectSingle","i","o","setSelectMultiple","values","setVals","coerceDate","v","setFiles","list","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","start","scrollableElements","getScrollPositions","positions","getTargetPos","rect","lastScrollPos","lastTargetPos","lastChange","resolve","tick","now","curScrollPos","curTargetPos","changed","DEFAULT_ARROW_SVG","DEFAULT_POINTER_SVG","loadCursorSvgs","CursorVisual","arrowSvg","pointerSvg","Fragment","getOrCreateCursor","svgs","styleId","createRoot","clamp","min","max","easeInOutCubic","cssColorToRgba","css","m","r","g","relativeLuminance","srgb","isDarkColor","rgba","getEffectiveBackgroundAtPoint","x","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","k","u","wobbleAmp","applyOffset","p","offset","dispatchMouseLike","point","extra","common","isDown","isUp","enriched","ev","isElement","obj","resolveWithin","within","byId","q","resolveTarget","all","idx","getAnchoredPoint","anchor","ax","ay","clampToViewport","CursorController","stepsOrTarget","steps","results","curX","curY","s","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","createBuiltInTools","res","last","clicked","act","_","XMarkdownRenderer","content","streaming","XMarkdown","PlainText","createBuiltInUI","renderOrUpdateUserForm","toolCallId","hosts","states","addToolResult","colors","currentParent","toolHost","title","description","submitLabel","skipLabel","fields","existingState","form","h","wrap","lab","inputEl","fieldId","savedVal","trimmedSubmit","trimmedSkip","showActions","submitBtn","skipBtn","status","badge","isRecord","useStreamingToolInput","chatMessages","allTools","lastProcessedInputRef","lastProcessedStateRef","toolCallCounterRef","allToolsRef","renderOrUpdateUserFormRef","message","part","toolName","partType","toolConfig","lastState","toolInput","tc","currentInput","lastInput","newCount","useHsafaAgent","config","configBaseUrl","customTools","customUIComponents","onStart","onFinish","onError","initialMessages","onMessagesChange","controlledChatId","onChatIdChange","setInput","internalChatId","setInternalChatId","setChatId","newChatId","transport","onFinishCallback","payload","assistantMessageId","onErrorCallback","builtInTools","builtInUI","allUI","formHostRef","formStateRef","cleanupAllForms","chatApiRef","pendingUIToolsRef","handleUIError","handleUISuccess","getToolFunction","chatApi","useChat","lastAssistantMessageIsCompleteWithToolCalls","toolCall","toolFn","isUiTool","toolNameIsUIComponent","result","sendMessage","stop","chatError","seenIds","pendingRenders","out","hydrated","inVal","key","node","raf","isLoading","notifyMessagesChange","handleSendMessage","messageText","messageFiles","trimmedInput","userMessage","handleNewChat","newId","handleSetMessages","messages","createChatStorage","LS_PREFIX","chatsIndexKey","chatKey","currentChatKey","showChatKey","loadChatsIndex","raw","saveChatsIndex","loadChat","saveChat","upsertChatMeta","meta","deleteChatMeta","deleteChatData","defaultValue","savedShow","useChatStorage","autoSave","autoRestore","storage","chatList","setChatList","currentChatMeta","setCurrentChatMeta","createdChatRef","restoredOnMountRef","refreshChatList","chats","found","firstUser","titleSource","textPart","wasLoadingRef","chat","saveCurrentChat","deleteChat","switchToChat","setMessages","saved","msgs","createNewChat","onNewChat","searchChats","query","lowerQuery","useMessageEditor","editingMessageId","setEditingMessageId","editingText","setEditingText","editAttachments","setEditAttachments","editUploading","setEditUploading","startEdit","messageId","cancelEdit","saveEdit","messageIndex","updatedMessages","isEditing","addEditAttachments","uploadPromises","newAttachments","removeEditAttachment","safeLoadChatIdFromStorage","useHsafaActiveChatId","prefer","storageChatId","setStorageChatId","storageReady","setStorageReady","ctxId","preferredId","preferredSource","useChatArtifact","initial","store","autoLoad","saveDebounceMs","active","resolvedChatId","setValue","setStatus","hydratedRef","lastChatIdRef","saveTimerRef","pendingSavePromiseRef","cancelPendingSave","doSave","flushSave","reload","loaded","cancelled","getAssistantMessageIdFromPayload","getChatIdFromPayload","getAssistantMessageIds","ids","getMessageRole","getMessageContentSignature","useChatArtifactVersioning","valueRef","prevMessagesRef","restoreSeqRef","cbChatId","prevArr","minLen","commonPrefixLen","pId","nId","pRole","nRole","isAppend","lastPrevRole","lastNextRole","isTailRewriteOnly","wasTruncated","wasRewritten","wasContentEdited","pSig","nSig","restoreSeq","assistantIds","version","useHsafaTools","setState","stateRef","At","get","set","updater","toolsRef","toolsFactoryRef","IconWrapper","IconComponent","React","IconButton","icon","ariaLabel","ChatHeader","alwaysOpen","onNew","onToggleHistory","onClose","historyBtnRef","Plus","History","ChevronRight","UIErrorBoundary","Component","onSuccess","errorInfo","componentName","getToolStatus","statusMap","parseMCPToolName","fullToolName","mcpPattern","match","originalToolName","formatToolName","char","AssistantMassage","openReasoningIds","toggleReasoning","HsafaUI","onUIError","onUISuccess","groups","currentReasonings","reasoningStartDate","reasoningEndDate","reasoningCompleted","it","isDynamicTool","isPrefixedTool","derivedToolName","itemId","isCompleted","hasText","handleClick","i2","isStreamingText","color","isRunning","UIByToolName","parsedTool","AttachmentItem","mode","onRemove","maxWidth","isImage","isEditable","isLink","containerStyle","fileIcon","File","Eye","X","Download","AttachmentDisplay","MessageList","onUserMessageClick","editableMessageIcon","messageParts","messageAttachments","imgUrl","Pencil","ChatInput","textareaRef","onFileInputChange","onSend","onStop","canStop","hasMessages","PresetPrompts","prompts","onSelect","expandedId","setExpandedId","preset","isExpanded","isLongPrompt","truncatedPrompt","timeAgo","ts","diff","d","w","months","ChatHistoryModal","historyOpen","historySearch","refreshKey","onSearchChange","onChatSelect","onChatDelete","historyPopupRef","modalContent","Trash2","createPortal","ConfirmEditModal","onConfirm","onCancel","editProcessContent","submitButtonLabel","cancelButtonLabel","CustomIcon","isContentComponent","ContentComponent","HsafaChat","primaryColor","primaryColorDark","primaryColorLight","backgroundColor","borderColor","textColor","accentColor","defaultOpen","HsafaTools","componentAboveInput","presetPrompts","currentChat","onChatChanged","providerDir","providerTheme","providerTools","providerUI","effectiveTheme","mergedTools","mergedUI","agent","uploadError","setUploadError","setIsOpen","setHistoryOpen","setHistorySearch","historyRefreshKey","setHistoryRefreshKey","setOpenReasoningIds","isConfirmEditOpen","setIsConfirmEditOpen","messageToEdit","setMessageToEdit","scrollRef","chatStorage","lastLoadedChatRef","savedId","currentAttachments","handleToggleHistory","handleClose","textarea","newHeight","handleUserMessageClick","handleConfirmEdit","handleCancelEdit","panel","prompt","themeColors","ContentContainer","mutedTextColor","enableBorderAnimation","borderRadius","enableContentBorder","enableMargin","chatWidth","effectiveDir","componentId","isMounted","setIsMounted","timeout","themeColorScheme","contentBorderRadius","chatWidthPx","marginStyle","containerWidth","nav","isOpfsAvailable","getOpfsRootDir","fileExists","writeTextFile","handle","writable","readTextFile","isFileSystemDirectoryHandle","safeJsonParse","createLocalStorageKeys","namespace","prefix","versionId","getDirectory","create","readOpfsFile","fileName","fileHandle","writeOpfsFile","createHsafaArtifactStore","serialize","deserialize","storageOrder","legacyDecode","keys","encodeRecord","record","decodeRecord","legacy","normalized","backend","root","nsDir","chatDir","decoded","versionsDir","bestChatId","bestTime","entries","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 React, { createContext, useCallback, useContext, useMemo, useState } from \"react\";\nimport type { HsafaTool } from \"../types/chat\";\n\n/**\n * Handler function for custom actions that can be triggered by the AI agent\n */\nexport type HsafaActionHandler = (params: unknown, 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<unknown> | unknown;\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<Record<string, unknown>>>;\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<Record<string, unknown>>) => () => void;\n /** Unregister a custom component */\n unregisterComponent: (name: string, component?: React.ComponentType<Record<string, unknown>>) => 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 /** Currently active chat id (set by HsafaChat) */\n currentChatId?: string;\n /** Setter for current chat id */\n setCurrentChatId: (chatId: string) => void;\n\n tools: Map<string, HsafaTool>;\n uiComponents: Map<string, React.ComponentType<Record<string, unknown>>>;\n registerTool: (name: string, tool: HsafaTool) => () => void;\n unregisterTool: (name: string, tool?: HsafaTool) => void;\n registerUIComponent: (name: string, component: React.ComponentType<Record<string, unknown>>) => () => void;\n unregisterUIComponent: (name: string, component?: React.ComponentType<Record<string, unknown>>) => 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 tools?: Record<string, HsafaTool>;\n uiComponents?: Record<string, React.ComponentType<Record<string, unknown>>>;\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, tools: initialTools, uiComponents: initialUIComponents }: HsafaProviderProps) {\n const [actions, setActions] = useState<Map<string, HsafaActionHandler>>(new Map());\n const [components, setComponents] = useState<Map<string, React.ComponentType<Record<string, unknown>>>>(new Map());\n const [tools, setTools] = useState<Map<string, HsafaTool>>(() => new Map(Object.entries(initialTools || {})));\n const [uiComponents, setUIComponents] = useState<Map<string, React.ComponentType<Record<string, unknown>>>>(() => new Map(Object.entries(initialUIComponents || {})));\n const [streamingStates, setStreamingStates] = useState<Map<string, boolean>>(new Map());\n const [chatOpenStates, setChatOpenStates] = useState<Map<string, boolean>>(new Map());\n const [currentChatId, setCurrentChatId] = useState<string | undefined>(undefined);\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<Record<string, unknown>>) => {\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<Record<string, unknown>>) => {\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 registerTool = useCallback((name: string, tool: HsafaTool) => {\n setTools(prev => {\n const next = new Map(prev);\n next.set(String(name), tool);\n return next;\n });\n return () => {\n setTools(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!tool || existing === tool) next.delete(String(name));\n return next;\n });\n };\n }, []);\n\n const unregisterTool = useCallback((name: string, tool?: HsafaTool) => {\n setTools(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!tool || existing === tool) next.delete(String(name));\n return next;\n });\n }, []);\n\n const registerUIComponent = useCallback((name: string, component: React.ComponentType<Record<string, unknown>>) => {\n setUIComponents(prev => {\n const next = new Map(prev);\n next.set(String(name), component);\n return next;\n });\n return () => {\n setUIComponents(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 unregisterUIComponent = useCallback((name: string, component?: React.ComponentType<Record<string, unknown>>) => {\n setUIComponents(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 next.set(chatId, isOpen);\n return next;\n });\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 tools,\n uiComponents,\n registerAction,\n unregisterAction,\n registerComponent,\n unregisterComponent,\n registerTool,\n unregisterTool,\n registerUIComponent,\n unregisterUIComponent,\n isAnyStreaming,\n setStreamingState,\n isAnyChatOpen,\n setChatOpenState,\n currentChatId,\n setCurrentChatId,\n }), [baseUrl, dir, theme, actions, components, tools, uiComponents, registerAction, unregisterAction, registerComponent, unregisterComponent, registerTool, unregisterTool, registerUIComponent, unregisterUIComponent, isAnyStreaming, setStreamingState, isAnyChatOpen, setChatOpenState, currentChatId]);\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 * 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 tools: new Map(),\n uiComponents: new Map(),\n registerAction: () => () => undefined,\n unregisterAction: () => undefined,\n registerComponent: () => () => undefined,\n unregisterComponent: () => undefined,\n registerTool: () => () => undefined,\n unregisterTool: () => undefined,\n registerUIComponent: () => () => undefined,\n unregisterUIComponent: () => undefined,\n isAnyStreaming: false,\n setStreamingState: () => undefined,\n isAnyChatOpen: false,\n setChatOpenState: () => undefined,\n currentChatId: undefined,\n setCurrentChatId: () => undefined,\n };\n return ctx;\n}\n","import { useState, useRef, useCallback } from 'react';\nimport { Attachment } from '../types/chat';\nimport { joinUrl } from '../utils/file-upload';\nimport { useHsafa } from '../providers/HsafaProvider';\n\nconst MAX_UPLOAD_SIZE = 25 * 1024 * 1024; // 25MB\n\nexport function useFileUpload(baseUrl?: string) {\n const { baseUrl: providerBaseUrl } = useHsafa();\n const effectiveBaseUrl = baseUrl || providerBaseUrl || '';\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(effectiveBaseUrl, '/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 }, [effectiveBaseUrl]);\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 setAttachments,\n MAX_UPLOAD_SIZE\n };\n}\n","import { DefaultChatTransport } from \"ai\";\n\nexport function createHsafaTransport(\n baseUrl: string,\n agentId: string,\n chatId: string,\n templateParams?: Record<string, unknown>\n) {\n console.log('🚀 [SDK] createHsafaTransport called with templateParams:', templateParams);\n return new DefaultChatTransport({\n api: `${baseUrl}/api/run/${agentId}`,\n fetch: async (input: unknown, init?: unknown) => {\n const reqInit = (init as { body?: any }) || {};\n const body = reqInit?.body ? JSON.parse(reqInit.body as string) : {};\n const mergedParams = templateParams && typeof templateParams === 'object' ? templateParams : {};\n console.log('🚀 [SDK] Before merge - body:', body);\n console.log('🚀 [SDK] Before merge - mergedParams:', mergedParams);\n const enhancedBody = { ...mergedParams, ...body, chatId } as Record<string, unknown>;\n console.log('🚀 [SDK] After merge - enhancedBody:', enhancedBody);\n return fetch(input as any, { ...(init as any), body: JSON.stringify(enhancedBody) });\n },\n });\n}\n\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 { getDomComponents, guideCursor, FillActiveInput } from \"../../web-controler\";\n\nexport function createBuiltInTools() {\n return {\n getDomComponents: {\n tool: async ({ includeHidden, selector }: any) => {\n return await getDomComponents({ includeHidden, selector });\n },\n executeEachToken: false,\n },\n controlCursor: {\n tool: async ({ target, action, anchor, durationMs, dragTo }: any) => {\n const res = await guideCursor(target, { action, anchor, durationMs, dragTo });\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 { success: true, message: act === 'click' ? `Cursor moved and clicked successfully${clicked}` : act === 'drag' ? `Cursor dragged successfully` : `Cursor moved successfully`, details: res };\n }\n return { success: false, message: 'Cursor action failed', details: res };\n },\n executeEachToken: false,\n },\n fillActiveInput: {\n tool: async ({ value }: any) => {\n const res = await FillActiveInput(value);\n return { success: !!res?.ok, message: res?.ok ? 'Active input filled successfully' : (res?.errors?.[0] || 'Failed to fill active input'), details: res };\n },\n executeEachToken: true,\n },\n requestInput: {\n tool: async (_: any) => ({ ok: true }),\n executeEachToken: true,\n },\n } as Record<string, any>;\n}\n\n\n","import React from 'react';\nimport { XMarkdown } from '@ant-design/x-markdown';\nimport '@ant-design/x-markdown/themes/light.css';\nimport '@ant-design/x-markdown/themes/dark.css';\n\ninterface XMarkdownRendererProps {\n content: string;\n theme?: 'light' | 'dark';\n streaming?: boolean;\n}\n\nexport function XMarkdownRenderer({ \n content, \n theme = 'dark',\n streaming = false,\n}: XMarkdownRendererProps) {\n // Type assertion to handle React 18 compatibility\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const MarkdownComponent = XMarkdown as React.ComponentType<any>;\n \n \n return (\n <MarkdownComponent\n content={content}\n className={theme === 'dark' ? 'x-markdown-dark' : 'x-markdown-light'}\n streaming={{\n hasNextChunk: streaming,\n enableAnimation: true,\n animationConfig: {\n fadeDuration: 200,\n },\n // Map incomplete markdown tokens to loading components\n incompleteMarkdownComponentMap: {\n html: 'IncompleteBlock', // For incomplete HTML/custom tags\n link: 'IncompleteBlock', // For incomplete links\n image: 'IncompleteBlock', // For incomplete images\n },\n }}\n openLinksInNewTab={true}\n config={{\n gfm: true, // GitHub Flavored Markdown\n }}\n dompurifyConfig={{\n // Allow custom HTML tags for components\n ADD_TAGS: ['data-chart', 'welcome', 'user-card', 'mermaid'],\n ADD_ATTR: ['data-source', 'data-spec', 'data-icon', 'data-description', 'data-raw'],\n }}\n style={{\n fontSize: '14px',\n lineHeight: '1.6',\n wordBreak: 'break-word',\n maxWidth: '100%',\n overflow: 'hidden',\n }}\n />\n );\n}\n","import React from 'react';\nimport { XMarkdownRenderer } from '../../XMarkdownRenderer';\n\n/**\n * PlainText - Built-in UI component that renders text with markdown support\n * Always available to agents without needing to be added to HsafaUI\n * \n * @param text - The text content to render with markdown\n */\nfunction PlainText({ input }: { input: any }) {\n return (\n <div style={{ \n fontSize: '14px', \n lineHeight: '1.6',\n width: '100%'\n }}>\n <XMarkdownRenderer content={input?.text || ''} theme=\"dark\" />\n </div>\n );\n}\n\n/**\n * Creates built-in UI components that are always available to agents\n * These components don't need to be explicitly added to HsafaUI prop\n */\nexport function createBuiltInUI(): Record<string, React.ComponentType<any>> {\n return {\n plainText: PlainText,\n };\n}\n\n","export type FormState = { submitted?: boolean; skipped?: boolean; values?: Record<string, any> };\n\nexport function renderOrUpdateUserForm(\n input: any,\n toolCallId: string,\n hosts: Map<string, HTMLDivElement>,\n states: Map<string, FormState>,\n addToolResult: (payload: { tool: string; toolCallId: string; output: any }) => void,\n colors?: Record<string, string>\n) {\n let host = hosts.get(toolCallId);\n if (!host) {\n host = document.createElement('div');\n host.className = 'hsafa-inline-form';\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 const chatEl = document.querySelector('.chat-scroll-container');\n (chatEl || document.body).appendChild(host);\n }\n hosts.set(toolCallId, host);\n } else {\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 const title = input?.title || 'Provide input';\n const description = input?.description || '';\n const submitLabel = input?.submitLabel || 'Submit';\n const skipLabel = input?.skipLabel || 'Skip';\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 = states.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 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 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') data[id] = (el as HTMLInputElement).checked;\n else data[id] = (el as HTMLInputElement).value ?? '';\n });\n states.set(toolCallId, { submitted: true, skipped: false, values: data });\n addToolResult({ tool: 'requestInput', toolCallId, output: { success: true, submitted: true, values: data } });\n form.querySelectorAll('[data-field-id]').forEach((el) => { (el as HTMLInputElement).disabled = true; (el as HTMLInputElement).style.opacity = '0.7'; });\n if (submitBtn) { submitBtn.textContent = `${trimmedSubmit || 'Submit'} ✓`; submitBtn.style.opacity = '0.8'; (submitBtn as any).disabled = true; }\n if (skipBtn) (skipBtn as any).disabled = true;\n };\n if (skipBtn) {\n skipBtn.onclick = () => {\n states.set(toolCallId, { submitted: false, skipped: true, values: undefined });\n addToolResult({ tool: 'requestInput', toolCallId, output: { success: true, submitted: false, skipped: true } });\n form.querySelectorAll('[data-field-id]').forEach((el) => { (el as HTMLInputElement).disabled = true; (el as HTMLInputElement).style.opacity = '0.7'; });\n if (skipBtn) { skipBtn.textContent = `${trimmedSkip || 'Skip'} ✓`; skipBtn.style.opacity = '0.8'; (skipBtn as any).disabled = true; }\n if (submitBtn) (submitBtn as any).disabled = true;\n };\n }\n\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) { badge.style.background = 'rgba(16,185,129,0.15)'; badge.style.color = '#10b981'; badge.textContent = 'Submitted'; }\n else { badge.style.background = 'rgba(234,179,8,0.15)'; badge.style.color = '#eab308'; badge.textContent = 'Skipped'; }\n status.appendChild(badge);\n form.appendChild(status);\n\n // Ensure action buttons are disabled and labels updated on hydration\n try {\n if (submitBtn) {\n (submitBtn as any).disabled = true;\n submitBtn.style.opacity = '0.8';\n if (existingState.submitted) submitBtn.textContent = `${trimmedSubmit || 'Submit'} ✓`;\n }\n if (skipBtn) {\n (skipBtn as any).disabled = true;\n skipBtn.style.opacity = '0.8';\n if (existingState.skipped) skipBtn.textContent = `${trimmedSkip || 'Skip'} ✓`;\n }\n } catch {}\n }\n host.appendChild(form);\n}\n\n\n","import { useEffect, useRef } from 'react';\n\ntype AnyRecord = Record<string, unknown>;\n\nfunction isRecord(v: unknown): v is AnyRecord {\n return !!v && typeof v === 'object';\n}\n\nexport function useStreamingToolInput(\n chatMessages: unknown[],\n allTools: Record<string, unknown>,\n renderOrUpdateUserForm: (input: unknown, toolCallId: string) => void\n) {\n const lastProcessedInputRef = useRef<Map<string, string>>(new Map());\n const lastProcessedStateRef = useRef<Map<string, string>>(new Map());\n const toolCallCounterRef = useRef<Map<string, number>>(new Map());\n const allToolsRef = useRef(allTools);\n const renderOrUpdateUserFormRef = useRef(renderOrUpdateUserForm);\n\n // Update refs without triggering re-render\n allToolsRef.current = allTools;\n renderOrUpdateUserFormRef.current = renderOrUpdateUserForm;\n\n useEffect(() => {\n \n\n chatMessages.forEach((message) => {\n if (!isRecord(message) || message.role !== 'assistant') return;\n const parts = Array.isArray(message.parts) ? (message.parts as unknown[]) : [];\n parts.forEach((part) => {\n if (!isRecord(part)) return;\n if (typeof part.toolCallId !== 'string' || !part.toolCallId) return;\n \n let toolName = typeof part.toolName === 'string' ? part.toolName : undefined;\n const partType = typeof part.type === 'string' ? part.type : '';\n if (!toolName && partType.startsWith('tool-')) toolName = partType.replace(/^tool-/, '');\n if (!toolName) return;\n\n const toolConfig = (allToolsRef.current as Record<string, unknown>)[toolName];\n\n // Fire lifecycle callbacks when tool state changes\n try {\n const state = String((part as AnyRecord).state || (part as AnyRecord).status || '');\n const lastState = lastProcessedStateRef.current.get(part.toolCallId);\n if (state && state !== lastState && toolConfig && typeof toolConfig === 'object') {\n lastProcessedStateRef.current.set(part.toolCallId, state);\n const toolInput = (part as AnyRecord).input ?? (part as AnyRecord).args ?? {};\n const ctx = { toolCallId: part.toolCallId, toolName };\n const tc = toolConfig as AnyRecord;\n if (state === 'input-streaming' && typeof tc.inputting_start === 'function') {\n (tc.inputting_start as (input: unknown, ctx: { toolCallId: string; toolName: string }) => void)(toolInput, ctx);\n }\n if (state === 'input-available' && typeof tc.running_start === 'function') {\n (tc.running_start as (input: unknown, ctx: { toolCallId: string; toolName: string }) => void)(toolInput, ctx);\n }\n }\n } catch {\n void 0;\n }\n\n // Increment tool call number for each valid tool call\n if (toolConfig && typeof toolConfig === 'object' && (toolConfig as AnyRecord).executeEachToken && (toolConfig as AnyRecord).tool) {\n const toolInput = (part as AnyRecord).input ?? (part as AnyRecord).args ?? {};\n const currentInput = JSON.stringify(toolInput);\n const lastInput = lastProcessedInputRef.current.get(part.toolCallId);\n if (currentInput !== lastInput && currentInput !== '{}') {\n lastProcessedInputRef.current.set(part.toolCallId, currentInput);\n try {\n if (toolName === 'requestInput') {\n renderOrUpdateUserFormRef.current(toolInput, part.toolCallId);\n } else {\n // Increment tool call number for this specific toolCallId\n const currentCount = toolCallCounterRef.current.get(part.toolCallId) || 0;\n const newCount = currentCount + 1;\n toolCallCounterRef.current.set(part.toolCallId, newCount);\n if(newCount > 1){\n ((toolConfig as AnyRecord).tool as (input: unknown) => unknown)({ ...(toolInput as AnyRecord), toolCallNumber: newCount - 1 });\n }\n }\n } catch {\n void 0;\n }\n }\n }\n });\n });\n }, [chatMessages]);\n}\n","/**\n * useHsafaAgent - The main headless hook for Hsafa Agent\n * \n * This hook provides all the logic needed to integrate an AI agent into your custom UI.\n * It handles chat state, tool execution, message streaming, and more.\n * \n * @example\n * ```tsx\n * function MyCustomChat() {\n * const agent = useHsafaAgent({\n * agentId: 'my-agent',\n * baseUrl: 'http://localhost:3000',\n * tools: {\n * customTool: async (input) => {\n * return { result: 'Custom tool executed!' };\n * }\n * }\n * });\n * \n * return (\n * <div>\n * {agent.messages.map(msg => (\n * <div key={msg.id}>{msg.content}</div>\n * ))}\n * <input \n * value={agent.input} \n * onChange={(e) => agent.setInput(e.target.value)}\n * onKeyPress={(e) => e.key === 'Enter' && agent.sendMessage()}\n * />\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useRef, useCallback, useEffect, useMemo } from 'react';\nimport { useChat } from '@ai-sdk/react';\nimport { useHsafa } from '../providers/HsafaProvider';\nimport { createHsafaTransport } from '../components/hsafa-chat/utils/transport';\nimport { createBuiltInTools } from '../components/hsafa-chat/utils/builtInTools';\nimport { createBuiltInUI } from '../components/hsafa-chat/utils/builtInUI';\nimport { renderOrUpdateUserForm as renderOrUpdateUserFormUtil } from '../components/hsafa-chat/utils/renderUserForm';\nimport { useStreamingToolInput } from '../components/hsafa-chat/hooks/useStreamingToolInput';\nimport { lastAssistantMessageIsCompleteWithToolCalls } from 'ai';\n\nexport interface UseHsafaAgentConfig {\n /** The agent ID to connect to */\n agentId: string;\n /** Base URL of your backend server */\n baseUrl?: string;\n /** Custom tools that the agent can use */\n tools?: Record<string, any>;\n /** Custom UI components for rendering tool results */\n uiComponents?: Record<string, React.ComponentType<any>>;\n /** Callback when a message starts */\n onStart?: (message: any) => void;\n /** Callback when a message finishes */\n onFinish?: (message: any) => void;\n /** Callback when an error occurs */\n onError?: (error: Error) => void;\n /** Initial messages to load */\n initialMessages?: any[];\n /** Callback when messages change */\n onMessagesChange?: (messages: any[], chatId?: string) => void;\n /** Optional controlled chat id */\n controlledChatId?: string;\n /** Optional callback when chat id changes */\n onChatIdChange?: (chatId: string) => void;\n /** Optional templating parameters merged into request body for server-side templating */\n templateParams?: Record<string, any>;\n}\n\nexport interface HsafaAgentAPI {\n // Core state\n /** Current input text */\n input: string;\n /** Set the input text */\n setInput: (value: string) => void;\n /** All chat messages */\n messages: any[];\n /** Whether the agent is currently processing */\n isLoading: boolean;\n /** Current chat status */\n status: 'idle' | 'submitted' | 'streaming' | 'error' | 'ready';\n /** Any error that occurred */\n error: Error | undefined;\n \n // Actions\n /** Send the current input as a message */\n sendMessage: (options?: { text?: string; files?: any[] }) => Promise<void>;\n /** Stop the current generation */\n stop: () => void;\n /** Clear all messages and start a new chat */\n newChat: () => void;\n /** Set messages directly (for loading history) */\n setMessages: (messages: any[]) => void;\n /** Notify that messages have changed (for edit operations) */\n notifyMessagesChange: () => void;\n \n // Advanced\n /** Direct access to the underlying chat API */\n chatApi: any;\n /** Current chat ID */\n chatId: string;\n /** Set the chat ID (for switching chats) */\n setChatId: (chatId: string) => void;\n /** All available tools (built-in + custom + dynamic page) */\n tools: Record<string, any>;\n /** All available UI components */\n uiComponents: Record<string, any>;\n \n // Form handling\n /** Ref to form host elements (for requestInput tool) */\n formHostRef: React.MutableRefObject<Map<string, HTMLDivElement>>;\n /** Ref to form state (for requestInput tool) */\n formStateRef: React.MutableRefObject<Map<string, { submitted?: boolean; skipped?: boolean; values?: Record<string, any> }>>;\n /** Cleanup all active forms */\n cleanupForms: () => void;\n \n // UI tool handling\n /** Callback when a UI component renders successfully */\n onUISuccess: (toolCallId: string, toolName: string) => void;\n /** Callback when a UI component encounters an error */\n onUIError: (toolCallId: string, toolName: string, error: Error) => void;\n}\n\nexport function useHsafaAgent(config: UseHsafaAgentConfig): HsafaAgentAPI {\n const {\n agentId,\n baseUrl: configBaseUrl = '',\n tools: customTools = {},\n uiComponents: customUIComponents = {},\n onStart,\n onFinish,\n onError,\n initialMessages = [],\n onMessagesChange,\n controlledChatId,\n onChatIdChange,\n templateParams,\n } = config;\n\n const { baseUrl: providerBaseUrl, setCurrentChatId } = useHsafa();\n const effectiveBaseUrl = (configBaseUrl && configBaseUrl.length > 0) ? configBaseUrl : (providerBaseUrl || '');\n\n const [input, setInput] = useState<string>('');\n \n // Generate chat ID for the session (internal, can be controlled via props)\n const [internalChatId, setInternalChatId] = useState(() => `chat_${Date.now()}_${Math.random().toString(36).slice(2)}`);\n const chatId = controlledChatId ?? internalChatId;\n const setChatId = useCallback((newChatId: string) => {\n if (controlledChatId === undefined) {\n setInternalChatId(newChatId);\n }\n if (onChatIdChange) onChatIdChange(newChatId);\n }, [controlledChatId, onChatIdChange]);\n \n useEffect(() => {\n try { setCurrentChatId(chatId); } catch {}\n return () => { try { setCurrentChatId(undefined as any); } catch {} };\n }, [chatId, setCurrentChatId]);\n\n // Configure transport to fetch from the correct endpoint\n const transport = useMemo(() => createHsafaTransport(effectiveBaseUrl, agentId, chatId, templateParams), [effectiveBaseUrl, agentId, chatId, templateParams]);\n \n // Memoize callbacks to prevent infinite loops\n const onFinishCallback = useCallback((payload: any) => {\n console.log('Message finished:', payload);\n let assistantMessageId: string | undefined = payload?.message?.id;\n if (!assistantMessageId && Array.isArray(payload?.messages)) {\n for (let i = payload.messages.length - 1; i >= 0; i--) {\n const m = payload.messages[i];\n if (m && m.role === 'assistant' && m.id) { assistantMessageId = m.id; break; }\n }\n }\n onFinish?.({\n ...payload,\n chatId,\n assistantMessageId,\n });\n }, [onFinish, chatId]);\n\n const onErrorCallback = useCallback((error: Error) => {\n console.error('Chat error:', error);\n onError?.(error);\n }, [onError]);\n\n // Built-in Web Controller Tools\n const builtInTools: Record<string, any> = useMemo(() => createBuiltInTools(), []);\n\n // Merge built-in tools and user-provided tools\n const allTools: Record<string, any> = useMemo(() => ({\n ...builtInTools,\n ...customTools,\n }), [builtInTools, customTools]);\n\n // Built-in UI Components\n const builtInUI: Record<string, any> = useMemo(() => createBuiltInUI(), []);\n\n // Merge built-in UI with user-provided UI components\n const allUI: Record<string, any> = useMemo(() => ({\n ...builtInUI,\n ...customUIComponents,\n }), [builtInUI, customUIComponents]);\n\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 \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 \n const renderOrUpdateUserForm = useCallback((input: any, toolCallId: string) => {\n renderOrUpdateUserFormUtil(\n input,\n toolCallId,\n formHostRef.current,\n formStateRef.current,\n (payload) => (chatApiRef.current as any).addToolResult(payload),\n undefined\n );\n }, []);\n\n // Ref to chatApi to use inside callbacks created before chatApi is defined\n const chatApiRef = useRef<any>(null);\n \n // Track UI tool calls that haven't sent results yet\n const pendingUIToolsRef = useRef<Set<string>>(new Set());\n\n // Handler for UI component errors - reports back to agent\n const handleUIError = useCallback((toolCallId: string, toolName: string, error: Error) => {\n console.error(`UI Error [${toolName}]:`, error);\n if (chatApiRef.current && pendingUIToolsRef.current.has(toolCallId)) {\n pendingUIToolsRef.current.delete(toolCallId);\n (chatApiRef.current as any).addToolResult({\n tool: toolName,\n toolCallId: toolCallId,\n state: 'output-error',\n errorText: error?.message || String(error),\n });\n }\n }, []);\n \n // Handler for UI component success - reports back to agent\n const handleUISuccess = useCallback((toolCallId: string, toolName: string) => {\n if (chatApiRef.current && pendingUIToolsRef.current.has(toolCallId)) {\n pendingUIToolsRef.current.delete(toolCallId);\n (chatApiRef.current as any).addToolResult({\n tool: toolName,\n toolCallId: toolCallId,\n output: {\n status: 'ok',\n rendered: true,\n component: toolName,\n logs: [],\n },\n });\n }\n }, []);\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 sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,\n // Removed sendAutomaticallyWhen to prevent infinite loops with Claude models\n // Tool results will still trigger continuation via explicit addToolResult calls\n async onToolCall({ toolCall }) {\n // Handle custom frontend tools\n const toolFn = getToolFunction(toolCall.toolName);\n\n // Special: requestInput renders a form and waits for user; no immediate tool result\n if (toolCall.toolName === 'requestInput') {\n try {\n renderOrUpdateUserForm(toolCall.input, toolCall.toolCallId);\n } catch (e) {\n console.error('requestInput render error', e);\n }\n return;\n }\n\n // Special: UI tools — check if this is a UI tool\n const isUiTool = toolCall.toolName === 'ui';\n const toolNameIsUIComponent = allUI && toolCall.toolName in allUI;\n const isUIOnlyToolCall = (isUiTool || toolNameIsUIComponent) && !toolFn;\n \n if (isUIOnlyToolCall) {\n // UI-only tool calls rely on the UI layer to provide addToolResult.\n // If a tool function exists for the same name, we must execute it.\n pendingUIToolsRef.current.add(toolCall.toolCallId);\n return;\n }\n\n if (!toolFn) return;\n\n try {\n const result = await toolFn(toolCall.input);\n (chatApi as any).addToolResult({\n tool: toolCall.toolName,\n toolCallId: toolCall.toolCallId,\n output: result,\n });\n } catch (err: any) {\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 \n const { messages: chatMessages, sendMessage, status, stop, error: chatError } = chatApi;\n chatApiRef.current = chatApi;\n\n useStreamingToolInput(chatMessages as any[], allTools, renderOrUpdateUserForm);\n\n // Hydrate request_input form states from persisted messages\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 !== 'requestInput') 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 };\n formStateRef.current.set(toolCallId, hydrated);\n }\n const inVal = part?.input || part?.args || {};\n pendingRenders.push({ input: inVal, toolCallId });\n });\n });\n\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 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 // Load initial messages if provided\n useEffect(() => {\n if (initialMessages && initialMessages.length > 0 && chatMessages.length === 0) {\n console.log('Initial messages:', initialMessages);\n }\n }, [initialMessages, chatMessages.length]);\n\n const isLoading = status === 'submitted' || status === 'streaming';\n\n // Create a callback that can be called externally to notify about message changes\n const notifyMessagesChange = useCallback(() => {\n if (onMessagesChange) {\n onMessagesChange(chatMessages, chatId);\n }\n }, [onMessagesChange, chatMessages, chatId]);\n\n // Send message handler\n const handleSendMessage = useCallback(async (options?: { text?: string; files?: any[] }) => {\n const messageText = options?.text !== undefined ? options.text : input;\n const messageFiles = options?.files || [];\n \n const trimmedInput = messageText.trim();\n if (!trimmedInput && messageFiles.length === 0) return;\n if (isLoading) return;\n\n // Clear input if using default input\n if (options?.text === undefined) {\n setInput('');\n }\n\n try {\n // Call onStart when user sends a message\n if (onStart) {\n // Create a temporary user message object for the callback\n const userMessage = {\n role: 'user',\n content: trimmedInput,\n createdAt: Date.now(),\n chatId,\n };\n onStart(userMessage);\n }\n\n await sendMessage({\n text: trimmedInput,\n files: messageFiles,\n });\n } catch (error) {\n console.error('Failed to send message:', error);\n throw error;\n }\n }, [input, isLoading, sendMessage, onStart, chatId]);\n\n // New chat handler\n const handleNewChat = useCallback(() => {\n if (isLoading) return;\n cleanupAllForms();\n setInput('');\n try { (chatApi as any)?.setMessages?.([]); } catch {}\n const newId = `chat_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n setChatId(newId);\n }, [isLoading, chatApi, cleanupAllForms, setChatId]);\n\n // Set messages handler\n const handleSetMessages = useCallback((messages: any[]) => {\n try { (chatApi as any)?.setMessages?.(messages); } catch {}\n }, [chatApi]);\n\n return {\n // Core state\n input,\n setInput,\n messages: chatMessages,\n isLoading,\n status,\n error: chatError,\n \n // Actions\n sendMessage: handleSendMessage,\n stop,\n newChat: handleNewChat,\n setMessages: handleSetMessages,\n notifyMessagesChange,\n \n // Advanced\n chatApi,\n chatId,\n setChatId,\n tools: allTools,\n uiComponents: allUI,\n \n // Form handling\n formHostRef,\n formStateRef,\n cleanupForms: cleanupAllForms,\n \n // UI tool handling\n onUISuccess: handleUISuccess,\n onUIError: handleUIError,\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 * useChatStorage - Hook for managing chat history persistence\n * \n * This hook provides utilities for saving and loading chat conversations\n * to/from localStorage. It handles chat metadata, message persistence,\n * and chat history management.\n * \n * @example\n * ```tsx\n * function MyChat() {\n * const agent = useHsafaAgent({ agentId: 'my-agent' });\n * const storage = useChatStorage({\n * agentId: 'my-agent',\n * chatId: agent.chatId,\n * messages: agent.messages,\n * isLoading: agent.isLoading,\n * });\n * \n * return (\n * <div>\n * <button onClick={() => {\n * const chat = storage.loadChat(chatId);\n * if (chat) agent.setMessages(chat.messages);\n * }}>\n * Load Chat\n * </button>\n * <select onChange={(e) => storage.switchToChat(e.target.value, agent.setMessages)}>\n * {storage.chatList.map(chat => (\n * <option key={chat.id} value={chat.id}>{chat.title}</option>\n * ))}\n * </select>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useEffect, useRef, useCallback, useMemo } from 'react';\nimport { createChatStorage } from '../utils/chat-storage';\n\nexport interface UseChatStorageConfig {\n /** The agent ID (used as storage namespace) */\n agentId: string;\n /** Current chat ID */\n chatId: string;\n /** Current messages to auto-save */\n messages: any[];\n /** Whether chat is currently loading (skip saving during load) */\n isLoading?: boolean;\n /** Whether to auto-save messages (default: true) */\n autoSave?: boolean;\n /** Whether to auto-restore last chat on mount (default: true) */\n autoRestore?: boolean;\n}\n\nexport interface ChatMetadata {\n id: string;\n title: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface SavedChat {\n id: string;\n messages: any[];\n agentId: string;\n}\n\nexport interface ChatStorageAPI {\n /** List of all saved chats */\n chatList: ChatMetadata[];\n /** Current chat metadata */\n currentChatMeta: ChatMetadata | null;\n /** Refresh the chat list */\n refreshChatList: () => void;\n /** Load a specific chat */\n loadChat: (chatId: string) => SavedChat | null;\n /** Save the current chat */\n saveCurrentChat: () => void;\n /** Delete a chat */\n deleteChat: (chatId: string) => void;\n /** Switch to a different chat */\n switchToChat: (chatId: string, setMessages: (messages: any[]) => void) => void;\n /** Create a new chat */\n createNewChat: (onNewChat: () => void) => void;\n /** Search chats by title */\n searchChats: (query: string) => ChatMetadata[];\n /** The underlying storage utility */\n storage: ReturnType<typeof createChatStorage>;\n}\n\nexport function useChatStorage(config: UseChatStorageConfig): ChatStorageAPI {\n const {\n agentId,\n chatId,\n messages,\n isLoading = false,\n autoSave = true,\n autoRestore = true,\n } = config;\n\n const storage = useMemo(() => createChatStorage(agentId), [agentId]);\n \n const [chatList, setChatList] = useState<ChatMetadata[]>([]);\n const [currentChatMeta, setCurrentChatMeta] = useState<ChatMetadata | null>(null);\n \n const createdChatRef = useRef<boolean>(false);\n const restoredOnMountRef = useRef<boolean>(false);\n\n // Refresh chat list from storage\n const refreshChatList = useCallback(() => {\n try {\n const chats = storage.loadChatsIndex();\n setChatList(chats);\n const current = chats.find(c => c.id === chatId);\n setCurrentChatMeta(current || null);\n } catch (error) {\n console.error('Failed to refresh chat list:', error);\n }\n }, [storage, chatId]);\n\n // Load chat list on mount and when chatId changes\n useEffect(() => {\n refreshChatList();\n }, [refreshChatList]);\n\n // Auto-restore last chat on mount\n useEffect(() => {\n if (!autoRestore || restoredOnMountRef.current) return;\n \n try {\n const savedId = storage.loadCurrentChatId();\n if (savedId) {\n createdChatRef.current = true;\n }\n } catch (error) {\n console.error('Failed to restore chat:', error);\n }\n \n restoredOnMountRef.current = true;\n }, [storage, autoRestore]);\n\n // Auto-save messages when they change\n useEffect(() => {\n if (!autoSave || messages.length === 0) return;\n\n // Create chat metadata on first user message\n if (!createdChatRef.current) {\n const firstUser = messages.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 \n try {\n storage.upsertChatMeta({ id: chatId, title, createdAt: now, updatedAt: now });\n storage.saveChat({ id: chatId, messages: messages as any, agentId } as any);\n storage.saveCurrentChatId(chatId);\n createdChatRef.current = true;\n refreshChatList();\n } catch (error) {\n console.error('Failed to create chat:', error);\n }\n }\n } else if (!isLoading) {\n // Update existing chat\n const now = Date.now();\n try {\n storage.saveChat({ id: chatId, messages: messages as any, agentId } as any);\n const metas = storage.loadChatsIndex();\n const found = metas.find((m) => m.id === chatId);\n if (found) {\n storage.upsertChatMeta({ ...found, updatedAt: now });\n refreshChatList();\n }\n } catch (error) {\n console.error('Failed to save chat:', error);\n }\n }\n }, []);\n\n // Save chat on stream completion\n const wasLoadingRef = useRef<boolean>(false);\n useEffect(() => {\n if (isLoading) {\n wasLoadingRef.current = true;\n return;\n }\n if (wasLoadingRef.current && autoSave) {\n wasLoadingRef.current = false;\n try {\n const now = Date.now();\n // Always persist the latest messages for this chat\n storage.saveChat({ id: chatId, messages: messages as any, agentId } as any);\n\n // Upsert metadata; if it doesn't exist yet, create it now\n const metas = storage.loadChatsIndex();\n const found = metas.find((m) => m.id === chatId);\n if (found) {\n storage.upsertChatMeta({ ...found, updatedAt: now });\n } else {\n // Create metadata on the first successful turn (after user sends a message)\n let titleSource = '';\n const firstUser = Array.isArray(messages)\n ? (messages as any[]).find((m: any) => m && m.role === 'user')\n : undefined;\n if (firstUser && 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 storage.upsertChatMeta({ id: chatId, title, createdAt: now, updatedAt: now });\n try { storage.saveCurrentChatId(chatId); } catch {}\n createdChatRef.current = true;\n }\n\n refreshChatList();\n } catch (error) {\n console.error('Failed to save chat on completion:', error);\n }\n }\n }, [isLoading, messages, chatId, agentId, storage, autoSave, refreshChatList]);\n\n // Load a specific chat\n const loadChat = useCallback((chatId: string): SavedChat | null => {\n try {\n const chat = storage.loadChat(chatId);\n if (!chat) return null;\n \n // Ensure agentId is present\n return {\n id: chat.id,\n messages: chat.messages,\n agentId: chat.agentId || agentId, // Use current agentId if not present\n };\n } catch (error) {\n console.error('Failed to load chat:', error);\n return null;\n }\n }, [storage, agentId]);\n\n // Save current chat manually\n const saveCurrentChat = useCallback(() => {\n if (messages.length === 0) return;\n \n try {\n const now = Date.now();\n storage.saveChat({ id: chatId, messages: messages as any, agentId } as any);\n const metas = storage.loadChatsIndex();\n const found = metas.find((m) => m.id === chatId);\n if (found) {\n storage.upsertChatMeta({ ...found, updatedAt: now });\n refreshChatList();\n }\n } catch (error) {\n console.error('Failed to save chat:', error);\n }\n }, [storage, chatId, messages, agentId, refreshChatList]);\n\n // Delete a chat\n const deleteChat = useCallback((chatId: string) => {\n try {\n storage.deleteChat(chatId);\n refreshChatList();\n } catch (error) {\n console.error('Failed to delete chat:', error);\n }\n }, [storage, refreshChatList]);\n\n // Switch to a different chat\n const switchToChat = useCallback((newChatId: string, setMessages: (messages: any[]) => void) => {\n if (newChatId === chatId) return;\n \n try {\n createdChatRef.current = true;\n storage.saveCurrentChatId(newChatId);\n const saved = storage.loadChat(newChatId);\n const msgs = (saved && Array.isArray((saved as any).messages)) ? (saved as any).messages : [];\n setMessages(msgs);\n refreshChatList();\n } catch (error) {\n console.error('Failed to switch chat:', error);\n }\n }, [storage, chatId, refreshChatList]);\n\n // Create a new chat\n const createNewChat = useCallback((onNewChat: () => void) => {\n createdChatRef.current = false;\n onNewChat();\n }, []);\n\n // Search chats\n const searchChats = useCallback((query: string): ChatMetadata[] => {\n if (!query.trim()) return chatList;\n \n const lowerQuery = query.toLowerCase();\n return chatList.filter(chat => \n chat.title.toLowerCase().includes(lowerQuery)\n );\n }, [chatList]);\n\n return {\n chatList,\n currentChatMeta,\n refreshChatList,\n loadChat,\n saveCurrentChat,\n deleteChat,\n switchToChat,\n createNewChat,\n searchChats,\n storage,\n };\n}","/**\n * useMessageEditor - Hook for editing and regenerating messages\n * \n * This hook provides functionality to edit user messages and regenerate\n * responses from a specific point in the conversation.\n * \n * @example\n * ```tsx\n * function MyChat() {\n * const agent = useHsafaAgent({ agentId: 'my-agent' });\n * const editor = useMessageEditor({\n * messages: agent.messages,\n * isLoading: agent.isLoading,\n * sendMessage: agent.sendMessage,\n * setMessages: agent.setMessages,\n * });\n * \n * return (\n * <div>\n * {agent.messages.map(msg => (\n * <div key={msg.id}>\n * {editor.isEditing(msg.id) ? (\n * <div>\n * <textarea \n * value={editor.editingText} \n * onChange={(e) => editor.setEditingText(e.target.value)}\n * />\n * <button onClick={() => editor.saveEdit(msg.id)}>Save</button>\n * <button onClick={editor.cancelEdit}>Cancel</button>\n * </div>\n * ) : (\n * <div>\n * {msg.content}\n * <button onClick={() => editor.startEdit(msg.id, msg.content)}>\n * Edit\n * </button>\n * </div>\n * )}\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback } from 'react';\nimport { useHsafa } from '../providers/HsafaProvider';\n\nexport interface UseMessageEditorConfig {\n /** Current messages array */\n messages: any[];\n /** Whether chat is currently loading */\n isLoading: boolean;\n /** Function to send a message */\n sendMessage: (options: { text: string; files?: any[] }) => Promise<void>;\n /** Function to update messages array */\n setMessages: (messages: any[]) => void;\n /** Base URL for file uploads (if editing messages with attachments) */\n baseUrl?: string;\n}\n\nexport interface MessageEditorAPI {\n /** ID of the message currently being edited */\n editingMessageId: string | null;\n /** Current edit text */\n editingText: string;\n /** Set the edit text */\n setEditingText: (text: string) => void;\n /** Attachments for the edited message */\n editAttachments: any[];\n /** Set edit attachments */\n setEditAttachments: (attachments: any[]) => void;\n /** Whether files are currently uploading */\n editUploading: boolean;\n /** Start editing a message */\n startEdit: (messageId: string, text: string, attachments?: any[]) => void;\n /** Cancel editing */\n cancelEdit: () => void;\n /** Save the edit and regenerate from that point */\n saveEdit: (messageId: string) => Promise<void>;\n /** Check if a message is being edited */\n isEditing: (messageId: string) => boolean;\n /** Add attachments to the edit */\n addEditAttachments: (files: FileList) => Promise<void>;\n /** Remove an attachment from the edit */\n removeEditAttachment: (id: string) => void;\n}\n\nexport function useMessageEditor(config: UseMessageEditorConfig): MessageEditorAPI {\n const {\n messages,\n isLoading,\n sendMessage,\n setMessages,\n baseUrl,\n } = config;\n\n const { baseUrl: providerBaseUrl } = useHsafa();\n const effectiveBaseUrl = baseUrl || providerBaseUrl || '';\n\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\n // Start editing a message\n const startEdit = useCallback((messageId: string, text: string, attachments: any[] = []) => {\n setEditingMessageId(messageId);\n setEditingText(text);\n setEditAttachments(attachments);\n }, []);\n\n // Cancel editing\n const cancelEdit = useCallback(() => {\n setEditingMessageId(null);\n setEditingText('');\n setEditAttachments([]);\n }, []);\n\n // Save edit and regenerate\n const saveEdit = useCallback(async (messageId: string) => {\n if (isLoading) return;\n \n try {\n // Find the message index\n const messageIndex = messages.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 = messages.slice(0, messageIndex);\n \n // Clear the current messages and set to the point before the edited message\n setMessages(updatedMessages);\n \n // Send the edited message\n await sendMessage({\n text: editingText.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 cancelEdit();\n } catch (error) {\n console.error('Failed to save edit:', error);\n throw error;\n }\n }, [isLoading, messages, sendMessage, editingText, editAttachments, setMessages, cancelEdit]);\n\n // Check if a message is being edited\n const isEditing = useCallback((messageId: string) => {\n return editingMessageId === messageId;\n }, [editingMessageId]);\n\n // Add attachments to edit\n const addEditAttachments = useCallback(async (files: FileList) => {\n if (!effectiveBaseUrl) {\n console.warn('baseUrl not provided, cannot upload attachments');\n return;\n }\n\n setEditUploading(true);\n try {\n const uploadPromises = Array.from(files).map(async (file) => {\n if (file.size > 25 * 1024 * 1024) throw new Error(`${file.name} is too large (max 25MB)`);\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 const newAttachments = await Promise.all(uploadPromises);\n setEditAttachments(prev => [...prev, ...newAttachments]);\n } catch (error) {\n console.error('Failed to upload files:', error);\n throw error;\n } finally {\n setEditUploading(false);\n }\n }, [effectiveBaseUrl]);\n\n // Remove attachment from edit\n const removeEditAttachment = useCallback((id: string) => {\n setEditAttachments(prev => prev.filter(att => att.id !== id));\n }, []);\n\n return {\n editingMessageId,\n editingText,\n setEditingText,\n editAttachments,\n setEditAttachments,\n editUploading,\n startEdit,\n cancelEdit,\n saveEdit,\n isEditing,\n addEditAttachments,\n removeEditAttachment,\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { useHsafa } from '../providers/HsafaProvider';\nimport { createChatStorage } from '../utils/chat-storage';\n\nexport type HsafaActiveChatIdSource = 'context' | 'storage' | 'none';\n\nexport interface UseHsafaActiveChatIdOptions {\n agentId: string;\n prefer?: 'context' | 'storage';\n}\n\nexport interface HsafaActiveChatIdResult {\n chatId?: string;\n isReady: boolean;\n source: HsafaActiveChatIdSource;\n}\n\nfunction safeLoadChatIdFromStorage(agentId: string): string | undefined {\n if (typeof window === 'undefined') return undefined;\n try {\n const storage = createChatStorage(agentId);\n const id = storage.loadCurrentChatId();\n return id || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function useHsafaActiveChatId(options: UseHsafaActiveChatIdOptions): HsafaActiveChatIdResult {\n const { agentId, prefer = 'context' } = options;\n\n const { currentChatId } = useHsafa();\n\n const [storageChatId, setStorageChatId] = useState<string | undefined>(undefined);\n const [storageReady, setStorageReady] = useState(false);\n\n useEffect(() => {\n setStorageReady(false);\n const id = safeLoadChatIdFromStorage(agentId);\n setStorageChatId(id);\n setStorageReady(true);\n }, [agentId]);\n\n return useMemo((): HsafaActiveChatIdResult => {\n const ctxId = currentChatId || undefined;\n\n const preferredId = prefer === 'context' ? ctxId : storageChatId;\n const preferredSource: HsafaActiveChatIdSource = prefer === 'context' ? 'context' : 'storage';\n\n if (preferredId) {\n return {\n chatId: preferredId,\n isReady: prefer === 'storage' ? storageReady : true,\n source: preferredSource,\n };\n }\n\n if (ctxId) {\n return { chatId: ctxId, isReady: true, source: 'context' };\n }\n\n if (storageChatId) {\n return { chatId: storageChatId, isReady: storageReady, source: 'storage' };\n }\n\n return { chatId: undefined, isReady: storageReady, source: 'none' };\n }, [currentChatId, prefer, storageChatId, storageReady]);\n}\n","import { Dispatch, SetStateAction, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { HsafaArtifactStore } from '../utils/artifact-store';\nimport { useHsafaActiveChatId } from './useHsafaActiveChatId';\n\nexport type ChatArtifactStatus = 'idle' | 'loading' | 'ready' | 'error';\n\nexport interface UseChatArtifactOptions<T> {\n agentId: string;\n chatId?: string;\n initial: T;\n store: HsafaArtifactStore<T>;\n autoLoad?: boolean;\n autoSave?: boolean;\n saveDebounceMs?: number;\n}\n\nexport interface ChatArtifactResult<T> {\n value: T;\n setValue: Dispatch<SetStateAction<T>>;\n status: ChatArtifactStatus;\n error?: unknown;\n reload: () => Promise<void>;\n flushSave: () => Promise<void>;\n}\n\nexport function useChatArtifact<T>(options: UseChatArtifactOptions<T>): ChatArtifactResult<T> {\n const {\n agentId,\n chatId: controlledChatId,\n initial,\n store,\n autoLoad = true,\n autoSave = true,\n saveDebounceMs = 800,\n } = options;\n\n const active = useHsafaActiveChatId({ agentId });\n const resolvedChatId = controlledChatId ?? active.chatId;\n\n const [value, setValue] = useState<T>(initial);\n const [status, setStatus] = useState<ChatArtifactStatus>('idle');\n const [error, setError] = useState<unknown>(undefined);\n\n const hydratedRef = useRef(false);\n const lastChatIdRef = useRef<string | undefined>(undefined);\n\n const saveTimerRef = useRef<number | undefined>(undefined);\n const pendingSavePromiseRef = useRef<Promise<void> | null>(null);\n\n const cancelPendingSave = useCallback(() => {\n if (typeof window === 'undefined') return;\n if (saveTimerRef.current) {\n window.clearTimeout(saveTimerRef.current);\n saveTimerRef.current = undefined;\n }\n }, []);\n\n const doSave = useCallback(async (): Promise<void> => {\n if (!resolvedChatId) return;\n try {\n await store.saveLatest(resolvedChatId, value);\n } catch (e) {\n setError(e);\n }\n }, [resolvedChatId, store, value]);\n\n const flushSave = useCallback(async (): Promise<void> => {\n cancelPendingSave();\n const p = doSave();\n pendingSavePromiseRef.current = p;\n await p;\n }, [cancelPendingSave, doSave]);\n\n const reload = useCallback(async (): Promise<void> => {\n if (!resolvedChatId) return;\n\n setStatus('loading');\n setError(undefined);\n\n try {\n const loaded = autoLoad ? await store.loadLatest(resolvedChatId) : null;\n setValue(loaded ?? initial);\n setStatus('ready');\n hydratedRef.current = true;\n lastChatIdRef.current = resolvedChatId;\n } catch (e) {\n setError(e);\n setStatus('error');\n }\n }, [autoLoad, initial, resolvedChatId, store]);\n\n useEffect(() => {\n if (!active.isReady && !controlledChatId) return;\n\n if (!resolvedChatId) {\n hydratedRef.current = false;\n lastChatIdRef.current = undefined;\n setStatus('idle');\n setError(undefined);\n setValue(initial);\n cancelPendingSave();\n return;\n }\n\n if (lastChatIdRef.current === resolvedChatId && hydratedRef.current) return;\n\n hydratedRef.current = false;\n lastChatIdRef.current = resolvedChatId;\n\n let cancelled = false;\n\n (async () => {\n setStatus(autoLoad ? 'loading' : 'ready');\n setError(undefined);\n\n try {\n const loaded = autoLoad ? await store.loadLatest(resolvedChatId) : null;\n if (cancelled) return;\n\n setValue(loaded ?? initial);\n setStatus('ready');\n hydratedRef.current = true;\n } catch (e) {\n if (cancelled) return;\n setError(e);\n setStatus('error');\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [active.isReady, autoLoad, cancelPendingSave, controlledChatId, initial, resolvedChatId, store]);\n\n useEffect(() => {\n if (!autoSave) return;\n if (!resolvedChatId) return;\n if (!hydratedRef.current) return;\n if (typeof window === 'undefined') return;\n\n cancelPendingSave();\n\n saveTimerRef.current = window.setTimeout(() => {\n const p = doSave();\n pendingSavePromiseRef.current = p;\n }, saveDebounceMs);\n\n return () => {\n cancelPendingSave();\n };\n }, [autoSave, cancelPendingSave, doSave, resolvedChatId, saveDebounceMs, value]);\n\n return useMemo(() => {\n return {\n value,\n setValue,\n status,\n error,\n reload,\n flushSave,\n };\n }, [error, flushSave, reload, status, value]);\n}\n","import { Dispatch, SetStateAction, useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { HsafaArtifactStore } from '../utils/artifact-store';\n\nexport interface UseChatArtifactVersioningOptions<T> {\n chatId?: string;\n store: HsafaArtifactStore<T>;\n value: T;\n setValue: Dispatch<SetStateAction<T>>;\n initial: T;\n}\n\nexport interface ChatArtifactVersioningAPI {\n onFinish: (payload: unknown) => Promise<void>;\n onMessagesChange: (messages: unknown[], chatId?: string) => Promise<void>;\n}\n\nfunction getAssistantMessageIdFromPayload(payload: unknown): string | undefined {\n if (!payload || typeof payload !== 'object') return undefined;\n const p = payload as {\n assistantMessageId?: unknown;\n message?: { id?: unknown };\n messages?: Array<{ id?: unknown; role?: unknown }>;\n };\n\n if (typeof p.assistantMessageId === 'string' && p.assistantMessageId.length > 0) return p.assistantMessageId;\n if (typeof p.message?.id === 'string' && p.message.id.length > 0) return p.message.id;\n\n const msgs = p.messages;\n if (!Array.isArray(msgs)) return undefined;\n\n for (let i = msgs.length - 1; i >= 0; i--) {\n const m = msgs[i];\n if (m && m.role === 'assistant' && typeof m.id === 'string' && m.id.length > 0) return m.id;\n }\n\n return undefined;\n}\n\nfunction getChatIdFromPayload(payload: unknown): string | undefined {\n if (!payload || typeof payload !== 'object') return undefined;\n const p = payload as { chatId?: unknown };\n if (typeof p.chatId === 'string' && p.chatId.length > 0) return p.chatId;\n return undefined;\n}\n\nfunction getAssistantMessageIds(messages: unknown[]): string[] {\n const ids: string[] = [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const m = messages[i] as { id?: unknown; role?: unknown } | null;\n if (!m) continue;\n if (m.role !== 'assistant') continue;\n if (typeof m.id !== 'string' || m.id.length === 0) continue;\n ids.push(m.id);\n }\n return ids;\n}\n\nfunction getMessageRole(message: unknown): string {\n if (!message || typeof message !== 'object') return '';\n const m = message as { role?: unknown };\n return typeof m.role === 'string' ? m.role : '';\n}\n\nfunction getMessageContentSignature(message: unknown): string {\n if (!message || typeof message !== 'object') return '';\n const m = message as { content?: unknown; text?: unknown };\n\n const raw = m.content ?? m.text;\n\n if (typeof raw === 'string') return raw.slice(0, 2000);\n if (raw == null) return '';\n\n try {\n return JSON.stringify(raw).slice(0, 2000);\n } catch {\n return '';\n }\n}\n\nexport function useChatArtifactVersioning<T>(options: UseChatArtifactVersioningOptions<T>): ChatArtifactVersioningAPI {\n const { chatId, store, value, setValue, initial } = options;\n\n const valueRef = useRef(value);\n useEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n const lastChatIdRef = useRef<string | undefined>(undefined);\n const prevMessagesRef = useRef<unknown[] | null>(null);\n const restoreSeqRef = useRef(0);\n\n const onFinish = useCallback(\n async (payload: unknown) => {\n const resolvedChatId = getChatIdFromPayload(payload) ?? chatId;\n if (!resolvedChatId) return;\n\n const assistantMessageId = getAssistantMessageIdFromPayload(payload);\n if (!assistantMessageId) return;\n\n await store.saveVersion(resolvedChatId, assistantMessageId, valueRef.current);\n },\n [chatId, store]\n );\n\n const onMessagesChange = useCallback(\n async (messages: unknown[], cbChatId?: string) => {\n const resolvedChatId = cbChatId ?? chatId;\n\n if (lastChatIdRef.current !== resolvedChatId) {\n lastChatIdRef.current = resolvedChatId;\n prevMessagesRef.current = Array.isArray(messages) ? messages : [];\n return;\n }\n\n const prev = prevMessagesRef.current;\n const next = Array.isArray(messages) ? messages : [];\n const prevArr = Array.isArray(prev) ? prev : [];\n\n const minLen = Math.min(prevArr.length, next.length);\n let commonPrefixLen = 0;\n for (let i = 0; i < minLen; i++) {\n const p = prevArr[i] as { id?: unknown; role?: unknown } | null;\n const n = next[i] as { id?: unknown; role?: unknown } | null;\n const pId = p && typeof p.id === 'string' ? p.id : '';\n const nId = n && typeof n.id === 'string' ? n.id : '';\n const pRole = p && typeof p.role === 'string' ? p.role : '';\n const nRole = n && typeof n.role === 'string' ? n.role : '';\n if (pId === nId && pRole === nRole) {\n commonPrefixLen++;\n continue;\n }\n break;\n }\n\n // Normal chat progression: prev is a prefix of next (append).\n const isAppend = prevArr.length > 0 && commonPrefixLen === prevArr.length && next.length >= prevArr.length;\n\n // Streaming may \"rewrite\" only the last message entry (same length, all but last match).\n // Avoid treating that as a history edit.\n const lastPrevRole = prevArr.length > 0 ? getMessageRole(prevArr[prevArr.length - 1]) : '';\n const lastNextRole = next.length > 0 ? getMessageRole(next[next.length - 1]) : '';\n const isAssistantTail = lastPrevRole === 'assistant' || lastNextRole === 'assistant';\n\n const isTailRewriteOnly =\n isAssistantTail &&\n prevArr.length > 0 &&\n next.length === prevArr.length &&\n commonPrefixLen === Math.max(0, prevArr.length - 1);\n\n const wasTruncated = prevArr.length > 0 && next.length < prevArr.length;\n\n // Detect edits/rewrites: messages changed in the middle (not append, not tail-only rewrite).\n const wasRewritten = prevArr.length > 0 && !isAppend && !isTailRewriteOnly && commonPrefixLen < prevArr.length;\n\n // Detect edits where IDs/roles are stable but the content changed (some UIs keep ids stable on edit).\n // Ignore the common case of assistant streaming updating the last assistant message.\n let wasContentEdited = false;\n for (let i = 0; i < minLen; i++) {\n const p = prevArr[i] as { id?: unknown; role?: unknown } | null;\n const n = next[i] as { id?: unknown; role?: unknown } | null;\n const pId = p && typeof p.id === 'string' ? p.id : '';\n const nId = n && typeof n.id === 'string' ? n.id : '';\n const pRole = p && typeof p.role === 'string' ? p.role : '';\n const nRole = n && typeof n.role === 'string' ? n.role : '';\n if (pId !== nId || pRole !== nRole) break;\n\n const pSig = getMessageContentSignature(p);\n const nSig = getMessageContentSignature(n);\n if (pSig === nSig) continue;\n\n const isLast = i === minLen - 1;\n const isAssistantTailStreaming = isLast && pRole === 'assistant' && nRole === 'assistant';\n if (!isAssistantTailStreaming) {\n wasContentEdited = true;\n }\n break;\n }\n\n if (!resolvedChatId) {\n prevMessagesRef.current = next;\n return;\n }\n\n if (wasTruncated || wasRewritten || wasContentEdited) {\n const restoreSeq = ++restoreSeqRef.current;\n\n const assistantIds = getAssistantMessageIds(next);\n for (const id of assistantIds) {\n try {\n const exists = await store.hasVersion(resolvedChatId, id);\n if (!exists) continue;\n const version = await store.loadVersion(resolvedChatId, id);\n if (restoreSeqRef.current !== restoreSeq) return;\n if (version) {\n setValue(version);\n prevMessagesRef.current = next;\n return;\n }\n } catch {\n continue;\n }\n }\n\n if (restoreSeqRef.current !== restoreSeq) return;\n setValue(initial);\n }\n\n prevMessagesRef.current = next;\n },\n [chatId, initial, setValue, store]\n );\n\n return useMemo(() => {\n return { onFinish, onMessagesChange };\n }, [onFinish, onMessagesChange]);\n}\n","import * as React from 'react';\n\nexport function useHsafaTools<TState, TTools extends Record<string, unknown>>(config: {\n state: TState;\n setState: React.Dispatch<React.SetStateAction<TState>>;\n tools: (api: {\n get: () => TState;\n set: React.Dispatch<React.SetStateAction<TState>>;\n }) => TTools;\n}): TTools {\n const { state, setState, tools } = config;\n\n const stateRef = React.useRef(state);\n stateRef.current = state;\n\n const get = React.useCallback(() => stateRef.current, []);\n\n const set: React.Dispatch<React.SetStateAction<TState>> = React.useCallback(\n (updater) => {\n setState((prev) => {\n const next = typeof updater === 'function' ? (updater as (p: TState) => TState)(prev) : updater;\n stateRef.current = next;\n return next;\n });\n },\n [setState]\n );\n\n const toolsRef = React.useRef<TTools | null>(null);\n const toolsFactoryRef = React.useRef(tools);\n toolsFactoryRef.current = tools;\n\n if (!toolsRef.current) {\n toolsRef.current = toolsFactoryRef.current({ get, set });\n }\n\n return toolsRef.current;\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, { Component, ReactNode } from 'react';\n\ninterface Props {\n children: ReactNode;\n componentName: string;\n resolvedColors: {\n textColor: string;\n mutedTextColor: string;\n borderColor: string;\n inputBackground: string;\n };\n toolCallId?: string;\n toolName?: string;\n onError?: (toolCallId: string, toolName: string, error: Error) => void;\n onSuccess?: (toolCallId: string, toolName: string) => void;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n errorInfo: React.ErrorInfo | null;\n}\n\nexport class UIErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = { hasError: false, error: null, errorInfo: null };\n }\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error, errorInfo: null };\n }\n\n componentDidMount() {\n // Report success if component mounted without errors\n const { toolCallId, toolName, onSuccess } = this.props;\n if (toolCallId && toolName && onSuccess && !this.state.hasError) {\n // Use setTimeout to ensure this happens after the render completes\n setTimeout(() => {\n if (!this.state.hasError) {\n onSuccess(toolCallId, toolName);\n }\n }, 0);\n }\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error(`UI Component Error (${this.props.componentName}):`, error, errorInfo);\n this.setState({ error, errorInfo });\n \n // Report error back to agent if callback provided\n const { toolCallId, toolName, onError } = this.props;\n if (toolCallId && toolName && onError) {\n onError(toolCallId, toolName, error);\n }\n }\n\n render() {\n if (this.state.hasError && this.state.error) {\n const { resolvedColors, componentName } = this.props;\n return (\n <div\n style={{\n padding: '16px',\n backgroundColor: '#fee2e2',\n border: '2px solid #ef4444',\n borderRadius: '12px',\n color: '#991b1b',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginBottom: '8px' }}>\n <span style={{ fontSize: '20px' }}>⚠️</span>\n <strong style={{ fontSize: '16px' }}>Component Error: {componentName}</strong>\n </div>\n <div style={{ fontSize: '14px', marginBottom: '8px', fontFamily: 'monospace' }}>\n {this.state.error.message}\n </div>\n {this.state.errorInfo && (\n <details style={{ fontSize: '12px', marginTop: '8px' }}>\n <summary style={{ cursor: 'pointer', fontWeight: 'bold' }}>\n Stack Trace\n </summary>\n <pre\n style={{\n marginTop: '8px',\n padding: '8px',\n backgroundColor: '#fef2f2',\n borderRadius: '4px',\n overflow: 'auto',\n maxHeight: '200px',\n fontSize: '11px',\n }}\n >\n {this.state.errorInfo.componentStack}\n </pre>\n </details>\n )}\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\n","import React from \"react\";\nimport { XMarkdownRenderer } from \"../XMarkdownRenderer\";\nimport { UIErrorBoundary } from \"./UIErrorBoundary\";\n\ntype ThemeColors = {\n mutedTextColor: string;\n inputBackground: string;\n borderColor: string;\n textColor: string;\n};\n\ninterface AssistantMassageProps {\n parts: any[];\n messageId: string;\n openReasoningIds: Set<string>;\n toggleReasoning: (id: string) => void;\n resolvedColors: ThemeColors;\n HsafaUI?: Record<string, React.ComponentType<any>>;\n onUIError?: (toolCallId: string, toolName: string, error: Error) => void;\n onUISuccess?: (toolCallId: string, toolName: string) => void;\n addToolResult?: (payload: any) => void;\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/**\n * Parse MCP tool name format: {label}_{hash}_{originalToolName}\n * Returns { isMCP: true, mcpName, toolName } if it's an MCP tool\n * Otherwise returns { isMCP: false, toolName: original }\n */\nconst parseMCPToolName = (fullToolName: string): { isMCP: boolean; mcpName?: string; toolName: string } => {\n // MCP tools follow pattern: {label}_{6-char-hash}_{toolName}\n // Example: PostgreSQL_26e10d_execute_sql\n const mcpPattern = /^(.+?)_([a-f0-9]{6})_(.+)$/;\n const match = fullToolName.match(mcpPattern);\n \n if (match) {\n const [, label, , originalToolName] = match;\n return {\n isMCP: true,\n mcpName: label.replace(/_/g, ' '), // Convert underscores to spaces in MCP name\n toolName: originalToolName.replace(/_/g, ' ') // Convert underscores to spaces in tool name\n };\n }\n \n return { isMCP: false, toolName: fullToolName };\n};\n\n/**\n * Format tool name to be more readable\n * Converts camelCase, snake_case, kebab-case to readable text\n */\nconst formatToolName = (toolName: string): string => {\n return toolName\n // Handle snake_case\n .replace(/_/g, ' ')\n // Handle kebab-case\n .replace(/-/g, ' ')\n // Handle camelCase (insert space before capitals)\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n // Capitalize first letter of each word\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n};\n\n\nexport function AssistantMassage({ parts, messageId, openReasoningIds, toggleReasoning, resolvedColors, HsafaUI, onUIError, onUISuccess, addToolResult }: AssistantMassageProps) {\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; toolCallId?: string } |\n { type: 'text'; text: string; 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 // Text content (e.g., from plainText tool)\n if (it.type === 'text' && typeof it.text === 'string') {\n // Flush any pending reasoning first\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 groups.push({\n type: 'text',\n text: it.text,\n startDate: it.startDate,\n endDate: it.endDate\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 === 'requestInput') {\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 toolCallId: it.toolCallId\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: isOpen ? '4px' : '0px' }}>\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', opacity: 0.5 }}>\n <XMarkdownRenderer content={t} theme={'dark'} streaming={!isCompleted} />\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 // Handle text content\n if (g.type === 'text') {\n const isStreamingText = typeof g.endDate !== 'number';\n return (\n <div key={itemId} style={{ fontSize: '15px', color: resolvedColors.textColor, lineHeight: '1.6' }}>\n <XMarkdownRenderer content={g.text} theme={'dark'} streaming={isStreamingText} />\n </div>\n );\n }\n\n // Handle tool calls - g.type is 'tool' at this point\n const { color, text } = getToolStatus(g.status);\n const isRunning = g.status === 'input-streaming' || g.status === 'input-available';\n \n // Special case: requestInput\n if (g.toolName === 'requestInput') {\n return <div key={itemId} style={{ display: 'block', position: 'relative' }}>\n <div \n data-get-from-user-host={(g as any).toolCallId || itemId}\n style={{ width: '100%' }}\n />\n </div>\n }\n \n // Check if a UI component exists for this tool name\n const UIByToolName = HsafaUI?.[g.toolName || ''];\n if (UIByToolName) {\n return (\n <div key={itemId} style={{ \n display: 'block', \n position: 'relative',\n }}>\n <UIErrorBoundary \n componentName={g.toolName || 'Unknown'} \n resolvedColors={resolvedColors}\n toolCallId={g.toolCallId}\n toolName={g.toolName || 'unknown'}\n onError={onUIError}\n onSuccess={onUISuccess}\n >\n <UIByToolName \n toolName={g.toolName || ''}\n toolCallId={g.toolCallId || ''}\n input={g.input}\n output={g.output}\n status={g.status}\n addToolResult={addToolResult}\n />\n </UIErrorBoundary>\n </div>\n );\n }\n\n // Default tool UI - Parse and format tool name\n const parsedTool = parseMCPToolName(g.toolName || 'tool');\n \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 {parsedTool.isMCP ? (\n <span style={{ fontWeight: 500, color: resolvedColors.textColor }}>\n <span style={{ fontWeight: 600 }}>{parsedTool.toolName}</span>\n <span style={{ opacity: 0.7, margin: '0 4px' }}>from</span>\n <span style={{ fontWeight: 600, opacity: 0.85 }}>{parsedTool.mcpName}</span>\n </span>\n ) : (\n <span style={{ fontWeight: 500, color: resolvedColors.textColor }}>\n {formatToolName(parsedTool.toolName)}\n </span>\n )}\n </div>\n </div>\n </div>\n );\n \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","/**\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 { AssistantMassage } from \"./AssistantMassage\";\nimport { Attachment } from \"../../types/chat\";\nimport { AttachmentDisplay } from \"../AttachmentDisplay\";\nimport { Pencil } from \"lucide-react\";\nimport { IconWrapper } from \"../IconWrapper\";\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: (message: any, id: string, text: string, attachments?: Attachment[]) => void;\n HsafaUI?: Record<string, React.ComponentType<any>>;\n onUIError?: (toolCallId: string, toolName: string, error: Error) => void;\n onUISuccess?: (toolCallId: string, toolName: string) => void;\n addToolResult?: (payload: any) => void;\n editableMessageIcon?: React.ComponentType<any>;\n}\n\nexport function MessageList({ \n chatMessages, \n isLoading, \n openReasoningIds, \n toggleReasoning, \n resolvedColors, \n t, \n onUserMessageClick,\n HsafaUI,\n onUIError,\n onUISuccess,\n addToolResult,\n editableMessageIcon\n}: MessageListProps) {\n\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 <div>\n <div\n title={t('editor.clickToEdit')}\n onClick={() => onUserMessageClick(m, 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 position: 'relative'\n }}\n onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground)}\n onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = resolvedColors.accentColor)}\n >\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: '8px' }}>\n <div style={{ flex: 1 }}>\n {messageText}\n {messageAttachments.length > 0 && (\n <AttachmentDisplay\n attachments={messageAttachments}\n resolvedColors={resolvedColors}\n />\n )}\n </div>\n <div style={{ \n flexShrink: 0,\n opacity: 0.5,\n transition: 'opacity 0.2s'\n }}>\n <IconWrapper IconComponent={editableMessageIcon || Pencil} size=\"14\" strokeWidth=\"2\" />\n </div>\n </div>\n </div>\n </div>\n ) : (\n <AssistantMassage\n parts={messageParts}\n messageId={m.id}\n openReasoningIds={openReasoningIds}\n toggleReasoning={toggleReasoning}\n resolvedColors={resolvedColors}\n HsafaUI={HsafaUI}\n onUIError={onUIError}\n onUISuccess={onUISuccess}\n addToolResult={addToolResult}\n />\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 React, { useState } from \"react\";\n\ntype ThemeColors = {\n textColor: string;\n mutedTextColor: string;\n borderColor: string;\n inputBackground: string;\n cardBackground: string;\n primaryColor: string;\n hoverBackground: string;\n};\n\ninterface PresetPromptsProps {\n prompts: Array<{ label: string; prompt: string }>;\n onSelect: (prompt: string) => void;\n resolvedColors: ThemeColors;\n disabled?: boolean;\n}\n\nexport function PresetPrompts({ \n prompts, \n onSelect, \n resolvedColors, \n disabled = false \n}: PresetPromptsProps) {\n const [expandedId, setExpandedId] = useState<number | null>(null);\n\n if (!prompts || prompts.length === 0) return null;\n\n return (\n <div style={{ \n padding: '12px 0',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px'\n }}>\n <div style={{\n fontSize: '12px',\n fontWeight: 600,\n color: resolvedColors.mutedTextColor,\n paddingLeft: '4px',\n textTransform: 'uppercase',\n letterSpacing: '0.5px'\n }}>\n Suggested Prompts\n </div>\n <div style={{ \n display: 'flex',\n flexDirection: 'column',\n gap: '8px'\n }}>\n {prompts.map((preset, index) => {\n const isExpanded = expandedId === index;\n const isLongPrompt = preset.prompt.length > 80;\n const truncatedPrompt = isLongPrompt && !isExpanded \n ? preset.prompt.slice(0, 80) + '...' \n : preset.prompt;\n\n return (\n <button\n key={index}\n onClick={() => {\n if (!disabled) {\n onSelect(preset.prompt);\n }\n }}\n disabled={disabled}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n padding: '12px',\n backgroundColor: resolvedColors.cardBackground,\n border: `1px solid ${resolvedColors.borderColor}`,\n borderRadius: '12px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s ease',\n textAlign: 'left',\n opacity: disabled ? 0.5 : 1,\n position: 'relative',\n overflow: 'hidden'\n }}\n onMouseEnter={(e) => {\n if (!disabled) {\n e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground;\n e.currentTarget.style.borderColor = resolvedColors.primaryColor;\n e.currentTarget.style.transform = 'translateX(2px)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = resolvedColors.cardBackground;\n e.currentTarget.style.borderColor = resolvedColors.borderColor;\n e.currentTarget.style.transform = 'translateX(0)';\n }}\n >\n {/* Label */}\n <div style={{\n fontSize: '13px',\n fontWeight: 600,\n color: resolvedColors.textColor,\n marginBottom: '6px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px'\n }}>\n <svg \n width=\"14\" \n height=\"14\" \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n stroke={resolvedColors.primaryColor}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ flexShrink: 0 }}\n >\n <path d=\"M12 20h9\"/>\n <path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\"/>\n </svg>\n {preset.label}\n </div>\n\n {/* Prompt text */}\n <div style={{\n fontSize: '12px',\n color: resolvedColors.mutedTextColor,\n lineHeight: '1.5',\n width: '100%',\n wordWrap: 'break-word',\n whiteSpace: 'pre-wrap'\n }}>\n {truncatedPrompt}\n </div>\n\n {/* Expand/Collapse button for long prompts */}\n {isLongPrompt && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n setExpandedId(isExpanded ? null : index);\n }}\n style={{\n marginTop: '8px',\n padding: '4px 8px',\n fontSize: '11px',\n color: resolvedColors.primaryColor,\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontWeight: 500\n }}\n >\n {isExpanded ? 'Show less' : 'Show more'}\n <svg \n width=\"10\" \n height=\"10\" \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n transform: isExpanded ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s'\n }}\n >\n <polyline points=\"6 9 12 15 18 9\"/>\n </svg>\n </button>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\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","import React from 'react';\nimport { createPortal } from 'react-dom';\nimport { ThemeColors } from '../../utils/chat-theme';\nimport { EditProcessContent } from '../../types/chat';\nimport { Pencil } from 'lucide-react';\nimport { IconWrapper } from '../IconWrapper';\n\ninterface ConfirmEditModalProps {\n isOpen: boolean;\n resolvedColors: ThemeColors;\n onConfirm: () => void;\n onCancel: () => void;\n editProcessContent?: EditProcessContent;\n}\n\nexport function ConfirmEditModal({\n isOpen,\n resolvedColors,\n onConfirm,\n onCancel,\n editProcessContent\n}: ConfirmEditModalProps) {\n if (!isOpen) return null;\n\n // Use custom content or defaults\n const title = editProcessContent?.title || 'Edit Message';\n const content = editProcessContent?.content || 'This will remove this message and all messages after it, and place its content in the input field for editing. Do you want to continue?';\n const submitButtonLabel = editProcessContent?.submit_button_label || 'Edit';\n const cancelButtonLabel = editProcessContent?.cancel_button_label || 'Cancel';\n const CustomIcon = editProcessContent?.icon;\n \n // Check if content is a React component or string\n const isContentComponent = typeof content === 'function';\n const ContentComponent = isContentComponent ? content as React.ComponentType<any> : 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={onCancel}\n />\n {/* Modal panel */}\n <div\n style={{\n position: 'fixed',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 1101,\n width: '420px',\n maxWidth: '94vw',\n overflow: 'hidden',\n borderRadius: '16px',\n border: `1px solid ${resolvedColors.borderColor}`,\n backgroundColor: resolvedColors.backgroundColor,\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n backdropFilter: 'blur(16px)',\n WebkitBackdropFilter: 'blur(16px)'\n }}\n >\n {/* Header */}\n <div style={{\n padding: '20px 24px',\n borderBottom: `1px solid ${resolvedColors.borderColor}`,\n display: 'flex',\n alignItems: 'center',\n gap: '12px'\n }}>\n {CustomIcon ? (\n <div style={{ flexShrink: 0 }}>\n <IconWrapper IconComponent={CustomIcon} size=\"20\" strokeWidth=\"2\" />\n </div>\n ) : (\n <div style={{ flexShrink: 0, color: resolvedColors.mutedTextColor }}>\n <IconWrapper IconComponent={Pencil} size=\"20\" strokeWidth=\"2\" />\n </div>\n )}\n <h3 style={{\n margin: 0,\n fontSize: '18px',\n fontWeight: '600',\n color: resolvedColors.textColor,\n flex: 1\n }}>\n {title}\n </h3>\n </div>\n\n {/* Content */}\n <div style={{\n padding: '24px',\n color: resolvedColors.textColor,\n fontSize: '14px',\n lineHeight: '1.6'\n }}>\n {isContentComponent && ContentComponent ? (\n <ContentComponent />\n ) : (\n <p style={{ margin: 0 }}>\n {content as string}\n </p>\n )}\n </div>\n\n {/* Actions */}\n <div style={{\n display: 'flex',\n gap: '12px',\n padding: '16px 24px',\n borderTop: `1px solid ${resolvedColors.borderColor}`,\n justifyContent: 'flex-end'\n }}>\n <button\n onClick={onCancel}\n style={{\n padding: '8px 16px',\n borderRadius: '8px',\n fontSize: '14px',\n fontWeight: '500',\n border: `1px solid ${resolvedColors.borderColor}`,\n backgroundColor: 'transparent',\n color: resolvedColors.textColor,\n cursor: 'pointer',\n transition: 'all 0.2s'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {cancelButtonLabel}\n </button>\n <button\n onClick={onConfirm}\n style={{\n padding: '8px 16px',\n borderRadius: '8px',\n fontSize: '14px',\n fontWeight: '500',\n border: 'none',\n backgroundColor: resolvedColors.primaryColor,\n color: resolvedColors.backgroundColor,\n cursor: 'pointer',\n transition: 'all 0.2s',\n opacity: 1\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '0.9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '1';\n }}\n >\n {submitButtonLabel}\n </button>\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","import React, { useState, useRef, useCallback, useEffect, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ChatHeader } from \"./hsafa-chat/ChatHeader\";\nimport { useFileUpload } from \"../hooks/useFileUploadHook\";\nimport { useAutoScroll } from \"../hooks/useAutoScroll\";\nimport { useHsafaAgent } from \"../hooks/useHsafaAgent\";\nimport { useChatStorage } from \"../hooks/useChatStorage\";\nimport { HsafaChatProps } from \"../types/chat\";\nimport { MessageList } from \"./hsafa-chat\";\nimport { ChatInput } from \"./hsafa-chat\";\nimport { PresetPrompts } from \"./hsafa-chat\";\nimport { createChatStorage } from \"../utils/chat-storage\";\nimport { ChatHistoryModal } from \"./hsafa-chat/ChatHistoryModal\";\nimport { ConfirmEditModal } from \"./hsafa-chat/ConfirmEditModal\";\nimport { useHsafa } from \"../providers/HsafaProvider\";\nimport { FloatingChatButton } from \"./FloatingChatButton\";\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 \n HsafaTools = {},\n HsafaUI = {},\n componentAboveInput,\n editProcessContent,\n presetPrompts,\n onStart,\n onFinish,\n currentChat,\n onChatChanged,\n templateParams,\n}: HsafaChatProps & { \n baseUrl?: string;\n initialMessages?: any[];\n onMessagesChange?: (messages: any[], chatId?: string) => void;\n HsafaUI?: Record<string, React.ComponentType<any>>;\n}) {\n const {\n dir: providerDir,\n theme: providerTheme,\n baseUrl: providerBaseUrl,\n setStreamingState,\n setChatOpenState,\n tools: providerTools,\n uiComponents: providerUI,\n } = 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' ? '#6f7276' : '#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 const mergedTools = useMemo(() => {\n const fromProvider = providerTools && providerTools.size > 0\n ? Object.fromEntries(providerTools.entries())\n : {};\n return {\n ...fromProvider,\n ...(HsafaTools || {}),\n };\n }, [HsafaTools, providerTools]);\n\n const mergedUI = useMemo(() => {\n const fromProvider = providerUI && providerUI.size > 0\n ? Object.fromEntries(providerUI.entries())\n : {};\n return {\n ...fromProvider,\n ...(HsafaUI || {}),\n };\n }, [HsafaUI, providerUI]);\n\n // Use the agent hook for all agent-related logic\n const agent = useHsafaAgent({\n agentId,\n baseUrl: effectiveBaseUrl,\n tools: mergedTools,\n uiComponents: mergedUI,\n templateParams,\n controlledChatId: currentChat,\n onChatIdChange: currentChat === undefined\n ? (id: string) => {\n if (onChatChanged) onChatChanged(id);\n }\n : undefined,\n onStart: useCallback((message: any) => {\n if (onStart) onStart(message);\n }, [onStart]),\n onFinish: useCallback((message: any) => {\n if (onFinish) onFinish(message);\n }, [onFinish]),\n onError: useCallback((error: Error) => {\n console.error('Chat error:', error);\n }, []),\n initialMessages,\n onMessagesChange,\n });\n\n // Destructure what we need from agent\n const {\n input,\n setInput,\n messages: chatMessages,\n isLoading,\n status,\n error: chatError,\n sendMessage,\n stop,\n setMessages,\n notifyMessagesChange,\n chatId: internalChatId,\n setChatId: setInternalChatId,\n tools: allTools,\n uiComponents: allUI,\n formHostRef,\n formStateRef,\n cleanupForms: cleanupAllForms,\n onUISuccess: handleUISuccess,\n onUIError: handleUIError,\n chatApi,\n } = agent;\n\n // Use controlled chatId if provided, otherwise use internal state\n const chatId = currentChat !== undefined ? currentChat : internalChatId;\n \n // Wrapper for setChatId that calls onChatChanged if provided\n const setChatId = useCallback((newChatId: string) => {\n if (currentChat === undefined) {\n // Uncontrolled mode: update internal state\n setInternalChatId(newChatId);\n }\n // Always notify parent if callback provided\n if (onChatChanged) {\n onChatChanged(newChatId);\n }\n }, [currentChat, setInternalChatId, onChatChanged]);\n\n // Sync internal chatId with controlled prop when it changes externally\n useEffect(() => {\n if (currentChat !== undefined && currentChat !== internalChatId) {\n setInternalChatId(currentChat);\n }\n }, [currentChat, internalChatId, setInternalChatId]);\n\n // File upload hook\n const {\n attachments,\n uploading,\n fileInputRef,\n formatBytes,\n handleRemoveAttachment,\n handleFileSelection,\n clearAttachments,\n setAttachments,\n } = useFileUpload(effectiveBaseUrl);\n\n const [uploadError, setUploadError] = useState<string | null>(null);\n\n // Hsafa provider integration and header/history state\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 [isConfirmEditOpen, setIsConfirmEditOpen] = useState(false);\n const [messageToEdit, setMessageToEdit] = useState<{ id: string; text: string; attachments: any[] } | null>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const scrollRef = useAutoScroll<HTMLDivElement>(isLoading);\n\n // Use chat storage hook for automatic persistence\n const chatStorage = useChatStorage({\n agentId,\n chatId,\n messages: chatMessages,\n isLoading,\n autoSave: true,\n autoRestore: false, // We handle restore manually to set chatId\n });\n \n // Keep reference to raw storage for UI preferences\n const storage = chatStorage.storage;\n \n // On mount: restore last opened chat and its messages (uncontrolled only)\n const restoredOnMountRef = useRef<boolean>(false);\n const lastLoadedChatRef = useRef<string | null>(null);\n \n useEffect(() => {\n if (restoredOnMountRef.current) return;\n if (currentChat !== undefined) {\n // Controlled mode: restore messages for the provided chatId without changing chatId\n try {\n const saved = storage.loadChat(currentChat);\n const msgs = (saved && Array.isArray((saved as any).messages)) ? (saved as any).messages : [];\n if (msgs.length > 0) { try { setMessages(msgs); } catch {} }\n lastLoadedChatRef.current = currentChat;\n } catch {}\n try { storage.saveCurrentChatId(currentChat); } catch {}\n restoredOnMountRef.current = true;\n return;\n }\n try {\n const savedId = storage.loadCurrentChatId();\n if (savedId) {\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 { setMessages(msgs); } catch {}\n lastLoadedChatRef.current = savedId;\n }\n } catch {}\n restoredOnMountRef.current = true;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentChat]);\n\n // In controlled mode: reload messages when currentChat changes (for switching)\n useEffect(() => {\n if (!restoredOnMountRef.current) return; // Wait for initial restore\n if (currentChat === undefined) return; // Only for controlled mode\n if (currentChat === lastLoadedChatRef.current) return; // Already loaded\n \n // Chat switched: load new chat's messages\n try {\n const saved = storage.loadChat(currentChat);\n const msgs = (saved && Array.isArray((saved as any).messages)) ? (saved as any).messages : [];\n try { setMessages(msgs); } catch {}\n lastLoadedChatRef.current = currentChat;\n try { storage.saveCurrentChatId(currentChat); } catch {}\n } catch {}\n }, [currentChat, storage, setMessages]);\n\n // After restore: persist current chatId so it is used on next reload\n useEffect(() => {\n if (!restoredOnMountRef.current) return;\n try { storage.saveCurrentChatId(chatId); } catch {}\n }, [chatId, 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 // Capture current state before clearing\n const currentAttachments = [...attachments];\n\n // Clear input and attachments immediately for better UX\n setInput('');\n clearAttachments();\n setUploadError(null);\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: currentAttachments.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 } 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 try { setMessages([]); } catch {}\n const newId = `chat_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n // Reset the loaded chat ref so the new chat is tracked\n lastLoadedChatRef.current = newId;\n // Use storage hook to mark a new chat session; actual metadata is created on first send\n try {\n chatStorage.createNewChat(() => {\n setChatId(newId);\n try { storage.saveCurrentChatId(newId); } catch {}\n });\n } catch {\n // Fallback: still set id to avoid being stuck\n setChatId(newId);\n try { storage.saveCurrentChatId(newId); } catch {}\n }\n }, [isLoading, clearAttachments, storage, setMessages, setChatId, cleanupAllForms, chatStorage]);\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\n const handleUserMessageClick = useCallback((message: any, id: string, text: string, attachments?: any[]) => {\n setMessageToEdit({ id, text, attachments: attachments || [] });\n setIsConfirmEditOpen(true);\n }, []);\n\n const handleConfirmEdit = useCallback(() => {\n if (!messageToEdit || isLoading) return;\n \n try {\n // Find the message index\n const messageIndex = chatMessages.findIndex((m: any) => m.id === messageToEdit.id);\n if (messageIndex === -1) return;\n\n // Remove messages from the edited message onwards\n const updatedMessages = chatMessages.slice(0, messageIndex);\n try { setMessages(updatedMessages); } catch {}\n \n // Set the message content in the main input\n setInput(messageToEdit.text);\n \n // Set the message attachments in the main input\n setAttachments(messageToEdit.attachments);\n \n // Close modal and reset state\n setIsConfirmEditOpen(false);\n setMessageToEdit(null);\n \n // Notify about messages change after edit\n notifyMessagesChange();\n } catch (error) {\n console.error('Failed to edit message:', error);\n setUploadError('Failed to edit message. Please try again.');\n }\n }, [messageToEdit, isLoading, chatMessages, setMessages, setAttachments, notifyMessagesChange]);\n\n const handleCancelEdit = useCallback(() => {\n setIsConfirmEditOpen(false);\n setMessageToEdit(null);\n }, []);\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')+2}\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 display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n padding: '16px 0'\n }}>\n {presetPrompts && presetPrompts.length > 0 ? (\n <PresetPrompts\n prompts={presetPrompts}\n onSelect={(prompt) => setInput(prompt)}\n resolvedColors={resolvedColors as any}\n disabled={isLoading}\n />\n ) : (\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 </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 HsafaUI={allUI}\n onUIError={handleUIError}\n onUISuccess={handleUISuccess}\n addToolResult={(payload: any) => (chatApi as any)?.addToolResult?.(payload)}\n editableMessageIcon={editProcessContent?.message_icon}\n />\n )}\n </div>\n\n \n\n {/* ChatInput */}\n <div style={{ position: 'sticky', bottom: '0', marginTop: 'auto', paddingBottom: '8px', }}>\n {/* Component Above Input */}\n {componentAboveInput && React.createElement(componentAboveInput, {})}\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 as 'ready' | 'streaming' | 'submitted' | 'error' | undefined}\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 cleanupAllForms();\n setChatId(id);\n // In controlled mode, messages will be loaded by the effect above\n // In uncontrolled mode, load messages here\n if (currentChat === undefined) {\n try { storage.saveCurrentChatId(id); } catch {}\n try {\n const saved = storage.loadChat(id);\n const msgs = (saved && Array.isArray((saved as any).messages)) ? (saved as any).messages : [];\n try { setMessages(msgs); } catch {}\n } catch {}\n }\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 {/* Confirm Edit Modal */}\n <ConfirmEditModal\n isOpen={isConfirmEditOpen}\n resolvedColors={resolvedColors as any}\n onConfirm={handleConfirmEdit}\n onCancel={handleCancelEdit}\n editProcessContent={editProcessContent}\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","type FileHandleWritable = FileSystemFileHandle & {\n createWritable: () => Promise<FileSystemWritableFileStream>;\n};\n\ntype NavigatorWithOpfs = Navigator & {\n storage?: {\n getDirectory?: () => Promise<FileSystemDirectoryHandle>;\n };\n};\n\nconst nav: NavigatorWithOpfs | undefined =\n typeof navigator !== 'undefined' ? (navigator as unknown as NavigatorWithOpfs) : undefined;\n\nexport function isOpfsAvailable(): boolean {\n return Boolean(nav?.storage?.getDirectory);\n}\n\nexport async function getOpfsRootDir(): Promise<FileSystemDirectoryHandle | null> {\n if (!isOpfsAvailable() || !nav?.storage?.getDirectory) return null;\n try {\n return await nav.storage.getDirectory();\n } catch {\n return null;\n }\n}\n\nexport async function getOrCreateDirectory(\n parent: FileSystemDirectoryHandle,\n name: string\n): Promise<FileSystemDirectoryHandle> {\n return await parent.getDirectoryHandle(name, { create: true });\n}\n\nexport async function getOrCreateFile(\n parent: FileSystemDirectoryHandle,\n name: string\n): Promise<FileSystemFileHandle> {\n return await parent.getFileHandle(name, { create: true });\n}\n\nexport async function fileExists(parent: FileSystemDirectoryHandle, name: string): Promise<boolean> {\n try {\n await parent.getFileHandle(name, { create: false });\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function writeTextFile(handle: FileSystemFileHandle, text: string): Promise<void> {\n const writable = await (handle as FileHandleWritable).createWritable();\n await writable.write(new Blob([text], { type: 'application/json' }));\n await writable.close();\n}\n\nexport async function readTextFile(handle: FileSystemFileHandle): Promise<string> {\n const file = await handle.getFile();\n return await file.text();\n}\n","import {\n fileExists,\n getOpfsRootDir,\n isOpfsAvailable,\n readTextFile,\n writeTextFile,\n} from './opfs';\n\nfunction isFileSystemDirectoryHandle(handle: FileSystemHandle): handle is FileSystemDirectoryHandle {\n return handle.kind === 'directory';\n}\n\ntype DirectoryHandleWithEntries = FileSystemDirectoryHandle & {\n entries: () => AsyncIterableIterator<[string, FileSystemHandle]>;\n};\n\nexport type HsafaArtifactStoreBackend = 'opfs' | 'localStorage';\n\nexport interface HsafaArtifactStoreConfig<T> {\n namespace: string;\n serialize?: (value: T) => string;\n deserialize?: (raw: string) => T;\n storageOrder?: HsafaArtifactStoreBackend[];\n legacyDecode?: (\n raw: string\n ) =>\n | {\n value: T;\n chatId: string;\n versionId: string;\n updatedAt?: string;\n }\n | null;\n}\n\nexport interface HsafaArtifactStore<T> {\n saveLatest: (chatId: string, value: T) => Promise<void>;\n loadLatest: (chatId: string) => Promise<T | null>;\n saveVersion: (chatId: string, versionId: string, value: T) => Promise<void>;\n loadVersion: (chatId: string, versionId: string) => Promise<T | null>;\n hasVersion: (chatId: string, versionId: string) => Promise<boolean>;\n findMostRecentChatId: () => Promise<string | null>;\n}\n\ntype StoredArtifactRecord = {\n chatId: string;\n versionId: string;\n updatedAt: string;\n data: string;\n};\n\nfunction safeJsonParse<T>(raw: string): T | null {\n try {\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\nfunction createLocalStorageKeys(namespace: string) {\n const prefix = `hsafa:${namespace}`;\n return {\n latest: (chatId: string) => `${prefix}:${chatId}:latest`,\n version: (chatId: string, versionId: string) => `${prefix}:${chatId}:versions:${versionId}`,\n latestPrefix: `${prefix}:`,\n };\n}\n\nasync function getDirectory(\n parent: FileSystemDirectoryHandle,\n name: string,\n create: boolean\n): Promise<FileSystemDirectoryHandle | null> {\n try {\n return await parent.getDirectoryHandle(name, { create });\n } catch {\n return null;\n }\n}\n\nasync function readOpfsFile(handle: FileSystemDirectoryHandle, fileName: string): Promise<string | null> {\n try {\n const fileHandle = await handle.getFileHandle(fileName, { create: false });\n return await readTextFile(fileHandle);\n } catch {\n return null;\n }\n}\n\nasync function writeOpfsFile(handle: FileSystemDirectoryHandle, fileName: string, text: string): Promise<boolean> {\n try {\n const fileHandle = await handle.getFileHandle(fileName, { create: true });\n await writeTextFile(fileHandle, text);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function createHsafaArtifactStore<T>(config: HsafaArtifactStoreConfig<T>): HsafaArtifactStore<T> {\n const {\n namespace,\n serialize = (value: T) => JSON.stringify(value),\n deserialize = (raw: string) => JSON.parse(raw) as T,\n storageOrder = ['opfs', 'localStorage'],\n legacyDecode,\n } = config;\n\n const keys = createLocalStorageKeys(namespace);\n\n const encodeRecord = (chatId: string, versionId: string, value: T): string => {\n const record: StoredArtifactRecord = {\n chatId,\n versionId,\n updatedAt: new Date().toISOString(),\n data: serialize(value),\n };\n return JSON.stringify(record);\n };\n\n const decodeRecord = (raw: string): { value: T; record: StoredArtifactRecord } | null => {\n const record = safeJsonParse<StoredArtifactRecord>(raw);\n if (record && typeof record.chatId === 'string' && typeof record.versionId === 'string') {\n if (typeof record.updatedAt !== 'string' || typeof record.data !== 'string') return null;\n\n try {\n const value = deserialize(record.data);\n return { value, record };\n } catch {\n return null;\n }\n }\n\n if (legacyDecode) {\n try {\n const legacy = legacyDecode(raw);\n if (!legacy) return null;\n if (typeof legacy.chatId !== 'string' || typeof legacy.versionId !== 'string') return null;\n\n const normalized: StoredArtifactRecord = {\n chatId: legacy.chatId,\n versionId: legacy.versionId,\n updatedAt: typeof legacy.updatedAt === 'string' ? legacy.updatedAt : new Date().toISOString(),\n data: serialize(legacy.value),\n };\n\n return { value: legacy.value, record: normalized };\n } catch {\n return null;\n }\n }\n\n return null;\n };\n\n const saveLatest = async (chatId: string, value: T): Promise<void> => {\n const raw = encodeRecord(chatId, '__latest', value);\n\n for (const backend of storageOrder) {\n if (backend === 'opfs') {\n if (!isOpfsAvailable()) continue;\n const root = await getOpfsRootDir();\n if (!root) continue;\n\n const nsDir = await getDirectory(root, namespace, true);\n if (!nsDir) continue;\n\n const chatDir = await getDirectory(nsDir, chatId, true);\n if (!chatDir) continue;\n\n const ok = await writeOpfsFile(chatDir, 'latest.json', raw);\n if (ok) return;\n }\n\n if (backend === 'localStorage') {\n try {\n localStorage.setItem(keys.latest(chatId), raw);\n return;\n } catch {\n continue;\n }\n }\n }\n };\n\n const loadLatest = async (chatId: string): Promise<T | null> => {\n for (const backend of storageOrder) {\n if (backend === 'opfs') {\n if (!isOpfsAvailable()) continue;\n const root = await getOpfsRootDir();\n if (!root) continue;\n\n const nsDir = await getDirectory(root, namespace, false);\n if (!nsDir) continue;\n\n const chatDir = await getDirectory(nsDir, chatId, false);\n if (!chatDir) continue;\n\n const raw = await readOpfsFile(chatDir, 'latest.json');\n if (!raw) continue;\n const decoded = decodeRecord(raw);\n if (!decoded) continue;\n return decoded.value;\n }\n\n if (backend === 'localStorage') {\n try {\n const raw = localStorage.getItem(keys.latest(chatId));\n if (!raw) continue;\n const decoded = decodeRecord(raw);\n if (!decoded) continue;\n return decoded.value;\n } catch {\n continue;\n }\n }\n }\n\n return null;\n };\n\n const saveVersion = async (chatId: string, versionId: string, value: T): Promise<void> => {\n const raw = encodeRecord(chatId, versionId, value);\n\n for (const backend of storageOrder) {\n if (backend === 'opfs') {\n if (!isOpfsAvailable()) continue;\n const root = await getOpfsRootDir();\n if (!root) continue;\n\n const nsDir = await getDirectory(root, namespace, true);\n if (!nsDir) continue;\n\n const chatDir = await getDirectory(nsDir, chatId, true);\n if (!chatDir) continue;\n\n const versionsDir = await getDirectory(chatDir, 'versions', true);\n if (!versionsDir) continue;\n\n const okVersion = await writeOpfsFile(versionsDir, `${versionId}.json`, raw);\n if (!okVersion) continue;\n\n const okLatest = await writeOpfsFile(chatDir, 'latest.json', raw);\n if (okLatest) return;\n }\n\n if (backend === 'localStorage') {\n try {\n localStorage.setItem(keys.version(chatId, versionId), raw);\n localStorage.setItem(keys.latest(chatId), raw);\n return;\n } catch {\n continue;\n }\n }\n }\n };\n\n const loadVersion = async (chatId: string, versionId: string): Promise<T | null> => {\n for (const backend of storageOrder) {\n if (backend === 'opfs') {\n if (!isOpfsAvailable()) continue;\n const root = await getOpfsRootDir();\n if (!root) continue;\n\n const nsDir = await getDirectory(root, namespace, false);\n if (!nsDir) continue;\n\n const chatDir = await getDirectory(nsDir, chatId, false);\n if (!chatDir) continue;\n\n const versionsDir = await getDirectory(chatDir, 'versions', false);\n if (!versionsDir) continue;\n\n const raw = await readOpfsFile(versionsDir, `${versionId}.json`);\n if (!raw) continue;\n\n const decoded = decodeRecord(raw);\n if (!decoded) continue;\n\n return decoded.value;\n }\n\n if (backend === 'localStorage') {\n try {\n const raw = localStorage.getItem(keys.version(chatId, versionId));\n if (!raw) continue;\n const decoded = decodeRecord(raw);\n if (!decoded) continue;\n return decoded.value;\n } catch {\n continue;\n }\n }\n }\n\n return null;\n };\n\n const hasVersion = async (chatId: string, versionId: string): Promise<boolean> => {\n for (const backend of storageOrder) {\n if (backend === 'opfs') {\n if (!isOpfsAvailable()) continue;\n const root = await getOpfsRootDir();\n if (!root) continue;\n\n const nsDir = await getDirectory(root, namespace, false);\n if (!nsDir) continue;\n\n const chatDir = await getDirectory(nsDir, chatId, false);\n if (!chatDir) continue;\n\n const versionsDir = await getDirectory(chatDir, 'versions', false);\n if (!versionsDir) continue;\n\n const exists = await fileExists(versionsDir, `${versionId}.json`);\n if (exists) return true;\n }\n\n if (backend === 'localStorage') {\n try {\n const exists = localStorage.getItem(keys.version(chatId, versionId)) != null;\n if (exists) return true;\n } catch {\n continue;\n }\n }\n }\n\n return false;\n };\n\n const findMostRecentChatId = async (): Promise<string | null> => {\n for (const backend of storageOrder) {\n if (backend === 'opfs') {\n if (!isOpfsAvailable()) continue;\n const root = await getOpfsRootDir();\n if (!root) continue;\n\n const nsDir = await getDirectory(root, namespace, false);\n if (!nsDir) continue;\n\n let bestChatId: string | null = null;\n let bestTime = 0;\n\n try {\n const entries = (nsDir as DirectoryHandleWithEntries).entries?.();\n if (!entries) continue;\n\n for await (const [name, handle] of entries) {\n if (!isFileSystemDirectoryHandle(handle)) continue;\n\n const chatDir = handle;\n const raw = await readOpfsFile(chatDir, 'latest.json');\n if (!raw) continue;\n\n const decoded = decodeRecord(raw);\n if (!decoded) continue;\n\n const t = Date.parse(decoded.record.updatedAt);\n if (!Number.isNaN(t) && t > bestTime) {\n bestTime = t;\n bestChatId = decoded.record.chatId || name;\n }\n }\n\n if (bestChatId) return bestChatId;\n } catch {\n continue;\n }\n }\n\n if (backend === 'localStorage') {\n try {\n let bestChatId: string | null = null;\n let bestTime = 0;\n\n for (let i = 0; i < localStorage.length; i++) {\n const k = localStorage.key(i);\n if (!k) continue;\n if (!k.startsWith(keys.latestPrefix) || !k.endsWith(':latest')) continue;\n\n const raw = localStorage.getItem(k);\n if (!raw) continue;\n\n const decoded = decodeRecord(raw);\n if (!decoded) continue;\n\n const t = Date.parse(decoded.record.updatedAt);\n if (!Number.isNaN(t) && t > bestTime) {\n bestTime = t;\n bestChatId = decoded.record.chatId;\n }\n }\n\n if (bestChatId) return bestChatId;\n } catch {\n continue;\n }\n }\n }\n\n return null;\n };\n\n return {\n saveLatest,\n loadLatest,\n saveVersion,\n loadVersion,\n hasVersion,\n findMostRecentChatId,\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"]}