@hsafa/ui-sdk 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Button.module.css","../src/components/Button.tsx","../src/utils/file.ts","../src/components/AttachmentItem.tsx","../src/components/AttachmentDisplay.tsx","../src/components/MessageEditor.tsx","../src/types/messages.ts","../src/utils/message-utils.ts","../src/components/UserMessage.tsx","../src/components/ReasoningDisplay.tsx","../src/components/MermaidDiagram.tsx","../src/utils/markdown.ts","../src/components/MarkdownRendererWithMermaid.tsx","../src/components/ReasoningPane.tsx","../src/components/MCPToolDisplay.tsx","../src/components/AssistantMessageItems.tsx","../src/components/AssistantMessage.tsx","../src/components/MessageList.tsx","../src/components/FloatingChatButton.tsx","../src/hooks/useToggle.ts","../src/hooks/useAutoScroll.ts","../src/providers/HsafaProvider.tsx","../src/hooks/useHsafaAction.ts","../src/hooks/useHsafaComponent.ts","../src/hooks/useChatStorage.ts","../src/hooks/useStreaming.ts","../src/utils/file-upload.ts","../src/hooks/useFileUploadHook.ts","../src/hooks/useAgentStreaming.ts","../src/i18n/translations.ts","../src/hooks/useTranslation.ts","../src/hooks/useActions.ts","../src/components/IconButton.tsx","../src/components/ChatHeader.tsx","../src/components/ChatInput.tsx","../src/utils/time.ts","../src/components/ChatHistory.tsx","../src/utils/chat-theme.ts","../src/components/HsafaChat.tsx","../src/components/ContentContainer.tsx"],"names":["Button_default","Button","variant","size","loading","disabled","children","className","props","buttonClasses","jsxs","jsx","formatBytes","bytes","units","exponent","AttachmentItem","attachment","resolvedColors","mode","onRemove","maxWidth","isImage","isEditable","isLink","containerStyle","content","Fragment","e","fileIcon","File","Eye","X","Download","AttachmentDisplay","attachments","att","MessageEditor","messageId","initialText","editingText","onEditingTextChange","onCancel","onSave","streaming","onRemoveAttachment","onAddAttachments","uploading","t","fileInputRef","React","handleKeyDown","handleFileChange","files","Plus","attachmentToContentPart","buildUserContent","text","trimmedText","parts","extractTextFromUserContent","part","extractAttachmentsFromUserContent","url","getMessageText","message","getMessageAttachments","createUserMessage","now","createAssistantMessage","defaultReasoningOpen","messagesToAPIFormat","messages","result","msg","contentParts","action","stableToolCallId","itemsText","updateUserMessage","newAttachments","getMessageDisplayText","textItems","item","UserMessage","isEditing","editingAttachments","onStartEdit","onCancelEdit","onSaveEdit","messageText","messageAttachments","ReasoningDisplay","reasoning","reasoningOpen","onToggleReasoning","lines","line","finalLine","MermaidDiagram","chart","theme","containerRef","useRef","error","setError","useState","setLoading","useEffect","mounted","mermaid","id","svg","svgElement","err","borderColor","bgColor","errorBg","errorText","loadingText","escapeHtml","s","inlineFormat","renderMarkdownToHtmlSafe","input","html","inCode","codeLang","codeBuffer","inUl","inOl","hasMermaid","codeBlockBg","codeTextColor","closeLists","i","raw","fenceMatch","mermaidCode","codeHtml","cls","h","level","ulItem","olItem","MarkdownRendererWithMermaid","useMemo","elements","index","match","ReasoningPane","mainAgentActions","hideReasoningContent","displayActions","lastReasoningAction","a","hasFinalResponse","totalDuration","calculateTotalDuration","ExpandedActionItem","CheckCircle","formatDuration","actions","total","ms","minutes","seconds","isFirst","isLast","duration","getToolStatus","statusMap","renderTimeline","dotColor","color","MCPToolDisplay","mcpToolCalls","uniqueTools","toolCall","existing","hasRunningTools","tool","completedToolsCount","toolName","toolInfo","AssistantMessageItems","items","mcpToolResults","actionStatuses","components","it","idx","key","actionKey","status","compName","Comp","textContent","AssistantMessage","isLastMessage","hasMainAgentActions","MessageList","editingMessageId","editingMessageText","scrollAnchorRef","m","FloatingChatButton","show","onClick","floatingButtonPosition","floatingButtonStyles","useToggle","initial","on","setOn","toggle","useCallback","prev","setTrue","setFalse","useAutoScroll","ref","el","observer","HsafaContext","createContext","HsafaProvider","baseUrl","setActions","setComponents","streamingStates","setStreamingStates","chatOpenStates","setChatOpenStates","registerAction","name","handler","next","unregisterAction","registerComponent","component","unregisterComponent","setStreamingState","chatId","isStreaming","setChatOpenState","isOpen","isAnyStreaming","state","isAnyChatOpen","value","useHsafa","ctx","useContext","useHsafaAction","handlerRef","stableHandler","params","meta","useHsafaComponent","componentRef","StableComponent","Wrapper","CurrentComponent","useChatStorage","agentId","LS_PREFIX","chatsIndexKey","chatKey","currentChatKey","showChatKey","currentChatId","setCurrentChatId","hasChatRecordRef","pendingFirstTitleRef","loadChatsIndex","saveChatsIndex","list","loadChat","saveChat","data","upsertChatMeta","x","deleteChatMeta","deleteChatData","onChatDeleted","wasCurrentChat","savedCurrent","cd","firstUser","displayText","title","firstMessage","localId","useStreaming","setStreaming","abortControllerRef","actionExecMapRef","assistantMsgIdRef","calledFinalActionsRef","actionParamsHistoryRef","actionExecutionStatusRef","setActionStatuses","hasActionParamsStabilized","currentParams","history","stringifiedParams","lastThree","processActions","trigger","executeOnStream","timeoutId","isStabilized","currentStatus","handleStop","resetActionTracking","cleanupTimeouts","joinUrl","path","b","MAX_UPLOAD_SIZE","useFileUpload","setAttachments","setUploading","uploadAttachment","file","formData","response","handleRemoveAttachment","handleFileSelection","fileList","uploaded","mt","clearAttachments","deepClone","obj","useAgentStreaming","streamData","setStreamData","startStreaming","body","onUpdate","signal","pushUpdate","clonedData","finalSignal","controller","res","txt","currentReasoning","currentToolCall","currentResponse","currentText","mainAgentSkipped","reader","decoder","buffer","done","evt","finishedStep","delta","existingToolCall","toolCallToUpdate","fallbackToolCall","toolCallForError","sourceAction","fileAction","stopStreaming","reset","translations","getTranslation","lang","useTranslation","language","useActions","_","k","IconButton","icon","ariaLabel","ChatHeader","expandable","alwaysOpen","maximized","dir","onMaximize","onNew","onToggleHistory","onClose","historyBtnRef","Maximize2","History","ChevronRight","ChatInput","onChange","onSend","onStop","placeholder","onFileInputClick","textareaRef","onFileSelection","textarea","newHeight","Loader2","Paperclip","Link","Square","ArrowUp","timeAgo","ts","diff","d","w","months","ChatHistory","searchQuery","onSearchChange","chats","onChatSelect","onChatDelete","filteredChats","modalContent","Trash2","createPortal","themeColors","cloneAttachments","usePersistentChatMessages","chatStorage","setMessages","selectChat","chatData","deleteChat","wasCurrent","resetChat","HsafaChat","primaryColor","backgroundColor","textColor","accentColor","width","height","defaultOpen","chatContainerClassName","detectedLanguage","resolvedPlaceholder","resolvedTitle","chatInstanceId","setValue","showChat","setShowChat","savedShow","historyOpen","setHistoryOpen","historySearch","setHistorySearch","setMaximized","chatsListVersion","setChatsListVersion","setEditingMessageId","setEditingMessageText","setEditingAttachments","isAtBottom","setIsAtBottom","suppressNextScrollRef","componentId","deleteStoredChat","fileUpload","agentStreaming","applyStreamUpdateToAssistant","assistantId","responseAction","executeTurn","prompt","baseMessages","userMessage","assistantMessageId","finalItems","handleChatSelect","handleChatDelete","v","themeColorScheme","handleSend","promptText","attachmentsCopy","assistantMessage","handleAddEditingAttachments","scrollContainer","handleScroll","scrollTop","scrollHeight","clientHeight","atBottom","o","newText","messageIndex","targetMessage","updatedMessage","scrollPos","ContentContainer","mutedTextColor","enableBorderAnimation","borderRadius","enableContentBorder","enableMargin","chatWidth","isMounted","setIsMounted","timeout","contentBorderRadius","chatWidthPx","marginStyle","containerWidth"],"mappings":"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","file":"index.js","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","/**\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 { 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 <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 <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 <X size=\"12\" strokeWidth=\"2\" />\n </button>\n )}\n \n {isLink && (\n <Download \n size=\"10\" \n strokeWidth=\"2\" \n style={{ \n color: resolvedColors.mutedTextColor,\n flexShrink: 0\n }} \n />\n )}\n </>\n );\n\n if (isLink) {\n return (\n <a\n href={attachment.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{\n ...containerStyle,\n textDecoration: 'none'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground;\n e.currentTarget.style.borderColor = resolvedColors.primaryColor;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = resolvedColors.inputBackground;\n e.currentTarget.style.borderColor = resolvedColors.borderColor;\n }}\n >\n {content}\n </a>\n );\n }\n\n return <div style={containerStyle}>{content}</div>;\n}\n","import React from 'react';\nimport { Attachment } from '../types/chat';\nimport { ThemeColors } from '../utils/chat-theme';\nimport { AttachmentItem } from './AttachmentItem';\n\ninterface AttachmentDisplayProps {\n attachments: Attachment[];\n resolvedColors: ThemeColors;\n onRemove?: (id: string) => void;\n}\n\nexport function AttachmentDisplay({ attachments, resolvedColors, onRemove }: AttachmentDisplayProps) {\n if (!Array.isArray(attachments) || attachments.length === 0) {\n return null;\n }\n\n const mode = typeof onRemove === 'function' ? 'editable' : 'viewable';\n\n return (\n <div style={{\n marginTop: '12px',\n display: 'flex',\n flexWrap: 'wrap',\n gap: '8px'\n }}>\n {attachments.map((att) => (\n <AttachmentItem\n key={att.id}\n attachment={att}\n resolvedColors={resolvedColors}\n mode={mode}\n onRemove={onRemove}\n />\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport { Plus } from 'lucide-react';\nimport { ThemeColors } from '../utils/chat-theme';\nimport { Attachment } from '../types/chat';\nimport { AttachmentDisplay } from './AttachmentDisplay';\nimport type { TranslationKeys } from '../i18n/translations';\n\ninterface MessageEditorProps {\n messageId: string;\n initialText: string;\n editingText: string;\n onEditingTextChange: (text: string) => void;\n onCancel: () => void;\n onSave: (messageId: string, text: string) => void;\n streaming: boolean;\n resolvedColors: ThemeColors;\n attachments?: Attachment[];\n onRemoveAttachment?: (id: string) => void;\n onAddAttachments?: (files: FileList) => void;\n uploading?: boolean;\n t: (key: keyof TranslationKeys) => string;\n}\n\nexport function MessageEditor({\n messageId,\n initialText,\n editingText,\n onEditingTextChange,\n onCancel,\n onSave,\n streaming,\n resolvedColors,\n attachments,\n onRemoveAttachment,\n onAddAttachments,\n uploading,\n t\n}: MessageEditorProps) {\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onCancel();\n } else if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (!streaming) {\n onSave(messageId, editingText || initialText);\n }\n }\n };\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0 && onAddAttachments) {\n onAddAttachments(files);\n }\n // Reset the input so the same file can be selected again\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n return (\n <div style={{\n maxWidth: '720px',\n borderRadius: '16px',\n padding: '8px',\n fontSize: '15px',\n border: `2px solid ${resolvedColors.primaryColor}`,\n backgroundColor: resolvedColors.accentColor,\n color: resolvedColors.textColor\n }}>\n <textarea\n autoFocus\n style={{\n width: '100%',\n resize: 'none',\n backgroundColor: 'transparent',\n padding: '8px',\n lineHeight: '1.6',\n outline: 'none',\n border: 'none',\n color: 'inherit',\n fontFamily: 'inherit',\n fontSize: 'inherit'\n }}\n rows={Math.max(2, Math.min(10, Math.ceil((editingText || initialText).length / 60)))}\n value={editingText}\n onChange={(e) => onEditingTextChange(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n \n {attachments && attachments.length > 0 && (\n <div style={{ padding: '8px' }}>\n <AttachmentDisplay\n attachments={attachments}\n resolvedColors={resolvedColors}\n onRemove={onRemoveAttachment}\n />\n </div>\n )}\n \n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n padding: '8px 8px 8px 0'\n }}>\n {/* File upload button */}\n {onAddAttachments && (\n <div>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n onChange={handleFileChange}\n style={{ display: 'none' }}\n />\n <button\n onClick={() => fileInputRef.current?.click()}\n disabled={uploading || streaming}\n title={uploading ? t('input.uploadingFiles') : t('input.attachFiles')}\n style={{\n display: 'flex',\n margin: '0 10px',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '50%',\n width: '28px',\n height: '28px',\n transition: 'all 0.2s',\n border: `1px solid ${resolvedColors.borderColor}`,\n color: resolvedColors.mutedTextColor,\n backgroundColor: 'transparent',\n cursor: uploading || streaming ? 'not-allowed' : 'pointer',\n opacity: uploading || streaming ? 0.5 : 1\n }}\n onMouseEnter={(e) => {\n if (!uploading && !streaming) {\n e.currentTarget.style.backgroundColor = resolvedColors.inputBackground;\n e.currentTarget.style.borderColor = resolvedColors.primaryColor;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.borderColor = resolvedColors.borderColor;\n }}\n >\n <Plus size={16} strokeWidth={2} />\n </button>\n </div>\n )}\n \n {/* Action buttons container */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px'\n }}>\n <button\n style={{\n borderRadius: '8px',\n padding: '4px 12px',\n fontSize: '14px',\n transition: 'background-color 0.2s',\n border: `1px solid ${resolvedColors.borderColor}`,\n color: resolvedColors.mutedTextColor,\n backgroundColor: 'transparent',\n cursor: 'pointer'\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = resolvedColors.inputBackground}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = 'transparent'}\n onClick={onCancel}\n >\n {t('editor.cancel')}\n </button>\n <button\n style={{\n borderRadius: '8px',\n padding: '4px 12px',\n fontSize: '14px',\n transition: 'border-color 0.2s',\n border: `1px solid ${resolvedColors.borderColor}`,\n backgroundColor: resolvedColors.cardBackground,\n color: resolvedColors.textColor,\n cursor: 'pointer'\n }}\n onMouseEnter={(e) => e.currentTarget.style.borderColor = resolvedColors.primaryColor}\n onMouseLeave={(e) => e.currentTarget.style.borderColor = resolvedColors.borderColor}\n onClick={() => { if (!streaming) onSave(messageId, editingText || initialText); }}\n >\n {t('editor.saveAndRegenerate')}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Vercel AI SDK compatible message types\n * Based on https://sdk.vercel.ai/docs/ai-sdk-core/messages\n */\n\n// Content Parts for User Messages\nexport type TextPart = {\n type: 'text';\n text: string;\n};\n\nexport type ImagePart = {\n type: 'image';\n image: string | URL;\n mediaType?: string;\n};\n\nexport type FilePart = {\n type: 'file';\n data: string | URL;\n mediaType: string;\n name?: string;\n};\n\nexport type UserContentPart = TextPart | ImagePart | FilePart;\n\n// Content Parts for Assistant Messages\nexport type AssistantTextPart = {\n type: 'text';\n text: string;\n};\n\nexport type ReasoningPart = {\n type: 'reasoning';\n text: string;\n};\n\nexport type AssistantFilePart = {\n type: 'file';\n data: string | URL;\n mediaType: string;\n filename?: string;\n};\n\nexport type ToolCallPart = {\n type: 'tool-call';\n toolCallId: string;\n toolName: string;\n input: any;\n};\n\nexport type AssistantContentPart = AssistantTextPart | ReasoningPart | AssistantFilePart | ToolCallPart;\n\n// Content Parts for Tool Messages\nexport type ToolResultPart = {\n type: 'tool-result';\n toolCallId: string;\n toolName: string;\n output: unknown;\n isError?: boolean;\n};\n\n// Message Types\nexport type SystemModelMessage = {\n role: 'system';\n content: string;\n};\n\nexport type UserModelMessage = {\n role: 'user';\n content: string | UserContentPart[];\n};\n\nexport type AssistantModelMessage = {\n role: 'assistant';\n content: string | AssistantContentPart[];\n};\n\nexport type ToolModelMessage = {\n role: 'tool';\n content: ToolResultPart[];\n};\n\nexport type ModelMessage = \n | SystemModelMessage \n | UserModelMessage \n | AssistantModelMessage \n | ToolModelMessage;\n\n// Extended Message Types for UI (includes ID and metadata)\nexport type UIMessage = ModelMessage & {\n id: string;\n createdAt?: number;\n metadata?: Record<string, any>;\n};\n\n// Legacy Attachment Type (for backward compatibility)\nexport interface Attachment {\n id: string;\n name: string;\n url: string;\n mimeType: string;\n size: number;\n}\n\n// Helper to convert Attachment to content parts\nexport function attachmentToContentPart(attachment: Attachment): ImagePart | FilePart {\n const isImage = attachment.mimeType.startsWith('image/');\n \n if (isImage) {\n return {\n type: 'image',\n image: new URL(attachment.url),\n mediaType: attachment.mimeType\n };\n } else {\n return {\n type: 'file',\n data: attachment.url,\n mediaType: attachment.mimeType,\n name: attachment.name\n };\n }\n}\n\n// Helper to build user content from text and attachments\nexport function buildUserContent(text: string, attachments: Attachment[]): string | UserContentPart[] {\n const trimmedText = (text || '').trim();\n \n // If no attachments, return simple string\n if (!attachments || attachments.length === 0) {\n return trimmedText;\n }\n \n // Build parts array\n const parts: UserContentPart[] = [];\n \n // Add text part if present\n if (trimmedText) {\n parts.push({ type: 'text', text: trimmedText });\n }\n \n // Add attachment parts\n for (const attachment of attachments) {\n parts.push(attachmentToContentPart(attachment));\n }\n \n return parts;\n}\n\n// Helper to extract text from user content\nexport function extractTextFromUserContent(content: string | UserContentPart[]): string {\n if (typeof content === 'string') {\n return content;\n }\n \n if (Array.isArray(content)) {\n const textParts = content.filter((part): part is TextPart => part.type === 'text');\n return textParts.map(part => part.text).join('\\n');\n }\n \n return '';\n}\n\n// Helper to extract attachments from user content\nexport function extractAttachmentsFromUserContent(content: string | UserContentPart[]): Attachment[] {\n if (typeof content === 'string' || !Array.isArray(content)) {\n return [];\n }\n \n const attachments: Attachment[] = [];\n \n for (const part of content) {\n if (part.type === 'image') {\n const url = typeof part.image === 'string' ? part.image : part.image.toString();\n attachments.push({\n id: `img_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n name: 'image',\n url,\n mimeType: part.mediaType || 'image/jpeg',\n size: 0\n });\n } else if (part.type === 'file') {\n const url = typeof part.data === 'string' ? part.data : part.data.toString();\n attachments.push({\n id: `file_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n name: part.name || 'file',\n url,\n mimeType: part.mediaType,\n size: 0\n });\n }\n }\n \n return attachments;\n}\n","/**\n * Message utility functions for converting between formats\n */\n\nimport { \n ChatMessage, \n Attachment, \n UserContentPart, \n AssistantContentPart \n} from '../types/chat';\nimport { \n buildUserContent, \n extractTextFromUserContent, \n extractAttachmentsFromUserContent \n} from '../types/messages';\n\n/**\n * Convert user message content to legacy format for backward compatibility\n */\nexport function getMessageText(message: ChatMessage): string {\n if (message.role === 'user') {\n // Try legacy text field first\n if (message.text) return message.text;\n \n // Extract from content\n return extractTextFromUserContent(message.content);\n }\n \n return '';\n}\n\n/**\n * Convert user message content to attachments for backward compatibility\n */\nexport function getMessageAttachments(message: ChatMessage): Attachment[] {\n if (message.role === 'user') {\n // Try legacy attachments field first\n if (message.attachments) return message.attachments;\n \n // Extract from content\n return extractAttachmentsFromUserContent(message.content);\n }\n \n return [];\n}\n\n/**\n * Create a user message in Vercel AI SDK format\n */\nexport function createUserMessage(\n text: string, \n attachments: Attachment[] = []\n): ChatMessage & { role: 'user' } {\n const content = buildUserContent(text, attachments);\n const now = Date.now();\n \n return {\n id: `user_${now}_${Math.random().toString(36).slice(2)}`,\n role: 'user',\n content,\n createdAt: now,\n // Keep legacy fields for backward compatibility\n text,\n attachments: attachments.length > 0 ? attachments : undefined\n };\n}\n\n/**\n * Create an assistant message in Vercel AI SDK format\n */\nexport function createAssistantMessage(defaultReasoningOpen = false): ChatMessage & { role: 'assistant' } {\n const now = Date.now();\n \n return {\n id: `assistant_${now}_${Math.random().toString(36).slice(2)}`,\n role: 'assistant',\n items: [],\n reasoning: '',\n reasoningOpen: defaultReasoningOpen,\n mainAgentActions: [],\n createdAt: now\n };\n}\n\n/**\n * Convert messages to API format (for sending to agent)\n * Properly formats messages according to Vercel AI SDK specification:\n * - User: text + images + files\n * - Assistant: first agent message + reasoning + tool calls + final text (items stringified)\n * - Tool: separate tool result messages\n */\nexport function messagesToAPIFormat(messages: ChatMessage[]): Array<{\n role: string;\n content: any;\n}> {\n const result: Array<{ role: string; content: any }> = [];\n \n for (const msg of messages) {\n if (msg.role === 'user') {\n // User messages: keep content as-is (string or array of TextPart/ImagePart/FilePart)\n result.push({\n role: msg.role,\n content: msg.content\n });\n } else if (msg.role === 'assistant') {\n // Assistant messages: construct content array with all parts\n const contentParts: AssistantContentPart[] = [];\n \n // 1. Add first agent message if available\n if (msg.firstAgentMessage) {\n contentParts.push({\n type: 'text',\n text: msg.firstAgentMessage\n });\n }\n \n // 2. Process main agent actions (reasoning and tool calls)\n if (msg.mainAgentActions && msg.mainAgentActions.length > 0) {\n for (const action of msg.mainAgentActions) {\n if (action.type === 'reasoning' && action.reasoning) {\n contentParts.push({\n type: 'reasoning',\n text: action.reasoning\n });\n } else if (action.type === 'tool-call' && action.toolName) {\n // Compute a stable toolCallId for both the tool-call and tool-result\n const stableToolCallId = action.toolCallId \n || (typeof action.startDate === 'number' && action.toolName \n ? `${action.toolName}_${action.startDate}`\n : `call_${action.toolName || 'tool'}_${Math.abs((action.durationMs || 0))}`);\n\n // Tool calls go in assistant content\n contentParts.push({\n type: 'tool-call',\n toolCallId: stableToolCallId,\n toolName: action.toolName,\n input: action.input || {}\n });\n \n // Tool results become separate tool messages\n if (action.output !== undefined) {\n result.push({\n role: 'tool',\n content: [{\n type: 'tool-result',\n toolCallId: stableToolCallId,\n toolName: action.toolName,\n output: action.output,\n isError: action.status === 'error'\n }]\n });\n }\n }\n }\n }\n \n // 3. Add final response items as stringified text\n if (msg.items && msg.items.length > 0) {\n const itemsText = JSON.stringify(msg.items, null, 2);\n contentParts.push({\n type: 'text',\n text: itemsText\n });\n }\n \n // Only add assistant message if it has content\n if (contentParts.length > 0) {\n result.push({\n role: msg.role,\n content: contentParts\n });\n }\n }\n }\n \n return result;\n}\n\n/**\n * Update a user message with new text and attachments\n */\nexport function updateUserMessage(\n message: ChatMessage & { role: 'user' },\n text: string,\n attachments?: Attachment[]\n): ChatMessage & { role: 'user' } {\n const newAttachments = attachments ?? getMessageAttachments(message);\n const content = buildUserContent(text, newAttachments);\n \n return {\n ...message,\n content,\n text,\n attachments: newAttachments.length > 0 ? newAttachments : undefined\n };\n}\n\n/**\n * Check if a message has attachments\n */\nexport function hasAttachments(message: ChatMessage): boolean {\n if (message.role === 'user') {\n const attachments = getMessageAttachments(message);\n return attachments.length > 0;\n }\n return false;\n}\n\n/**\n * Get display text for a message (useful for chat history preview)\n */\nexport function getMessageDisplayText(message: ChatMessage): string {\n if (message.role === 'user') {\n const text = getMessageText(message);\n const attachments = getMessageAttachments(message);\n \n if (attachments.length > 0) {\n return `${text} [${attachments.length} attachment${attachments.length > 1 ? 's' : ''}]`;\n }\n \n return text;\n } else if (message.role === 'assistant') {\n // Extract text from items\n const items = message.items || [];\n const textItems = items.filter((item: any) => item.type === 'text');\n if (textItems.length > 0) {\n return textItems.map((item: any) => item.text || '').join(' ').slice(0, 100);\n }\n return 'Assistant response';\n }\n \n return '';\n}\n","import React from 'react';\nimport { ChatMessage, Attachment } from '../types/chat';\nimport { ThemeColors } from '../utils/chat-theme';\nimport { AttachmentDisplay } from './AttachmentDisplay';\nimport { MessageEditor } from './MessageEditor';\nimport { getMessageText, getMessageAttachments } from '../utils/message-utils';\nimport type { TranslationKeys } from '../i18n/translations';\n\ninterface UserMessageProps {\n message: ChatMessage & { role: 'user' };\n isEditing: boolean;\n editingText: string;\n editingAttachments?: Attachment[];\n onEditingTextChange: (text: string) => void;\n onStartEdit: (messageId: string, text: string) => void;\n onCancelEdit: () => void;\n onSaveEdit: (messageId: string, text: string) => void;\n onRemoveAttachment?: (id: string) => void;\n onAddAttachments?: (files: FileList) => void;\n uploading?: boolean;\n streaming: boolean;\n resolvedColors: ThemeColors;\n t: (key: keyof TranslationKeys) => string;\n}\n\nexport function UserMessage({\n message,\n isEditing,\n editingText,\n editingAttachments,\n onEditingTextChange,\n onStartEdit,\n onCancelEdit,\n onSaveEdit,\n onRemoveAttachment,\n onAddAttachments,\n uploading,\n streaming,\n resolvedColors,\n t\n}: UserMessageProps) {\n const messageText = getMessageText(message);\n const messageAttachments = getMessageAttachments(message);\n \n if (isEditing) {\n return (\n <MessageEditor\n messageId={message.id}\n initialText={messageText}\n editingText={editingText}\n onEditingTextChange={onEditingTextChange}\n onCancel={onCancelEdit}\n onSave={onSaveEdit}\n streaming={streaming}\n resolvedColors={resolvedColors}\n attachments={editingAttachments || messageAttachments}\n onRemoveAttachment={onRemoveAttachment}\n onAddAttachments={onAddAttachments}\n uploading={uploading}\n t={t}\n />\n );\n }\n\n return (\n <div\n title={t('editor.clickToEdit')}\n onClick={() => {\n if (streaming) return;\n onStartEdit(message.id, messageText);\n }}\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 }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = resolvedColors.accentColor}\n >\n {messageText}\n <AttachmentDisplay\n attachments={messageAttachments}\n resolvedColors={resolvedColors}\n />\n </div>\n );\n}\n","import React from 'react';\nimport { ThemeColors } from '../utils/chat-theme';\n\ninterface ReasoningDisplayProps {\n reasoning?: string;\n reasoningOpen?: boolean;\n onToggleReasoning: () => void;\n resolvedColors: ThemeColors;\n}\n\nexport function ReasoningDisplay({\n reasoning,\n reasoningOpen,\n onToggleReasoning,\n resolvedColors\n}: ReasoningDisplayProps) {\n if (!reasoning) return null;\n\n return (\n <div\n style={{\n borderRadius: '12px',\n padding: '12px',\n cursor: 'pointer',\n backgroundColor: resolvedColors.inputBackground,\n border: `1px solid ${resolvedColors.borderColor}`\n }}\n onClick={onToggleReasoning}\n >\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '4px'\n }}>\n <div style={{\n fontSize: '12px',\n color: resolvedColors.mutedTextColor\n }}>Reasoning</div>\n <button\n type=\"button\"\n style={{\n fontSize: '12px',\n transition: 'color 0.2s',\n color: resolvedColors.mutedTextColor,\n background: 'none',\n border: 'none',\n cursor: 'pointer'\n }}\n onMouseEnter={(e) => e.currentTarget.style.color = resolvedColors.textColor}\n onMouseLeave={(e) => e.currentTarget.style.color = resolvedColors.mutedTextColor}\n >\n {reasoningOpen ? 'Hide' : 'Show full'}\n </button>\n </div>\n {reasoningOpen ? (\n <pre style={{\n fontSize: '12px',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n color: resolvedColors.mutedTextColor,\n margin: '0',\n fontFamily: 'ui-monospace, SFMono-Regular, \"SF Mono\", Consolas, \"Liberation Mono\", Menlo, monospace'\n }}>{reasoning}</pre>\n ) : (\n (() => {\n const lines = (reasoning || '').trim().split('\\n').filter(line => line.trim());\n const finalLine = lines.length > 0 ? lines[lines.length - 1] : '';\n return (\n <pre style={{\n fontSize: '12px',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n color: resolvedColors.mutedTextColor,\n margin: '0',\n fontFamily: 'ui-monospace, SFMono-Regular, \"SF Mono\", Consolas, \"Liberation Mono\", Menlo, monospace'\n }}>\n {finalLine || '…'}\n </pre>\n );\n })()\n )}\n </div>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\n\nexport interface MermaidDiagramProps {\n chart: string;\n theme: 'light' | 'dark';\n}\n\n/**\n * Simple MermaidDiagram component for SDK use\n */\nexport function MermaidDiagram({ chart, theme }: MermaidDiagramProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let mounted = true;\n \n const renderMermaid = async () => {\n try {\n setLoading(true);\n setError(null);\n \n // Dynamic import to avoid SSR issues - only try if mermaid is available\n let mermaid: any;\n try {\n mermaid = await import('mermaid');\n } catch {\n throw new Error('Mermaid library not available');\n }\n \n if (!mounted) return;\n \n // Configure mermaid\n mermaid.default?.initialize({\n startOnLoad: false,\n theme: theme === 'dark' ? 'dark' : 'default',\n themeVariables: {\n darkMode: theme === 'dark',\n primaryColor: theme === 'dark' ? '#3B82F6' : '#1D4ED8',\n primaryTextColor: theme === 'dark' ? '#F3F4F6' : '#1F2937',\n primaryBorderColor: theme === 'dark' ? '#374151' : '#D1D5DB',\n },\n flowchart: { useMaxWidth: true },\n sequence: { useMaxWidth: true },\n gantt: { useMaxWidth: true },\n });\n \n if (containerRef.current && mounted) {\n const id = `mermaid-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n const { svg } = await mermaid.default.render(id, chart);\n \n if (containerRef.current && mounted) {\n containerRef.current.innerHTML = svg;\n const svgElement = containerRef.current.querySelector('svg');\n if (svgElement) {\n svgElement.style.maxWidth = '100%';\n svgElement.style.height = 'auto';\n svgElement.style.display = 'block';\n }\n }\n }\n } catch (err) {\n if (mounted) {\n setError(err instanceof Error ? err.message : 'Failed to render diagram');\n }\n } finally {\n if (mounted) {\n setLoading(false);\n }\n }\n };\n \n renderMermaid();\n \n return () => { mounted = false; };\n }, [chart, theme]);\n \n const borderColor = theme === 'dark' ? '#374151' : '#D1D5DB';\n const bgColor = theme === 'dark' ? '#1F2937' : '#F9FAFB';\n const errorBg = theme === 'dark' ? '#7F1D1D' : '#FEF2F2';\n const errorText = theme === 'dark' ? '#FCA5A5' : '#DC2626';\n const loadingText = theme === 'dark' ? '#9CA3AF' : '#6B7280';\n \n if (error) {\n return (\n <div style={{\n borderRadius: '12px',\n border: `1px solid ${borderColor}`,\n backgroundColor: errorBg,\n padding: '16px',\n margin: '8px 0'\n }}>\n <div style={{\n fontSize: '14px',\n color: errorText,\n marginBottom: '8px',\n fontWeight: '500'\n }}>\n Failed to render diagram\n </div>\n <div style={{\n fontSize: '12px',\n color: errorText,\n opacity: 0.8\n }}>\n {error}\n </div>\n </div>\n );\n }\n \n return (\n <div style={{\n borderRadius: '12px',\n border: `1px solid ${borderColor}`,\n backgroundColor: bgColor,\n padding: '16px',\n margin: '8px 0',\n overflow: 'hidden'\n }}>\n {loading && (\n <div style={{\n fontSize: '14px',\n color: loadingText,\n textAlign: 'center',\n padding: '32px'\n }}>\n Rendering diagram...\n </div>\n )}\n <div \n ref={containerRef}\n style={{\n display: loading ? 'none' : 'block',\n textAlign: 'center',\n minHeight: loading ? '0' : '50px'\n }}\n />\n </div>\n );\n}\n","/**\n * Markdown rendering utilities for the HsafaChat component\n */\n\n/**\n * Escape HTML characters\n */\nexport function escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\n/**\n * Apply inline formatting (links, bold, italic, code)\n */\nexport function inlineFormat(s: string): string {\n s = s.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline; color: inherit; opacity: 0.8;\">$1</a>');\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n s = s.replace(/\\*([^*\\n]+)\\*/g, '<em>$1</em>');\n s = s.replace(/`([^`]+)`/g, '<code style=\"padding: 2px 4px; border-radius: 4px; background-color: rgba(0,0,0,0.1); font-family: monospace;\">$1</code>');\n return s;\n}\n\n/**\n * Render markdown to HTML with mermaid detection\n */\nexport function renderMarkdownToHtmlSafe(input: string, theme: 'light' | 'dark' = 'dark'): { html: string; hasMermaid: boolean } {\n const lines = (input || '').replace(/\\r\\n/g, '\\n').split('\\n');\n let html = '';\n let inCode = false;\n let codeLang = '';\n let codeBuffer: string[] = [];\n let inUl = false;\n let inOl = false;\n let hasMermaid = false;\n\n const borderColor = theme === 'dark' ? '#374151' : '#D1D5DB';\n const bgColor = theme === 'dark' ? '#1F2937' : '#F9FAFB';\n const codeBlockBg = theme === 'dark' ? '#111827' : '#F3F4F6';\n const codeTextColor = theme === 'dark' ? '#E5E7EB' : '#374151';\n\n const closeLists = () => {\n if (inUl) { html += '</ul>'; inUl = false; }\n if (inOl) { html += '</ol>'; inOl = false; }\n };\n\n for (let i = 0; i < lines.length; i++) {\n let raw = lines[i];\n const fenceMatch = raw.match(/^```\\s*(\\w+)?\\s*$/);\n \n if (fenceMatch) {\n if (!inCode) {\n closeLists();\n inCode = true;\n codeLang = fenceMatch[1] ? String(fenceMatch[1]) : '';\n codeBuffer = [];\n } else {\n // Check if this is a mermaid diagram\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n inCode = false;\n codeLang = '';\n codeBuffer = [];\n }\n continue;\n }\n\n if (inCode) {\n codeBuffer.push(raw);\n continue;\n }\n\n // Horizontal rules\n if (/^\\s*(---|\\*\\*\\*|___)\\s*$/.test(raw)) {\n closeLists();\n html += '<hr style=\"margin: 12px 0; opacity: 0.6; border: none; border-top: 1px solid currentColor;\" />';\n continue;\n }\n\n // Headers\n const h = raw.match(/^(#{1,6})\\s+(.+)$/);\n if (h) {\n closeLists();\n const level = h[1].length;\n const content = inlineFormat(escapeHtml(h[2].trim()));\n const size = level <= 2 ? '18px' : level === 3 ? '16px' : '14px';\n html += `<h${level} style=\"font-size: ${size}; font-weight: 600; margin: 8px 0 4px 0;\">${content}</h${level}>`;\n continue;\n }\n\n // Lists\n const ulItem = raw.match(/^\\s*[-*]\\s+(.+)$/);\n const olItem = raw.match(/^\\s*\\d+\\.\\s+(.+)$/);\n if (ulItem) {\n if (!inUl) { closeLists(); html += '<ul style=\"list-style-type: disc; padding-left: 24px; margin: 4px 0;\">'; inUl = true; }\n const content = inlineFormat(escapeHtml(ulItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n if (olItem) {\n if (!inOl) { closeLists(); html += '<ol style=\"list-style-type: decimal; padding-left: 24px; margin: 4px 0;\">'; inOl = true; }\n const content = inlineFormat(escapeHtml(olItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n\n // Empty lines\n if (raw.trim().length === 0) {\n closeLists();\n html += '<div style=\"height: 8px;\"></div>';\n } else {\n closeLists();\n const content = inlineFormat(escapeHtml(raw));\n html += `<p style=\"line-height: 1.6; margin: 4px 0; word-break: break-word;\">${content}</p>`;\n }\n }\n\n // Handle unclosed code blocks\n if (inCode) {\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n }\n if (inUl) html += '</ul>';\n if (inOl) html += '</ol>';\n \n return { html, hasMermaid };\n}\n","import React, { useMemo } from 'react';\nimport { MermaidDiagram } from './MermaidDiagram';\nimport { escapeHtml } from '../utils/markdown';\n\nfunction inlineFormat(s: string) {\n s = s.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline; color: inherit; opacity: 0.8;\">$1</a>');\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n s = s.replace(/\\*([^*\\n]+)\\*/g, '<em>$1</em>');\n s = s.replace(/`([^`]+)`/g, '<code style=\"padding: 2px 4px; border-radius: 4px; background-color: rgba(0,0,0,0.1); font-family: monospace;\">$1</code>');\n return s;\n}\n\nfunction renderMarkdownToHtmlSafe(input: string, theme: 'light' | 'dark' = 'dark'): { html: string; hasMermaid: boolean } {\n const lines = (input || '').replace(/\\r\\n/g, '\\n').split('\\n');\n let html = '';\n let inCode = false;\n let codeLang = '';\n let codeBuffer: string[] = [];\n let inUl = false;\n let inOl = false;\n let hasMermaid = false;\n\n const borderColor = theme === 'dark' ? '#374151' : '#D1D5DB';\n const bgColor = theme === 'dark' ? '#1F2937' : '#F9FAFB';\n const codeBlockBg = theme === 'dark' ? '#111827' : '#F3F4F6';\n const codeTextColor = theme === 'dark' ? '#E5E7EB' : '#374151';\n\n const closeLists = () => {\n if (inUl) { html += '</ul>'; inUl = false; }\n if (inOl) { html += '</ol>'; inOl = false; }\n };\n\n for (let i = 0; i < lines.length; i++) {\n let raw = lines[i];\n const fenceMatch = raw.match(/^```\\s*(\\w+)?\\s*$/);\n \n if (fenceMatch) {\n if (!inCode) {\n closeLists();\n inCode = true;\n codeLang = fenceMatch[1] ? String(fenceMatch[1]) : '';\n codeBuffer = [];\n } else {\n // Check if this is a mermaid diagram\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n inCode = false;\n codeLang = '';\n codeBuffer = [];\n }\n continue;\n }\n\n if (inCode) {\n codeBuffer.push(raw);\n continue;\n }\n\n // Horizontal rules\n if (/^\\s*(---|\\*\\*\\*|___)\\s*$/.test(raw)) {\n closeLists();\n html += '<hr style=\"margin: 12px 0; opacity: 0.6; border: none; border-top: 1px solid currentColor;\" />';\n continue;\n }\n\n // Headers\n const h = raw.match(/^(#{1,6})\\s+(.+)$/);\n if (h) {\n closeLists();\n const level = h[1].length;\n const content = inlineFormat(escapeHtml(h[2].trim()));\n const size = level <= 2 ? '18px' : level === 3 ? '16px' : '14px';\n html += `<h${level} style=\"font-size: ${size}; font-weight: 600; margin: 8px 0 4px 0;\">${content}</h${level}>`;\n continue;\n }\n\n // Lists\n const ulItem = raw.match(/^\\s*[-*]\\s+(.+)$/);\n const olItem = raw.match(/^\\s*\\d+\\.\\s+(.+)$/);\n if (ulItem) {\n if (!inUl) { closeLists(); html += '<ul style=\"list-style-type: disc; padding-left: 24px; margin: 4px 0;\">'; inUl = true; }\n const content = inlineFormat(escapeHtml(ulItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n if (olItem) {\n if (!inOl) { closeLists(); html += '<ol style=\"list-style-type: decimal; padding-left: 24px; margin: 4px 0;\">'; inOl = true; }\n const content = inlineFormat(escapeHtml(olItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n\n // Empty lines\n if (raw.trim().length === 0) {\n closeLists();\n html += '<div style=\"height: 8px;\"></div>';\n } else {\n closeLists();\n const content = inlineFormat(escapeHtml(raw));\n html += `<p style=\"line-height: 1.6; margin: 4px 0; word-break: break-word;\">${content}</p>`;\n }\n }\n\n // Handle unclosed code blocks\n if (inCode) {\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n }\n if (inUl) html += '</ul>';\n if (inOl) html += '</ol>';\n \n return { html, hasMermaid };\n}\n\n// Markdown component that handles both regular markdown and mermaid diagrams\nexport function MarkdownRendererWithMermaid({ content, theme }: { content: string; theme: 'light' | 'dark' }) {\n const { html, hasMermaid } = useMemo(() => renderMarkdownToHtmlSafe(content, theme), [content, theme]);\n \n if (!hasMermaid) {\n return (\n <div\n style={{\n fontSize: '14px',\n lineHeight: '1.6',\n wordBreak: 'break-word',\n maxWidth: '100%',\n overflow: 'hidden'\n }}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n }\n\n // Parse HTML and replace mermaid placeholders with components\n const parts = html.split(/(<div class=\"mermaid-placeholder\"[^>]*><\\/div>)/g);\n const elements: React.ReactNode[] = [];\n \n parts.forEach((part, index) => {\n if (part.includes('mermaid-placeholder')) {\n // Extract mermaid code from data attribute\n const match = part.match(/data-mermaid=\"([^\"]*)\"/); \n if (match) {\n const mermaidCode = match[1]\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&amp;/g, '&')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\");\n \n elements.push(\n React.createElement(MermaidDiagram, {\n key: `mermaid-${index}`,\n chart: mermaidCode,\n theme: theme\n })\n );\n }\n } else if (part.trim()) {\n // Regular HTML content\n elements.push(\n React.createElement('div', {\n key: `html-${index}`,\n style: {\n fontSize: '14px',\n lineHeight: '1.6',\n wordBreak: 'break-word',\n maxWidth: '100%',\n overflow: 'hidden'\n },\n dangerouslySetInnerHTML: { __html: part }\n })\n );\n }\n });\n\n return React.createElement(React.Fragment, {}, ...elements);\n}\n","import React, { useState } from 'react';\nimport { ThemeColors } from '../utils/chat-theme';\nimport { MainAgentAction } from '../types/chat';\nimport { MarkdownRendererWithMermaid } from './MarkdownRendererWithMermaid';\nimport { CheckCircle } from 'lucide-react';\n\ninterface ReasoningPaneProps {\n mainAgentActions?: MainAgentAction[];\n reasoningOpen?: boolean;\n onToggleReasoning: () => void;\n resolvedColors: ThemeColors;\n streaming?: boolean;\n theme?: 'light' | 'dark';\n hideReasoningContent?: boolean; // If true, only shows that reasoning is happening without the actual content\n}\n\n/**\n * ReasoningPane displays an array of main agent actions including:\n * - Reasoning blocks\n * - Tool calls with input/output\n * - Interspersed in chronological order\n */\nexport function ReasoningPane({\n mainAgentActions,\n reasoningOpen,\n onToggleReasoning,\n resolvedColors,\n streaming = false,\n theme = 'dark',\n hideReasoningContent = false\n}: ReasoningPaneProps) {\n if (!mainAgentActions || mainAgentActions.length === 0) return null;\n\n // Filter out response actions and only show reasoning + tool-call (no text)\n const displayActions = mainAgentActions.filter(\n action => action.type === 'reasoning' || action.type === 'tool-call'\n );\n\n if (displayActions.length === 0) return null;\n\n // Get last reasoning action for preview\n const lastReasoningAction = [...displayActions].reverse().find(a => a.type === 'reasoning');\n \n // Check if final response has started (detect response action)\n const hasFinalResponse = mainAgentActions.some(action => action.type === 'response');\n\n // Calculate total duration\n const totalDuration = calculateTotalDuration(displayActions);\n\n return (\n <div\n style={{\n cursor: 'pointer',\n padding: '0',\n maxWidth: '100%'\n }}\n onClick={onToggleReasoning}\n >\n {reasoningOpen ? (\n // Expanded view - show all actions with timeline\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '0',\n maxWidth: '100%',\n position: 'relative'\n }}>\n {displayActions.map((action, index) => (\n <ExpandedActionItem\n key={index}\n action={action}\n resolvedColors={resolvedColors}\n theme={theme}\n isFirst={index === 0}\n isLast={index === displayActions.length - 1}\n hideReasoningContent={hideReasoningContent}\n />\n ))}\n {/* Final \"Done\" item when reasoning is complete */}\n {\n <div style={{\n display: 'flex',\n gap: '12px',\n paddingBottom: '0',\n position: 'relative',\n marginTop: '16px'\n }}>\n {/* Timeline indicator */}\n <div style={{\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: '24px',\n flexShrink: 0\n }}>\n \n \n {/* Final dot */}\n {hasFinalResponse ? <div style={{\n width: '8px',\n height: '8px',\n \n marginTop: '6px',\n zIndex: 1\n }} >\n <CheckCircle size={10} color={resolvedColors.borderColor} />\n </div>\n : <div style={{\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: resolvedColors.borderColor,\n marginTop: '6px',\n zIndex: 1\n }} />}\n </div>\n \n {/* Content */}\n <div style={{\n flex: 1,\n minWidth: 0\n }}>\n {hasFinalResponse && <div style={{\n fontSize: '11px',\n color: resolvedColors.mutedTextColor,\n fontWeight: 500,\n display: 'flex',\n alignItems: 'center',\n gap: '6px'\n }}>\n <span>Done</span>\n </div>}\n </div>\n </div>\n }\n </div>\n ) : (\n // Collapsed view - GPT style\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n maxWidth: '100%',\n minWidth: 0,\n overflow: 'hidden'\n }}>\n {/* Animated \"Thinking...\" - show while streaming until final response is detected */}\n {(streaming && !hasFinalResponse) ? (\n <div style={{\n fontSize: '13px',\n color: resolvedColors.mutedTextColor,\n fontStyle: 'italic',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n minWidth: 0\n }}>\n <span>Thinking</span>\n <span className=\"thinking-dots\" style={{\n display: 'inline-flex',\n gap: '2px'\n }}>\n <span style={{ animation: 'thinking-pulse 1.4s ease-in-out 0s infinite' }}>.</span>\n <span style={{ animation: 'thinking-pulse 1.4s ease-in-out 0.2s infinite' }}>.</span>\n <span style={{ animation: 'thinking-pulse 1.4s ease-in-out 0.4s infinite' }}>.</span>\n </span>\n </div>\n ):\n (\n <div style={{\n fontSize: '13px',\n color: resolvedColors.mutedTextColor,\n fontWeight: 500,\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n overflow: 'hidden',\n maxWidth: '100%',\n minWidth: 0,\n width: '100%'\n }}>\n <span style={{ \n opacity: 0.9,\n fontSize: '12px'\n }}>Thought</span>\n <span style={{ \n color: resolvedColors.mutedTextColor,\n fontFamily: 'monospace',\n fontSize: '12px',\n opacity: 0.5,\n letterSpacing: '0.1px'\n }}>\n for {formatDuration(totalDuration)}\n </span>\n </div>\n )}\n \n {/* First line of last reasoning - show when not streaming or when response has started */}\n {!hideReasoningContent && lastReasoningAction?.type === 'reasoning' && ( !hasFinalResponse) && (\n <div style={{\n fontSize: '12px',\n color: resolvedColors.mutedTextColor,\n opacity: 0.7,\n overflow: 'hidden',\n maxWidth: '100%',\n minWidth: 0,\n width: '100%'\n }}>\n <MarkdownRendererWithMermaid content={lastReasoningAction.reasoning} theme={theme} />\n </div>\n )}\n </div>\n )}\n\n {/* CSS for thinking animation */}\n <style>{`\n @keyframes thinking-pulse {\n 0%, 60%, 100% { opacity: 0.3; }\n 30% { opacity: 1; }\n }\n `}</style>\n </div>\n );\n}\n\nfunction calculateTotalDuration(actions: MainAgentAction[]): number {\n return actions.reduce((total, action) => {\n if ('startDate' in action && 'endDate' in action && action.startDate && action.endDate) {\n return total + (action.endDate - action.startDate);\n }\n return total;\n }, 0);\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n \n const minutes = Math.floor(ms / 60000);\n const seconds = Math.round((ms % 60000) / 1000);\n return `${minutes}m ${seconds}s`;\n}\n\n/**\n * Expanded view - shows individual action items with timeline\n */\nfunction ExpandedActionItem({\n action,\n resolvedColors,\n theme,\n isFirst,\n isLast,\n hideReasoningContent = false\n}: {\n action: MainAgentAction;\n resolvedColors: ThemeColors;\n theme: 'light' | 'dark';\n isFirst: boolean;\n isLast: boolean;\n hideReasoningContent?: boolean;\n}) {\n const duration = ('startDate' in action && 'endDate' in action && action.startDate && action.endDate)\n ? formatDuration(action.endDate - action.startDate)\n : null;\n\n const getToolStatus = (action: Extract<MainAgentAction, { type: 'tool-call' }>) => {\n const statusMap = {\n input_streaming: { color: theme === 'dark' ? '#eab308' : '#d97706', text: 'Inputting' },\n running: { color: theme === 'dark' ? '#3b82f6' : '#2563eb', text: 'Running' },\n error: { color: theme === 'dark' ? '#ef4444' : '#dc2626', text: 'Error' },\n finished: { color: theme === 'dark' ? '#10b981' : '#059669', text: 'Called' }\n };\n return statusMap[action.status] || statusMap.finished;\n };\n\n const renderTimeline = (dotColor: string) => (\n <div style={{\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: '24px',\n flexShrink: 0\n }}>\n <div style={{\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: dotColor,\n marginTop: '6px',\n zIndex: 1\n }} />\n <div style={{\n position: 'absolute',\n top: '20px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '2px',\n height: 'calc(100% + 4px)',\n backgroundColor: theme === 'dark' ? resolvedColors.borderColor : resolvedColors.mutedTextColor,\n }} />\n </div>\n );\n\n if (action.type === 'reasoning') {\n return (\n <div style={{ display: 'flex', gap: '12px', paddingBottom: isLast ? '0' : '16px', position: 'relative', marginBottom: '6px' }}>\n {renderTimeline(resolvedColors.borderColor)}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: '11px', color: resolvedColors.mutedTextColor, marginBottom: '4px', fontWeight: 500, display: 'flex', alignItems: 'center', gap: '6px' }}>\n <span>Reasoning</span>\n {duration && <span style={{ fontFamily: 'monospace', fontSize: '10px' }}>{duration}</span>}\n </div>\n {!hideReasoningContent && (\n <div style={{ fontSize: '13px', color: resolvedColors.mutedTextColor, lineHeight: '1.6', maxWidth: '100%', opacity: action.status === 'streaming' ? 0.8 : 1 }}>\n <MarkdownRendererWithMermaid content={action.reasoning} theme={theme} />\n </div>\n )}\n </div>\n </div>\n );\n }\n\n if (action.type === 'tool-call') {\n const { color, text } = getToolStatus(action);\n return (\n <div style={{ display: 'flex', gap: '12px', paddingBottom: isLast ? '0' : '16px', position: 'relative', marginBottom: '6px' }}>\n {renderTimeline(color)}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: '12px', color: resolvedColors.mutedTextColor, display: 'flex', alignItems: 'center', gap: '8px', flexWrap: 'wrap' }}>\n <span style={{ fontWeight: 500, opacity: theme === 'dark' ? 0.7 : 0.6 }}>{text}</span>\n <span style={{ fontWeight: 500 }}>{action.toolName || 'tool'}</span>\n {duration && <span style={{ fontFamily: 'monospace', fontSize: '10px', opacity: theme === 'dark' ? 0.5 : 0.6 }}>{duration}</span>}\n </div>\n </div>\n </div>\n );\n }\n\n return null;\n}\n\n\n","import React from 'react';\nimport { ThemeColors } from '../utils/chat-theme';\n\ninterface MCPToolCall {\n toolName: string;\n args: any;\n timestamp: number;\n status?: 'pending' | 'running' | 'completed' | 'failed';\n}\n\ninterface MCPToolDisplayProps {\n mcpToolCalls?: MCPToolCall[];\n resolvedColors: ThemeColors;\n}\n\nexport function MCPToolDisplay({ mcpToolCalls, resolvedColors }: MCPToolDisplayProps) {\n if (!mcpToolCalls || mcpToolCalls.length === 0) {\n return null;\n }\n\n // Get unique tool names and their latest status\n const uniqueTools = new Map<string, { status: string; count: number }>();\n\n mcpToolCalls.forEach((toolCall) => {\n const existing = uniqueTools.get(toolCall.toolName);\n if (!existing || (existing.status === 'running' && toolCall.status === 'completed')) {\n uniqueTools.set(toolCall.toolName, {\n status: toolCall.status || 'pending',\n count: (existing?.count || 0) + 1\n });\n } else if (existing) {\n existing.count++;\n }\n });\n\n const hasRunningTools = Array.from(uniqueTools.values()).some(tool => tool.status === 'running');\n const completedToolsCount = Array.from(uniqueTools.values()).filter(tool => tool.status === 'completed').length;\n\n return (\n <div style={{\n borderRadius: '12px',\n padding: '12px',\n backgroundColor: resolvedColors.cardBackground,\n border: `1px solid ${resolvedColors.borderColor}`,\n fontSize: '12px',\n color: resolvedColors.mutedTextColor\n }}>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginBottom: '8px'\n }}>\n <span style={{\n display: 'inline-block',\n height: '8px',\n width: '8px',\n borderRadius: '50%',\n backgroundColor: hasRunningTools ? '#3b82f6' : '#10b981'\n }} />\n <span>\n {hasRunningTools\n ? 'Agent is using tools'\n : completedToolsCount > 0\n ? `Agent used ${completedToolsCount} tool${completedToolsCount > 1 ? 's' : ''}`\n : 'Agent used tools'\n }\n </span>\n </div>\n <div style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: '6px'\n }}>\n {Array.from(uniqueTools.entries()).map(([toolName, toolInfo]) => (\n <div key={toolName} style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '11px',\n padding: '4px 8px',\n borderRadius: '6px',\n backgroundColor: resolvedColors.inputBackground,\n border: `1px solid ${resolvedColors.borderColor}`\n }}>\n {toolInfo.status === 'running' ? (\n <svg\n style={{\n animation: 'spin 1s linear infinite',\n height: '8px',\n width: '8px',\n flexShrink: 0\n }}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n style={{ opacity: 0.25 }}\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n style={{ opacity: 0.75 }}\n fill=\"currentColor\"\n d=\"m4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n ) : (\n <span style={{\n display: 'inline-block',\n height: '4px',\n width: '4px',\n borderRadius: '50%',\n backgroundColor: toolInfo.status === 'completed' ? '#10b981' : '#ef4444',\n flexShrink: 0\n }} />\n )}\n <span style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: '120px'\n }}>\n {toolName}\n </span>\n {toolInfo.count > 1 && (\n <span style={{\n opacity: 0.6,\n flexShrink: 0,\n fontSize: '10px'\n }}>\n ×{toolInfo.count}\n </span>\n )}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { resolveColors } from '../utils/theme';\nimport { MarkdownRendererWithMermaid } from './MarkdownRendererWithMermaid';\nimport { MCPToolDisplay } from './MCPToolDisplay';\nimport { ThemeColors } from '../utils/chat-theme';\n\ninterface MCPToolCall {\n toolName: string;\n args: any;\n timestamp: number;\n status?: 'pending' | 'running' | 'completed' | 'failed';\n}\n\ninterface AssistantMessageItemsProps {\n items: any[];\n mcpToolCalls?: MCPToolCall[];\n mcpToolResults?: Record<string, any>;\n actionStatuses: Map<string, 'executing' | 'executed'>;\n components: Map<string, React.ComponentType<any>>;\n theme: 'light' | 'dark';\n resolvedColors: ThemeColors;\n}\n\nexport function AssistantMessageItems({\n items,\n mcpToolCalls,\n mcpToolResults,\n actionStatuses,\n components,\n theme,\n resolvedColors\n}: AssistantMessageItemsProps) {\n if (!Array.isArray(items) || items.length === 0) return null;\n\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '12px'\n }}>\n {items.map((it, idx) => {\n const key = `it-${idx}`;\n if (typeof it === 'string') {\n return (\n <div key={key} style={{\n padding: '0',\n color: resolvedColors.textColor\n }}>\n <MarkdownRendererWithMermaid content={it} theme={theme} />\n </div>\n );\n }\n if (it && typeof it === 'object') {\n if (it.type === 'action') {\n const actionKey = `${String(it.name ?? 'action')}:${idx}`;\n const status = actionStatuses.get(actionKey);\n \n return (\n <div key={key} style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '8px'\n }}>\n {/* Action execution status */}\n <div style={{\n padding: '8px',\n fontSize: '12px',\n color: resolvedColors.mutedTextColor\n }}>\n {status === 'executing' ? (\n <span style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px'\n }}>\n <svg \n style={{\n animation: 'spin 1s linear infinite',\n height: '12px',\n width: '12px'\n }}\n xmlns=\"http://www.w3.org/2000/svg\" \n fill=\"none\" \n viewBox=\"0 0 24 24\"\n >\n <circle \n style={{ opacity: 0.25 }}\n cx=\"12\" \n cy=\"12\" \n r=\"10\" \n stroke=\"currentColor\" \n strokeWidth=\"4\"\n />\n <path \n style={{ opacity: 0.75 }}\n fill=\"currentColor\" \n d=\"m4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n {String(it.name ?? 'action')} is executing\n </span>\n ) : (\n <span style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px'\n }}>\n <span style={{\n display: 'inline-block',\n height: '6px',\n width: '6px',\n borderRadius: '50%',\n backgroundColor: '#10b981'\n }} />\n {String(it.name ?? 'action')} has executed\n </span>\n )}\n </div>\n </div>\n );\n }\n if (it.type === 'ui') {\n const compName = String(it.component ?? '').trim();\n const Comp = compName ? components.get(compName) : undefined;\n if (Comp) {\n return (\n <div key={key} style={{\n padding: '0'\n }}>\n <Comp {...(it.props || {})} />\n </div>\n );\n }\n return (\n <div key={key} style={{\n padding: '0'\n }}>\n <div style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '12px',\n marginBottom: '8px',\n color: resolvedColors.mutedTextColor\n }}>\n <span style={{\n padding: '2px 8px',\n borderRadius: '4px',\n backgroundColor: resolvedColors.accentColor,\n border: `1px solid ${resolvedColors.borderColor}`\n }}>UI</span>\n <span>{compName || 'component'}</span>\n <span style={{\n marginLeft: '8px',\n opacity: 0.7\n }}>(unregistered)</span>\n </div>\n <pre style={{\n fontSize: '12px',\n overflow: 'auto',\n color: resolvedColors.mutedTextColor,\n margin: '0',\n fontFamily: 'ui-monospace, SFMono-Regular, \"SF Mono\", Consolas, \"Liberation Mono\", Menlo, monospace'\n }}>{JSON.stringify(it.props ?? {}, null, 2)}</pre>\n </div>\n );\n }\n // Check if object has text/content field to render as markdown\n const textContent = it.text || it.content || it.message;\n if (typeof textContent === 'string') {\n return (\n <div key={key} style={{\n padding: '0',\n color: resolvedColors.textColor\n }}>\n <MarkdownRendererWithMermaid content={textContent} theme={theme} />\n </div>\n );\n }\n \n return (\n <div key={key} style={{\n padding: '0',\n fontSize: '14px'\n }}>\n <pre style={{\n fontSize: '12px',\n overflow: 'auto',\n color: resolvedColors.mutedTextColor,\n margin: '0',\n fontFamily: 'ui-monospace, SFMono-Regular, \"SF Mono\", Consolas, \"Liberation Mono\", Menlo, monospace'\n }}>{JSON.stringify(it, null, 2)}</pre>\n </div>\n );\n }\n return null;\n })}\n\n {/* MCP Tool Calls - Display unique tool names only */}\n <MCPToolDisplay\n mcpToolCalls={mcpToolCalls}\n resolvedColors={resolvedColors}\n />\n </div>\n );\n}\n","import React, { useRef } from 'react';\nimport { ChatMessage } from '../types/chat';\nimport { ThemeColors } from '../utils/chat-theme';\nimport { ReasoningDisplay } from './ReasoningDisplay';\nimport { ReasoningPane } from './ReasoningPane';\nimport { AssistantMessageItems } from './AssistantMessageItems';\n\ninterface AssistantMessageProps {\n message: ChatMessage & { role: 'assistant' };\n streaming: boolean;\n isLastMessage: boolean;\n actionStatuses: Map<string, 'executing' | 'executed'>;\n components: Map<string, React.ComponentType<any>>;\n theme: 'light' | 'dark';\n resolvedColors: ThemeColors;\n onToggleReasoning: (messageId: string) => void;\n hideReasoningContent?: boolean;\n}\n\nexport function AssistantMessage({\n message,\n streaming,\n isLastMessage,\n actionStatuses,\n components,\n theme,\n resolvedColors,\n onToggleReasoning,\n hideReasoningContent = false\n}: AssistantMessageProps) {\n // Check if we have new structured main agent actions\n const hasMainAgentActions = (message as any).mainAgentActions && \n (message as any).mainAgentActions.length > 0;\n\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '12px'\n }}>\n {/* First Agent Response - shown above reasoning */}\n {(message as any).firstAgentMessage && (\n <div style={{\n padding: '12px 0',\n }}>\n \n <div style={{\n fontSize: '13px',\n color: resolvedColors.textColor,\n lineHeight: '1.5'\n }}>\n {(message as any).firstAgentMessage}\n </div>\n </div>\n )}\n\n {/* Use new ReasoningPane if mainAgentActions exist, otherwise fallback to old ReasoningDisplay */}\n {hasMainAgentActions ? (\n <ReasoningPane\n mainAgentActions={(message as any).mainAgentActions}\n reasoningOpen={message.reasoningOpen}\n onToggleReasoning={() => onToggleReasoning(message.id)}\n resolvedColors={resolvedColors}\n streaming={streaming && isLastMessage}\n theme={theme}\n hideReasoningContent={hideReasoningContent}\n />\n ) : (\n <ReasoningDisplay\n reasoning={message.reasoning}\n reasoningOpen={message.reasoningOpen}\n onToggleReasoning={() => onToggleReasoning(message.id)}\n resolvedColors={resolvedColors}\n />\n )}\n \n <AssistantMessageItems\n items={message.items}\n mcpToolCalls={(message as any).mcpToolCalls}\n mcpToolResults={(message as any).mcpToolResults}\n actionStatuses={actionStatuses}\n components={components}\n theme={theme}\n resolvedColors={resolvedColors}\n />\n \n {streaming && isLastMessage && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '12px',\n color: resolvedColors.mutedTextColor\n }}>\n <span style={{\n display: 'inline-block',\n height: '8px',\n width: '8px',\n borderRadius: '50%',\n backgroundColor: resolvedColors.mutedTextColor,\n animation: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite'\n }} />\n <span>Working…</span>\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { ChatMessage, Attachment } from '../types/chat';\nimport { ThemeColors } from '../utils/chat-theme';\nimport { UserMessage } from './UserMessage';\nimport { AssistantMessage } from './AssistantMessage';\nimport type { TranslationKeys } from '../i18n/translations';\n\ninterface MessageListProps {\n messages: ChatMessage[];\n streaming: boolean;\n editingMessageId: string | null;\n editingMessageText: string;\n editingAttachments?: Attachment[];\n error: string | null;\n actionStatuses: Map<string, 'executing' | 'executed'>;\n components: Map<string, React.ComponentType<any>>;\n theme: 'light' | 'dark';\n resolvedColors: ThemeColors;\n onEditingTextChange: (text: string) => void;\n onRemoveAttachment?: (id: string) => void;\n onAddAttachments?: (files: FileList) => void;\n uploading?: boolean;\n onStartEdit: (messageId: string, text: string) => void;\n onCancelEdit: () => void;\n onSaveEdit: (messageId: string, text: string) => void;\n onToggleReasoning: (messageId: string) => void;\n scrollAnchorRef: React.RefObject<HTMLDivElement>;\n hideReasoningContent?: boolean;\n t: (key: keyof TranslationKeys) => string;\n}\n\nexport function MessageList({\n messages,\n streaming,\n editingMessageId,\n editingMessageText,\n editingAttachments,\n error,\n actionStatuses,\n components,\n theme,\n resolvedColors,\n onEditingTextChange,\n onRemoveAttachment,\n onAddAttachments,\n uploading,\n onStartEdit,\n onCancelEdit,\n onSaveEdit,\n onToggleReasoning,\n scrollAnchorRef,\n hideReasoningContent = false,\n t\n}: MessageListProps) {\n return (\n <div\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 }}\n >\n {error && (\n <div style={{\n margin: '0 8px',\n borderRadius: '12px',\n backgroundColor: 'rgba(239, 68, 68, 0.1)',\n color: '#fca5a5',\n border: '1px solid rgba(239, 68, 68, 0.3)',\n padding: '12px',\n fontSize: '14px'\n }}>{error}</div>\n )}\n \n {messages.length === 0 && !streaming && (\n <div style={{\n margin: '0 8px',\n borderRadius: '12px',\n padding: '16px',\n border: `1px solid ${resolvedColors.borderColor}`,\n backgroundColor: resolvedColors.accentColor,\n color: resolvedColors.mutedTextColor\n }}>\n {t('messages.empty')}\n </div>\n )}\n \n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '16px'\n }}>\n {messages.map((m, i) => (\n <div key={m.id} style={{ padding: '0 4px' }}>\n {m.role === 'user' ? (\n <UserMessage\n message={m as ChatMessage & { role: 'user' }}\n isEditing={editingMessageId === m.id}\n editingText={editingMessageText}\n editingAttachments={editingAttachments}\n onEditingTextChange={onEditingTextChange}\n onStartEdit={onStartEdit}\n onCancelEdit={onCancelEdit}\n onSaveEdit={onSaveEdit}\n onRemoveAttachment={onRemoveAttachment}\n onAddAttachments={onAddAttachments}\n uploading={uploading}\n streaming={streaming}\n resolvedColors={resolvedColors}\n t={t}\n />\n ) : (\n <AssistantMessage\n message={m as ChatMessage & { role: 'assistant' }}\n streaming={streaming}\n isLastMessage={i === messages.length - 1}\n actionStatuses={actionStatuses}\n components={components}\n theme={theme}\n resolvedColors={resolvedColors}\n onToggleReasoning={onToggleReasoning}\n hideReasoningContent={hideReasoningContent}\n />\n )}\n </div>\n ))}\n </div>\n \n <div ref={scrollAnchorRef} />\n </div>\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 { useCallback, useState } from \"react\";\n\nexport interface UseToggleReturn {\n /** Current toggle state */\n on: boolean;\n /** Toggle the state */\n toggle: () => void;\n /** Set the state directly */\n setOn: (value: boolean | ((prev: boolean) => boolean)) => void;\n /** Set state to true */\n setTrue: () => void;\n /** Set state to false */\n setFalse: () => void;\n}\n\n/**\n * A hook for managing boolean toggle state\n * @param initial - Initial state value (default: false)\n * @returns Object with toggle state and control functions\n */\nexport function useToggle(initial = false): UseToggleReturn {\n const [on, setOn] = useState(initial);\n \n const toggle = useCallback(() => setOn(prev => !prev), []);\n const setTrue = useCallback(() => setOn(true), []);\n const setFalse = useCallback(() => setOn(false), []);\n\n return { \n on, \n toggle, \n setOn, \n setTrue, \n setFalse \n };\n}\n","import { useEffect, useRef } from \"react\";\n\nexport function useAutoScroll<T extends HTMLElement>() {\n const ref = useRef<T | null>(null);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const observer = new MutationObserver(() => {\n el.scrollTop = el.scrollHeight;\n });\n\n observer.observe(el, { childList: true, subtree: true });\n el.scrollTop = el.scrollHeight;\n\n return () => observer.disconnect();\n }, []);\n\n return ref;\n}\n","import React, { createContext, useCallback, useContext, useMemo, useState } from \"react\";\n\n/**\n * Handler function for custom actions that can be triggered by the AI agent\n */\nexport type HsafaActionHandler = (params: any, meta: {\n /** Name of the action being called */\n name: string;\n /** When the action is being triggered */\n trigger: 'partial' | 'final' | 'params_complete';\n /** Index of the action in the sequence */\n index: number;\n /** ID of the assistant message that triggered this action */\n assistantMessageId?: string;\n /** ID of the current chat session */\n chatId?: string;\n}) => Promise<any> | any;\n\n/**\n * Configuration options for the Hsafa SDK\n */\nexport interface HsafaConfig {\n /** Base URL for agent API calls, e.g. \"\" (same origin) or \"https://example.com\" */\n baseUrl?: string;\n}\n\n/**\n * Context value provided by HsafaProvider\n */\nexport interface HsafaContextValue extends HsafaConfig {\n /** Registered custom actions */\n actions: Map<string, HsafaActionHandler>;\n /** Registered custom components */\n components: Map<string, React.ComponentType<any>>;\n /** Register a custom action handler */\n registerAction: (name: string, handler: HsafaActionHandler) => () => void;\n /** Unregister a custom action handler */\n unregisterAction: (name: string, handler?: HsafaActionHandler) => void;\n /** Register a custom component */\n registerComponent: (name: string, component: React.ComponentType<any>) => () => void;\n /** Unregister a custom component */\n unregisterComponent: (name: string, component?: React.ComponentType<any>) => void;\n /** Global streaming state - true if any chat is streaming */\n isAnyStreaming: boolean;\n /** Set streaming state for a specific chat instance */\n setStreamingState: (chatId: string, isStreaming: boolean) => void;\n /** Global chat open state - true if any chat is open */\n isAnyChatOpen: boolean;\n /** Set chat open state for a specific chat instance */\n setChatOpenState: (chatId: string, isOpen: boolean) => void;\n}\n\nconst HsafaContext = createContext<HsafaContextValue | undefined>(undefined);\n\n/**\n * Props for the HsafaProvider component\n */\nexport interface HsafaProviderProps extends HsafaConfig {\n /** Child components that will have access to the Hsafa context */\n children: React.ReactNode;\n}\n\n/**\n * Provider component that sets up the Hsafa context for the SDK.\n * Wrap your app or chat components with this provider to enable Hsafa functionality.\n * \n * @example\n * ```tsx\n * <HsafaProvider baseUrl=\"https://api.example.com\">\n * <HsafaChat agentId=\"my-agent\" />\n * </HsafaProvider>\n * ```\n */\nexport function HsafaProvider({ baseUrl, children }: HsafaProviderProps) {\n const [actions, setActions] = useState<Map<string, HsafaActionHandler>>(new Map());\n const [components, setComponents] = useState<Map<string, React.ComponentType<any>>>(new Map());\n const [streamingStates, setStreamingStates] = useState<Map<string, boolean>>(new Map());\n const [chatOpenStates, setChatOpenStates] = useState<Map<string, boolean>>(new Map());\n\n const registerAction = useCallback((name: string, handler: HsafaActionHandler) => {\n setActions(prev => {\n const next = new Map(prev);\n next.set(String(name), handler);\n return next;\n });\n return () => {\n setActions(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!handler || existing === handler) next.delete(String(name));\n return next;\n });\n };\n }, []);\n\n const unregisterAction = useCallback((name: string, handler?: HsafaActionHandler) => {\n setActions(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!handler || existing === handler) next.delete(String(name));\n return next;\n });\n }, []);\n\n const registerComponent = useCallback((name: string, component: React.ComponentType<any>) => {\n setComponents(prev => {\n const next = new Map(prev);\n next.set(String(name), component);\n return next;\n });\n return () => {\n setComponents(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!component || existing === component) next.delete(String(name));\n return next;\n });\n };\n }, []);\n\n const unregisterComponent = useCallback((name: string, component?: React.ComponentType<any>) => {\n setComponents(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!component || existing === component) next.delete(String(name));\n return next;\n });\n }, []);\n\n const setStreamingState = useCallback((chatId: string, isStreaming: boolean) => {\n setStreamingStates(prev => {\n const next = new Map(prev);\n if (isStreaming) {\n next.set(chatId, true);\n } else {\n next.delete(chatId);\n }\n return next;\n });\n }, []);\n\n const setChatOpenState = useCallback((chatId: string, isOpen: boolean) => {\n setChatOpenStates(prev => {\n const next = new Map(prev);\n if (isOpen) {\n next.set(chatId, true);\n } else {\n next.delete(chatId);\n }\n return next;\n });\n }, []);\n\n const isAnyStreaming = useMemo(() => {\n return Array.from(streamingStates.values()).some(state => state);\n }, [streamingStates]);\n\n const isAnyChatOpen = useMemo(() => {\n return Array.from(chatOpenStates.values()).some(state => state);\n }, [chatOpenStates]);\n\n const value: HsafaContextValue = useMemo(() => ({\n baseUrl,\n actions,\n components,\n registerAction,\n unregisterAction,\n registerComponent,\n unregisterComponent,\n isAnyStreaming,\n setStreamingState,\n isAnyChatOpen,\n setChatOpenState,\n }), [baseUrl, actions, components, registerAction, unregisterAction, registerComponent, unregisterComponent, isAnyStreaming, setStreamingState, isAnyChatOpen, setChatOpenState]);\n\n return (\n <HsafaContext.Provider value={value}>\n {children}\n </HsafaContext.Provider>\n );\n}\n\n/**\n * Hook to access the Hsafa context.\n * Must be used within a HsafaProvider.\n * \n * @returns The Hsafa context value with actions, components, and configuration\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const { registerAction, baseUrl } = useHsafa();\n * \n * useEffect(() => {\n * const unregister = registerAction('myAction', async (params) => {\n * console.log('Action called with:', params);\n * return { success: true };\n * });\n * \n * return unregister;\n * }, [registerAction]);\n * \n * return <div>My Component</div>;\n * }\n * ```\n */\nexport function useHsafa(): HsafaContextValue {\n const ctx = useContext(HsafaContext);\n if (!ctx) return {\n baseUrl: undefined,\n actions: new Map(),\n components: new Map(),\n registerAction: () => () => undefined,\n unregisterAction: () => undefined,\n registerComponent: () => () => undefined,\n unregisterComponent: () => undefined,\n isAnyStreaming: false,\n setStreamingState: () => undefined,\n isAnyChatOpen: false,\n setChatOpenState: () => undefined,\n };\n return ctx;\n}\n","import { useEffect, useRef, useCallback } from 'react';\nimport { useHsafa } from '../providers/HsafaProvider';\nimport type { HsafaActionHandler } from '../providers/HsafaProvider';\n\n/**\n * Register an action handler by name within the nearest HsafaProvider.\n * The handler will be automatically unregistered on unmount.\n * \n * @param name - Unique name for the action\n * @param handler - Function to execute when action is triggered\n * \n * @example\n * ```tsx\n * useHsafaAction('submitForm', async (params, meta) => {\n * console.log('Form submitted:', params);\n * return { success: true };\n * });\n * ```\n */\nexport function useHsafaAction(name: string, handler: HsafaActionHandler) {\n const { registerAction } = useHsafa();\n const handlerRef = useRef(handler);\n \n // Keep latest handler without re-registering\n // This pattern allows the handler to close over latest state/props\n // without triggering re-registration\n useEffect(() => {\n handlerRef.current = handler;\n });\n\n // Create stable wrapper function that delegates to current handler\n const stableHandler = useCallback<HsafaActionHandler>(\n (params, meta) => handlerRef.current(params, meta),\n [] // Never changes - delegates to ref\n );\n\n // Register/unregister on mount/unmount or name change\n useEffect(() => {\n if (!name || typeof handler !== 'function') {\n console.warn(`[useHsafaAction] Invalid action registration: name=\"${name}\", handler type=\"${typeof handler}\"`);\n return;\n }\n \n const unregister = registerAction(name, stableHandler);\n return unregister;\n }, [name, registerAction, stableHandler]);\n}\n","import React, { useEffect, useRef, useMemo } from 'react';\nimport type { ComponentType } from 'react';\nimport { useHsafa } from '../providers/HsafaProvider';\n\n/**\n * Register a UI component by name within the nearest HsafaProvider.\n * The component will be automatically unregistered on unmount.\n * \n * @param name - Unique name for the component (matches agent's component field)\n * @param component - React component to render when agent requests this component\n * \n * @example\n * ```tsx\n * function ProductCard({ name, price }: { name: string; price: number }) {\n * return <div>{name}: ${price}</div>;\n * }\n * \n * useHsafaComponent('ProductCard', ProductCard);\n * ```\n */\nexport function useHsafaComponent<T = any>(name: string, component: ComponentType<T>) {\n const { registerComponent } = useHsafa();\n const componentRef = useRef(component);\n \n // Keep latest component without re-registering\n // This allows component to update without triggering re-registration\n useEffect(() => {\n componentRef.current = component;\n });\n\n // Create stable wrapper component that delegates to current component\n // Using useMemo instead of useCallback for components\n const StableComponent = useMemo<ComponentType<any>>(\n () => {\n // Forward ref wrapper that always uses latest component\n const Wrapper = (props: any) => {\n const CurrentComponent = componentRef.current;\n return React.createElement(CurrentComponent as any, props);\n };\n Wrapper.displayName = `HsafaStable(${name})`;\n return Wrapper;\n },\n [] // Never changes - delegates to ref\n );\n\n // Register/unregister on mount/unmount or name change\n useEffect(() => {\n if (!name || typeof component !== 'function') {\n console.warn(`[useHsafaComponent] Invalid component registration: name=\"${name}\", component type=\"${typeof component}\"`);\n return;\n }\n \n const unregister = registerComponent(name, StableComponent);\n return unregister;\n }, [name, registerComponent, StableComponent]);\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { ChatMessage } from '../types/chat';\nimport { getMessageDisplayText } from '../utils/message-utils';\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 useChatStorage(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 [currentChatId, setCurrentChatId] = useState<string | null>(null);\n const hasChatRecordRef = useRef<boolean>(false);\n const pendingFirstTitleRef = useRef<string | null>(null);\n\n // Storage operations\n const loadChatsIndex = (): ChatMeta[] => {\n try {\n const raw = localStorage.getItem(chatsIndexKey);\n return raw ? JSON.parse(raw) : [];\n } catch { \n return []; \n }\n };\n\n const saveChatsIndex = (list: ChatMeta[]) => {\n try { \n localStorage.setItem(chatsIndexKey, JSON.stringify(list)); \n } 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 { \n return null; \n }\n };\n\n const saveChat = (data: ChatData) => {\n try { \n localStorage.setItem(chatKey(data.id), JSON.stringify(data)); \n } 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; \n 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 { \n localStorage.removeItem(chatKey(id)); \n } catch {}\n };\n\n const deleteChat = (id: string, onChatDeleted?: (wasCurrentChat: boolean) => void) => {\n deleteChatData(id);\n deleteChatMeta(id);\n const wasCurrentChat = currentChatId === id;\n if (wasCurrentChat) {\n setCurrentChatId(null);\n hasChatRecordRef.current = false;\n pendingFirstTitleRef.current = null;\n try { \n localStorage.removeItem(currentChatKey); \n } catch {}\n }\n onChatDeleted?.(wasCurrentChat);\n };\n\n const loadChatPreferences = () => {\n try {\n const savedCurrent = localStorage.getItem(currentChatKey);\n if (savedCurrent) {\n const cd = loadChat(savedCurrent);\n if (cd) {\n setCurrentChatId(cd.id);\n hasChatRecordRef.current = true;\n return cd.messages || [];\n }\n }\n } catch {}\n return [];\n };\n\n const persistChatData = (messages: ChatMessage[]) => {\n if (!currentChatId || !hasChatRecordRef.current) return;\n \n const data: ChatData = { id: currentChatId, messages, agentId };\n saveChat(data);\n \n const firstUser = messages.find(m => m.role === 'user');\n const displayText = firstUser ? getMessageDisplayText(firstUser) : 'New chat';\n const title = (pendingFirstTitleRef.current || displayText).slice(0, 80);\n const meta: ChatMeta = { \n id: currentChatId, \n title, \n createdAt: Date.now(), \n updatedAt: Date.now() \n };\n \n upsertChatMeta(meta);\n \n try { \n localStorage.setItem(currentChatKey, currentChatId); \n } catch {}\n };\n\n const createNewChat = (firstMessage?: string) => {\n const localId = `local-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n setCurrentChatId(localId);\n hasChatRecordRef.current = true;\n \n const title = (firstMessage || 'New chat').slice(0, 80);\n const now = Date.now();\n \n upsertChatMeta({ id: localId, title, createdAt: now, updatedAt: now });\n \n try { \n localStorage.setItem(currentChatKey, localId); \n } catch {}\n \n return localId;\n };\n\n return {\n // State\n currentChatId,\n setCurrentChatId,\n hasChatRecordRef,\n pendingFirstTitleRef,\n \n // Operations\n loadChatsIndex,\n loadChat,\n saveChat,\n deleteChat,\n loadChatPreferences,\n persistChatData,\n createNewChat,\n upsertChatMeta,\n \n // Keys\n showChatKey\n };\n}\n","import { useState, useRef, useCallback } from 'react';\nimport { ChatMessage } from '../types/chat';\n\nexport function useStreaming() {\n const [streaming, setStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n \n // Streaming meta refs\n const actionExecMapRef = useRef<Record<string, boolean>>({});\n const assistantMsgIdRef = useRef<string | undefined>(undefined);\n const calledFinalActionsRef = useRef<Set<string>>(new Set());\n \n // Action parameter tracking for completion detection\n const actionParamsHistoryRef = useRef<Map<string, any[]>>(new Map());\n const actionExecutionStatusRef = useRef<Map<string, 'executing' | 'executed'>>(new Map());\n const [actionStatuses, setActionStatuses] = useState<Map<string, 'executing' | 'executed'>>(new Map());\n\n const hasActionParamsStabilized = useCallback((actionKey: string, currentParams: any): boolean => {\n const history = actionParamsHistoryRef.current.get(actionKey) || [];\n const stringifiedParams = JSON.stringify(currentParams);\n \n // Add current params to history\n history.push(stringifiedParams);\n \n // Keep only last 5 entries to detect stabilization with better accuracy\n if (history.length > 5) {\n history.shift();\n }\n \n actionParamsHistoryRef.current.set(actionKey, history);\n \n // Consider stabilized if params haven't changed in last 3 updates (more robust)\n if (history.length >= 3) {\n const lastThree = history.slice(-3);\n return lastThree.every(params => params === lastThree[0]);\n }\n \n return false;\n }, []);\n\n const processActions = useCallback((\n items: any[] | undefined, \n trigger: 'partial' | 'final',\n actions: Map<string, any>,\n currentChatId: string | null\n ) => {\n if (!Array.isArray(items) || items.length === 0) return;\n \n items.forEach((it, idx) => {\n if (!it || typeof it !== 'object') return;\n if (it.type === 'action') {\n const name = String(it.name ?? '').trim();\n if (!name) return;\n const handler = actions.get(name);\n if (!handler) {\n console.warn(`Action handler not found for: ${name}`);\n return;\n }\n \n const executeOnStream = !!actionExecMapRef.current[name];\n const key = `${assistantMsgIdRef.current || 'assist'}:${name}:${idx}`;\n const actionKey = `${name}:${idx}`;\n \n try {\n if (trigger === 'partial' && executeOnStream) {\n // Execute on each partial update (streaming mode)\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executing'));\n \n // Add debouncing for rapid fire actions\n const timeoutId = setTimeout(() => {\n Promise.resolve(handler(it.params, { \n name, \n trigger, \n index: idx, \n assistantMessageId: assistantMsgIdRef.current, \n chatId: currentChatId || undefined \n })).catch(error => {\n console.error(`Error executing streaming action ${name}:`, error);\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executed'));\n });\n }, 50); // 50ms debounce\n \n // Store timeout for cleanup if needed\n actionExecutionStatusRef.current.set(`${actionKey}_timeout`, timeoutId as any);\n \n } else if (trigger === 'partial' && !executeOnStream) {\n // Check if action parameters have stabilized (finished streaming)\n const isStabilized = hasActionParamsStabilized(actionKey, it.params);\n const currentStatus = actionExecutionStatusRef.current.get(actionKey);\n \n if (isStabilized && currentStatus !== 'executed') {\n // Parameters have stabilized, execute the action\n actionExecutionStatusRef.current.set(actionKey, 'executed');\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executed'));\n \n Promise.resolve(handler(it.params, { \n name, \n trigger: 'params_complete', \n index: idx, \n assistantMessageId: assistantMsgIdRef.current, \n chatId: currentChatId || undefined \n })).catch(error => {\n console.error(`Error executing stabilized action ${name}:`, error);\n });\n } else if (!currentStatus) {\n // First time seeing this action, mark as executing\n actionExecutionStatusRef.current.set(actionKey, 'executing');\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executing'));\n }\n } else if (trigger === 'final') {\n // Final trigger - ensure action is executed if not already\n const currentStatus = actionExecutionStatusRef.current.get(actionKey);\n if (currentStatus !== 'executed' && !calledFinalActionsRef.current.has(key)) {\n calledFinalActionsRef.current.add(key);\n \n // Clear any pending timeouts\n const timeoutId = actionExecutionStatusRef.current.get(`${actionKey}_timeout`);\n if (timeoutId) {\n clearTimeout(timeoutId as any);\n actionExecutionStatusRef.current.delete(`${actionKey}_timeout`);\n }\n \n actionExecutionStatusRef.current.set(actionKey, 'executed');\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executed'));\n \n Promise.resolve(handler(it.params, { \n name, \n trigger: executeOnStream ? 'final' : 'params_complete', \n index: idx, \n assistantMessageId: assistantMsgIdRef.current, \n chatId: currentChatId || undefined \n })).catch(error => {\n console.error(`Error executing final action ${name}:`, error);\n });\n }\n }\n } catch (error) {\n console.error(`Error processing action ${name}:`, error);\n }\n }\n });\n }, [hasActionParamsStabilized]);\n\n const handleStop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setStreaming(false);\n setError(\"Request stopped by user\");\n }, []);\n\n const resetActionTracking = useCallback(() => {\n calledFinalActionsRef.current.clear();\n actionParamsHistoryRef.current.clear();\n actionExecutionStatusRef.current.clear();\n setActionStatuses(new Map());\n }, []);\n\n // Cleanup function for action timeouts\n const cleanupTimeouts = useCallback(() => {\n actionExecutionStatusRef.current.forEach((value, key) => {\n if (key.endsWith('_timeout')) {\n clearTimeout(value as any);\n }\n });\n }, []);\n\n return {\n // State\n streaming,\n setStreaming,\n error,\n setError,\n actionStatuses,\n setActionStatuses,\n \n // Refs\n abortControllerRef,\n actionExecMapRef,\n assistantMsgIdRef,\n calledFinalActionsRef,\n actionParamsHistoryRef,\n actionExecutionStatusRef,\n \n // Functions\n processActions,\n handleStop,\n resetActionTracking,\n cleanupTimeouts,\n hasActionParamsStabilized\n };\n}\n","import { Attachment } from '../types/chat';\n\n// File upload constants\nexport const MAX_UPLOAD_SIZE = 25 * 1024 * 1024; // 25MB\n\nexport function joinUrl(baseUrl: string | undefined, path: string): string {\n if (!baseUrl) return path;\n const a = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const b = path.startsWith('/') ? path : `/${path}`;\n return `${a}${b}`;\n}\n\nexport function buildUserContent(text: string, attachments: Attachment[]) {\n const parts: any[] = [];\n const t = (text || '').trim();\n if (t) parts.push({ type: 'text', text: t });\n for (const a of (attachments || [])) {\n const mt = a.mimeType || 'application/octet-stream';\n if (mt.startsWith('image/')) {\n parts.push({ type: 'image', image: new URL(a.url), mediaType: mt });\n } else {\n parts.push({ type: 'file', data: a.url, mediaType: mt, name: a.name });\n }\n }\n return parts;\n}\n\nexport async function uploadAttachment(file: File, baseUrl: string | undefined): Promise<Attachment> {\n const formData = new FormData();\n formData.append('file', file);\n\n const response = await fetch(joinUrl(baseUrl, '/api/uploads'), {\n method: 'POST',\n body: formData,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(text || `Failed to upload ${file.name}`);\n }\n\n const data = await response.json();\n return {\n id: data.id,\n name: data.name || file.name,\n url: data.url,\n mimeType: data.mimeType || file.type || 'application/octet-stream',\n size: typeof data.size === 'number' ? data.size : file.size,\n };\n}\n\nexport async function handleFileSelection(\n fileList: FileList | File[] | null,\n baseUrl: string | undefined,\n onError: (error: string) => void,\n onUploading: (uploading: boolean) => void\n): Promise<Attachment[]> {\n if (!fileList) return [];\n \n const files = Array.isArray(fileList) ? fileList : Array.from(fileList);\n onUploading(true);\n\n const uploaded: Attachment[] = [];\n try {\n for (const file of files) {\n if (file.size > MAX_UPLOAD_SIZE) {\n onError(`\"${file.name}\" exceeds the ${(MAX_UPLOAD_SIZE / (1024 * 1024)).toFixed(0)}MB limit.`);\n continue;\n }\n\n try {\n const attachment = await uploadAttachment(file, baseUrl);\n uploaded.push(attachment);\n } catch (err: any) {\n console.error('Failed to upload attachment:', err);\n onError(String(err?.message ?? `Failed to upload ${file.name}`));\n }\n }\n\n return uploaded;\n } finally {\n onUploading(false);\n }\n}\n","import { useState, useRef, useCallback } from 'react';\nimport { Attachment } from '../types/chat';\nimport { joinUrl } from '../utils/file-upload';\n\nconst MAX_UPLOAD_SIZE = 25 * 1024 * 1024; // 25MB\n\nexport function useFileUpload(baseUrl: string) {\n const [attachments, setAttachments] = useState<Attachment[]>([]);\n const [uploading, setUploading] = useState(false);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n\n const formatBytes = useCallback((bytes: number) => {\n if (!bytes || Number.isNaN(bytes)) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const exponent = Math.min(units.length - 1, Math.floor(Math.log(bytes) / Math.log(1024)));\n const value = bytes / Math.pow(1024, exponent);\n return `${value.toFixed(exponent === 0 ? 0 : 1)} ${units[exponent]}`;\n }, []);\n\n const uploadAttachment = useCallback(async (file: File): Promise<Attachment> => {\n const formData = new FormData();\n formData.append('file', file);\n\n const response = await fetch(joinUrl(baseUrl, '/api/uploads'), {\n method: 'POST',\n body: formData,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(text || `Failed to upload ${file.name}`);\n }\n\n const data = await response.json();\n return {\n id: data.id,\n name: data.name || file.name,\n url: data.url,\n mimeType: data.mimeType || file.type || 'application/octet-stream',\n size: typeof data.size === 'number' ? data.size : file.size,\n };\n }, [baseUrl]);\n\n const handleRemoveAttachment = useCallback((id: string) => {\n setAttachments(prev => prev.filter(att => att.id !== id));\n }, []);\n\n const handleFileSelection = useCallback(async (fileList: FileList | File[] | null, setError: (error: string | null) => void) => {\n if (!fileList) return;\n const files = Array.isArray(fileList) ? fileList : Array.from(fileList);\n setError(null);\n setUploading(true);\n\n const uploaded: Attachment[] = [];\n try {\n for (const file of files) {\n if (file.size > MAX_UPLOAD_SIZE) {\n setError(`\"${file.name}\" exceeds the ${formatBytes(MAX_UPLOAD_SIZE)} limit.`);\n continue;\n }\n\n try {\n const attachment = await uploadAttachment(file);\n uploaded.push(attachment);\n } catch (err: any) {\n console.error('Failed to upload attachment:', err);\n setError(String(err?.message ?? `Failed to upload ${file.name}`));\n }\n }\n\n if (uploaded.length) {\n setAttachments(prev => [...prev, ...uploaded]);\n }\n } finally {\n setUploading(false);\n }\n }, [uploadAttachment, formatBytes]);\n\n const buildUserContent = useCallback((text: string, attachments: Attachment[]) => {\n const parts: any[] = [];\n const t = (text || '').trim();\n if (t) parts.push({ type: 'text', text: t });\n for (const a of (attachments || [])) {\n const mt = a.mimeType || 'application/octet-stream';\n if (mt.startsWith('image/')) {\n parts.push({ type: 'image', image: new URL(a.url), mediaType: mt });\n } else {\n parts.push({ type: 'file', data: a.url, mediaType: mt, name: a.name });\n }\n }\n return parts;\n }, []);\n\n const clearAttachments = useCallback(() => {\n setAttachments([]);\n }, []);\n\n return {\n attachments,\n uploading,\n fileInputRef,\n formatBytes,\n handleRemoveAttachment,\n handleFileSelection,\n buildUserContent,\n clearAttachments,\n MAX_UPLOAD_SIZE\n };\n}\n","import { useState, useRef, useCallback } from 'react';\n\n/**\n * Types matching the structure from getAgentStreamingResponse\n */\nexport type FirstAgentData = {\n message: string;\n continue: boolean;\n startDate?: number;\n endDate?: number;\n durationMs?: number;\n};\n\nexport type MainAgentAction = \n | {\n type: 'reasoning';\n reasoning: string;\n status: 'streaming' | 'finished';\n startDate?: number;\n endDate?: number;\n durationMs?: number;\n }\n | {\n type: 'tool-call';\n toolCallId?: string;\n toolName?: string;\n input?: any;\n inputText?: string;\n output?: any;\n status: 'input_streaming' | 'running' | 'finished' | 'error';\n error?: string;\n startDate?: number;\n endDate?: number;\n durationMs?: number;\n }\n | {\n type: 'step';\n stepNumber?: number;\n finishReason?: string;\n usage?: any;\n startDate?: number;\n endDate?: number;\n durationMs?: number;\n }\n | {\n type: 'text';\n text: string;\n status: 'streaming' | 'finished';\n startDate?: number;\n endDate?: number;\n durationMs?: number;\n }\n | {\n type: 'source';\n source: any;\n durationMs?: number;\n }\n | {\n type: 'file';\n file: any;\n durationMs?: number;\n }\n | {\n type: 'response';\n items: any[];\n [key: string]: any;\n startDate?: number;\n endDate?: number;\n durationMs?: number;\n };\n\nexport type AgentStreamData = {\n first_agent: FirstAgentData;\n main_agent: MainAgentAction[];\n};\n\nfunction deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Hook to handle agent streaming responses\n * Returns streaming state and a function to start streaming\n */\nexport function useAgentStreaming() {\n const [streaming, setStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [streamData, setStreamData] = useState<AgentStreamData | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const startStreaming = useCallback(async ({\n agentId,\n body,\n baseUrl,\n onUpdate,\n signal,\n }: {\n agentId: string;\n body: any;\n baseUrl?: string;\n onUpdate?: (data: AgentStreamData) => void;\n signal?: AbortSignal;\n }): Promise<AgentStreamData | null> => {\n try {\n setStreaming(true);\n setError(null);\n\n // Use external signal if provided; otherwise create our own controller\n let finalSignal: AbortSignal;\n if (signal) {\n abortControllerRef.current = null;\n finalSignal = signal;\n } else {\n const controller = new AbortController();\n abortControllerRef.current = controller;\n finalSignal = controller.signal;\n }\n\n const base = baseUrl ? baseUrl.replace(/\\/$/, '') : '';\n const url = `${base}/api/run/${encodeURIComponent(agentId)}`;\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/x-ndjson',\n },\n body: JSON.stringify(body ?? {}),\n signal: finalSignal,\n });\n\n if (!res.ok || !res.body) {\n const txt = await res.text().catch(() => '');\n throw new Error(`Request failed: ${res.status} ${res.statusText} - ${txt}`);\n }\n\n // Initialize structured data\n const data: AgentStreamData = {\n first_agent: {\n message: '',\n continue: false,\n },\n main_agent: [],\n };\n\n // Track current state\n let currentReasoning: MainAgentAction & { type: 'reasoning' } | null = null;\n let currentToolCall: MainAgentAction & { type: 'tool-call' } | null = null;\n let currentResponse: MainAgentAction & { type: 'response' } | null = null;\n let currentText: MainAgentAction & { type: 'text' } | null = null;\n let mainAgentSkipped = false;\n\n function pushUpdate() {\n const clonedData = deepClone(data);\n setStreamData(clonedData);\n onUpdate?.(clonedData);\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n\n // Push initial update\n pushUpdate();\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n let idx = buffer.indexOf('\\n');\n \n while (idx !== -1) {\n const line = buffer.slice(0, idx).trim();\n buffer = buffer.slice(idx + 1);\n \n if (line.length > 0) {\n try {\n const evt = JSON.parse(line);\n const type: string = evt?.type;\n\n switch (type) {\n case 'start':\n break;\n\n // First Agent Events\n case 'first-agent-start':\n data.first_agent.startDate = evt?.startDate;\n data.first_agent.durationMs = evt?.durationMs;\n pushUpdate();\n break;\n\n case 'first-agent-partial':\n if (typeof evt?.message === 'string') {\n data.first_agent.message = evt.message;\n }\n if (typeof evt?.continue === 'boolean') {\n data.first_agent.continue = evt.continue;\n }\n if (typeof evt?.durationMs === 'number') {\n data.first_agent.durationMs = evt.durationMs;\n }\n pushUpdate();\n break;\n\n case 'first-agent-end':\n if (typeof evt?.message === 'string') {\n data.first_agent.message = evt.message;\n }\n if (typeof evt?.continue === 'boolean') {\n data.first_agent.continue = evt.continue;\n }\n data.first_agent.endDate = evt?.endDate;\n data.first_agent.durationMs = evt?.durationMs;\n pushUpdate();\n break;\n\n // Main Agent Events\n case 'main-agent-start':\n mainAgentSkipped = false;\n break;\n\n case 'main-agent-step-finish': {\n const finishedStep: MainAgentAction = {\n type: 'step',\n stepNumber: undefined,\n finishReason: evt?.finishReason,\n usage: evt?.usage,\n endDate: evt?.endDate,\n durationMs: evt?.durationMs,\n } as any;\n data.main_agent.push(finishedStep);\n pushUpdate();\n break;\n }\n\n case 'main-agent-skipped':\n mainAgentSkipped = true;\n break;\n\n case 'main-agent-reasoning-start':\n currentReasoning = {\n type: 'reasoning',\n reasoning: '',\n status: 'streaming',\n startDate: evt?.startDate,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(currentReasoning);\n pushUpdate();\n break;\n\n case 'main-agent-reasoning-delta':\n if (currentReasoning && typeof evt?.text === 'string') {\n currentReasoning.reasoning += evt.text;\n currentReasoning.durationMs = evt?.durationMs;\n pushUpdate();\n }\n break;\n\n case 'main-agent-reasoning-end':\n if (currentReasoning) {\n if (typeof evt?.text === 'string' && evt.text.length > 0) {\n currentReasoning.reasoning += evt.text;\n }\n currentReasoning.status = 'finished';\n currentReasoning.endDate = evt?.endDate;\n currentReasoning.durationMs = evt?.durationMs;\n \n // Remove empty reasoning\n if (!currentReasoning.reasoning || currentReasoning.reasoning.trim().length === 0) {\n const index = data.main_agent.indexOf(currentReasoning);\n if (index > -1) {\n data.main_agent.splice(index, 1);\n }\n }\n \n currentReasoning = null;\n pushUpdate();\n } else {\n // Fallback: reasoning-end without start\n if (typeof evt?.text === 'string' && evt.text.length > 0) {\n const reasoning: MainAgentAction = {\n type: 'reasoning',\n reasoning: evt.text,\n status: 'finished',\n endDate: evt?.endDate,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(reasoning);\n pushUpdate();\n }\n }\n break;\n\n case 'main-agent-tool-call-start':\n currentToolCall = {\n type: 'tool-call',\n toolCallId: evt?.toolCallId,\n toolName: evt?.toolName,\n inputText: '',\n input: undefined,\n output: undefined,\n status: 'input_streaming',\n startDate: evt?.startDate,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(currentToolCall);\n pushUpdate();\n break;\n\n case 'main-agent-tool-input-delta':\n const delta = evt?.delta || evt?.argsTextDelta;\n if (currentToolCall && typeof delta === 'string') {\n currentToolCall.inputText = (currentToolCall.inputText || '') + delta;\n currentToolCall.durationMs = evt?.durationMs;\n pushUpdate();\n }\n break;\n\n case 'tool-call':\n case 'main-agent-tool-call':\n if (currentToolCall) {\n currentToolCall.input = evt?.input;\n currentToolCall.status = 'running';\n currentToolCall.durationMs = evt?.durationMs;\n } else {\n // Tool call without streaming start - try to find existing first\n const existingToolCall = data.main_agent.find(\n (action): action is MainAgentAction & { type: 'tool-call' } =>\n action.type === 'tool-call' &&\n (action.toolCallId === evt?.toolCallId || action.toolName === evt?.toolName)\n );\n \n if (existingToolCall) {\n existingToolCall.input = evt?.input;\n existingToolCall.status = 'running';\n existingToolCall.durationMs = evt?.durationMs;\n currentToolCall = existingToolCall;\n } else {\n // Create new tool call\n currentToolCall = {\n type: 'tool-call',\n toolCallId: evt?.toolCallId,\n toolName: evt?.toolName,\n input: evt?.input,\n inputText: '',\n output: undefined,\n status: 'running',\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(currentToolCall);\n }\n }\n pushUpdate();\n break;\n\n case 'tool-result':\n case 'main-agent-tool-result':\n let toolCallToUpdate = currentToolCall;\n \n if (!toolCallToUpdate) {\n // Find matching tool call\n toolCallToUpdate = data.main_agent.find(\n (action): action is MainAgentAction & { type: 'tool-call' } =>\n action.type === 'tool-call' &&\n (action.toolCallId === evt?.toolCallId || action.toolName === evt?.toolName)\n ) || null;\n }\n \n if (toolCallToUpdate) {\n toolCallToUpdate.output = evt?.output;\n toolCallToUpdate.status = 'finished';\n toolCallToUpdate.endDate = evt?.endDate;\n toolCallToUpdate.durationMs = evt?.durationMs;\n currentToolCall = null;\n } else {\n // Create a minimal tool call entry if we somehow missed the tool-call event\n const fallbackToolCall: MainAgentAction = {\n type: 'tool-call',\n toolCallId: evt?.toolCallId,\n toolName: evt?.toolName,\n input: undefined,\n inputText: '',\n output: evt?.output,\n status: 'finished',\n endDate: evt?.endDate,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(fallbackToolCall);\n }\n pushUpdate();\n break;\n\n case 'tool-error':\n case 'main-agent-tool-error':\n let toolCallForError = currentToolCall;\n \n if (!toolCallForError) {\n // Find matching tool call\n toolCallForError = data.main_agent.find(\n (action): action is MainAgentAction & { type: 'tool-call' } =>\n action.type === 'tool-call' &&\n (action.toolCallId === evt?.toolCallId || action.toolName === evt?.toolName)\n ) || null;\n }\n \n if (toolCallForError) {\n toolCallForError.error = evt?.error;\n toolCallForError.status = 'error';\n toolCallForError.endDate = evt?.endDate;\n toolCallForError.durationMs = evt?.durationMs;\n currentToolCall = null;\n } else {\n // Create a minimal tool call entry with error\n const fallbackToolCall: MainAgentAction = {\n type: 'tool-call',\n toolCallId: evt?.toolCallId,\n toolName: evt?.toolName,\n input: undefined,\n inputText: '',\n output: undefined,\n error: evt?.error,\n status: 'error',\n endDate: evt?.endDate,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(fallbackToolCall);\n }\n pushUpdate();\n break;\n\n case 'main-agent-response-partial':\n if (mainAgentSkipped) break;\n \n if (!currentResponse) {\n currentResponse = {\n type: 'response',\n items: [],\n startDate: evt?.startDate,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(currentResponse);\n }\n \n if (evt?.value && typeof evt.value === 'object') {\n const items = Array.isArray(evt.value.items) ? evt.value.items : currentResponse.items;\n Object.assign(currentResponse, evt.value);\n currentResponse.items = items;\n currentResponse.durationMs = evt?.durationMs;\n }\n pushUpdate();\n break;\n\n case 'text-delta':\n case 'main-agent-text-delta':\n if (typeof evt?.text === 'string' && evt.text) {\n if (!currentText) {\n currentText = {\n type: 'text',\n text: '',\n status: 'streaming',\n startDate: evt?.startDate,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(currentText);\n }\n currentText.text += evt.text;\n currentText.durationMs = evt?.durationMs;\n pushUpdate();\n }\n break;\n\n case 'text-end':\n if (currentText) {\n currentText.status = 'finished';\n currentText.endDate = evt?.endDate;\n currentText.durationMs = evt?.durationMs;\n currentText = null;\n pushUpdate();\n }\n break;\n\n case 'source':\n case 'main-agent-source':\n const sourceAction: MainAgentAction = {\n type: 'source',\n source: evt?.source,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(sourceAction);\n pushUpdate();\n break;\n\n case 'file':\n case 'main-agent-file':\n const fileAction: MainAgentAction = {\n type: 'file',\n file: evt?.file,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(fileAction);\n pushUpdate();\n break;\n\n case 'final':\n if (mainAgentSkipped) break;\n \n if (evt?.value && typeof evt.value === 'object') {\n if (!currentResponse) {\n currentResponse = {\n type: 'response',\n items: [],\n endDate: evt?.endDate,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(currentResponse);\n }\n \n const items = Array.isArray(evt.value.items) ? evt.value.items : currentResponse.items;\n Object.assign(currentResponse, evt.value);\n currentResponse.items = items;\n currentResponse.endDate = evt?.endDate;\n currentResponse.durationMs = evt?.durationMs;\n }\n pushUpdate();\n break;\n\n case 'error':\n case 'main-agent-error':\n throw new Error(evt?.error || 'Unknown agent error');\n\n default:\n break;\n }\n } catch (e) {\n console.warn('Failed to parse streaming line:', e);\n }\n }\n idx = buffer.indexOf('\\n');\n }\n }\n\n try { reader.releaseLock(); } catch {}\n setStreaming(false);\n return data;\n\n } catch (e: any) {\n if (e.name === 'AbortError') {\n setError('Request was cancelled');\n } else {\n setError(e?.message || 'Request failed');\n }\n setStreaming(false);\n return null;\n }\n }, []);\n\n const stopStreaming = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setStreaming(false);\n }, []);\n\n const reset = useCallback(() => {\n setStreamData(null);\n setError(null);\n setStreaming(false);\n }, []);\n\n return {\n streaming,\n error,\n streamData,\n startStreaming,\n stopStreaming,\n reset,\n };\n}\n","export type TranslationKeys = {\n // Chat Header\n 'header.maximize': string;\n 'header.minimize': string;\n 'header.new': string;\n 'header.history': string;\n 'header.close': string;\n \n // Chat Input\n 'input.placeholder': string;\n 'input.attachFiles': string;\n 'input.insertLink': string;\n 'input.send': string;\n 'input.stop': string;\n 'input.uploadingFiles': string;\n 'input.previewImage': string;\n 'input.removeFile': string;\n \n // Message Editor\n 'editor.cancel': string;\n 'editor.saveAndRegenerate': string;\n 'editor.clickToEdit': string;\n \n // Message List\n 'messages.empty': string;\n 'messages.error': string;\n \n // Chat History\n 'history.search': string;\n 'history.noChatsFound': string;\n 'history.untitledChat': string;\n 'history.deleteChat': string;\n \n // General\n 'general.agent': string;\n};\n\nexport type Translations = {\n [K in keyof TranslationKeys]: string;\n};\n\nexport const translations: Record<string, Translations> = {\n en: {\n // Chat Header\n 'header.maximize': 'Maximize',\n 'header.minimize': 'Minimize',\n 'header.new': 'New',\n 'header.history': 'History',\n 'header.close': 'Close chat',\n \n // Chat Input\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 \n // Message Editor\n 'editor.cancel': 'Cancel',\n 'editor.saveAndRegenerate': 'Save & Regenerate',\n 'editor.clickToEdit': 'Click to edit',\n \n // Message List\n 'messages.empty': 'Start by sending a message to the agent.',\n 'messages.error': 'An error occurred',\n \n // Chat History\n 'history.search': 'Search',\n 'history.noChatsFound': 'No chats found.',\n 'history.untitledChat': 'Untitled chat',\n 'history.deleteChat': 'Delete chat',\n \n // General\n 'general.agent': 'Agent',\n },\n \n ar: {\n // Chat Header\n 'header.maximize': 'تكبير',\n 'header.minimize': 'تصغير',\n 'header.new': 'جديد',\n 'header.history': 'السجل',\n 'header.close': 'إغلاق المحادثة',\n \n // Chat Input\n 'input.placeholder': 'اطرح سؤالك...',\n 'input.attachFiles': 'إرفاق ملفات',\n 'input.insertLink': 'إدراج رابط',\n 'input.send': 'إرسال',\n 'input.stop': 'إيقاف',\n 'input.uploadingFiles': 'جاري رفع الملفات...',\n 'input.previewImage': 'معاينة الصورة',\n 'input.removeFile': 'حذف الملف',\n \n // Message Editor\n 'editor.cancel': 'إلغاء',\n 'editor.saveAndRegenerate': 'حفظ وإعادة توليد',\n 'editor.clickToEdit': 'انقر للتعديل',\n \n // Message List\n 'messages.empty': 'ابدأ بإرسال رسالة إلى الوكيل.',\n 'messages.error': 'حدث خطأ',\n \n // Chat History\n 'history.search': 'بحث',\n 'history.noChatsFound': 'لم يتم العثور على محادثات.',\n 'history.untitledChat': 'محادثة بدون عنوان',\n 'history.deleteChat': 'حذف المحادثة',\n \n // General\n 'general.agent': 'الوكيل',\n },\n};\n\nexport type SupportedLanguage = 'en' | 'ar';\n\nexport function getTranslation(\n lang: SupportedLanguage,\n key: keyof TranslationKeys\n): string {\n return translations[lang]?.[key] || translations['en'][key] || key;\n}\n","import { useCallback } from 'react';\nimport { \n getTranslation, \n SupportedLanguage, \n TranslationKeys \n} from '../i18n/translations';\n\nexport function useTranslation(language: SupportedLanguage = 'en') {\n const t = useCallback(\n (key: keyof TranslationKeys): string => {\n return getTranslation(language, key);\n },\n [language]\n );\n\n return { t, language };\n}\n","import { useCallback, useRef, useState, useEffect } from 'react';\n\nexport interface UseActionsProps {\n actions: Map<string, Function>;\n currentChatId: string | null;\n}\n\n/**\n * Hook to manage action execution with smart parameter stabilization detection\n * Handles both streaming (continuous execution) and batch (execute once stable) modes\n */\nexport function useActions({ actions, currentChatId }: UseActionsProps) {\n // Streaming meta refs\n const actionExecMapRef = useRef<Record<string, boolean>>({});\n const assistantMsgIdRef = useRef<string | undefined>(undefined);\n const calledFinalActionsRef = useRef<Set<string>>(new Set());\n \n const [actionStatuses, setActionStatuses] = useState<Map<string, 'executing' | 'executed'>>(new Map());\n\n // No pending timers to cleanup\n useEffect(() => { return () => {}; }, []);\n\n // Simplified: no stabilization tracking\n\n const processActions = useCallback((items: any[] | undefined, trigger: 'partial' | 'final') => {\n if (!Array.isArray(items) || items.length === 0) {\n // If final arrived without items, mark any pending actions as executed\n if (trigger === 'final') {\n setActionStatuses(prev => {\n const next = new Map(prev);\n next.forEach((_, k) => next.set(k, 'executed'));\n return next;\n });\n }\n return;\n }\n \n items.forEach((it, idx) => {\n if (!it || typeof it !== 'object') return;\n if (it.type === 'action') {\n const name = String(it.name ?? '').trim();\n if (!name) return;\n const handler = actions.get(name);\n if (!handler) {\n console.warn(`[useActions] Action handler not found: \"${name}\". Did you register it with useHsafaAction?`);\n return;\n }\n \n const executeOnStream = typeof it.executeOnStream === 'boolean'\n ? it.executeOnStream\n : !!actionExecMapRef.current[name];\n const key = `${assistantMsgIdRef.current || 'assist'}:${name}:${idx}`;\n const actionKey = `${name}:${idx}`;\n \n try {\n if (trigger === 'partial' && executeOnStream) {\n // Execute on each partial update (streaming mode)\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executing'));\n \n // Execute immediately without debounce\n Promise.resolve(handler(it.params, { \n name, \n trigger, \n index: idx, \n assistantMessageId: assistantMsgIdRef.current, \n chatId: currentChatId || undefined \n })).catch(error => {\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executed'));\n });\n \n } else if (trigger === 'partial' && !executeOnStream) {\n // Do not execute during streaming; just mark as executing once\n setActionStatuses(prev => {\n if (prev.get(actionKey) === 'executing') return prev;\n const next = new Map(prev);\n next.set(actionKey, 'executing');\n return next;\n });\n } else if (trigger === 'final') {\n // Final trigger - execute once and mark as executed\n if (!calledFinalActionsRef.current.has(key)) {\n calledFinalActionsRef.current.add(key);\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executed'));\n \n Promise.resolve(handler(it.params, { \n name, \n trigger: executeOnStream ? 'final' : 'params_complete', \n index: idx, \n assistantMessageId: assistantMsgIdRef.current, \n chatId: currentChatId || undefined \n })).catch(error => {\n console.error(`[useActions] Error executing final action \"${name}\":`, error);\n });\n }\n }\n } catch (error) {\n console.error(`[useActions] Error processing action \"${name}\":`, error);\n }\n }\n });\n }, [actions, currentChatId]);\n\n const resetActionTracking = useCallback(() => {\n // Reset tracking for new assistant message\n calledFinalActionsRef.current.clear();\n setActionStatuses(new Map());\n }, []);\n\n return {\n actionExecMapRef,\n assistantMsgIdRef,\n actionStatuses,\n processActions,\n resetActionTracking\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 { ThemeColors } from '../utils/chat-theme';\nimport type { TranslationKeys } from '../i18n/translations';\nimport { IconButton } from './IconButton';\n\ninterface ChatHeaderProps {\n title: string;\n expandable: boolean;\n alwaysOpen: boolean;\n maximized: boolean;\n streaming: boolean;\n dir: string;\n resolvedColors: ThemeColors;\n onMaximize: () => void;\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 expandable,\n alwaysOpen,\n maximized,\n streaming,\n dir,\n resolvedColors,\n onMaximize,\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 {expandable && (\n <IconButton\n icon={<Maximize2 size=\"20\" strokeWidth=\"2\" />}\n onClick={onMaximize}\n ariaLabel={maximized ? t('header.minimize') : t('header.maximize')}\n resolvedColors={resolvedColors}\n />\n )}\n \n <IconButton\n icon={<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 <History size=\"20\" strokeWidth=\"2\" />\n </button>\n \n {!alwaysOpen && (\n <IconButton\n icon={<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 from 'react';\nimport { Paperclip, Link, ArrowUp, Square, X, Eye, File, Loader2 } from 'lucide-react';\nimport { Attachment } from '../types/chat';\nimport { ThemeColors } from '../utils/chat-theme';\nimport type { TranslationKeys } from '../i18n/translations';\n\nexport interface ChatInputProps {\n value: string;\n onChange: (value: string) => void;\n onSend: () => void;\n onStop: () => void;\n streaming: boolean;\n placeholder: string;\n attachments: Attachment[];\n uploading: boolean;\n onRemoveAttachment: (id: string) => void;\n onFileInputClick: () => void;\n resolvedColors: ThemeColors;\n formatBytes: (bytes: number) => string;\n textareaRef: React.RefObject<HTMLTextAreaElement>;\n fileInputRef: React.RefObject<HTMLInputElement>;\n onFileSelection: (files: FileList | null) => void;\n t: (key: keyof TranslationKeys) => string;\n dir?: string;\n}\n\nexport function ChatInput({\n value,\n onChange,\n onSend,\n onStop,\n streaming,\n placeholder,\n attachments,\n uploading,\n onRemoveAttachment,\n onFileInputClick,\n resolvedColors,\n formatBytes,\n textareaRef,\n fileInputRef,\n onFileSelection,\n t,\n dir = 'ltr'\n}: ChatInputProps) {\n // Auto-resize textarea\n React.useEffect(() => {\n const textarea = textareaRef.current;\n if (textarea) {\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 }\n }, [value, textareaRef]);\n\n // Reset height on mount to ensure clean state\n React.useEffect(() => {\n const textarea = textareaRef.current;\n if (textarea && !value) {\n textarea.style.height = '24px';\n }\n }, [textareaRef, value]);\n return (\n <div style={{\n position: 'sticky',\n bottom: '0',\n marginTop: 'auto',\n paddingBottom: '8px',\n paddingTop: '4px',\n backgroundColor: resolvedColors.backgroundColor\n }}>\n {/* Unified input container */}\n <div style={{\n position: 'relative',\n flex: '1'\n }}>\n {/* The box */}\n <div style={{\n position: 'relative',\n width: '100%',\n borderRadius: '16px',\n paddingBottom: '48px',\n paddingTop: '16px',\n border: `1px solid ${resolvedColors.borderColor}`,\n backgroundColor: resolvedColors.accentColor\n }}>\n {/* Attachments display */}\n {attachments.length > 0 && (\n <div style={{\n padding: '12px 16px',\n display: 'flex',\n flexWrap: 'wrap',\n gap: '10px'\n }}>\n {attachments.map((att) => {\n const isImage = att.mimeType?.startsWith('image/');\n return (\n <div key={att.id} style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 12px',\n backgroundColor: resolvedColors.inputBackground,\n borderRadius: '10px',\n border: `1px solid ${resolvedColors.borderColor}`,\n fontSize: '12px',\n color: resolvedColors.textColor,\n transition: 'all 0.2s ease-out',\n cursor: 'pointer',\n position: 'relative'\n }}>\n {/* File icon or thumbnail */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n borderRadius: '4px',\n backgroundColor: isImage ? 'transparent' : resolvedColors.accentColor\n }}>\n {isImage ? (\n <img \n src={att.url} \n alt={att.name}\n style={{\n width: '20px',\n height: '20px',\n borderRadius: '4px',\n objectFit: 'cover'\n }}\n onError={(e) => {\n // Fallback to file icon if image fails to load\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 <File \n size=\"14\" \n strokeWidth=\"2\" \n style={{ \n display: isImage ? 'none' : 'block',\n color: resolvedColors.mutedTextColor \n }} \n />\n </div>\n \n {/* File info */}\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n minWidth: '0',\n flex: '1'\n }}>\n <span title={att.name} style={{\n maxWidth: '140px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontWeight: '500'\n }}>\n {att.name}\n </span>\n <span style={{ \n color: resolvedColors.mutedTextColor,\n fontSize: '10px',\n marginTop: '2px'\n }}>\n {formatBytes(att.size)}\n </span>\n </div>\n \n {/* Preview and remove buttons */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n marginLeft: '8px'\n }}>\n {isImage && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n window.open(att.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={t('input.previewImage')}\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 <Eye size=\"12\" strokeWidth=\"2\" />\n </button>\n )}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemoveAttachment(att.id);\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={t('input.removeFile')}\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 <X size=\"12\" strokeWidth=\"2\" />\n </button>\n </div>\n </div>\n );\n })}\n </div>\n )}\n \n {/* Upload progress */}\n {uploading && (\n <div style={{\n padding: '8px 16px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '12px',\n color: resolvedColors.mutedTextColor\n }}>\n <Loader2 size=\"14\" strokeWidth=\"2\" style={{ animation: 'spin 1s linear infinite' }} />\n <span>{t('input.uploadingFiles')}</span>\n </div>\n )}\n \n {/* Text area */}\n <div style={{ padding: '0 16px' }}>\n <textarea\n aria-label=\"Prompt\"\n rows={1}\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 placeholder={placeholder}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (!streaming) onSend();\n }\n }}\n ref={textareaRef}\n />\n </div>\n\n {/* Bottom-left/right actions inside the box (RTL aware) */}\n <div style={{\n position: 'absolute',\n bottom: '8px',\n ...(dir === 'rtl' ? { right: '8px' } : { left: '8px' }),\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n color: resolvedColors.mutedTextColor\n }}>\n <button\n style={{\n borderRadius: '8px',\n padding: '8px',\n transition: 'all 0.2s',\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'inherit'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = `${resolvedColors.backgroundColor}99`;\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 aria-label={t('input.attachFiles')}\n onClick={onFileInputClick}\n >\n <Paperclip size=\"18\" strokeWidth=\"2\" />\n </button>\n <button\n style={{\n borderRadius: '8px',\n padding: '8px',\n transition: 'all 0.2s',\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'inherit'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = `${resolvedColors.backgroundColor}99`;\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 aria-label={t('input.insertLink')}\n >\n <Link size=\"18\" strokeWidth=\"2\" />\n </button>\n </div>\n\n {/* Hidden file input */}\n <input\n type=\"file\"\n ref={fileInputRef}\n multiple\n accept=\"*/*\"\n style={{ display: 'none' }}\n onChange={(e) => onFileSelection(e.target.files)}\n />\n\n {/* Bottom-right/left send button (RTL aware) */}\n <div style={{\n position: 'absolute',\n bottom: '8px',\n ...(dir === 'rtl' ? { left: '8px' } : { right: '8px' })\n }}>\n <button\n aria-label={streaming ? t('input.stop') : t('input.send')}\n disabled={!streaming && !value.trim()}\n style={{\n borderRadius: '12px',\n padding: '12px',\n transition: 'all 0.2s ease-out',\n border: `1px solid ${streaming ? '#ef4444' : resolvedColors.borderColor}`,\n backgroundColor: streaming ? '#ef444420' : resolvedColors.cardBackground,\n color: streaming ? '#ef4444' : resolvedColors.mutedTextColor,\n opacity: (!streaming && !value.trim()) ? 0.4 : 1,\n cursor: (!streaming && !value.trim()) ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n }}\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n if (streaming) {\n e.currentTarget.style.borderColor = '#dc2626';\n e.currentTarget.style.backgroundColor = '#dc262630';\n e.currentTarget.style.color = '#dc2626';\n } else {\n e.currentTarget.style.borderColor = resolvedColors.primaryColor;\n e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground;\n e.currentTarget.style.color = resolvedColors.textColor;\n }\n }\n }}\n onMouseLeave={(e) => {\n if (!e.currentTarget.disabled) {\n if (streaming) {\n e.currentTarget.style.borderColor = '#ef4444';\n e.currentTarget.style.backgroundColor = '#ef444420';\n e.currentTarget.style.color = '#ef4444';\n } else {\n e.currentTarget.style.borderColor = resolvedColors.borderColor;\n e.currentTarget.style.backgroundColor = resolvedColors.cardBackground;\n e.currentTarget.style.color = resolvedColors.mutedTextColor;\n }\n }\n }}\n onClick={() => {\n if (streaming) {\n onStop();\n } else {\n onSend();\n }\n }}\n >\n {streaming ? (\n <Square size=\"18\" strokeWidth=\"2\" />\n ) : (\n <ArrowUp size=\"18\" strokeWidth=\"2\" />\n )}\n </button>\n </div>\n </div>\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 { ResolvedColors } from '../utils/theme';\nimport { timeAgo } from '../utils/time';\nimport { ChatMeta } from '../utils/storage';\nimport type { TranslationKeys } from '../i18n/translations';\n\nexport interface ChatHistoryProps {\n isOpen: boolean;\n onClose: () => void;\n searchQuery: string;\n onSearchChange: (query: string) => void;\n chats: ChatMeta[];\n currentChatId: string | null;\n onChatSelect: (chatId: string) => void;\n onChatDelete: (chatId: string) => void;\n resolvedColors: ResolvedColors;\n t: (key: keyof TranslationKeys) => string;\n}\n\nexport function ChatHistory({\n isOpen,\n onClose,\n searchQuery,\n onSearchChange,\n chats,\n currentChatId,\n onChatSelect,\n onChatDelete,\n resolvedColors,\n t\n}: ChatHistoryProps) {\n if (!isOpen) return null;\n\n const filteredChats = searchQuery.trim() \n ? chats.filter(m => (m.title || '').toLowerCase().includes(searchQuery.toLowerCase().trim()))\n : chats;\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 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={searchQuery}\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder={t('history.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 {filteredChats.length === 0 ? (\n <div style={{\n padding: '24px',\n color: resolvedColors.mutedTextColor,\n textAlign: 'center'\n }}>{t('history.noChatsFound')}</div>\n ) : (\n <div>\n {filteredChats.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 || t('history.untitledChat')}</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={t('history.deleteChat')}\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 <Trash2 size=\"16\" strokeWidth=\"2\" />\n </button>\n </div>\n </div>\n ))}\n </div>\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","// 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, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useHsafa } from \"../providers/HsafaProvider\";\n\n// Custom hooks\nimport { useChatStorage } from '../hooks/useChatStorage';\nimport { useStreaming } from '../hooks/useStreaming';\nimport { useFileUpload } from '../hooks/useFileUploadHook';\nimport { useAgentStreaming } from '../hooks/useAgentStreaming';\nimport type { AgentStreamData } from '../hooks/useAgentStreaming';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { useActions } from '../hooks/useActions';\nimport type { SupportedLanguage } from '../i18n/translations';\n\n// Components\nimport { ChatHeader } from './ChatHeader';\nimport { ChatInput } from './ChatInput';\nimport { MessageList } from './MessageList';\nimport { FloatingChatButton } from './FloatingChatButton';\nimport { ChatHistory } from './ChatHistory';\n\n// Utilities and types\nimport { ThemeColors, themeColors } from '../utils/chat-theme';\nimport type { HsafaChatProps, ChatMessage, Attachment } from '../types/chat';\nimport { \n createUserMessage, \n createAssistantMessage, \n messagesToAPIFormat,\n updateUserMessage,\n getMessageText,\n getMessageAttachments\n} from '../utils/message-utils';\n\ntype UserChatMessage = Extract<ChatMessage, { role: 'user' }>;\n\ntype ExecuteTurnParams = {\n prompt: string;\n baseMessages: ChatMessage[];\n userMessage: UserChatMessage;\n assistantMessageId: string;\n chatId: string | null;\n};\n\nconst cloneAttachments = (attachments: Attachment[]): Attachment[] =>\n attachments.map(att => ({ ...att }));\n\nfunction usePersistentChatMessages(chatStorage: ReturnType<typeof useChatStorage>) {\n const [messages, setMessages] = useState<ChatMessage[]>(() => {\n try {\n return chatStorage.loadChatPreferences();\n } catch (error) {\n console.warn('Failed to load chat preferences:', error);\n return [];\n }\n });\n\n useEffect(() => {\n if (messages.length === 0) return;\n try {\n chatStorage.persistChatData(messages);\n } catch (error) {\n console.warn('Failed to persist chat data:', error);\n }\n }, [messages]);\n\n const selectChat = useCallback((chatId: string) => {\n try {\n chatStorage.setCurrentChatId(chatId);\n const chatData = chatStorage.loadChat(chatId);\n setMessages(chatData?.messages || []);\n return true;\n } catch (error) {\n console.warn('Failed to load selected chat:', error);\n return false;\n }\n }, [chatStorage]);\n\n const deleteChat = useCallback((chatId: string) => {\n try {\n chatStorage.deleteChat(chatId, (wasCurrent) => {\n if (wasCurrent) {\n setMessages([]);\n }\n });\n } catch (error) {\n console.warn('Failed to delete chat:', error);\n }\n }, [chatStorage]);\n\n const resetChat = useCallback(() => {\n setMessages([]);\n chatStorage.setCurrentChatId(null);\n }, [chatStorage]);\n\n return { messages, setMessages, selectChat, deleteChat, resetChat };\n}\n\nexport function HsafaChat(props: HsafaChatProps) {\n const {\n agentId, theme = 'dark', primaryColor, backgroundColor, \n borderColor, textColor, accentColor, width = 420,\n height = '100vh', expandable = true, alwaysOpen = false, \n defaultOpen = false, dir = 'ltr', language,\n floatingButtonPosition = dir === 'rtl' ? { bottom: 16, left: 16 } : { bottom: 16, right: 16 },\n placeholder, title,\n chatContainerClassName = '',\n defaultReasoningOpen = false, hideReasoningContent = false\n } = props;\n\n // Determine language - prioritize explicit language prop, then infer from dir\n const detectedLanguage: SupportedLanguage = language || (dir === 'rtl' ? 'ar' : 'en');\n const { t } = useTranslation(detectedLanguage);\n \n // Use translated defaults if not provided\n const resolvedPlaceholder = placeholder ?? t('input.placeholder');\n const resolvedTitle = title ?? t('general.agent');\n\n const { baseUrl, actions, components, setStreamingState, setChatOpenState } = useHsafa();\n const chatInstanceId = useRef(`chat-${agentId}-${Date.now()}`).current;\n\n // Local state\n const [value, setValue] = useState<string>(\"\");\n const [showChat, setShowChat] = useState<boolean>(() => {\n if (alwaysOpen) return true;\n try {\n const savedShow = localStorage.getItem(`hsafaChat_${agentId}.showChat`);\n return savedShow !== null ? savedShow === 'true' : defaultOpen;\n } catch {\n return defaultOpen;\n }\n });\n\n const [historyOpen, setHistoryOpen] = useState<boolean>(false);\n const [historySearch, setHistorySearch] = useState<string>(\"\");\n const [maximized, setMaximized] = useState<boolean>(false);\n const [chatsListVersion, setChatsListVersion] = useState<number>(0);\n const [editingMessageId, setEditingMessageId] = useState<string | null>(null);\n const [editingMessageText, setEditingMessageText] = useState<string>(\"\");\n const [editingAttachments, setEditingAttachments] = useState<Attachment[]>([]);\n\n // Refs\n const scrollAnchorRef = useRef<HTMLDivElement>(null);\n const [isAtBottom, setIsAtBottom] = useState<boolean>(true);\n const suppressNextScrollRef = useRef<boolean>(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const historyBtnRef = useRef<HTMLButtonElement>(null);\n const componentId = useRef(`hsafa-chat-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);\n\n // Custom hooks\n const chatStorage = useChatStorage(agentId);\n const {\n messages,\n setMessages,\n selectChat,\n deleteChat: deleteStoredChat,\n resetChat\n } = usePersistentChatMessages(chatStorage);\n const streaming = useStreaming();\n const fileUpload = useFileUpload(baseUrl || '');\n const agentStreaming = useAgentStreaming();\n const {\n actionExecMapRef,\n assistantMsgIdRef,\n actionStatuses,\n processActions,\n resetActionTracking,\n } = useActions({ actions, currentChatId: chatStorage.currentChatId });\n\n // Report streaming state to provider\n useEffect(() => {\n setStreamingState(chatInstanceId, streaming.streaming);\n }, [streaming.streaming, chatInstanceId, setStreamingState]);\n\n // Report chat open state to provider\n useEffect(() => {\n setChatOpenState(chatInstanceId, showChat);\n return () => {\n // Cleanup on unmount\n setChatOpenState(chatInstanceId, false);\n setStreamingState(chatInstanceId, false);\n };\n }, [showChat, chatInstanceId, setChatOpenState, setStreamingState]);\n\n // Persist showChat state to localStorage when it changes\n useEffect(() => {\n if (alwaysOpen) return; // Don't persist if alwaysOpen\n try {\n localStorage.setItem(`hsafaChat_${agentId}.showChat`, String(showChat));\n } catch (error) {\n console.warn('Failed to save chat state:', error);\n }\n }, [showChat, agentId, alwaysOpen]);\n\n const {\n attachments,\n uploading,\n fileInputRef,\n formatBytes,\n handleRemoveAttachment,\n handleFileSelection,\n clearAttachments\n } = fileUpload;\n\n // Helper: apply streaming update to a specific assistant message\n const applyStreamUpdateToAssistant = useCallback((assistantId: string, data: AgentStreamData) => {\n setMessages(prev => prev.map(m => {\n if (m.id === assistantId && m.role === 'assistant') {\n const responseAction = data.main_agent.find(action => action.type === 'response');\n const items = responseAction?.type === 'response' ? responseAction.items : [];\n return {\n ...m,\n items,\n mainAgentActions: data.main_agent,\n firstAgentMessage: data.first_agent.message,\n firstAgentContinue: data.first_agent.continue,\n reasoningOpen: m.reasoningOpen,\n };\n }\n return m;\n }));\n }, []);\n\n const executeTurn = useCallback(async ({\n prompt,\n baseMessages,\n userMessage,\n assistantMessageId,\n chatId\n }: ExecuteTurnParams) => {\n if (!agentId) return;\n\n streaming.setError(null);\n streaming.setStreaming(true);\n\n try {\n const history = messagesToAPIFormat(baseMessages);\n history.push({ role: 'user', content: userMessage.content });\n\n // Prepare action processing for this assistant message\n assistantMsgIdRef.current = assistantMessageId;\n resetActionTracking();\n\n await agentStreaming.startStreaming({\n agentId,\n baseUrl,\n body: { prompt, chatId: chatId ?? undefined, messages: history },\n onUpdate: (data: AgentStreamData) => {\n // Update UI state\n applyStreamUpdateToAssistant(assistantMessageId, data);\n // Execute actions on partial updates\n const responseAction = data.main_agent.find(a => a.type === 'response') as any;\n const items = responseAction?.items || [];\n processActions(items, 'partial');\n }\n });\n\n // After streaming completes, ensure final execution for any pending actions\n const lastData = agentStreaming.streamData;\n const finalResponse = lastData?.main_agent?.find(a => a.type === 'response') as any;\n const finalItems = finalResponse?.items || [];\n processActions(finalItems, 'final');\n } catch (e: any) {\n streaming.setError(e?.message || 'Request failed');\n } finally {\n streaming.setStreaming(false);\n }\n }, [agentId, baseUrl, agentStreaming, streaming, applyStreamUpdateToAssistant]);\n\n // Chat history handlers\n const handleChatSelect = useCallback((chatId: string) => {\n if (selectChat(chatId)) {\n setHistoryOpen(false);\n setHistorySearch(\"\");\n }\n }, [selectChat, setHistoryOpen, setHistorySearch]);\n\n const handleChatDelete = useCallback((chatId: string) => {\n deleteStoredChat(chatId);\n // Force re-render to update the chats list\n setChatsListVersion(v => v + 1);\n }, [deleteStoredChat]);\n\n // Theme resolution\n const themeColorScheme = themeColors[theme];\n const resolvedColors: ThemeColors = {\n primaryColor: primaryColor || themeColorScheme.primaryColor,\n backgroundColor: backgroundColor ?? 'transparent',\n borderColor: borderColor || themeColorScheme.borderColor,\n textColor: textColor || themeColorScheme.textColor,\n accentColor: accentColor || themeColorScheme.accentColor,\n mutedTextColor: themeColorScheme.mutedTextColor,\n inputBackground: themeColorScheme.inputBackground,\n cardBackground: themeColorScheme.cardBackground,\n hoverBackground: themeColorScheme.hoverBackground,\n };\n\n // Handle sending messages\n const handleSend = useCallback(async () => {\n if (!agentId) return;\n\n const promptText = value.trim();\n if (!promptText) return;\n\n // Create a new chat if this is the first message\n let chatId = chatStorage.currentChatId;\n if (!chatId) {\n chatId = chatStorage.createNewChat(promptText);\n }\n\n const attachmentsCopy = cloneAttachments(attachments);\n const userMessage = createUserMessage(promptText, attachmentsCopy);\n const assistantMessage = createAssistantMessage(defaultReasoningOpen);\n const baseMessages = messages;\n\n setMessages([...baseMessages, userMessage, assistantMessage]);\n setValue(\"\");\n clearAttachments();\n \n // Enable auto-scroll when sending a new message\n setIsAtBottom(true);\n\n await executeTurn({\n prompt: promptText,\n baseMessages,\n userMessage,\n assistantMessageId: assistantMessage.id,\n chatId\n });\n }, [agentId, value, messages, attachments, clearAttachments, executeTurn, chatStorage, setMessages, setValue]);\n\n // Handle adding attachments during editing\n const handleAddEditingAttachments = useCallback(async (fileList: FileList) => {\n if (!fileList || !baseUrl) return;\n \n const files = Array.from(fileList);\n streaming.setError(null);\n \n const uploaded: Attachment[] = [];\n try {\n for (const file of files) {\n if (file.size > fileUpload.MAX_UPLOAD_SIZE) {\n streaming.setError(`\"${file.name}\" exceeds the ${fileUpload.formatBytes(fileUpload.MAX_UPLOAD_SIZE)} limit.`);\n continue;\n }\n\n try {\n const formData = new FormData();\n formData.append('file', file);\n\n const response = await fetch(`${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 const attachment: Attachment = {\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 uploaded.push(attachment);\n } catch (err: any) {\n console.error('Failed to upload attachment:', err);\n streaming.setError(String(err?.message ?? `Failed to upload ${file.name}`));\n }\n }\n\n if (uploaded.length) {\n setEditingAttachments(prev => [...prev, ...uploaded]);\n }\n } catch (error) {\n console.error('Error adding attachments during edit:', error);\n }\n }, [baseUrl, fileUpload, streaming]);\n\n // Effects\n useEffect(() => {\n // Don't scroll if user manually suppressed it (e.g., toggling reasoning)\n if (suppressNextScrollRef.current) {\n suppressNextScrollRef.current = false;\n return;\n }\n \n // Only auto-scroll if user is at the bottom\n if (!isAtBottom) return;\n \n // Use requestAnimationFrame to ensure DOM has updated\n requestAnimationFrame(() => {\n scrollAnchorRef.current?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n });\n }, [messages, streaming.streaming, isAtBottom]);\n\n // Track scroll position to detect if user is at bottom\n useEffect(() => {\n const scrollContainer = document.querySelector('.chat-scroll-container');\n if (!scrollContainer) return;\n\n const handleScroll = () => {\n const { scrollTop, scrollHeight, clientHeight } = scrollContainer;\n // Smaller threshold (50px) - more sensitive to user scrolling up\n const threshold = 40;\n const atBottom = scrollHeight - scrollTop - clientHeight < threshold;\n setIsAtBottom(atBottom);\n };\n\n scrollContainer.addEventListener('scroll', handleScroll);\n // Check initial state\n handleScroll();\n\n return () => scrollContainer.removeEventListener('scroll', handleScroll);\n }, []);\n\n // Portal container for chat UI\n const chatPortal = typeof document !== 'undefined' ? createPortal(\n <>\n {/* Chat Panel */}\n <div\n className={chatContainerClassName}\n style={{\n width: showChat ? (maximized ? '100%' : (typeof width === 'number' ? `${width}px` : width)) : '0',\n height,\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: showChat ? resolvedColors.backgroundColor : 'transparent',\n opacity: showChat ? 1 : 0,\n padding: showChat ? '24px 16px' : '0',\n transition: 'all 0.3s ease-out',\n position: 'fixed',\n top: 0,\n ...(dir === 'rtl' ? { left: 0 } : { right: 0 }),\n bottom: 0,\n zIndex: maximized ? 9999 : 1000,\n pointerEvents: showChat ? 'auto' : 'none'\n }}\n >\n {/* Header */}\n <ChatHeader\n title={resolvedTitle}\n expandable={expandable}\n alwaysOpen={alwaysOpen}\n maximized={maximized}\n streaming={streaming.streaming}\n dir={dir}\n resolvedColors={resolvedColors}\n onMaximize={() => setMaximized(m => !m)}\n onNew={resetChat}\n onToggleHistory={() => setHistoryOpen(o => !o)}\n onClose={() => setShowChat(false)}\n historyBtnRef={historyBtnRef}\n t={t}\n />\n\n {/* Message List */}\n <MessageList\n messages={messages}\n streaming={streaming.streaming}\n editingMessageId={editingMessageId}\n editingMessageText={editingMessageText}\n editingAttachments={editingAttachments}\n error={streaming.error}\n actionStatuses={actionStatuses}\n components={components}\n theme={theme}\n resolvedColors={resolvedColors}\n hideReasoningContent={hideReasoningContent}\n onEditingTextChange={setEditingMessageText}\n onRemoveAttachment={(id) => {\n setEditingAttachments(prev => prev.filter(att => att.id !== id));\n }}\n onAddAttachments={handleAddEditingAttachments}\n uploading={uploading}\n onStartEdit={(id, text) => {\n const msg = messages.find(m => m.id === id);\n setEditingMessageId(id);\n setEditingMessageText(text);\n if (msg && msg.role === 'user') {\n setEditingAttachments(cloneAttachments(getMessageAttachments(msg)));\n }\n }}\n onCancelEdit={() => {\n setEditingMessageId(null);\n setEditingAttachments([]);\n }}\n onSaveEdit={async (messageId, newText) => {\n const messageIndex = messages.findIndex(m => m.id === messageId);\n if (messageIndex === -1) return;\n\n const targetMessage = messages[messageIndex];\n if (targetMessage.role !== 'user') return;\n\n const trimmedText = newText.trim();\n const updatedMessage = updateUserMessage(\n targetMessage,\n trimmedText,\n cloneAttachments(editingAttachments)\n );\n\n const baseMessages = messages.slice(0, messageIndex);\n const assistantMessage = createAssistantMessage(defaultReasoningOpen);\n\n setMessages([...baseMessages, updatedMessage, assistantMessage]);\n setEditingMessageId(null);\n setEditingAttachments([]);\n\n await executeTurn({\n prompt: trimmedText,\n baseMessages,\n userMessage: updatedMessage,\n assistantMessageId: assistantMessage.id,\n chatId: chatStorage.currentChatId ?? null\n });\n }}\n onToggleReasoning={(messageId) => {\n // Save current scroll position before toggling\n const scrollContainer = document.querySelector('.chat-scroll-container');\n const scrollPos = scrollContainer?.scrollTop || 0;\n \n suppressNextScrollRef.current = true;\n setMessages(prev => prev.map(x => \n x.id === messageId && x.role === 'assistant' \n ? { ...x, reasoningOpen: !x.reasoningOpen } \n : x\n ));\n \n // Restore scroll position after DOM update\n requestAnimationFrame(() => {\n if (scrollContainer) {\n scrollContainer.scrollTop = scrollPos;\n }\n });\n }}\n scrollAnchorRef={scrollAnchorRef}\n t={t}\n />\n\n {/* Chat Input */}\n <ChatInput\n value={value}\n onChange={setValue}\n onSend={handleSend}\n onStop={streaming.handleStop}\n streaming={streaming.streaming}\n placeholder={resolvedPlaceholder}\n attachments={attachments}\n uploading={uploading}\n onRemoveAttachment={handleRemoveAttachment}\n onFileInputClick={() => fileInputRef.current?.click()}\n resolvedColors={resolvedColors}\n formatBytes={formatBytes}\n textareaRef={textareaRef}\n fileInputRef={fileInputRef}\n onFileSelection={(files) => handleFileSelection(files, streaming.setError)}\n t={t}\n dir={dir}\n />\n </div>\n\n {/* Floating Chat Button */}\n <FloatingChatButton\n show={!showChat && !alwaysOpen}\n onClick={() => setShowChat(true)}\n resolvedColors={resolvedColors}\n floatingButtonPosition={floatingButtonPosition}\n />\n\n {/* Chat History Modal */}\n <ChatHistory\n isOpen={historyOpen}\n onClose={() => setHistoryOpen(false)}\n searchQuery={historySearch}\n onSearchChange={setHistorySearch}\n chats={chatStorage.loadChatsIndex()}\n currentChatId={chatStorage.currentChatId}\n onChatSelect={handleChatSelect}\n onChatDelete={handleChatDelete}\n resolvedColors={resolvedColors}\n t={t}\n />\n\n {/* CSS Animations */}\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 @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n \n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n </>,\n document.body\n ) : null;\n\n // Render chat UI via portal - fixed to viewport edge\n return chatPortal;\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 = 450,\n dir = \"ltr\",\n}: ContentContainerProps) {\n const { isAnyStreaming, isAnyChatOpen } = useHsafa();\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[theme];\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 ? dir === \"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.3s 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.3s 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"]}
1
+ {"version":3,"sources":["../src/components/Button.module.css","../src/components/Button.tsx","../src/utils/file.ts","../src/components/AttachmentItem.tsx","../src/components/AttachmentDisplay.tsx","../src/components/MessageEditor.tsx","../src/types/messages.ts","../src/utils/message-utils.ts","../src/components/UserMessage.tsx","../src/components/ReasoningDisplay.tsx","../src/components/MermaidDiagram.tsx","../src/utils/markdown.ts","../src/components/MarkdownRendererWithMermaid.tsx","../src/components/ReasoningPane.tsx","../src/components/MCPToolDisplay.tsx","../src/components/AssistantMessageItems.tsx","../src/components/AssistantMessage.tsx","../src/components/MessageList.tsx","../src/components/FloatingChatButton.tsx","../src/hooks/useToggle.ts","../src/hooks/useAutoScroll.ts","../src/providers/HsafaProvider.tsx","../src/hooks/useHsafaAction.ts","../src/hooks/useHsafaComponent.ts","../src/hooks/useChatStorage.ts","../src/hooks/useStreaming.ts","../src/utils/file-upload.ts","../src/hooks/useFileUploadHook.ts","../src/hooks/useAgentStreaming.ts","../src/i18n/translations.ts","../src/hooks/useTranslation.ts","../src/hooks/useActions.ts","../src/components/IconButton.tsx","../src/components/ChatHeader.tsx","../src/components/ChatInput.tsx","../src/utils/time.ts","../src/components/ChatHistory.tsx","../src/utils/chat-theme.ts","../src/components/HsafaChat.tsx","../src/components/ContentContainer.tsx"],"names":["Button_default","Button","variant","size","loading","disabled","children","className","props","buttonClasses","jsxs","jsx","formatBytes","bytes","units","exponent","AttachmentItem","attachment","resolvedColors","mode","onRemove","maxWidth","isImage","isEditable","isLink","containerStyle","content","Fragment","e","fileIcon","File","Eye","X","Download","AttachmentDisplay","attachments","att","MessageEditor","messageId","initialText","editingText","onEditingTextChange","onCancel","onSave","streaming","onRemoveAttachment","onAddAttachments","uploading","t","fileInputRef","React","handleKeyDown","handleFileChange","files","Plus","attachmentToContentPart","buildUserContent","text","trimmedText","parts","extractTextFromUserContent","part","extractAttachmentsFromUserContent","url","getMessageText","message","getMessageAttachments","createUserMessage","now","createAssistantMessage","defaultReasoningOpen","messagesToAPIFormat","messages","result","msg","contentParts","action","stableToolCallId","itemsText","updateUserMessage","newAttachments","getMessageDisplayText","textItems","item","UserMessage","isEditing","editingAttachments","onStartEdit","onCancelEdit","onSaveEdit","messageText","messageAttachments","ReasoningDisplay","reasoning","reasoningOpen","onToggleReasoning","lines","line","finalLine","MermaidDiagram","chart","theme","containerRef","useRef","error","setError","useState","setLoading","useEffect","mounted","mermaid","id","svg","svgElement","err","borderColor","bgColor","errorBg","errorText","loadingText","escapeHtml","s","inlineFormat","renderMarkdownToHtmlSafe","input","html","inCode","codeLang","codeBuffer","inUl","inOl","hasMermaid","codeBlockBg","codeTextColor","closeLists","i","raw","fenceMatch","mermaidCode","codeHtml","cls","h","level","ulItem","olItem","MarkdownRendererWithMermaid","useMemo","elements","index","match","ReasoningPane","mainAgentActions","hideReasoningContent","displayActions","lastReasoningAction","a","hasFinalResponse","totalDuration","calculateTotalDuration","ExpandedActionItem","CheckCircle","formatDuration","actions","total","ms","minutes","seconds","isFirst","isLast","duration","getToolStatus","statusMap","renderTimeline","dotColor","color","MCPToolDisplay","mcpToolCalls","uniqueTools","toolCall","existing","hasRunningTools","tool","completedToolsCount","toolName","toolInfo","AssistantMessageItems","items","mcpToolResults","actionStatuses","components","it","idx","key","actionKey","status","compName","Comp","textContent","AssistantMessage","isLastMessage","hasMainAgentActions","MessageList","editingMessageId","editingMessageText","scrollAnchorRef","m","FloatingChatButton","show","onClick","floatingButtonPosition","floatingButtonStyles","useToggle","initial","on","setOn","toggle","useCallback","prev","setTrue","setFalse","useAutoScroll","ref","el","observer","HsafaContext","createContext","HsafaProvider","baseUrl","setActions","setComponents","streamingStates","setStreamingStates","chatOpenStates","setChatOpenStates","registerAction","name","handler","next","unregisterAction","registerComponent","component","unregisterComponent","setStreamingState","chatId","isStreaming","setChatOpenState","isOpen","isAnyStreaming","state","isAnyChatOpen","value","useHsafa","ctx","useContext","useHsafaAction","handlerRef","stableHandler","params","meta","useHsafaComponent","componentRef","StableComponent","Wrapper","CurrentComponent","useChatStorage","agentId","LS_PREFIX","chatsIndexKey","chatKey","currentChatKey","showChatKey","currentChatId","setCurrentChatId","hasChatRecordRef","pendingFirstTitleRef","loadChatsIndex","saveChatsIndex","list","loadChat","saveChat","data","upsertChatMeta","x","deleteChatMeta","deleteChatData","onChatDeleted","wasCurrentChat","savedCurrent","cd","firstUser","displayText","title","firstMessage","localId","useStreaming","setStreaming","abortControllerRef","actionExecMapRef","assistantMsgIdRef","calledFinalActionsRef","actionParamsHistoryRef","actionExecutionStatusRef","setActionStatuses","hasActionParamsStabilized","currentParams","history","stringifiedParams","lastThree","processActions","trigger","executeOnStream","timeoutId","isStabilized","currentStatus","handleStop","resetActionTracking","cleanupTimeouts","joinUrl","path","b","MAX_UPLOAD_SIZE","useFileUpload","setAttachments","setUploading","uploadAttachment","file","formData","response","handleRemoveAttachment","handleFileSelection","fileList","uploaded","mt","clearAttachments","deepClone","obj","useAgentStreaming","streamData","setStreamData","startStreaming","body","onUpdate","signal","pushUpdate","clonedData","finalSignal","controller","res","txt","currentReasoning","currentToolCall","currentResponse","currentText","mainAgentSkipped","reader","decoder","buffer","done","evt","finishedStep","delta","existingToolCall","toolCallToUpdate","fallbackToolCall","toolCallForError","sourceAction","fileAction","stopStreaming","reset","translations","getTranslation","lang","useTranslation","language","useActions","_","k","IconButton","icon","ariaLabel","ChatHeader","expandable","alwaysOpen","maximized","dir","onMaximize","onNew","onToggleHistory","onClose","historyBtnRef","Maximize2","History","ChevronRight","ChatInput","onChange","onSend","onStop","placeholder","onFileInputClick","textareaRef","onFileSelection","textarea","newHeight","Loader2","Paperclip","Link","Square","ArrowUp","timeAgo","ts","diff","d","w","months","ChatHistory","searchQuery","onSearchChange","chats","onChatSelect","onChatDelete","filteredChats","modalContent","Trash2","createPortal","themeColors","cloneAttachments","usePersistentChatMessages","chatStorage","setMessages","selectChat","chatData","deleteChat","wasCurrent","resetChat","HsafaChat","primaryColor","backgroundColor","textColor","accentColor","width","height","defaultOpen","chatContainerClassName","detectedLanguage","resolvedPlaceholder","resolvedTitle","chatInstanceId","setValue","showChat","setShowChat","savedShow","historyOpen","setHistoryOpen","historySearch","setHistorySearch","setMaximized","chatsListVersion","setChatsListVersion","setEditingMessageId","setEditingMessageText","setEditingAttachments","isAtBottom","setIsAtBottom","suppressNextScrollRef","componentId","deleteStoredChat","fileUpload","agentStreaming","applyStreamUpdateToAssistant","assistantId","responseAction","executeTurn","prompt","baseMessages","userMessage","assistantMessageId","finalItems","handleChatSelect","handleChatDelete","v","themeColorScheme","handleSend","promptText","attachmentsCopy","assistantMessage","handleAddEditingAttachments","scrollContainer","handleScroll","scrollTop","scrollHeight","clientHeight","atBottom","o","newText","messageIndex","targetMessage","updatedMessage","scrollPos","ContentContainer","mutedTextColor","enableBorderAnimation","borderRadius","enableContentBorder","enableMargin","chatWidth","isMounted","setIsMounted","timeout","contentBorderRadius","chatWidthPx","marginStyle","containerWidth"],"mappings":"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","file":"index.js","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","/**\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 { 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 <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 <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 <X size=\"12\" strokeWidth=\"2\" />\n </button>\n )}\n \n {isLink && (\n <Download \n size=\"10\" \n strokeWidth=\"2\" \n style={{ \n color: resolvedColors.mutedTextColor,\n flexShrink: 0\n }} \n />\n )}\n </>\n );\n\n if (isLink) {\n return (\n <a\n href={attachment.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{\n ...containerStyle,\n textDecoration: 'none'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground;\n e.currentTarget.style.borderColor = resolvedColors.primaryColor;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = resolvedColors.inputBackground;\n e.currentTarget.style.borderColor = resolvedColors.borderColor;\n }}\n >\n {content}\n </a>\n );\n }\n\n return <div style={containerStyle}>{content}</div>;\n}\n","import React from 'react';\nimport { Attachment } from '../types/chat';\nimport { ThemeColors } from '../utils/chat-theme';\nimport { AttachmentItem } from './AttachmentItem';\n\ninterface AttachmentDisplayProps {\n attachments: Attachment[];\n resolvedColors: ThemeColors;\n onRemove?: (id: string) => void;\n}\n\nexport function AttachmentDisplay({ attachments, resolvedColors, onRemove }: AttachmentDisplayProps) {\n if (!Array.isArray(attachments) || attachments.length === 0) {\n return null;\n }\n\n const mode = typeof onRemove === 'function' ? 'editable' : 'viewable';\n\n return (\n <div style={{\n marginTop: '12px',\n display: 'flex',\n flexWrap: 'wrap',\n gap: '8px'\n }}>\n {attachments.map((att) => (\n <AttachmentItem\n key={att.id}\n attachment={att}\n resolvedColors={resolvedColors}\n mode={mode}\n onRemove={onRemove}\n />\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport { Plus } from 'lucide-react';\nimport { ThemeColors } from '../utils/chat-theme';\nimport { Attachment } from '../types/chat';\nimport { AttachmentDisplay } from './AttachmentDisplay';\nimport type { TranslationKeys } from '../i18n/translations';\n\ninterface MessageEditorProps {\n messageId: string;\n initialText: string;\n editingText: string;\n onEditingTextChange: (text: string) => void;\n onCancel: () => void;\n onSave: (messageId: string, text: string) => void;\n streaming: boolean;\n resolvedColors: ThemeColors;\n attachments?: Attachment[];\n onRemoveAttachment?: (id: string) => void;\n onAddAttachments?: (files: FileList) => void;\n uploading?: boolean;\n t: (key: keyof TranslationKeys) => string;\n}\n\nexport function MessageEditor({\n messageId,\n initialText,\n editingText,\n onEditingTextChange,\n onCancel,\n onSave,\n streaming,\n resolvedColors,\n attachments,\n onRemoveAttachment,\n onAddAttachments,\n uploading,\n t\n}: MessageEditorProps) {\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onCancel();\n } else if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (!streaming) {\n onSave(messageId, editingText || initialText);\n }\n }\n };\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0 && onAddAttachments) {\n onAddAttachments(files);\n }\n // Reset the input so the same file can be selected again\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n return (\n <div style={{\n maxWidth: '720px',\n borderRadius: '16px',\n padding: '8px',\n fontSize: '15px',\n border: `2px solid ${resolvedColors.primaryColor}`,\n backgroundColor: resolvedColors.accentColor,\n color: resolvedColors.textColor\n }}>\n <textarea\n autoFocus\n style={{\n width: '100%',\n resize: 'none',\n backgroundColor: 'transparent',\n padding: '8px',\n lineHeight: '1.6',\n outline: 'none',\n border: 'none',\n color: 'inherit',\n fontFamily: 'inherit',\n fontSize: 'inherit'\n }}\n rows={Math.max(2, Math.min(10, Math.ceil((editingText || initialText).length / 60)))}\n value={editingText}\n onChange={(e) => onEditingTextChange(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n \n {attachments && attachments.length > 0 && (\n <div style={{ padding: '8px' }}>\n <AttachmentDisplay\n attachments={attachments}\n resolvedColors={resolvedColors}\n onRemove={onRemoveAttachment}\n />\n </div>\n )}\n \n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n padding: '8px 8px 8px 0'\n }}>\n {/* File upload button */}\n {onAddAttachments && (\n <div>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n onChange={handleFileChange}\n style={{ display: 'none' }}\n />\n <button\n onClick={() => fileInputRef.current?.click()}\n disabled={uploading || streaming}\n title={uploading ? t('input.uploadingFiles') : t('input.attachFiles')}\n style={{\n display: 'flex',\n margin: '0 10px',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '50%',\n width: '28px',\n height: '28px',\n transition: 'all 0.2s',\n border: `1px solid ${resolvedColors.borderColor}`,\n color: resolvedColors.mutedTextColor,\n backgroundColor: 'transparent',\n cursor: uploading || streaming ? 'not-allowed' : 'pointer',\n opacity: uploading || streaming ? 0.5 : 1\n }}\n onMouseEnter={(e) => {\n if (!uploading && !streaming) {\n e.currentTarget.style.backgroundColor = resolvedColors.inputBackground;\n e.currentTarget.style.borderColor = resolvedColors.primaryColor;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.borderColor = resolvedColors.borderColor;\n }}\n >\n <Plus size={16} strokeWidth={2} />\n </button>\n </div>\n )}\n \n {/* Action buttons container */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px'\n }}>\n <button\n style={{\n borderRadius: '8px',\n padding: '4px 12px',\n fontSize: '14px',\n transition: 'background-color 0.2s',\n border: `1px solid ${resolvedColors.borderColor}`,\n color: resolvedColors.mutedTextColor,\n backgroundColor: 'transparent',\n cursor: 'pointer'\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = resolvedColors.inputBackground}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = 'transparent'}\n onClick={onCancel}\n >\n {t('editor.cancel')}\n </button>\n <button\n style={{\n borderRadius: '8px',\n padding: '4px 12px',\n fontSize: '14px',\n transition: 'border-color 0.2s',\n border: `1px solid ${resolvedColors.borderColor}`,\n backgroundColor: resolvedColors.cardBackground,\n color: resolvedColors.textColor,\n cursor: 'pointer'\n }}\n onMouseEnter={(e) => e.currentTarget.style.borderColor = resolvedColors.primaryColor}\n onMouseLeave={(e) => e.currentTarget.style.borderColor = resolvedColors.borderColor}\n onClick={() => { if (!streaming) onSave(messageId, editingText || initialText); }}\n >\n {t('editor.saveAndRegenerate')}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Vercel AI SDK compatible message types\n * Based on https://sdk.vercel.ai/docs/ai-sdk-core/messages\n */\n\n// Content Parts for User Messages\nexport type TextPart = {\n type: 'text';\n text: string;\n};\n\nexport type ImagePart = {\n type: 'image';\n image: string | URL;\n mediaType?: string;\n};\n\nexport type FilePart = {\n type: 'file';\n data: string | URL;\n mediaType: string;\n name?: string;\n};\n\nexport type UserContentPart = TextPart | ImagePart | FilePart;\n\n// Content Parts for Assistant Messages\nexport type AssistantTextPart = {\n type: 'text';\n text: string;\n};\n\nexport type ReasoningPart = {\n type: 'reasoning';\n text: string;\n};\n\nexport type AssistantFilePart = {\n type: 'file';\n data: string | URL;\n mediaType: string;\n filename?: string;\n};\n\nexport type ToolCallPart = {\n type: 'tool-call';\n toolCallId: string;\n toolName: string;\n input: any;\n};\n\nexport type AssistantContentPart = AssistantTextPart | ReasoningPart | AssistantFilePart | ToolCallPart;\n\n// Content Parts for Tool Messages\nexport type ToolResultPart = {\n type: 'tool-result';\n toolCallId: string;\n toolName: string;\n output: unknown;\n isError?: boolean;\n};\n\n// Message Types\nexport type SystemModelMessage = {\n role: 'system';\n content: string;\n};\n\nexport type UserModelMessage = {\n role: 'user';\n content: string | UserContentPart[];\n};\n\nexport type AssistantModelMessage = {\n role: 'assistant';\n content: string | AssistantContentPart[];\n};\n\nexport type ToolModelMessage = {\n role: 'tool';\n content: ToolResultPart[];\n};\n\nexport type ModelMessage = \n | SystemModelMessage \n | UserModelMessage \n | AssistantModelMessage \n | ToolModelMessage;\n\n// Extended Message Types for UI (includes ID and metadata)\nexport type UIMessage = ModelMessage & {\n id: string;\n createdAt?: number;\n metadata?: Record<string, any>;\n};\n\n// Legacy Attachment Type (for backward compatibility)\nexport interface Attachment {\n id: string;\n name: string;\n url: string;\n mimeType: string;\n size: number;\n}\n\n// Helper to convert Attachment to content parts\nexport function attachmentToContentPart(attachment: Attachment): ImagePart | FilePart {\n const isImage = attachment.mimeType.startsWith('image/');\n \n if (isImage) {\n return {\n type: 'image',\n image: new URL(attachment.url),\n mediaType: attachment.mimeType\n };\n } else {\n return {\n type: 'file',\n data: attachment.url,\n mediaType: attachment.mimeType,\n name: attachment.name\n };\n }\n}\n\n// Helper to build user content from text and attachments\nexport function buildUserContent(text: string, attachments: Attachment[]): string | UserContentPart[] {\n const trimmedText = (text || '').trim();\n \n // If no attachments, return simple string\n if (!attachments || attachments.length === 0) {\n return trimmedText;\n }\n \n // Build parts array\n const parts: UserContentPart[] = [];\n \n // Add text part if present\n if (trimmedText) {\n parts.push({ type: 'text', text: trimmedText });\n }\n \n // Add attachment parts\n for (const attachment of attachments) {\n parts.push(attachmentToContentPart(attachment));\n }\n \n return parts;\n}\n\n// Helper to extract text from user content\nexport function extractTextFromUserContent(content: string | UserContentPart[]): string {\n if (typeof content === 'string') {\n return content;\n }\n \n if (Array.isArray(content)) {\n const textParts = content.filter((part): part is TextPart => part.type === 'text');\n return textParts.map(part => part.text).join('\\n');\n }\n \n return '';\n}\n\n// Helper to extract attachments from user content\nexport function extractAttachmentsFromUserContent(content: string | UserContentPart[]): Attachment[] {\n if (typeof content === 'string' || !Array.isArray(content)) {\n return [];\n }\n \n const attachments: Attachment[] = [];\n \n for (const part of content) {\n if (part.type === 'image') {\n const url = typeof part.image === 'string' ? part.image : part.image.toString();\n attachments.push({\n id: `img_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n name: 'image',\n url,\n mimeType: part.mediaType || 'image/jpeg',\n size: 0\n });\n } else if (part.type === 'file') {\n const url = typeof part.data === 'string' ? part.data : part.data.toString();\n attachments.push({\n id: `file_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n name: part.name || 'file',\n url,\n mimeType: part.mediaType,\n size: 0\n });\n }\n }\n \n return attachments;\n}\n","/**\n * Message utility functions for converting between formats\n */\n\nimport { \n ChatMessage, \n Attachment, \n UserContentPart, \n AssistantContentPart \n} from '../types/chat';\nimport { \n buildUserContent, \n extractTextFromUserContent, \n extractAttachmentsFromUserContent \n} from '../types/messages';\n\n/**\n * Convert user message content to legacy format for backward compatibility\n */\nexport function getMessageText(message: ChatMessage): string {\n if (message.role === 'user') {\n // Try legacy text field first\n if (message.text) return message.text;\n \n // Extract from content\n return extractTextFromUserContent(message.content);\n }\n \n return '';\n}\n\n/**\n * Convert user message content to attachments for backward compatibility\n */\nexport function getMessageAttachments(message: ChatMessage): Attachment[] {\n if (message.role === 'user') {\n // Try legacy attachments field first\n if (message.attachments) return message.attachments;\n \n // Extract from content\n return extractAttachmentsFromUserContent(message.content);\n }\n \n return [];\n}\n\n/**\n * Create a user message in Vercel AI SDK format\n */\nexport function createUserMessage(\n text: string, \n attachments: Attachment[] = []\n): ChatMessage & { role: 'user' } {\n const content = buildUserContent(text, attachments);\n const now = Date.now();\n \n return {\n id: `user_${now}_${Math.random().toString(36).slice(2)}`,\n role: 'user',\n content,\n createdAt: now,\n // Keep legacy fields for backward compatibility\n text,\n attachments: attachments.length > 0 ? attachments : undefined\n };\n}\n\n/**\n * Create an assistant message in Vercel AI SDK format\n */\nexport function createAssistantMessage(defaultReasoningOpen = false): ChatMessage & { role: 'assistant' } {\n const now = Date.now();\n \n return {\n id: `assistant_${now}_${Math.random().toString(36).slice(2)}`,\n role: 'assistant',\n items: [],\n reasoning: '',\n reasoningOpen: defaultReasoningOpen,\n mainAgentActions: [],\n createdAt: now\n };\n}\n\n/**\n * Convert messages to API format (for sending to agent)\n * Properly formats messages according to Vercel AI SDK specification:\n * - User: text + images + files\n * - Assistant: first agent message + reasoning + tool calls + final text (items stringified)\n * - Tool: separate tool result messages\n */\nexport function messagesToAPIFormat(messages: ChatMessage[]): Array<{\n role: string;\n content: any;\n}> {\n const result: Array<{ role: string; content: any }> = [];\n \n for (const msg of messages) {\n if (msg.role === 'user') {\n // User messages: keep content as-is (string or array of TextPart/ImagePart/FilePart)\n result.push({\n role: msg.role,\n content: msg.content\n });\n } else if (msg.role === 'assistant') {\n // Assistant messages: construct content array with all parts\n const contentParts: AssistantContentPart[] = [];\n \n // 1. Add first agent message if available\n if (msg.firstAgentMessage) {\n contentParts.push({\n type: 'text',\n text: msg.firstAgentMessage\n });\n }\n \n // 2. Process main agent actions (reasoning and tool calls)\n if (msg.mainAgentActions && msg.mainAgentActions.length > 0) {\n for (const action of msg.mainAgentActions) {\n if (action.type === 'reasoning' && action.reasoning) {\n contentParts.push({\n type: 'reasoning',\n text: action.reasoning\n });\n } else if (action.type === 'tool-call' && action.toolName) {\n // Compute a stable toolCallId for both the tool-call and tool-result\n const stableToolCallId = action.toolCallId \n || (typeof action.startDate === 'number' && action.toolName \n ? `${action.toolName}_${action.startDate}`\n : `call_${action.toolName || 'tool'}_${Math.abs((action.durationMs || 0))}`);\n\n // Tool calls go in assistant content\n contentParts.push({\n type: 'tool-call',\n toolCallId: stableToolCallId,\n toolName: action.toolName,\n input: action.input || {}\n });\n \n // Tool results become separate tool messages\n if (action.output !== undefined) {\n result.push({\n role: 'tool',\n content: [{\n type: 'tool-result',\n toolCallId: stableToolCallId,\n toolName: action.toolName,\n output: action.output,\n isError: action.status === 'error'\n }]\n });\n }\n }\n }\n }\n \n // 3. Add final response items as stringified text\n if (msg.items && msg.items.length > 0) {\n const itemsText = JSON.stringify(msg.items, null, 2);\n contentParts.push({\n type: 'text',\n text: itemsText\n });\n }\n \n // Only add assistant message if it has content\n if (contentParts.length > 0) {\n result.push({\n role: msg.role,\n content: contentParts\n });\n }\n }\n }\n \n return result;\n}\n\n/**\n * Update a user message with new text and attachments\n */\nexport function updateUserMessage(\n message: ChatMessage & { role: 'user' },\n text: string,\n attachments?: Attachment[]\n): ChatMessage & { role: 'user' } {\n const newAttachments = attachments ?? getMessageAttachments(message);\n const content = buildUserContent(text, newAttachments);\n \n return {\n ...message,\n content,\n text,\n attachments: newAttachments.length > 0 ? newAttachments : undefined\n };\n}\n\n/**\n * Check if a message has attachments\n */\nexport function hasAttachments(message: ChatMessage): boolean {\n if (message.role === 'user') {\n const attachments = getMessageAttachments(message);\n return attachments.length > 0;\n }\n return false;\n}\n\n/**\n * Get display text for a message (useful for chat history preview)\n */\nexport function getMessageDisplayText(message: ChatMessage): string {\n if (message.role === 'user') {\n const text = getMessageText(message);\n const attachments = getMessageAttachments(message);\n \n if (attachments.length > 0) {\n return `${text} [${attachments.length} attachment${attachments.length > 1 ? 's' : ''}]`;\n }\n \n return text;\n } else if (message.role === 'assistant') {\n // Extract text from items\n const items = message.items || [];\n const textItems = items.filter((item: any) => item.type === 'text');\n if (textItems.length > 0) {\n return textItems.map((item: any) => item.text || '').join(' ').slice(0, 100);\n }\n return 'Assistant response';\n }\n \n return '';\n}\n","import React from 'react';\nimport { ChatMessage, Attachment } from '../types/chat';\nimport { ThemeColors } from '../utils/chat-theme';\nimport { AttachmentDisplay } from './AttachmentDisplay';\nimport { MessageEditor } from './MessageEditor';\nimport { getMessageText, getMessageAttachments } from '../utils/message-utils';\nimport type { TranslationKeys } from '../i18n/translations';\n\ninterface UserMessageProps {\n message: ChatMessage & { role: 'user' };\n isEditing: boolean;\n editingText: string;\n editingAttachments?: Attachment[];\n onEditingTextChange: (text: string) => void;\n onStartEdit: (messageId: string, text: string) => void;\n onCancelEdit: () => void;\n onSaveEdit: (messageId: string, text: string) => void;\n onRemoveAttachment?: (id: string) => void;\n onAddAttachments?: (files: FileList) => void;\n uploading?: boolean;\n streaming: boolean;\n resolvedColors: ThemeColors;\n t: (key: keyof TranslationKeys) => string;\n}\n\nexport function UserMessage({\n message,\n isEditing,\n editingText,\n editingAttachments,\n onEditingTextChange,\n onStartEdit,\n onCancelEdit,\n onSaveEdit,\n onRemoveAttachment,\n onAddAttachments,\n uploading,\n streaming,\n resolvedColors,\n t\n}: UserMessageProps) {\n const messageText = getMessageText(message);\n const messageAttachments = getMessageAttachments(message);\n \n if (isEditing) {\n return (\n <MessageEditor\n messageId={message.id}\n initialText={messageText}\n editingText={editingText}\n onEditingTextChange={onEditingTextChange}\n onCancel={onCancelEdit}\n onSave={onSaveEdit}\n streaming={streaming}\n resolvedColors={resolvedColors}\n attachments={editingAttachments || messageAttachments}\n onRemoveAttachment={onRemoveAttachment}\n onAddAttachments={onAddAttachments}\n uploading={uploading}\n t={t}\n />\n );\n }\n\n return (\n <div\n title={t('editor.clickToEdit')}\n onClick={() => {\n if (streaming) return;\n onStartEdit(message.id, messageText);\n }}\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 }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = resolvedColors.accentColor}\n >\n {messageText}\n <AttachmentDisplay\n attachments={messageAttachments}\n resolvedColors={resolvedColors}\n />\n </div>\n );\n}\n","import React from 'react';\nimport { ThemeColors } from '../utils/chat-theme';\n\ninterface ReasoningDisplayProps {\n reasoning?: string;\n reasoningOpen?: boolean;\n onToggleReasoning: () => void;\n resolvedColors: ThemeColors;\n}\n\nexport function ReasoningDisplay({\n reasoning,\n reasoningOpen,\n onToggleReasoning,\n resolvedColors\n}: ReasoningDisplayProps) {\n if (!reasoning) return null;\n\n return (\n <div\n style={{\n borderRadius: '12px',\n padding: '12px',\n cursor: 'pointer',\n backgroundColor: resolvedColors.inputBackground,\n border: `1px solid ${resolvedColors.borderColor}`\n }}\n onClick={onToggleReasoning}\n >\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '4px'\n }}>\n <div style={{\n fontSize: '12px',\n color: resolvedColors.mutedTextColor\n }}>Reasoning</div>\n <button\n type=\"button\"\n style={{\n fontSize: '12px',\n transition: 'color 0.2s',\n color: resolvedColors.mutedTextColor,\n background: 'none',\n border: 'none',\n cursor: 'pointer'\n }}\n onMouseEnter={(e) => e.currentTarget.style.color = resolvedColors.textColor}\n onMouseLeave={(e) => e.currentTarget.style.color = resolvedColors.mutedTextColor}\n >\n {reasoningOpen ? 'Hide' : 'Show full'}\n </button>\n </div>\n {reasoningOpen ? (\n <pre style={{\n fontSize: '12px',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n color: resolvedColors.mutedTextColor,\n margin: '0',\n fontFamily: 'ui-monospace, SFMono-Regular, \"SF Mono\", Consolas, \"Liberation Mono\", Menlo, monospace'\n }}>{reasoning}</pre>\n ) : (\n (() => {\n const lines = (reasoning || '').trim().split('\\n').filter(line => line.trim());\n const finalLine = lines.length > 0 ? lines[lines.length - 1] : '';\n return (\n <pre style={{\n fontSize: '12px',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n color: resolvedColors.mutedTextColor,\n margin: '0',\n fontFamily: 'ui-monospace, SFMono-Regular, \"SF Mono\", Consolas, \"Liberation Mono\", Menlo, monospace'\n }}>\n {finalLine || '…'}\n </pre>\n );\n })()\n )}\n </div>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\n\nexport interface MermaidDiagramProps {\n chart: string;\n theme: 'light' | 'dark';\n}\n\n/**\n * Simple MermaidDiagram component for SDK use\n */\nexport function MermaidDiagram({ chart, theme }: MermaidDiagramProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let mounted = true;\n \n const renderMermaid = async () => {\n try {\n setLoading(true);\n setError(null);\n \n // Dynamic import to avoid SSR issues - only try if mermaid is available\n let mermaid: any;\n try {\n mermaid = await import('mermaid');\n } catch {\n throw new Error('Mermaid library not available');\n }\n \n if (!mounted) return;\n \n // Configure mermaid\n mermaid.default?.initialize({\n startOnLoad: false,\n theme: theme === 'dark' ? 'dark' : 'default',\n themeVariables: {\n darkMode: theme === 'dark',\n primaryColor: theme === 'dark' ? '#3B82F6' : '#1D4ED8',\n primaryTextColor: theme === 'dark' ? '#F3F4F6' : '#1F2937',\n primaryBorderColor: theme === 'dark' ? '#374151' : '#D1D5DB',\n },\n flowchart: { useMaxWidth: true },\n sequence: { useMaxWidth: true },\n gantt: { useMaxWidth: true },\n });\n \n if (containerRef.current && mounted) {\n const id = `mermaid-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n const { svg } = await mermaid.default.render(id, chart);\n \n if (containerRef.current && mounted) {\n containerRef.current.innerHTML = svg;\n const svgElement = containerRef.current.querySelector('svg');\n if (svgElement) {\n svgElement.style.maxWidth = '100%';\n svgElement.style.height = 'auto';\n svgElement.style.display = 'block';\n }\n }\n }\n } catch (err) {\n if (mounted) {\n setError(err instanceof Error ? err.message : 'Failed to render diagram');\n }\n } finally {\n if (mounted) {\n setLoading(false);\n }\n }\n };\n \n renderMermaid();\n \n return () => { mounted = false; };\n }, [chart, theme]);\n \n const borderColor = theme === 'dark' ? '#374151' : '#D1D5DB';\n const bgColor = theme === 'dark' ? '#1F2937' : '#F9FAFB';\n const errorBg = theme === 'dark' ? '#7F1D1D' : '#FEF2F2';\n const errorText = theme === 'dark' ? '#FCA5A5' : '#DC2626';\n const loadingText = theme === 'dark' ? '#9CA3AF' : '#6B7280';\n \n if (error) {\n return (\n <div style={{\n borderRadius: '12px',\n border: `1px solid ${borderColor}`,\n backgroundColor: errorBg,\n padding: '16px',\n margin: '8px 0'\n }}>\n <div style={{\n fontSize: '14px',\n color: errorText,\n marginBottom: '8px',\n fontWeight: '500'\n }}>\n Failed to render diagram\n </div>\n <div style={{\n fontSize: '12px',\n color: errorText,\n opacity: 0.8\n }}>\n {error}\n </div>\n </div>\n );\n }\n \n return (\n <div style={{\n borderRadius: '12px',\n border: `1px solid ${borderColor}`,\n backgroundColor: bgColor,\n padding: '16px',\n margin: '8px 0',\n overflow: 'hidden'\n }}>\n {loading && (\n <div style={{\n fontSize: '14px',\n color: loadingText,\n textAlign: 'center',\n padding: '32px'\n }}>\n Rendering diagram...\n </div>\n )}\n <div \n ref={containerRef}\n style={{\n display: loading ? 'none' : 'block',\n textAlign: 'center',\n minHeight: loading ? '0' : '50px'\n }}\n />\n </div>\n );\n}\n","/**\n * Markdown rendering utilities for the HsafaChat component\n */\n\n/**\n * Escape HTML characters\n */\nexport function escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\n/**\n * Apply inline formatting (links, bold, italic, code)\n */\nexport function inlineFormat(s: string): string {\n s = s.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline; color: inherit; opacity: 0.8;\">$1</a>');\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n s = s.replace(/\\*([^*\\n]+)\\*/g, '<em>$1</em>');\n s = s.replace(/`([^`]+)`/g, '<code style=\"padding: 2px 4px; border-radius: 4px; background-color: rgba(0,0,0,0.1); font-family: monospace;\">$1</code>');\n return s;\n}\n\n/**\n * Render markdown to HTML with mermaid detection\n */\nexport function renderMarkdownToHtmlSafe(input: string, theme: 'light' | 'dark' = 'dark'): { html: string; hasMermaid: boolean } {\n const lines = (input || '').replace(/\\r\\n/g, '\\n').split('\\n');\n let html = '';\n let inCode = false;\n let codeLang = '';\n let codeBuffer: string[] = [];\n let inUl = false;\n let inOl = false;\n let hasMermaid = false;\n\n const borderColor = theme === 'dark' ? '#374151' : '#D1D5DB';\n const bgColor = theme === 'dark' ? '#1F2937' : '#F9FAFB';\n const codeBlockBg = theme === 'dark' ? '#111827' : '#F3F4F6';\n const codeTextColor = theme === 'dark' ? '#E5E7EB' : '#374151';\n\n const closeLists = () => {\n if (inUl) { html += '</ul>'; inUl = false; }\n if (inOl) { html += '</ol>'; inOl = false; }\n };\n\n for (let i = 0; i < lines.length; i++) {\n let raw = lines[i];\n const fenceMatch = raw.match(/^```\\s*(\\w+)?\\s*$/);\n \n if (fenceMatch) {\n if (!inCode) {\n closeLists();\n inCode = true;\n codeLang = fenceMatch[1] ? String(fenceMatch[1]) : '';\n codeBuffer = [];\n } else {\n // Check if this is a mermaid diagram\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n inCode = false;\n codeLang = '';\n codeBuffer = [];\n }\n continue;\n }\n\n if (inCode) {\n codeBuffer.push(raw);\n continue;\n }\n\n // Horizontal rules\n if (/^\\s*(---|\\*\\*\\*|___)\\s*$/.test(raw)) {\n closeLists();\n html += '<hr style=\"margin: 12px 0; opacity: 0.6; border: none; border-top: 1px solid currentColor;\" />';\n continue;\n }\n\n // Headers\n const h = raw.match(/^(#{1,6})\\s+(.+)$/);\n if (h) {\n closeLists();\n const level = h[1].length;\n const content = inlineFormat(escapeHtml(h[2].trim()));\n const size = level <= 2 ? '18px' : level === 3 ? '16px' : '14px';\n html += `<h${level} style=\"font-size: ${size}; font-weight: 600; margin: 8px 0 4px 0;\">${content}</h${level}>`;\n continue;\n }\n\n // Lists\n const ulItem = raw.match(/^\\s*[-*]\\s+(.+)$/);\n const olItem = raw.match(/^\\s*\\d+\\.\\s+(.+)$/);\n if (ulItem) {\n if (!inUl) { closeLists(); html += '<ul style=\"list-style-type: disc; padding-left: 24px; margin: 4px 0;\">'; inUl = true; }\n const content = inlineFormat(escapeHtml(ulItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n if (olItem) {\n if (!inOl) { closeLists(); html += '<ol style=\"list-style-type: decimal; padding-left: 24px; margin: 4px 0;\">'; inOl = true; }\n const content = inlineFormat(escapeHtml(olItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n\n // Empty lines\n if (raw.trim().length === 0) {\n closeLists();\n html += '<div style=\"height: 8px;\"></div>';\n } else {\n closeLists();\n const content = inlineFormat(escapeHtml(raw));\n html += `<p style=\"line-height: 1.6; margin: 4px 0; word-break: break-word;\">${content}</p>`;\n }\n }\n\n // Handle unclosed code blocks\n if (inCode) {\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n }\n if (inUl) html += '</ul>';\n if (inOl) html += '</ol>';\n \n return { html, hasMermaid };\n}\n","import React, { useMemo } from 'react';\nimport { MermaidDiagram } from './MermaidDiagram';\nimport { escapeHtml } from '../utils/markdown';\n\nfunction inlineFormat(s: string) {\n s = s.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline; color: inherit; opacity: 0.8;\">$1</a>');\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n s = s.replace(/\\*([^*\\n]+)\\*/g, '<em>$1</em>');\n s = s.replace(/`([^`]+)`/g, '<code style=\"padding: 2px 4px; border-radius: 4px; background-color: rgba(0,0,0,0.1); font-family: monospace;\">$1</code>');\n return s;\n}\n\nfunction renderMarkdownToHtmlSafe(input: string, theme: 'light' | 'dark' = 'dark'): { html: string; hasMermaid: boolean } {\n const lines = (input || '').replace(/\\r\\n/g, '\\n').split('\\n');\n let html = '';\n let inCode = false;\n let codeLang = '';\n let codeBuffer: string[] = [];\n let inUl = false;\n let inOl = false;\n let hasMermaid = false;\n\n const borderColor = theme === 'dark' ? '#374151' : '#D1D5DB';\n const bgColor = theme === 'dark' ? '#1F2937' : '#F9FAFB';\n const codeBlockBg = theme === 'dark' ? '#111827' : '#F3F4F6';\n const codeTextColor = theme === 'dark' ? '#E5E7EB' : '#374151';\n\n const closeLists = () => {\n if (inUl) { html += '</ul>'; inUl = false; }\n if (inOl) { html += '</ol>'; inOl = false; }\n };\n\n for (let i = 0; i < lines.length; i++) {\n let raw = lines[i];\n const fenceMatch = raw.match(/^```\\s*(\\w+)?\\s*$/);\n \n if (fenceMatch) {\n if (!inCode) {\n closeLists();\n inCode = true;\n codeLang = fenceMatch[1] ? String(fenceMatch[1]) : '';\n codeBuffer = [];\n } else {\n // Check if this is a mermaid diagram\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n inCode = false;\n codeLang = '';\n codeBuffer = [];\n }\n continue;\n }\n\n if (inCode) {\n codeBuffer.push(raw);\n continue;\n }\n\n // Horizontal rules\n if (/^\\s*(---|\\*\\*\\*|___)\\s*$/.test(raw)) {\n closeLists();\n html += '<hr style=\"margin: 12px 0; opacity: 0.6; border: none; border-top: 1px solid currentColor;\" />';\n continue;\n }\n\n // Headers\n const h = raw.match(/^(#{1,6})\\s+(.+)$/);\n if (h) {\n closeLists();\n const level = h[1].length;\n const content = inlineFormat(escapeHtml(h[2].trim()));\n const size = level <= 2 ? '18px' : level === 3 ? '16px' : '14px';\n html += `<h${level} style=\"font-size: ${size}; font-weight: 600; margin: 8px 0 4px 0;\">${content}</h${level}>`;\n continue;\n }\n\n // Lists\n const ulItem = raw.match(/^\\s*[-*]\\s+(.+)$/);\n const olItem = raw.match(/^\\s*\\d+\\.\\s+(.+)$/);\n if (ulItem) {\n if (!inUl) { closeLists(); html += '<ul style=\"list-style-type: disc; padding-left: 24px; margin: 4px 0;\">'; inUl = true; }\n const content = inlineFormat(escapeHtml(ulItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n if (olItem) {\n if (!inOl) { closeLists(); html += '<ol style=\"list-style-type: decimal; padding-left: 24px; margin: 4px 0;\">'; inOl = true; }\n const content = inlineFormat(escapeHtml(olItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n\n // Empty lines\n if (raw.trim().length === 0) {\n closeLists();\n html += '<div style=\"height: 8px;\"></div>';\n } else {\n closeLists();\n const content = inlineFormat(escapeHtml(raw));\n html += `<p style=\"line-height: 1.6; margin: 4px 0; word-break: break-word;\">${content}</p>`;\n }\n }\n\n // Handle unclosed code blocks\n if (inCode) {\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n }\n if (inUl) html += '</ul>';\n if (inOl) html += '</ol>';\n \n return { html, hasMermaid };\n}\n\n// Markdown component that handles both regular markdown and mermaid diagrams\nexport function MarkdownRendererWithMermaid({ content, theme }: { content: string; theme: 'light' | 'dark' }) {\n const { html, hasMermaid } = useMemo(() => renderMarkdownToHtmlSafe(content, theme), [content, theme]);\n \n if (!hasMermaid) {\n return (\n <div\n style={{\n fontSize: '14px',\n lineHeight: '1.6',\n wordBreak: 'break-word',\n maxWidth: '100%',\n overflow: 'hidden'\n }}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n }\n\n // Parse HTML and replace mermaid placeholders with components\n const parts = html.split(/(<div class=\"mermaid-placeholder\"[^>]*><\\/div>)/g);\n const elements: React.ReactNode[] = [];\n \n parts.forEach((part, index) => {\n if (part.includes('mermaid-placeholder')) {\n // Extract mermaid code from data attribute\n const match = part.match(/data-mermaid=\"([^\"]*)\"/); \n if (match) {\n const mermaidCode = match[1]\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&amp;/g, '&')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\");\n \n elements.push(\n React.createElement(MermaidDiagram, {\n key: `mermaid-${index}`,\n chart: mermaidCode,\n theme: theme\n })\n );\n }\n } else if (part.trim()) {\n // Regular HTML content\n elements.push(\n React.createElement('div', {\n key: `html-${index}`,\n style: {\n fontSize: '14px',\n lineHeight: '1.6',\n wordBreak: 'break-word',\n maxWidth: '100%',\n overflow: 'hidden'\n },\n dangerouslySetInnerHTML: { __html: part }\n })\n );\n }\n });\n\n return React.createElement(React.Fragment, {}, ...elements);\n}\n","import React, { useState } from 'react';\nimport { ThemeColors } from '../utils/chat-theme';\nimport { MainAgentAction } from '../types/chat';\nimport { MarkdownRendererWithMermaid } from './MarkdownRendererWithMermaid';\nimport { CheckCircle } from 'lucide-react';\n\ninterface ReasoningPaneProps {\n mainAgentActions?: MainAgentAction[];\n reasoningOpen?: boolean;\n onToggleReasoning: () => void;\n resolvedColors: ThemeColors;\n streaming?: boolean;\n theme?: 'light' | 'dark';\n hideReasoningContent?: boolean; // If true, only shows that reasoning is happening without the actual content\n}\n\n/**\n * ReasoningPane displays an array of main agent actions including:\n * - Reasoning blocks\n * - Tool calls with input/output\n * - Interspersed in chronological order\n */\nexport function ReasoningPane({\n mainAgentActions,\n reasoningOpen,\n onToggleReasoning,\n resolvedColors,\n streaming = false,\n theme = 'dark',\n hideReasoningContent = false\n}: ReasoningPaneProps) {\n if (!mainAgentActions || mainAgentActions.length === 0) return null;\n\n // Filter out response actions and only show reasoning + tool-call (no text)\n const displayActions = mainAgentActions.filter(\n action => action.type === 'reasoning' || action.type === 'tool-call'\n );\n\n if (displayActions.length === 0) return null;\n\n // Get last reasoning action for preview\n const lastReasoningAction = [...displayActions].reverse().find(a => a.type === 'reasoning');\n \n // Check if final response has started (detect response action)\n const hasFinalResponse = mainAgentActions.some(action => action.type === 'response');\n\n // Calculate total duration\n const totalDuration = calculateTotalDuration(displayActions);\n\n return (\n <div\n style={{\n cursor: 'pointer',\n padding: '0',\n maxWidth: '100%'\n }}\n onClick={onToggleReasoning}\n >\n {reasoningOpen ? (\n // Expanded view - show all actions with timeline\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '0',\n maxWidth: '100%',\n position: 'relative'\n }}>\n {displayActions.map((action, index) => (\n <ExpandedActionItem\n key={index}\n action={action}\n resolvedColors={resolvedColors}\n theme={theme}\n isFirst={index === 0}\n isLast={index === displayActions.length - 1}\n hideReasoningContent={hideReasoningContent}\n />\n ))}\n {/* Final \"Done\" item when reasoning is complete */}\n {\n <div style={{\n display: 'flex',\n gap: '12px',\n paddingBottom: '0',\n position: 'relative',\n marginTop: '16px'\n }}>\n {/* Timeline indicator */}\n <div style={{\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: '24px',\n flexShrink: 0\n }}>\n \n \n {/* Final dot */}\n {hasFinalResponse ? <div style={{\n width: '8px',\n height: '8px',\n \n marginTop: '6px',\n zIndex: 1\n }} >\n <CheckCircle size={10} color={resolvedColors.borderColor} />\n </div>\n : <div style={{\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: resolvedColors.borderColor,\n marginTop: '6px',\n zIndex: 1\n }} />}\n </div>\n \n {/* Content */}\n <div style={{\n flex: 1,\n minWidth: 0\n }}>\n {hasFinalResponse && <div style={{\n fontSize: '11px',\n color: resolvedColors.mutedTextColor,\n fontWeight: 500,\n display: 'flex',\n alignItems: 'center',\n gap: '6px'\n }}>\n <span>Done</span>\n </div>}\n </div>\n </div>\n }\n </div>\n ) : (\n // Collapsed view - GPT style\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n maxWidth: '100%',\n minWidth: 0,\n overflow: 'hidden'\n }}>\n {/* Animated \"Thinking...\" - show while streaming until final response is detected */}\n {(streaming && !hasFinalResponse) ? (\n <div style={{\n fontSize: '13px',\n color: resolvedColors.mutedTextColor,\n fontStyle: 'italic',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n minWidth: 0\n }}>\n <span>Thinking</span>\n <span className=\"thinking-dots\" style={{\n display: 'inline-flex',\n gap: '2px'\n }}>\n <span style={{ animation: 'thinking-pulse 1.4s ease-in-out 0s infinite' }}>.</span>\n <span style={{ animation: 'thinking-pulse 1.4s ease-in-out 0.2s infinite' }}>.</span>\n <span style={{ animation: 'thinking-pulse 1.4s ease-in-out 0.4s infinite' }}>.</span>\n </span>\n </div>\n ):\n (\n <div style={{\n fontSize: '13px',\n color: resolvedColors.mutedTextColor,\n fontWeight: 500,\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n overflow: 'hidden',\n maxWidth: '100%',\n minWidth: 0,\n width: '100%'\n }}>\n <span style={{ \n opacity: 0.9,\n fontSize: '12px'\n }}>Thought</span>\n <span style={{ \n color: resolvedColors.mutedTextColor,\n fontFamily: 'monospace',\n fontSize: '12px',\n opacity: 0.5,\n letterSpacing: '0.1px'\n }}>\n for {formatDuration(totalDuration)}\n </span>\n </div>\n )}\n \n {/* First line of last reasoning - show when not streaming or when response has started */}\n {!hideReasoningContent && lastReasoningAction?.type === 'reasoning' && ( !hasFinalResponse) && (\n <div style={{\n fontSize: '12px',\n color: resolvedColors.mutedTextColor,\n opacity: 0.7,\n overflow: 'hidden',\n maxWidth: '100%',\n minWidth: 0,\n width: '100%'\n }}>\n <MarkdownRendererWithMermaid content={lastReasoningAction.reasoning} theme={theme} />\n </div>\n )}\n </div>\n )}\n\n {/* CSS for thinking animation */}\n <style>{`\n @keyframes thinking-pulse {\n 0%, 60%, 100% { opacity: 0.3; }\n 30% { opacity: 1; }\n }\n `}</style>\n </div>\n );\n}\n\nfunction calculateTotalDuration(actions: MainAgentAction[]): number {\n return actions.reduce((total, action) => {\n if ('startDate' in action && 'endDate' in action && action.startDate && action.endDate) {\n return total + (action.endDate - action.startDate);\n }\n return total;\n }, 0);\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n \n const minutes = Math.floor(ms / 60000);\n const seconds = Math.round((ms % 60000) / 1000);\n return `${minutes}m ${seconds}s`;\n}\n\n/**\n * Expanded view - shows individual action items with timeline\n */\nfunction ExpandedActionItem({\n action,\n resolvedColors,\n theme,\n isFirst,\n isLast,\n hideReasoningContent = false\n}: {\n action: MainAgentAction;\n resolvedColors: ThemeColors;\n theme: 'light' | 'dark';\n isFirst: boolean;\n isLast: boolean;\n hideReasoningContent?: boolean;\n}) {\n const duration = ('startDate' in action && 'endDate' in action && action.startDate && action.endDate)\n ? formatDuration(action.endDate - action.startDate)\n : null;\n\n const getToolStatus = (action: Extract<MainAgentAction, { type: 'tool-call' }>) => {\n const statusMap = {\n input_streaming: { color: theme === 'dark' ? '#eab308' : '#d97706', text: 'Inputting' },\n running: { color: theme === 'dark' ? '#3b82f6' : '#2563eb', text: 'Running' },\n error: { color: theme === 'dark' ? '#ef4444' : '#dc2626', text: 'Error' },\n finished: { color: theme === 'dark' ? '#10b981' : '#059669', text: 'Called' }\n };\n return statusMap[action.status] || statusMap.finished;\n };\n\n const renderTimeline = (dotColor: string) => (\n <div style={{\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: '24px',\n flexShrink: 0\n }}>\n <div style={{\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: dotColor,\n marginTop: '6px',\n zIndex: 1\n }} />\n <div style={{\n position: 'absolute',\n top: '20px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '2px',\n height: 'calc(100% + 4px)',\n backgroundColor: theme === 'dark' ? resolvedColors.borderColor : resolvedColors.mutedTextColor,\n }} />\n </div>\n );\n\n if (action.type === 'reasoning') {\n return (\n <div style={{ display: 'flex', gap: '12px', paddingBottom: isLast ? '0' : '16px', position: 'relative', marginBottom: '6px' }}>\n {renderTimeline(resolvedColors.borderColor)}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: '11px', color: resolvedColors.mutedTextColor, marginBottom: '4px', fontWeight: 500, display: 'flex', alignItems: 'center', gap: '6px' }}>\n <span>Reasoning</span>\n {duration && <span style={{ fontFamily: 'monospace', fontSize: '10px' }}>{duration}</span>}\n </div>\n {!hideReasoningContent && (\n <div style={{ fontSize: '13px', color: resolvedColors.mutedTextColor, lineHeight: '1.6', maxWidth: '100%', opacity: action.status === 'streaming' ? 0.8 : 1 }}>\n <MarkdownRendererWithMermaid content={action.reasoning} theme={theme} />\n </div>\n )}\n </div>\n </div>\n );\n }\n\n if (action.type === 'tool-call') {\n const { color, text } = getToolStatus(action);\n return (\n <div style={{ display: 'flex', gap: '12px', paddingBottom: isLast ? '0' : '16px', position: 'relative', marginBottom: '6px' }}>\n {renderTimeline(color)}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: '12px', color: resolvedColors.mutedTextColor, display: 'flex', alignItems: 'center', gap: '8px', flexWrap: 'wrap' }}>\n <span style={{ fontWeight: 500, opacity: theme === 'dark' ? 0.7 : 0.6 }}>{text}</span>\n <span style={{ fontWeight: 500 }}>{action.toolName || 'tool'}</span>\n {duration && <span style={{ fontFamily: 'monospace', fontSize: '10px', opacity: theme === 'dark' ? 0.5 : 0.6 }}>{duration}</span>}\n </div>\n </div>\n </div>\n );\n }\n\n return null;\n}\n\n\n","import React from 'react';\nimport { ThemeColors } from '../utils/chat-theme';\n\ninterface MCPToolCall {\n toolName: string;\n args: any;\n timestamp: number;\n status?: 'pending' | 'running' | 'completed' | 'failed';\n}\n\ninterface MCPToolDisplayProps {\n mcpToolCalls?: MCPToolCall[];\n resolvedColors: ThemeColors;\n}\n\nexport function MCPToolDisplay({ mcpToolCalls, resolvedColors }: MCPToolDisplayProps) {\n if (!mcpToolCalls || mcpToolCalls.length === 0) {\n return null;\n }\n\n // Get unique tool names and their latest status\n const uniqueTools = new Map<string, { status: string; count: number }>();\n\n mcpToolCalls.forEach((toolCall) => {\n const existing = uniqueTools.get(toolCall.toolName);\n if (!existing || (existing.status === 'running' && toolCall.status === 'completed')) {\n uniqueTools.set(toolCall.toolName, {\n status: toolCall.status || 'pending',\n count: (existing?.count || 0) + 1\n });\n } else if (existing) {\n existing.count++;\n }\n });\n\n const hasRunningTools = Array.from(uniqueTools.values()).some(tool => tool.status === 'running');\n const completedToolsCount = Array.from(uniqueTools.values()).filter(tool => tool.status === 'completed').length;\n\n return (\n <div style={{\n borderRadius: '12px',\n padding: '12px',\n backgroundColor: resolvedColors.cardBackground,\n border: `1px solid ${resolvedColors.borderColor}`,\n fontSize: '12px',\n color: resolvedColors.mutedTextColor\n }}>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginBottom: '8px'\n }}>\n <span style={{\n display: 'inline-block',\n height: '8px',\n width: '8px',\n borderRadius: '50%',\n backgroundColor: hasRunningTools ? '#3b82f6' : '#10b981'\n }} />\n <span>\n {hasRunningTools\n ? 'Agent is using tools'\n : completedToolsCount > 0\n ? `Agent used ${completedToolsCount} tool${completedToolsCount > 1 ? 's' : ''}`\n : 'Agent used tools'\n }\n </span>\n </div>\n <div style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: '6px'\n }}>\n {Array.from(uniqueTools.entries()).map(([toolName, toolInfo]) => (\n <div key={toolName} style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '11px',\n padding: '4px 8px',\n borderRadius: '6px',\n backgroundColor: resolvedColors.inputBackground,\n border: `1px solid ${resolvedColors.borderColor}`\n }}>\n {toolInfo.status === 'running' ? (\n <svg\n style={{\n animation: 'spin 1s linear infinite',\n height: '8px',\n width: '8px',\n flexShrink: 0\n }}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n style={{ opacity: 0.25 }}\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n style={{ opacity: 0.75 }}\n fill=\"currentColor\"\n d=\"m4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n ) : (\n <span style={{\n display: 'inline-block',\n height: '4px',\n width: '4px',\n borderRadius: '50%',\n backgroundColor: toolInfo.status === 'completed' ? '#10b981' : '#ef4444',\n flexShrink: 0\n }} />\n )}\n <span style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: '120px'\n }}>\n {toolName}\n </span>\n {toolInfo.count > 1 && (\n <span style={{\n opacity: 0.6,\n flexShrink: 0,\n fontSize: '10px'\n }}>\n ×{toolInfo.count}\n </span>\n )}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { resolveColors } from '../utils/theme';\nimport { MarkdownRendererWithMermaid } from './MarkdownRendererWithMermaid';\nimport { MCPToolDisplay } from './MCPToolDisplay';\nimport { ThemeColors } from '../utils/chat-theme';\n\ninterface MCPToolCall {\n toolName: string;\n args: any;\n timestamp: number;\n status?: 'pending' | 'running' | 'completed' | 'failed';\n}\n\ninterface AssistantMessageItemsProps {\n items: any[];\n mcpToolCalls?: MCPToolCall[];\n mcpToolResults?: Record<string, any>;\n actionStatuses: Map<string, 'executing' | 'executed'>;\n components: Map<string, React.ComponentType<any>>;\n theme: 'light' | 'dark';\n resolvedColors: ThemeColors;\n}\n\nexport function AssistantMessageItems({\n items,\n mcpToolCalls,\n mcpToolResults,\n actionStatuses,\n components,\n theme,\n resolvedColors\n}: AssistantMessageItemsProps) {\n if (!Array.isArray(items) || items.length === 0) return null;\n\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '12px'\n }}>\n {items.map((it, idx) => {\n const key = `it-${idx}`;\n if (typeof it === 'string') {\n return (\n <div key={key} style={{\n padding: '0',\n color: resolvedColors.textColor\n }}>\n <MarkdownRendererWithMermaid content={it} theme={theme} />\n </div>\n );\n }\n if (it && typeof it === 'object') {\n if (it.type === 'action') {\n const actionKey = `${String(it.name ?? 'action')}:${idx}`;\n const status = actionStatuses.get(actionKey);\n \n return (\n <div key={key} style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '8px'\n }}>\n {/* Action execution status */}\n <div style={{\n padding: '8px',\n fontSize: '12px',\n color: resolvedColors.mutedTextColor\n }}>\n {status === 'executing' ? (\n <span style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px'\n }}>\n <svg \n style={{\n animation: 'spin 1s linear infinite',\n height: '12px',\n width: '12px'\n }}\n xmlns=\"http://www.w3.org/2000/svg\" \n fill=\"none\" \n viewBox=\"0 0 24 24\"\n >\n <circle \n style={{ opacity: 0.25 }}\n cx=\"12\" \n cy=\"12\" \n r=\"10\" \n stroke=\"currentColor\" \n strokeWidth=\"4\"\n />\n <path \n style={{ opacity: 0.75 }}\n fill=\"currentColor\" \n d=\"m4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n {String(it.name ?? 'action')} is executing\n </span>\n ) : (\n <span style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px'\n }}>\n <span style={{\n display: 'inline-block',\n height: '6px',\n width: '6px',\n borderRadius: '50%',\n backgroundColor: '#10b981'\n }} />\n {String(it.name ?? 'action')} has executed\n </span>\n )}\n </div>\n </div>\n );\n }\n if (it.type === 'ui') {\n const compName = String(it.component ?? '').trim();\n const Comp = compName ? components.get(compName) : undefined;\n if (Comp) {\n return (\n <div key={key} style={{\n padding: '0'\n }}>\n <Comp {...(it.props || {})} />\n </div>\n );\n }\n return (\n <div key={key} style={{\n padding: '0'\n }}>\n <div style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '12px',\n marginBottom: '8px',\n color: resolvedColors.mutedTextColor\n }}>\n <span style={{\n padding: '2px 8px',\n borderRadius: '4px',\n backgroundColor: resolvedColors.accentColor,\n border: `1px solid ${resolvedColors.borderColor}`\n }}>UI</span>\n <span>{compName || 'component'}</span>\n <span style={{\n marginLeft: '8px',\n opacity: 0.7\n }}>(unregistered)</span>\n </div>\n <pre style={{\n fontSize: '12px',\n overflow: 'auto',\n color: resolvedColors.mutedTextColor,\n margin: '0',\n fontFamily: 'ui-monospace, SFMono-Regular, \"SF Mono\", Consolas, \"Liberation Mono\", Menlo, monospace'\n }}>{JSON.stringify(it.props ?? {}, null, 2)}</pre>\n </div>\n );\n }\n // Check if object has text/content field to render as markdown\n const textContent = it.text || it.content || it.message;\n if (typeof textContent === 'string') {\n return (\n <div key={key} style={{\n padding: '0',\n color: resolvedColors.textColor\n }}>\n <MarkdownRendererWithMermaid content={textContent} theme={theme} />\n </div>\n );\n }\n \n return (\n <div key={key} style={{\n padding: '0',\n fontSize: '14px'\n }}>\n <pre style={{\n fontSize: '12px',\n overflow: 'auto',\n color: resolvedColors.mutedTextColor,\n margin: '0',\n fontFamily: 'ui-monospace, SFMono-Regular, \"SF Mono\", Consolas, \"Liberation Mono\", Menlo, monospace'\n }}>{JSON.stringify(it, null, 2)}</pre>\n </div>\n );\n }\n return null;\n })}\n\n {/* MCP Tool Calls - Display unique tool names only */}\n <MCPToolDisplay\n mcpToolCalls={mcpToolCalls}\n resolvedColors={resolvedColors}\n />\n </div>\n );\n}\n","import React, { useRef } from 'react';\nimport { ChatMessage } from '../types/chat';\nimport { ThemeColors } from '../utils/chat-theme';\nimport { ReasoningDisplay } from './ReasoningDisplay';\nimport { ReasoningPane } from './ReasoningPane';\nimport { AssistantMessageItems } from './AssistantMessageItems';\n\ninterface AssistantMessageProps {\n message: ChatMessage & { role: 'assistant' };\n streaming: boolean;\n isLastMessage: boolean;\n actionStatuses: Map<string, 'executing' | 'executed'>;\n components: Map<string, React.ComponentType<any>>;\n theme: 'light' | 'dark';\n resolvedColors: ThemeColors;\n onToggleReasoning: (messageId: string) => void;\n hideReasoningContent?: boolean;\n}\n\nexport function AssistantMessage({\n message,\n streaming,\n isLastMessage,\n actionStatuses,\n components,\n theme,\n resolvedColors,\n onToggleReasoning,\n hideReasoningContent = false\n}: AssistantMessageProps) {\n // Check if we have new structured main agent actions\n const hasMainAgentActions = (message as any).mainAgentActions && \n (message as any).mainAgentActions.length > 0;\n\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '12px'\n }}>\n {/* First Agent Response - shown above reasoning */}\n {(message as any).firstAgentMessage && (\n <div style={{\n padding: '12px 0',\n }}>\n \n <div style={{\n fontSize: '13px',\n color: resolvedColors.textColor,\n lineHeight: '1.5'\n }}>\n {(message as any).firstAgentMessage}\n </div>\n </div>\n )}\n\n {/* Use new ReasoningPane if mainAgentActions exist, otherwise fallback to old ReasoningDisplay */}\n {hasMainAgentActions ? (\n <ReasoningPane\n mainAgentActions={(message as any).mainAgentActions}\n reasoningOpen={message.reasoningOpen}\n onToggleReasoning={() => onToggleReasoning(message.id)}\n resolvedColors={resolvedColors}\n streaming={streaming && isLastMessage}\n theme={theme}\n hideReasoningContent={hideReasoningContent}\n />\n ) : (\n <ReasoningDisplay\n reasoning={message.reasoning}\n reasoningOpen={message.reasoningOpen}\n onToggleReasoning={() => onToggleReasoning(message.id)}\n resolvedColors={resolvedColors}\n />\n )}\n \n <AssistantMessageItems\n items={message.items}\n mcpToolCalls={(message as any).mcpToolCalls}\n mcpToolResults={(message as any).mcpToolResults}\n actionStatuses={actionStatuses}\n components={components}\n theme={theme}\n resolvedColors={resolvedColors}\n />\n \n {streaming && isLastMessage && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '12px',\n color: resolvedColors.mutedTextColor\n }}>\n <span style={{\n display: 'inline-block',\n height: '8px',\n width: '8px',\n borderRadius: '50%',\n backgroundColor: resolvedColors.mutedTextColor,\n animation: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite'\n }} />\n <span>Working…</span>\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { ChatMessage, Attachment } from '../types/chat';\nimport { ThemeColors } from '../utils/chat-theme';\nimport { UserMessage } from './UserMessage';\nimport { AssistantMessage } from './AssistantMessage';\nimport type { TranslationKeys } from '../i18n/translations';\n\ninterface MessageListProps {\n messages: ChatMessage[];\n streaming: boolean;\n editingMessageId: string | null;\n editingMessageText: string;\n editingAttachments?: Attachment[];\n error: string | null;\n actionStatuses: Map<string, 'executing' | 'executed'>;\n components: Map<string, React.ComponentType<any>>;\n theme: 'light' | 'dark';\n resolvedColors: ThemeColors;\n onEditingTextChange: (text: string) => void;\n onRemoveAttachment?: (id: string) => void;\n onAddAttachments?: (files: FileList) => void;\n uploading?: boolean;\n onStartEdit: (messageId: string, text: string) => void;\n onCancelEdit: () => void;\n onSaveEdit: (messageId: string, text: string) => void;\n onToggleReasoning: (messageId: string) => void;\n scrollAnchorRef: React.RefObject<HTMLDivElement>;\n hideReasoningContent?: boolean;\n t: (key: keyof TranslationKeys) => string;\n}\n\nexport function MessageList({\n messages,\n streaming,\n editingMessageId,\n editingMessageText,\n editingAttachments,\n error,\n actionStatuses,\n components,\n theme,\n resolvedColors,\n onEditingTextChange,\n onRemoveAttachment,\n onAddAttachments,\n uploading,\n onStartEdit,\n onCancelEdit,\n onSaveEdit,\n onToggleReasoning,\n scrollAnchorRef,\n hideReasoningContent = false,\n t\n}: MessageListProps) {\n return (\n <div\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 }}\n >\n {error && (\n <div style={{\n margin: '0 8px',\n borderRadius: '12px',\n backgroundColor: 'rgba(239, 68, 68, 0.1)',\n color: '#fca5a5',\n border: '1px solid rgba(239, 68, 68, 0.3)',\n padding: '12px',\n fontSize: '14px'\n }}>{error}</div>\n )}\n \n {messages.length === 0 && !streaming && (\n <div style={{\n margin: '0 8px',\n borderRadius: '12px',\n padding: '16px',\n border: `1px solid ${resolvedColors.borderColor}`,\n backgroundColor: resolvedColors.accentColor,\n color: resolvedColors.mutedTextColor\n }}>\n {t('messages.empty')}\n </div>\n )}\n \n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '16px'\n }}>\n {messages.map((m, i) => (\n <div key={m.id} style={{ padding: '0 4px' }}>\n {m.role === 'user' ? (\n <UserMessage\n message={m as ChatMessage & { role: 'user' }}\n isEditing={editingMessageId === m.id}\n editingText={editingMessageText}\n editingAttachments={editingAttachments}\n onEditingTextChange={onEditingTextChange}\n onStartEdit={onStartEdit}\n onCancelEdit={onCancelEdit}\n onSaveEdit={onSaveEdit}\n onRemoveAttachment={onRemoveAttachment}\n onAddAttachments={onAddAttachments}\n uploading={uploading}\n streaming={streaming}\n resolvedColors={resolvedColors}\n t={t}\n />\n ) : (\n <AssistantMessage\n message={m as ChatMessage & { role: 'assistant' }}\n streaming={streaming}\n isLastMessage={i === messages.length - 1}\n actionStatuses={actionStatuses}\n components={components}\n theme={theme}\n resolvedColors={resolvedColors}\n onToggleReasoning={onToggleReasoning}\n hideReasoningContent={hideReasoningContent}\n />\n )}\n </div>\n ))}\n </div>\n \n <div ref={scrollAnchorRef} />\n </div>\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 { useCallback, useState } from \"react\";\n\nexport interface UseToggleReturn {\n /** Current toggle state */\n on: boolean;\n /** Toggle the state */\n toggle: () => void;\n /** Set the state directly */\n setOn: (value: boolean | ((prev: boolean) => boolean)) => void;\n /** Set state to true */\n setTrue: () => void;\n /** Set state to false */\n setFalse: () => void;\n}\n\n/**\n * A hook for managing boolean toggle state\n * @param initial - Initial state value (default: false)\n * @returns Object with toggle state and control functions\n */\nexport function useToggle(initial = false): UseToggleReturn {\n const [on, setOn] = useState(initial);\n \n const toggle = useCallback(() => setOn(prev => !prev), []);\n const setTrue = useCallback(() => setOn(true), []);\n const setFalse = useCallback(() => setOn(false), []);\n\n return { \n on, \n toggle, \n setOn, \n setTrue, \n setFalse \n };\n}\n","import { useEffect, useRef } from \"react\";\n\nexport function useAutoScroll<T extends HTMLElement>() {\n const ref = useRef<T | null>(null);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const observer = new MutationObserver(() => {\n el.scrollTop = el.scrollHeight;\n });\n\n observer.observe(el, { childList: true, subtree: true });\n el.scrollTop = el.scrollHeight;\n\n return () => observer.disconnect();\n }, []);\n\n return ref;\n}\n","import React, { createContext, useCallback, useContext, useMemo, useState } from \"react\";\n\n/**\n * Handler function for custom actions that can be triggered by the AI agent\n */\nexport type HsafaActionHandler = (params: any, meta: {\n /** Name of the action being called */\n name: string;\n /** When the action is being triggered */\n trigger: 'partial' | 'final' | 'params_complete';\n /** Index of the action in the sequence */\n index: number;\n /** ID of the assistant message that triggered this action */\n assistantMessageId?: string;\n /** ID of the current chat session */\n chatId?: string;\n}) => Promise<any> | any;\n\n/**\n * Configuration options for the Hsafa SDK\n */\nexport interface HsafaConfig {\n /** Base URL for agent API calls, e.g. \"\" (same origin) or \"https://example.com\" */\n baseUrl?: string;\n}\n\n/**\n * Context value provided by HsafaProvider\n */\nexport interface HsafaContextValue extends HsafaConfig {\n /** Registered custom actions */\n actions: Map<string, HsafaActionHandler>;\n /** Registered custom components */\n components: Map<string, React.ComponentType<any>>;\n /** Register a custom action handler */\n registerAction: (name: string, handler: HsafaActionHandler) => () => void;\n /** Unregister a custom action handler */\n unregisterAction: (name: string, handler?: HsafaActionHandler) => void;\n /** Register a custom component */\n registerComponent: (name: string, component: React.ComponentType<any>) => () => void;\n /** Unregister a custom component */\n unregisterComponent: (name: string, component?: React.ComponentType<any>) => void;\n /** Global streaming state - true if any chat is streaming */\n isAnyStreaming: boolean;\n /** Set streaming state for a specific chat instance */\n setStreamingState: (chatId: string, isStreaming: boolean) => void;\n /** Global chat open state - true if any chat is open */\n isAnyChatOpen: boolean;\n /** Set chat open state for a specific chat instance */\n setChatOpenState: (chatId: string, isOpen: boolean) => void;\n}\n\nconst HsafaContext = createContext<HsafaContextValue | undefined>(undefined);\n\n/**\n * Props for the HsafaProvider component\n */\nexport interface HsafaProviderProps extends HsafaConfig {\n /** Child components that will have access to the Hsafa context */\n children: React.ReactNode;\n}\n\n/**\n * Provider component that sets up the Hsafa context for the SDK.\n * Wrap your app or chat components with this provider to enable Hsafa functionality.\n * \n * @example\n * ```tsx\n * <HsafaProvider baseUrl=\"https://api.example.com\">\n * <HsafaChat agentId=\"my-agent\" />\n * </HsafaProvider>\n * ```\n */\nexport function HsafaProvider({ baseUrl, children }: HsafaProviderProps) {\n const [actions, setActions] = useState<Map<string, HsafaActionHandler>>(new Map());\n const [components, setComponents] = useState<Map<string, React.ComponentType<any>>>(new Map());\n const [streamingStates, setStreamingStates] = useState<Map<string, boolean>>(new Map());\n const [chatOpenStates, setChatOpenStates] = useState<Map<string, boolean>>(new Map());\n\n const registerAction = useCallback((name: string, handler: HsafaActionHandler) => {\n setActions(prev => {\n const next = new Map(prev);\n next.set(String(name), handler);\n return next;\n });\n return () => {\n setActions(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!handler || existing === handler) next.delete(String(name));\n return next;\n });\n };\n }, []);\n\n const unregisterAction = useCallback((name: string, handler?: HsafaActionHandler) => {\n setActions(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!handler || existing === handler) next.delete(String(name));\n return next;\n });\n }, []);\n\n const registerComponent = useCallback((name: string, component: React.ComponentType<any>) => {\n setComponents(prev => {\n const next = new Map(prev);\n next.set(String(name), component);\n return next;\n });\n return () => {\n setComponents(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!component || existing === component) next.delete(String(name));\n return next;\n });\n };\n }, []);\n\n const unregisterComponent = useCallback((name: string, component?: React.ComponentType<any>) => {\n setComponents(prev => {\n const next = new Map(prev);\n const existing = next.get(String(name));\n if (!component || existing === component) next.delete(String(name));\n return next;\n });\n }, []);\n\n const setStreamingState = useCallback((chatId: string, isStreaming: boolean) => {\n setStreamingStates(prev => {\n const next = new Map(prev);\n if (isStreaming) {\n next.set(chatId, true);\n } else {\n next.delete(chatId);\n }\n return next;\n });\n }, []);\n\n const setChatOpenState = useCallback((chatId: string, isOpen: boolean) => {\n setChatOpenStates(prev => {\n const next = new Map(prev);\n if (isOpen) {\n next.set(chatId, true);\n } else {\n next.delete(chatId);\n }\n return next;\n });\n }, []);\n\n const isAnyStreaming = useMemo(() => {\n return Array.from(streamingStates.values()).some(state => state);\n }, [streamingStates]);\n\n const isAnyChatOpen = useMemo(() => {\n return Array.from(chatOpenStates.values()).some(state => state);\n }, [chatOpenStates]);\n\n const value: HsafaContextValue = useMemo(() => ({\n baseUrl,\n actions,\n components,\n registerAction,\n unregisterAction,\n registerComponent,\n unregisterComponent,\n isAnyStreaming,\n setStreamingState,\n isAnyChatOpen,\n setChatOpenState,\n }), [baseUrl, actions, components, registerAction, unregisterAction, registerComponent, unregisterComponent, isAnyStreaming, setStreamingState, isAnyChatOpen, setChatOpenState]);\n\n return (\n <HsafaContext.Provider value={value}>\n {children}\n </HsafaContext.Provider>\n );\n}\n\n/**\n * Hook to access the Hsafa context.\n * Must be used within a HsafaProvider.\n * \n * @returns The Hsafa context value with actions, components, and configuration\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const { registerAction, baseUrl } = useHsafa();\n * \n * useEffect(() => {\n * const unregister = registerAction('myAction', async (params) => {\n * console.log('Action called with:', params);\n * return { success: true };\n * });\n * \n * return unregister;\n * }, [registerAction]);\n * \n * return <div>My Component</div>;\n * }\n * ```\n */\nexport function useHsafa(): HsafaContextValue {\n const ctx = useContext(HsafaContext);\n if (!ctx) return {\n baseUrl: undefined,\n actions: new Map(),\n components: new Map(),\n registerAction: () => () => undefined,\n unregisterAction: () => undefined,\n registerComponent: () => () => undefined,\n unregisterComponent: () => undefined,\n isAnyStreaming: false,\n setStreamingState: () => undefined,\n isAnyChatOpen: false,\n setChatOpenState: () => undefined,\n };\n return ctx;\n}\n","import { useEffect, useRef, useCallback } from 'react';\nimport { useHsafa } from '../providers/HsafaProvider';\nimport type { HsafaActionHandler } from '../providers/HsafaProvider';\n\n/**\n * Register an action handler by name within the nearest HsafaProvider.\n * The handler will be automatically unregistered on unmount.\n * \n * @param name - Unique name for the action\n * @param handler - Function to execute when action is triggered\n * \n * @example\n * ```tsx\n * useHsafaAction('submitForm', async (params, meta) => {\n * console.log('Form submitted:', params);\n * return { success: true };\n * });\n * ```\n */\nexport function useHsafaAction(name: string, handler: HsafaActionHandler) {\n const { registerAction } = useHsafa();\n const handlerRef = useRef(handler);\n \n // Keep latest handler without re-registering\n // This pattern allows the handler to close over latest state/props\n // without triggering re-registration\n useEffect(() => {\n handlerRef.current = handler;\n });\n\n // Create stable wrapper function that delegates to current handler\n const stableHandler = useCallback<HsafaActionHandler>(\n (params, meta) => handlerRef.current(params, meta),\n [] // Never changes - delegates to ref\n );\n\n // Register/unregister on mount/unmount or name change\n useEffect(() => {\n if (!name || typeof handler !== 'function') {\n console.warn(`[useHsafaAction] Invalid action registration: name=\"${name}\", handler type=\"${typeof handler}\"`);\n return;\n }\n \n const unregister = registerAction(name, stableHandler);\n return unregister;\n }, [name, registerAction, stableHandler]);\n}\n","import React, { useEffect, useRef, useMemo } from 'react';\nimport type { ComponentType } from 'react';\nimport { useHsafa } from '../providers/HsafaProvider';\n\n/**\n * Register a UI component by name within the nearest HsafaProvider.\n * The component will be automatically unregistered on unmount.\n * \n * @param name - Unique name for the component (matches agent's component field)\n * @param component - React component to render when agent requests this component\n * \n * @example\n * ```tsx\n * function ProductCard({ name, price }: { name: string; price: number }) {\n * return <div>{name}: ${price}</div>;\n * }\n * \n * useHsafaComponent('ProductCard', ProductCard);\n * ```\n */\nexport function useHsafaComponent<T = any>(name: string, component: ComponentType<T>) {\n const { registerComponent } = useHsafa();\n const componentRef = useRef(component);\n \n // Keep latest component without re-registering\n // This allows component to update without triggering re-registration\n useEffect(() => {\n componentRef.current = component;\n });\n\n // Create stable wrapper component that delegates to current component\n // Using useMemo instead of useCallback for components\n const StableComponent = useMemo<ComponentType<any>>(\n () => {\n // Forward ref wrapper that always uses latest component\n const Wrapper = (props: any) => {\n const CurrentComponent = componentRef.current;\n return React.createElement(CurrentComponent as any, props);\n };\n Wrapper.displayName = `HsafaStable(${name})`;\n return Wrapper;\n },\n [] // Never changes - delegates to ref\n );\n\n // Register/unregister on mount/unmount or name change\n useEffect(() => {\n if (!name || typeof component !== 'function') {\n console.warn(`[useHsafaComponent] Invalid component registration: name=\"${name}\", component type=\"${typeof component}\"`);\n return;\n }\n \n const unregister = registerComponent(name, StableComponent);\n return unregister;\n }, [name, registerComponent, StableComponent]);\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { ChatMessage } from '../types/chat';\nimport { getMessageDisplayText } from '../utils/message-utils';\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 useChatStorage(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 [currentChatId, setCurrentChatId] = useState<string | null>(null);\n const hasChatRecordRef = useRef<boolean>(false);\n const pendingFirstTitleRef = useRef<string | null>(null);\n\n // Storage operations\n const loadChatsIndex = (): ChatMeta[] => {\n try {\n const raw = localStorage.getItem(chatsIndexKey);\n return raw ? JSON.parse(raw) : [];\n } catch { \n return []; \n }\n };\n\n const saveChatsIndex = (list: ChatMeta[]) => {\n try { \n localStorage.setItem(chatsIndexKey, JSON.stringify(list)); \n } 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 { \n return null; \n }\n };\n\n const saveChat = (data: ChatData) => {\n try { \n localStorage.setItem(chatKey(data.id), JSON.stringify(data)); \n } 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; \n 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 { \n localStorage.removeItem(chatKey(id)); \n } catch {}\n };\n\n const deleteChat = (id: string, onChatDeleted?: (wasCurrentChat: boolean) => void) => {\n deleteChatData(id);\n deleteChatMeta(id);\n const wasCurrentChat = currentChatId === id;\n if (wasCurrentChat) {\n setCurrentChatId(null);\n hasChatRecordRef.current = false;\n pendingFirstTitleRef.current = null;\n try { \n localStorage.removeItem(currentChatKey); \n } catch {}\n }\n onChatDeleted?.(wasCurrentChat);\n };\n\n const loadChatPreferences = () => {\n try {\n const savedCurrent = localStorage.getItem(currentChatKey);\n if (savedCurrent) {\n const cd = loadChat(savedCurrent);\n if (cd) {\n setCurrentChatId(cd.id);\n hasChatRecordRef.current = true;\n return cd.messages || [];\n }\n }\n } catch {}\n return [];\n };\n\n const persistChatData = (messages: ChatMessage[]) => {\n if (!currentChatId || !hasChatRecordRef.current) return;\n \n const data: ChatData = { id: currentChatId, messages, agentId };\n saveChat(data);\n \n const firstUser = messages.find(m => m.role === 'user');\n const displayText = firstUser ? getMessageDisplayText(firstUser) : 'New chat';\n const title = (pendingFirstTitleRef.current || displayText).slice(0, 80);\n const meta: ChatMeta = { \n id: currentChatId, \n title, \n createdAt: Date.now(), \n updatedAt: Date.now() \n };\n \n upsertChatMeta(meta);\n \n try { \n localStorage.setItem(currentChatKey, currentChatId); \n } catch {}\n };\n\n const createNewChat = (firstMessage?: string) => {\n const localId = `local-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n setCurrentChatId(localId);\n hasChatRecordRef.current = true;\n \n const title = (firstMessage || 'New chat').slice(0, 80);\n const now = Date.now();\n \n upsertChatMeta({ id: localId, title, createdAt: now, updatedAt: now });\n \n try { \n localStorage.setItem(currentChatKey, localId); \n } catch {}\n \n return localId;\n };\n\n return {\n // State\n currentChatId,\n setCurrentChatId,\n hasChatRecordRef,\n pendingFirstTitleRef,\n \n // Operations\n loadChatsIndex,\n loadChat,\n saveChat,\n deleteChat,\n loadChatPreferences,\n persistChatData,\n createNewChat,\n upsertChatMeta,\n \n // Keys\n showChatKey\n };\n}\n","import { useState, useRef, useCallback } from 'react';\nimport { ChatMessage } from '../types/chat';\n\nexport function useStreaming() {\n const [streaming, setStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n \n // Streaming meta refs\n const actionExecMapRef = useRef<Record<string, boolean>>({});\n const assistantMsgIdRef = useRef<string | undefined>(undefined);\n const calledFinalActionsRef = useRef<Set<string>>(new Set());\n \n // Action parameter tracking for completion detection\n const actionParamsHistoryRef = useRef<Map<string, any[]>>(new Map());\n const actionExecutionStatusRef = useRef<Map<string, 'executing' | 'executed'>>(new Map());\n const [actionStatuses, setActionStatuses] = useState<Map<string, 'executing' | 'executed'>>(new Map());\n\n const hasActionParamsStabilized = useCallback((actionKey: string, currentParams: any): boolean => {\n const history = actionParamsHistoryRef.current.get(actionKey) || [];\n const stringifiedParams = JSON.stringify(currentParams);\n \n // Add current params to history\n history.push(stringifiedParams);\n \n // Keep only last 5 entries to detect stabilization with better accuracy\n if (history.length > 5) {\n history.shift();\n }\n \n actionParamsHistoryRef.current.set(actionKey, history);\n \n // Consider stabilized if params haven't changed in last 3 updates (more robust)\n if (history.length >= 3) {\n const lastThree = history.slice(-3);\n return lastThree.every(params => params === lastThree[0]);\n }\n \n return false;\n }, []);\n\n const processActions = useCallback((\n items: any[] | undefined, \n trigger: 'partial' | 'final',\n actions: Map<string, any>,\n currentChatId: string | null\n ) => {\n if (!Array.isArray(items) || items.length === 0) return;\n \n items.forEach((it, idx) => {\n if (!it || typeof it !== 'object') return;\n if (it.type === 'action') {\n const name = String(it.name ?? '').trim();\n if (!name) return;\n const handler = actions.get(name);\n if (!handler) {\n console.warn(`Action handler not found for: ${name}`);\n return;\n }\n \n const executeOnStream = !!actionExecMapRef.current[name];\n const key = `${assistantMsgIdRef.current || 'assist'}:${name}:${idx}`;\n const actionKey = `${name}:${idx}`;\n \n try {\n if (trigger === 'partial' && executeOnStream) {\n // Execute on each partial update (streaming mode)\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executing'));\n \n // Add debouncing for rapid fire actions\n const timeoutId = setTimeout(() => {\n Promise.resolve(handler(it.params, { \n name, \n trigger, \n index: idx, \n assistantMessageId: assistantMsgIdRef.current, \n chatId: currentChatId || undefined \n })).catch(error => {\n console.error(`Error executing streaming action ${name}:`, error);\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executed'));\n });\n }, 50); // 50ms debounce\n \n // Store timeout for cleanup if needed\n actionExecutionStatusRef.current.set(`${actionKey}_timeout`, timeoutId as any);\n \n } else if (trigger === 'partial' && !executeOnStream) {\n // Check if action parameters have stabilized (finished streaming)\n const isStabilized = hasActionParamsStabilized(actionKey, it.params);\n const currentStatus = actionExecutionStatusRef.current.get(actionKey);\n \n if (isStabilized && currentStatus !== 'executed') {\n // Parameters have stabilized, execute the action\n actionExecutionStatusRef.current.set(actionKey, 'executed');\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executed'));\n \n Promise.resolve(handler(it.params, { \n name, \n trigger: 'params_complete', \n index: idx, \n assistantMessageId: assistantMsgIdRef.current, \n chatId: currentChatId || undefined \n })).catch(error => {\n console.error(`Error executing stabilized action ${name}:`, error);\n });\n } else if (!currentStatus) {\n // First time seeing this action, mark as executing\n actionExecutionStatusRef.current.set(actionKey, 'executing');\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executing'));\n }\n } else if (trigger === 'final') {\n // Final trigger - ensure action is executed if not already\n const currentStatus = actionExecutionStatusRef.current.get(actionKey);\n if (currentStatus !== 'executed' && !calledFinalActionsRef.current.has(key)) {\n calledFinalActionsRef.current.add(key);\n \n // Clear any pending timeouts\n const timeoutId = actionExecutionStatusRef.current.get(`${actionKey}_timeout`);\n if (timeoutId) {\n clearTimeout(timeoutId as any);\n actionExecutionStatusRef.current.delete(`${actionKey}_timeout`);\n }\n \n actionExecutionStatusRef.current.set(actionKey, 'executed');\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executed'));\n \n Promise.resolve(handler(it.params, { \n name, \n trigger: executeOnStream ? 'final' : 'params_complete', \n index: idx, \n assistantMessageId: assistantMsgIdRef.current, \n chatId: currentChatId || undefined \n })).catch(error => {\n console.error(`Error executing final action ${name}:`, error);\n });\n }\n }\n } catch (error) {\n console.error(`Error processing action ${name}:`, error);\n }\n }\n });\n }, [hasActionParamsStabilized]);\n\n const handleStop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setStreaming(false);\n setError(\"Request stopped by user\");\n }, []);\n\n const resetActionTracking = useCallback(() => {\n calledFinalActionsRef.current.clear();\n actionParamsHistoryRef.current.clear();\n actionExecutionStatusRef.current.clear();\n setActionStatuses(new Map());\n }, []);\n\n // Cleanup function for action timeouts\n const cleanupTimeouts = useCallback(() => {\n actionExecutionStatusRef.current.forEach((value, key) => {\n if (key.endsWith('_timeout')) {\n clearTimeout(value as any);\n }\n });\n }, []);\n\n return {\n // State\n streaming,\n setStreaming,\n error,\n setError,\n actionStatuses,\n setActionStatuses,\n \n // Refs\n abortControllerRef,\n actionExecMapRef,\n assistantMsgIdRef,\n calledFinalActionsRef,\n actionParamsHistoryRef,\n actionExecutionStatusRef,\n \n // Functions\n processActions,\n handleStop,\n resetActionTracking,\n cleanupTimeouts,\n hasActionParamsStabilized\n };\n}\n","import { Attachment } from '../types/chat';\n\n// File upload constants\nexport const MAX_UPLOAD_SIZE = 25 * 1024 * 1024; // 25MB\n\nexport function joinUrl(baseUrl: string | undefined, path: string): string {\n if (!baseUrl) return path;\n const a = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const b = path.startsWith('/') ? path : `/${path}`;\n return `${a}${b}`;\n}\n\nexport function buildUserContent(text: string, attachments: Attachment[]) {\n const parts: any[] = [];\n const t = (text || '').trim();\n if (t) parts.push({ type: 'text', text: t });\n for (const a of (attachments || [])) {\n const mt = a.mimeType || 'application/octet-stream';\n if (mt.startsWith('image/')) {\n parts.push({ type: 'image', image: new URL(a.url), mediaType: mt });\n } else {\n parts.push({ type: 'file', data: a.url, mediaType: mt, name: a.name });\n }\n }\n return parts;\n}\n\nexport async function uploadAttachment(file: File, baseUrl: string | undefined): Promise<Attachment> {\n const formData = new FormData();\n formData.append('file', file);\n\n const response = await fetch(joinUrl(baseUrl, '/api/uploads'), {\n method: 'POST',\n body: formData,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(text || `Failed to upload ${file.name}`);\n }\n\n const data = await response.json();\n return {\n id: data.id,\n name: data.name || file.name,\n url: data.url,\n mimeType: data.mimeType || file.type || 'application/octet-stream',\n size: typeof data.size === 'number' ? data.size : file.size,\n };\n}\n\nexport async function handleFileSelection(\n fileList: FileList | File[] | null,\n baseUrl: string | undefined,\n onError: (error: string) => void,\n onUploading: (uploading: boolean) => void\n): Promise<Attachment[]> {\n if (!fileList) return [];\n \n const files = Array.isArray(fileList) ? fileList : Array.from(fileList);\n onUploading(true);\n\n const uploaded: Attachment[] = [];\n try {\n for (const file of files) {\n if (file.size > MAX_UPLOAD_SIZE) {\n onError(`\"${file.name}\" exceeds the ${(MAX_UPLOAD_SIZE / (1024 * 1024)).toFixed(0)}MB limit.`);\n continue;\n }\n\n try {\n const attachment = await uploadAttachment(file, baseUrl);\n uploaded.push(attachment);\n } catch (err: any) {\n console.error('Failed to upload attachment:', err);\n onError(String(err?.message ?? `Failed to upload ${file.name}`));\n }\n }\n\n return uploaded;\n } finally {\n onUploading(false);\n }\n}\n","import { useState, useRef, useCallback } from 'react';\nimport { Attachment } from '../types/chat';\nimport { joinUrl } from '../utils/file-upload';\n\nconst MAX_UPLOAD_SIZE = 25 * 1024 * 1024; // 25MB\n\nexport function useFileUpload(baseUrl: string) {\n const [attachments, setAttachments] = useState<Attachment[]>([]);\n const [uploading, setUploading] = useState(false);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n\n const formatBytes = useCallback((bytes: number) => {\n if (!bytes || Number.isNaN(bytes)) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const exponent = Math.min(units.length - 1, Math.floor(Math.log(bytes) / Math.log(1024)));\n const value = bytes / Math.pow(1024, exponent);\n return `${value.toFixed(exponent === 0 ? 0 : 1)} ${units[exponent]}`;\n }, []);\n\n const uploadAttachment = useCallback(async (file: File): Promise<Attachment> => {\n const formData = new FormData();\n formData.append('file', file);\n\n const response = await fetch(joinUrl(baseUrl, '/api/uploads'), {\n method: 'POST',\n body: formData,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(text || `Failed to upload ${file.name}`);\n }\n\n const data = await response.json();\n return {\n id: data.id,\n name: data.name || file.name,\n url: data.url,\n mimeType: data.mimeType || file.type || 'application/octet-stream',\n size: typeof data.size === 'number' ? data.size : file.size,\n };\n }, [baseUrl]);\n\n const handleRemoveAttachment = useCallback((id: string) => {\n setAttachments(prev => prev.filter(att => att.id !== id));\n }, []);\n\n const handleFileSelection = useCallback(async (fileList: FileList | File[] | null, setError: (error: string | null) => void) => {\n if (!fileList) return;\n const files = Array.isArray(fileList) ? fileList : Array.from(fileList);\n setError(null);\n setUploading(true);\n\n const uploaded: Attachment[] = [];\n try {\n for (const file of files) {\n if (file.size > MAX_UPLOAD_SIZE) {\n setError(`\"${file.name}\" exceeds the ${formatBytes(MAX_UPLOAD_SIZE)} limit.`);\n continue;\n }\n\n try {\n const attachment = await uploadAttachment(file);\n uploaded.push(attachment);\n } catch (err: any) {\n console.error('Failed to upload attachment:', err);\n setError(String(err?.message ?? `Failed to upload ${file.name}`));\n }\n }\n\n if (uploaded.length) {\n setAttachments(prev => [...prev, ...uploaded]);\n }\n } finally {\n setUploading(false);\n }\n }, [uploadAttachment, formatBytes]);\n\n const buildUserContent = useCallback((text: string, attachments: Attachment[]) => {\n const parts: any[] = [];\n const t = (text || '').trim();\n if (t) parts.push({ type: 'text', text: t });\n for (const a of (attachments || [])) {\n const mt = a.mimeType || 'application/octet-stream';\n if (mt.startsWith('image/')) {\n parts.push({ type: 'image', image: new URL(a.url), mediaType: mt });\n } else {\n parts.push({ type: 'file', data: a.url, mediaType: mt, name: a.name });\n }\n }\n return parts;\n }, []);\n\n const clearAttachments = useCallback(() => {\n setAttachments([]);\n }, []);\n\n return {\n attachments,\n uploading,\n fileInputRef,\n formatBytes,\n handleRemoveAttachment,\n handleFileSelection,\n buildUserContent,\n clearAttachments,\n MAX_UPLOAD_SIZE\n };\n}\n","import { useState, useRef, useCallback } from 'react';\n\n/**\n * Types matching the structure from getAgentStreamingResponse\n */\nexport type FirstAgentData = {\n message: string;\n continue: boolean;\n startDate?: number;\n endDate?: number;\n durationMs?: number;\n};\n\nexport type MainAgentAction = \n | {\n type: 'reasoning';\n reasoning: string;\n status: 'streaming' | 'finished';\n startDate?: number;\n endDate?: number;\n durationMs?: number;\n }\n | {\n type: 'tool-call';\n toolCallId?: string;\n toolName?: string;\n input?: any;\n inputText?: string;\n output?: any;\n status: 'input_streaming' | 'running' | 'finished' | 'error';\n error?: string;\n startDate?: number;\n endDate?: number;\n durationMs?: number;\n }\n | {\n type: 'step';\n stepNumber?: number;\n finishReason?: string;\n usage?: any;\n startDate?: number;\n endDate?: number;\n durationMs?: number;\n }\n | {\n type: 'text';\n text: string;\n status: 'streaming' | 'finished';\n startDate?: number;\n endDate?: number;\n durationMs?: number;\n }\n | {\n type: 'source';\n source: any;\n durationMs?: number;\n }\n | {\n type: 'file';\n file: any;\n durationMs?: number;\n }\n | {\n type: 'response';\n items: any[];\n [key: string]: any;\n startDate?: number;\n endDate?: number;\n durationMs?: number;\n };\n\nexport type AgentStreamData = {\n first_agent: FirstAgentData;\n main_agent: MainAgentAction[];\n};\n\nfunction deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Hook to handle agent streaming responses\n * Returns streaming state and a function to start streaming\n */\nexport function useAgentStreaming() {\n const [streaming, setStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [streamData, setStreamData] = useState<AgentStreamData | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const startStreaming = useCallback(async ({\n agentId,\n body,\n baseUrl,\n onUpdate,\n signal,\n }: {\n agentId: string;\n body: any;\n baseUrl?: string;\n onUpdate?: (data: AgentStreamData) => void;\n signal?: AbortSignal;\n }): Promise<AgentStreamData | null> => {\n try {\n setStreaming(true);\n setError(null);\n\n // Use external signal if provided; otherwise create our own controller\n let finalSignal: AbortSignal;\n if (signal) {\n abortControllerRef.current = null;\n finalSignal = signal;\n } else {\n const controller = new AbortController();\n abortControllerRef.current = controller;\n finalSignal = controller.signal;\n }\n\n const base = baseUrl ? baseUrl.replace(/\\/$/, '') : '';\n const url = `${base}/api/run/${encodeURIComponent(agentId)}`;\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/x-ndjson',\n },\n body: JSON.stringify(body ?? {}),\n signal: finalSignal,\n });\n\n if (!res.ok || !res.body) {\n const txt = await res.text().catch(() => '');\n throw new Error(`Request failed: ${res.status} ${res.statusText} - ${txt}`);\n }\n\n // Initialize structured data\n const data: AgentStreamData = {\n first_agent: {\n message: '',\n continue: false,\n },\n main_agent: [],\n };\n\n // Track current state\n let currentReasoning: MainAgentAction & { type: 'reasoning' } | null = null;\n let currentToolCall: MainAgentAction & { type: 'tool-call' } | null = null;\n let currentResponse: MainAgentAction & { type: 'response' } | null = null;\n let currentText: MainAgentAction & { type: 'text' } | null = null;\n let mainAgentSkipped = false;\n\n function pushUpdate() {\n const clonedData = deepClone(data);\n setStreamData(clonedData);\n onUpdate?.(clonedData);\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n\n // Push initial update\n pushUpdate();\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n let idx = buffer.indexOf('\\n');\n \n while (idx !== -1) {\n const line = buffer.slice(0, idx).trim();\n buffer = buffer.slice(idx + 1);\n \n if (line.length > 0) {\n try {\n const evt = JSON.parse(line);\n const type: string = evt?.type;\n\n switch (type) {\n case 'start':\n break;\n\n // First Agent Events\n case 'first-agent-start':\n data.first_agent.startDate = evt?.startDate;\n data.first_agent.durationMs = evt?.durationMs;\n pushUpdate();\n break;\n\n case 'first-agent-partial':\n if (typeof evt?.message === 'string') {\n data.first_agent.message = evt.message;\n }\n if (typeof evt?.continue === 'boolean') {\n data.first_agent.continue = evt.continue;\n }\n if (typeof evt?.durationMs === 'number') {\n data.first_agent.durationMs = evt.durationMs;\n }\n pushUpdate();\n break;\n\n case 'first-agent-end':\n if (typeof evt?.message === 'string') {\n data.first_agent.message = evt.message;\n }\n if (typeof evt?.continue === 'boolean') {\n data.first_agent.continue = evt.continue;\n }\n data.first_agent.endDate = evt?.endDate;\n data.first_agent.durationMs = evt?.durationMs;\n pushUpdate();\n break;\n\n // Main Agent Events\n case 'main-agent-start':\n mainAgentSkipped = false;\n break;\n\n case 'main-agent-step-finish': {\n const finishedStep: MainAgentAction = {\n type: 'step',\n stepNumber: undefined,\n finishReason: evt?.finishReason,\n usage: evt?.usage,\n endDate: evt?.endDate,\n durationMs: evt?.durationMs,\n } as any;\n data.main_agent.push(finishedStep);\n pushUpdate();\n break;\n }\n\n case 'main-agent-skipped':\n mainAgentSkipped = true;\n break;\n\n case 'main-agent-reasoning-start':\n currentReasoning = {\n type: 'reasoning',\n reasoning: '',\n status: 'streaming',\n startDate: evt?.startDate,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(currentReasoning);\n pushUpdate();\n break;\n\n case 'main-agent-reasoning-delta':\n if (currentReasoning && typeof evt?.text === 'string') {\n currentReasoning.reasoning += evt.text;\n currentReasoning.durationMs = evt?.durationMs;\n pushUpdate();\n }\n break;\n\n case 'main-agent-reasoning-end':\n if (currentReasoning) {\n if (typeof evt?.text === 'string' && evt.text.length > 0) {\n currentReasoning.reasoning += evt.text;\n }\n currentReasoning.status = 'finished';\n currentReasoning.endDate = evt?.endDate;\n currentReasoning.durationMs = evt?.durationMs;\n \n // Remove empty reasoning\n if (!currentReasoning.reasoning || currentReasoning.reasoning.trim().length === 0) {\n const index = data.main_agent.indexOf(currentReasoning);\n if (index > -1) {\n data.main_agent.splice(index, 1);\n }\n }\n \n currentReasoning = null;\n pushUpdate();\n } else {\n // Fallback: reasoning-end without start\n if (typeof evt?.text === 'string' && evt.text.length > 0) {\n const reasoning: MainAgentAction = {\n type: 'reasoning',\n reasoning: evt.text,\n status: 'finished',\n endDate: evt?.endDate,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(reasoning);\n pushUpdate();\n }\n }\n break;\n\n case 'main-agent-tool-call-start':\n currentToolCall = {\n type: 'tool-call',\n toolCallId: evt?.toolCallId,\n toolName: evt?.toolName,\n inputText: '',\n input: undefined,\n output: undefined,\n status: 'input_streaming',\n startDate: evt?.startDate,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(currentToolCall);\n pushUpdate();\n break;\n\n case 'main-agent-tool-input-delta':\n const delta = evt?.delta || evt?.argsTextDelta;\n if (currentToolCall && typeof delta === 'string') {\n currentToolCall.inputText = (currentToolCall.inputText || '') + delta;\n currentToolCall.durationMs = evt?.durationMs;\n pushUpdate();\n }\n break;\n\n case 'tool-call':\n case 'main-agent-tool-call':\n if (currentToolCall) {\n currentToolCall.input = evt?.input;\n currentToolCall.status = 'running';\n currentToolCall.durationMs = evt?.durationMs;\n } else {\n // Tool call without streaming start - try to find existing first\n const existingToolCall = data.main_agent.find(\n (action): action is MainAgentAction & { type: 'tool-call' } =>\n action.type === 'tool-call' &&\n (action.toolCallId === evt?.toolCallId || action.toolName === evt?.toolName)\n );\n \n if (existingToolCall) {\n existingToolCall.input = evt?.input;\n existingToolCall.status = 'running';\n existingToolCall.durationMs = evt?.durationMs;\n currentToolCall = existingToolCall;\n } else {\n // Create new tool call\n currentToolCall = {\n type: 'tool-call',\n toolCallId: evt?.toolCallId,\n toolName: evt?.toolName,\n input: evt?.input,\n inputText: '',\n output: undefined,\n status: 'running',\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(currentToolCall);\n }\n }\n pushUpdate();\n break;\n\n case 'tool-result':\n case 'main-agent-tool-result':\n let toolCallToUpdate = currentToolCall;\n \n if (!toolCallToUpdate) {\n // Find matching tool call\n toolCallToUpdate = data.main_agent.find(\n (action): action is MainAgentAction & { type: 'tool-call' } =>\n action.type === 'tool-call' &&\n (action.toolCallId === evt?.toolCallId || action.toolName === evt?.toolName)\n ) || null;\n }\n \n if (toolCallToUpdate) {\n toolCallToUpdate.output = evt?.output;\n toolCallToUpdate.status = 'finished';\n toolCallToUpdate.endDate = evt?.endDate;\n toolCallToUpdate.durationMs = evt?.durationMs;\n currentToolCall = null;\n } else {\n // Create a minimal tool call entry if we somehow missed the tool-call event\n const fallbackToolCall: MainAgentAction = {\n type: 'tool-call',\n toolCallId: evt?.toolCallId,\n toolName: evt?.toolName,\n input: undefined,\n inputText: '',\n output: evt?.output,\n status: 'finished',\n endDate: evt?.endDate,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(fallbackToolCall);\n }\n pushUpdate();\n break;\n\n case 'tool-error':\n case 'main-agent-tool-error':\n let toolCallForError = currentToolCall;\n \n if (!toolCallForError) {\n // Find matching tool call\n toolCallForError = data.main_agent.find(\n (action): action is MainAgentAction & { type: 'tool-call' } =>\n action.type === 'tool-call' &&\n (action.toolCallId === evt?.toolCallId || action.toolName === evt?.toolName)\n ) || null;\n }\n \n if (toolCallForError) {\n toolCallForError.error = evt?.error;\n toolCallForError.status = 'error';\n toolCallForError.endDate = evt?.endDate;\n toolCallForError.durationMs = evt?.durationMs;\n currentToolCall = null;\n } else {\n // Create a minimal tool call entry with error\n const fallbackToolCall: MainAgentAction = {\n type: 'tool-call',\n toolCallId: evt?.toolCallId,\n toolName: evt?.toolName,\n input: undefined,\n inputText: '',\n output: undefined,\n error: evt?.error,\n status: 'error',\n endDate: evt?.endDate,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(fallbackToolCall);\n }\n pushUpdate();\n break;\n\n case 'main-agent-response-partial':\n if (mainAgentSkipped) break;\n \n if (!currentResponse) {\n currentResponse = {\n type: 'response',\n items: [],\n startDate: evt?.startDate,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(currentResponse);\n }\n \n if (evt?.value && typeof evt.value === 'object') {\n const items = Array.isArray(evt.value.items) ? evt.value.items : currentResponse.items;\n Object.assign(currentResponse, evt.value);\n currentResponse.items = items;\n currentResponse.durationMs = evt?.durationMs;\n }\n pushUpdate();\n break;\n\n case 'text-delta':\n case 'main-agent-text-delta':\n if (typeof evt?.text === 'string' && evt.text) {\n if (!currentText) {\n currentText = {\n type: 'text',\n text: '',\n status: 'streaming',\n startDate: evt?.startDate,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(currentText);\n }\n currentText.text += evt.text;\n currentText.durationMs = evt?.durationMs;\n pushUpdate();\n }\n break;\n\n case 'text-end':\n if (currentText) {\n currentText.status = 'finished';\n currentText.endDate = evt?.endDate;\n currentText.durationMs = evt?.durationMs;\n currentText = null;\n pushUpdate();\n }\n break;\n\n case 'source':\n case 'main-agent-source':\n const sourceAction: MainAgentAction = {\n type: 'source',\n source: evt?.source,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(sourceAction);\n pushUpdate();\n break;\n\n case 'file':\n case 'main-agent-file':\n const fileAction: MainAgentAction = {\n type: 'file',\n file: evt?.file,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(fileAction);\n pushUpdate();\n break;\n\n case 'final':\n if (mainAgentSkipped) break;\n \n if (evt?.value && typeof evt.value === 'object') {\n if (!currentResponse) {\n currentResponse = {\n type: 'response',\n items: [],\n endDate: evt?.endDate,\n durationMs: evt?.durationMs,\n };\n data.main_agent.push(currentResponse);\n }\n \n const items = Array.isArray(evt.value.items) ? evt.value.items : currentResponse.items;\n Object.assign(currentResponse, evt.value);\n currentResponse.items = items;\n currentResponse.endDate = evt?.endDate;\n currentResponse.durationMs = evt?.durationMs;\n }\n pushUpdate();\n break;\n\n case 'error':\n case 'main-agent-error':\n throw new Error(evt?.error || 'Unknown agent error');\n\n default:\n break;\n }\n } catch (e) {\n console.warn('Failed to parse streaming line:', e);\n }\n }\n idx = buffer.indexOf('\\n');\n }\n }\n\n try { reader.releaseLock(); } catch {}\n setStreaming(false);\n return data;\n\n } catch (e: any) {\n if (e.name === 'AbortError') {\n setError('Request was cancelled');\n } else {\n setError(e?.message || 'Request failed');\n }\n setStreaming(false);\n return null;\n }\n }, []);\n\n const stopStreaming = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setStreaming(false);\n }, []);\n\n const reset = useCallback(() => {\n setStreamData(null);\n setError(null);\n setStreaming(false);\n }, []);\n\n return {\n streaming,\n error,\n streamData,\n startStreaming,\n stopStreaming,\n reset,\n };\n}\n","export type TranslationKeys = {\n // Chat Header\n 'header.maximize': string;\n 'header.minimize': string;\n 'header.new': string;\n 'header.history': string;\n 'header.close': string;\n \n // Chat Input\n 'input.placeholder': string;\n 'input.attachFiles': string;\n 'input.insertLink': string;\n 'input.send': string;\n 'input.stop': string;\n 'input.uploadingFiles': string;\n 'input.previewImage': string;\n 'input.removeFile': string;\n \n // Message Editor\n 'editor.cancel': string;\n 'editor.saveAndRegenerate': string;\n 'editor.clickToEdit': string;\n \n // Message List\n 'messages.empty': string;\n 'messages.error': string;\n \n // Chat History\n 'history.search': string;\n 'history.noChatsFound': string;\n 'history.untitledChat': string;\n 'history.deleteChat': string;\n \n // General\n 'general.agent': string;\n};\n\nexport type Translations = {\n [K in keyof TranslationKeys]: string;\n};\n\nexport const translations: Record<string, Translations> = {\n en: {\n // Chat Header\n 'header.maximize': 'Maximize',\n 'header.minimize': 'Minimize',\n 'header.new': 'New',\n 'header.history': 'History',\n 'header.close': 'Close chat',\n \n // Chat Input\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 \n // Message Editor\n 'editor.cancel': 'Cancel',\n 'editor.saveAndRegenerate': 'Save & Regenerate',\n 'editor.clickToEdit': 'Click to edit',\n \n // Message List\n 'messages.empty': 'Start by sending a message to the agent.',\n 'messages.error': 'An error occurred',\n \n // Chat History\n 'history.search': 'Search',\n 'history.noChatsFound': 'No chats found.',\n 'history.untitledChat': 'Untitled chat',\n 'history.deleteChat': 'Delete chat',\n \n // General\n 'general.agent': 'Agent',\n },\n \n ar: {\n // Chat Header\n 'header.maximize': 'تكبير',\n 'header.minimize': 'تصغير',\n 'header.new': 'جديد',\n 'header.history': 'السجل',\n 'header.close': 'إغلاق المحادثة',\n \n // Chat Input\n 'input.placeholder': 'اطرح سؤالك...',\n 'input.attachFiles': 'إرفاق ملفات',\n 'input.insertLink': 'إدراج رابط',\n 'input.send': 'إرسال',\n 'input.stop': 'إيقاف',\n 'input.uploadingFiles': 'جاري رفع الملفات...',\n 'input.previewImage': 'معاينة الصورة',\n 'input.removeFile': 'حذف الملف',\n \n // Message Editor\n 'editor.cancel': 'إلغاء',\n 'editor.saveAndRegenerate': 'حفظ وإعادة توليد',\n 'editor.clickToEdit': 'انقر للتعديل',\n \n // Message List\n 'messages.empty': 'ابدأ بإرسال رسالة إلى الوكيل.',\n 'messages.error': 'حدث خطأ',\n \n // Chat History\n 'history.search': 'بحث',\n 'history.noChatsFound': 'لم يتم العثور على محادثات.',\n 'history.untitledChat': 'محادثة بدون عنوان',\n 'history.deleteChat': 'حذف المحادثة',\n \n // General\n 'general.agent': 'الوكيل',\n },\n};\n\nexport type SupportedLanguage = 'en' | 'ar';\n\nexport function getTranslation(\n lang: SupportedLanguage,\n key: keyof TranslationKeys\n): string {\n return translations[lang]?.[key] || translations['en'][key] || key;\n}\n","import { useCallback } from 'react';\nimport { \n getTranslation, \n SupportedLanguage, \n TranslationKeys \n} from '../i18n/translations';\n\nexport function useTranslation(language: SupportedLanguage = 'en') {\n const t = useCallback(\n (key: keyof TranslationKeys): string => {\n return getTranslation(language, key);\n },\n [language]\n );\n\n return { t, language };\n}\n","import { useCallback, useRef, useState, useEffect } from 'react';\n\nexport interface UseActionsProps {\n actions: Map<string, Function>;\n currentChatId: string | null;\n}\n\n/**\n * Hook to manage action execution with smart parameter stabilization detection\n * Handles both streaming (continuous execution) and batch (execute once stable) modes\n */\nexport function useActions({ actions, currentChatId }: UseActionsProps) {\n // Streaming meta refs\n const actionExecMapRef = useRef<Record<string, boolean>>({});\n const assistantMsgIdRef = useRef<string | undefined>(undefined);\n const calledFinalActionsRef = useRef<Set<string>>(new Set());\n \n const [actionStatuses, setActionStatuses] = useState<Map<string, 'executing' | 'executed'>>(new Map());\n\n // No pending timers to cleanup\n useEffect(() => { return () => {}; }, []);\n\n // Simplified: no stabilization tracking\n\n const processActions = useCallback((items: any[] | undefined, trigger: 'partial' | 'final') => {\n if (!Array.isArray(items) || items.length === 0) {\n // If final arrived without items, mark any pending actions as executed\n if (trigger === 'final') {\n setActionStatuses(prev => {\n const next = new Map(prev);\n next.forEach((_, k) => next.set(k, 'executed'));\n return next;\n });\n }\n return;\n }\n \n items.forEach((it, idx) => {\n if (!it || typeof it !== 'object') return;\n if (it.type === 'action') {\n const name = String(it.name ?? '').trim();\n if (!name) return;\n \n // CRITICAL: Check if handler exists before processing\n // This prevents executing with incomplete action names during streaming\n const handler = actions.get(name);\n if (!handler) {\n // Action name might still be streaming (incomplete), skip silently\n return;\n }\n \n const executeOnStream = typeof it.executeOnStream === 'boolean'\n ? it.executeOnStream\n : !!actionExecMapRef.current[name];\n const key = `${assistantMsgIdRef.current || 'assist'}:${name}:${idx}`;\n const actionKey = `${name}:${idx}`;\n \n try {\n if (trigger === 'partial' && executeOnStream) {\n // Execute on each partial update (streaming mode)\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executing'));\n \n // Execute immediately without debounce\n Promise.resolve(handler(it.params, { \n name, \n trigger, \n index: idx, \n assistantMessageId: assistantMsgIdRef.current, \n chatId: currentChatId || undefined \n })).catch(error => {\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executed'));\n });\n \n } else if (trigger === 'partial' && !executeOnStream) {\n // Show loading during streaming; will auto-complete on final\n setActionStatuses(prev => {\n if (prev.get(actionKey) === 'executing') return prev;\n const next = new Map(prev);\n next.set(actionKey, 'executing');\n return next;\n });\n } else if (trigger === 'final') {\n // Final trigger - execute once and mark as executed\n if (!calledFinalActionsRef.current.has(key)) {\n calledFinalActionsRef.current.add(key);\n \n // Mark as executed immediately to stop loading\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executed'));\n \n // Execute the action\n Promise.resolve(handler(it.params, { \n name, \n trigger: executeOnStream ? 'final' : 'params_complete', \n index: idx, \n assistantMessageId: assistantMsgIdRef.current, \n chatId: currentChatId || undefined \n })).catch(error => {\n console.error(`[useActions] Error executing final action \"${name}\":`, error);\n });\n } else {\n // Already executed, just ensure it's marked as executed\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executed'));\n }\n }\n } catch (error) {\n console.error(`[useActions] Error processing action \"${name}\":`, error);\n // Mark as executed on error to stop loading\n setActionStatuses(prev => new Map(prev).set(actionKey, 'executed'));\n }\n }\n });\n }, [actions, currentChatId]);\n\n const resetActionTracking = useCallback(() => {\n // Reset tracking for new assistant message\n calledFinalActionsRef.current.clear();\n setActionStatuses(new Map());\n }, []);\n\n return {\n actionExecMapRef,\n assistantMsgIdRef,\n actionStatuses,\n processActions,\n resetActionTracking\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 { ThemeColors } from '../utils/chat-theme';\nimport type { TranslationKeys } from '../i18n/translations';\nimport { IconButton } from './IconButton';\n\ninterface ChatHeaderProps {\n title: string;\n expandable: boolean;\n alwaysOpen: boolean;\n maximized: boolean;\n streaming: boolean;\n dir: string;\n resolvedColors: ThemeColors;\n onMaximize: () => void;\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 expandable,\n alwaysOpen,\n maximized,\n streaming,\n dir,\n resolvedColors,\n onMaximize,\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 {expandable && (\n <IconButton\n icon={<Maximize2 size=\"20\" strokeWidth=\"2\" />}\n onClick={onMaximize}\n ariaLabel={maximized ? t('header.minimize') : t('header.maximize')}\n resolvedColors={resolvedColors}\n />\n )}\n \n <IconButton\n icon={<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 <History size=\"20\" strokeWidth=\"2\" />\n </button>\n \n {!alwaysOpen && (\n <IconButton\n icon={<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 from 'react';\nimport { Paperclip, Link, ArrowUp, Square, X, Eye, File, Loader2 } from 'lucide-react';\nimport { Attachment } from '../types/chat';\nimport { ThemeColors } from '../utils/chat-theme';\nimport type { TranslationKeys } from '../i18n/translations';\n\nexport interface ChatInputProps {\n value: string;\n onChange: (value: string) => void;\n onSend: () => void;\n onStop: () => void;\n streaming: boolean;\n placeholder: string;\n attachments: Attachment[];\n uploading: boolean;\n onRemoveAttachment: (id: string) => void;\n onFileInputClick: () => void;\n resolvedColors: ThemeColors;\n formatBytes: (bytes: number) => string;\n textareaRef: React.RefObject<HTMLTextAreaElement>;\n fileInputRef: React.RefObject<HTMLInputElement>;\n onFileSelection: (files: FileList | null) => void;\n t: (key: keyof TranslationKeys) => string;\n dir?: string;\n}\n\nexport function ChatInput({\n value,\n onChange,\n onSend,\n onStop,\n streaming,\n placeholder,\n attachments,\n uploading,\n onRemoveAttachment,\n onFileInputClick,\n resolvedColors,\n formatBytes,\n textareaRef,\n fileInputRef,\n onFileSelection,\n t,\n dir = 'ltr'\n}: ChatInputProps) {\n // Auto-resize textarea\n React.useEffect(() => {\n const textarea = textareaRef.current;\n if (textarea) {\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 }\n }, [value, textareaRef]);\n\n // Reset height on mount to ensure clean state\n React.useEffect(() => {\n const textarea = textareaRef.current;\n if (textarea && !value) {\n textarea.style.height = '24px';\n }\n }, [textareaRef, value]);\n return (\n <div style={{\n position: 'sticky',\n bottom: '0',\n marginTop: 'auto',\n paddingBottom: '8px',\n paddingTop: '4px',\n backgroundColor: resolvedColors.backgroundColor\n }}>\n {/* Unified input container */}\n <div style={{\n position: 'relative',\n flex: '1'\n }}>\n {/* The box */}\n <div style={{\n position: 'relative',\n width: '100%',\n borderRadius: '16px',\n paddingBottom: '48px',\n paddingTop: '16px',\n border: `1px solid ${resolvedColors.borderColor}`,\n backgroundColor: resolvedColors.accentColor\n }}>\n {/* Attachments display */}\n {attachments.length > 0 && (\n <div style={{\n padding: '12px 16px',\n display: 'flex',\n flexWrap: 'wrap',\n gap: '10px'\n }}>\n {attachments.map((att) => {\n const isImage = att.mimeType?.startsWith('image/');\n return (\n <div key={att.id} style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 12px',\n backgroundColor: resolvedColors.inputBackground,\n borderRadius: '10px',\n border: `1px solid ${resolvedColors.borderColor}`,\n fontSize: '12px',\n color: resolvedColors.textColor,\n transition: 'all 0.2s ease-out',\n cursor: 'pointer',\n position: 'relative'\n }}>\n {/* File icon or thumbnail */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n borderRadius: '4px',\n backgroundColor: isImage ? 'transparent' : resolvedColors.accentColor\n }}>\n {isImage ? (\n <img \n src={att.url} \n alt={att.name}\n style={{\n width: '20px',\n height: '20px',\n borderRadius: '4px',\n objectFit: 'cover'\n }}\n onError={(e) => {\n // Fallback to file icon if image fails to load\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 <File \n size=\"14\" \n strokeWidth=\"2\" \n style={{ \n display: isImage ? 'none' : 'block',\n color: resolvedColors.mutedTextColor \n }} \n />\n </div>\n \n {/* File info */}\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n minWidth: '0',\n flex: '1'\n }}>\n <span title={att.name} style={{\n maxWidth: '140px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontWeight: '500'\n }}>\n {att.name}\n </span>\n <span style={{ \n color: resolvedColors.mutedTextColor,\n fontSize: '10px',\n marginTop: '2px'\n }}>\n {formatBytes(att.size)}\n </span>\n </div>\n \n {/* Preview and remove buttons */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n marginLeft: '8px'\n }}>\n {isImage && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n window.open(att.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={t('input.previewImage')}\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 <Eye size=\"12\" strokeWidth=\"2\" />\n </button>\n )}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemoveAttachment(att.id);\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={t('input.removeFile')}\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 <X size=\"12\" strokeWidth=\"2\" />\n </button>\n </div>\n </div>\n );\n })}\n </div>\n )}\n \n {/* Upload progress */}\n {uploading && (\n <div style={{\n padding: '8px 16px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '12px',\n color: resolvedColors.mutedTextColor\n }}>\n <Loader2 size=\"14\" strokeWidth=\"2\" style={{ animation: 'spin 1s linear infinite' }} />\n <span>{t('input.uploadingFiles')}</span>\n </div>\n )}\n \n {/* Text area */}\n <div style={{ padding: '0 16px' }}>\n <textarea\n aria-label=\"Prompt\"\n rows={1}\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 placeholder={placeholder}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (!streaming) onSend();\n }\n }}\n ref={textareaRef}\n />\n </div>\n\n {/* Bottom-left/right actions inside the box (RTL aware) */}\n <div style={{\n position: 'absolute',\n bottom: '8px',\n ...(dir === 'rtl' ? { right: '8px' } : { left: '8px' }),\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n color: resolvedColors.mutedTextColor\n }}>\n <button\n style={{\n borderRadius: '8px',\n padding: '8px',\n transition: 'all 0.2s',\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'inherit'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = `${resolvedColors.backgroundColor}99`;\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 aria-label={t('input.attachFiles')}\n onClick={onFileInputClick}\n >\n <Paperclip size=\"18\" strokeWidth=\"2\" />\n </button>\n <button\n style={{\n borderRadius: '8px',\n padding: '8px',\n transition: 'all 0.2s',\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'inherit'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = `${resolvedColors.backgroundColor}99`;\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 aria-label={t('input.insertLink')}\n >\n <Link size=\"18\" strokeWidth=\"2\" />\n </button>\n </div>\n\n {/* Hidden file input */}\n <input\n type=\"file\"\n ref={fileInputRef}\n multiple\n accept=\"*/*\"\n style={{ display: 'none' }}\n onChange={(e) => onFileSelection(e.target.files)}\n />\n\n {/* Bottom-right/left send button (RTL aware) */}\n <div style={{\n position: 'absolute',\n bottom: '8px',\n ...(dir === 'rtl' ? { left: '8px' } : { right: '8px' })\n }}>\n <button\n aria-label={streaming ? t('input.stop') : t('input.send')}\n disabled={!streaming && !value.trim()}\n style={{\n borderRadius: '12px',\n padding: '12px',\n transition: 'all 0.2s ease-out',\n border: `1px solid ${streaming ? '#ef4444' : resolvedColors.borderColor}`,\n backgroundColor: streaming ? '#ef444420' : resolvedColors.cardBackground,\n color: streaming ? '#ef4444' : resolvedColors.mutedTextColor,\n opacity: (!streaming && !value.trim()) ? 0.4 : 1,\n cursor: (!streaming && !value.trim()) ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n }}\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n if (streaming) {\n e.currentTarget.style.borderColor = '#dc2626';\n e.currentTarget.style.backgroundColor = '#dc262630';\n e.currentTarget.style.color = '#dc2626';\n } else {\n e.currentTarget.style.borderColor = resolvedColors.primaryColor;\n e.currentTarget.style.backgroundColor = resolvedColors.hoverBackground;\n e.currentTarget.style.color = resolvedColors.textColor;\n }\n }\n }}\n onMouseLeave={(e) => {\n if (!e.currentTarget.disabled) {\n if (streaming) {\n e.currentTarget.style.borderColor = '#ef4444';\n e.currentTarget.style.backgroundColor = '#ef444420';\n e.currentTarget.style.color = '#ef4444';\n } else {\n e.currentTarget.style.borderColor = resolvedColors.borderColor;\n e.currentTarget.style.backgroundColor = resolvedColors.cardBackground;\n e.currentTarget.style.color = resolvedColors.mutedTextColor;\n }\n }\n }}\n onClick={() => {\n if (streaming) {\n onStop();\n } else {\n onSend();\n }\n }}\n >\n {streaming ? (\n <Square size=\"18\" strokeWidth=\"2\" />\n ) : (\n <ArrowUp size=\"18\" strokeWidth=\"2\" />\n )}\n </button>\n </div>\n </div>\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 { ResolvedColors } from '../utils/theme';\nimport { timeAgo } from '../utils/time';\nimport { ChatMeta } from '../utils/storage';\nimport type { TranslationKeys } from '../i18n/translations';\n\nexport interface ChatHistoryProps {\n isOpen: boolean;\n onClose: () => void;\n searchQuery: string;\n onSearchChange: (query: string) => void;\n chats: ChatMeta[];\n currentChatId: string | null;\n onChatSelect: (chatId: string) => void;\n onChatDelete: (chatId: string) => void;\n resolvedColors: ResolvedColors;\n t: (key: keyof TranslationKeys) => string;\n}\n\nexport function ChatHistory({\n isOpen,\n onClose,\n searchQuery,\n onSearchChange,\n chats,\n currentChatId,\n onChatSelect,\n onChatDelete,\n resolvedColors,\n t\n}: ChatHistoryProps) {\n if (!isOpen) return null;\n\n const filteredChats = searchQuery.trim() \n ? chats.filter(m => (m.title || '').toLowerCase().includes(searchQuery.toLowerCase().trim()))\n : chats;\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 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={searchQuery}\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder={t('history.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 {filteredChats.length === 0 ? (\n <div style={{\n padding: '24px',\n color: resolvedColors.mutedTextColor,\n textAlign: 'center'\n }}>{t('history.noChatsFound')}</div>\n ) : (\n <div>\n {filteredChats.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 || t('history.untitledChat')}</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={t('history.deleteChat')}\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 <Trash2 size=\"16\" strokeWidth=\"2\" />\n </button>\n </div>\n </div>\n ))}\n </div>\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","// 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, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useHsafa } from \"../providers/HsafaProvider\";\n\n// Custom hooks\nimport { useChatStorage } from '../hooks/useChatStorage';\nimport { useStreaming } from '../hooks/useStreaming';\nimport { useFileUpload } from '../hooks/useFileUploadHook';\nimport { useAgentStreaming } from '../hooks/useAgentStreaming';\nimport type { AgentStreamData } from '../hooks/useAgentStreaming';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { useActions } from '../hooks/useActions';\nimport type { SupportedLanguage } from '../i18n/translations';\n\n// Components\nimport { ChatHeader } from './ChatHeader';\nimport { ChatInput } from './ChatInput';\nimport { MessageList } from './MessageList';\nimport { FloatingChatButton } from './FloatingChatButton';\nimport { ChatHistory } from './ChatHistory';\n\n// Utilities and types\nimport { ThemeColors, themeColors } from '../utils/chat-theme';\nimport type { HsafaChatProps, ChatMessage, Attachment } from '../types/chat';\nimport { \n createUserMessage, \n createAssistantMessage, \n messagesToAPIFormat,\n updateUserMessage,\n getMessageText,\n getMessageAttachments\n} from '../utils/message-utils';\n\ntype UserChatMessage = Extract<ChatMessage, { role: 'user' }>;\n\ntype ExecuteTurnParams = {\n prompt: string;\n baseMessages: ChatMessage[];\n userMessage: UserChatMessage;\n assistantMessageId: string;\n chatId: string | null;\n};\n\nconst cloneAttachments = (attachments: Attachment[]): Attachment[] =>\n attachments.map(att => ({ ...att }));\n\nfunction usePersistentChatMessages(chatStorage: ReturnType<typeof useChatStorage>) {\n const [messages, setMessages] = useState<ChatMessage[]>(() => {\n try {\n return chatStorage.loadChatPreferences();\n } catch (error) {\n console.warn('Failed to load chat preferences:', error);\n return [];\n }\n });\n\n useEffect(() => {\n if (messages.length === 0) return;\n try {\n chatStorage.persistChatData(messages);\n } catch (error) {\n console.warn('Failed to persist chat data:', error);\n }\n }, [messages]);\n\n const selectChat = useCallback((chatId: string) => {\n try {\n chatStorage.setCurrentChatId(chatId);\n const chatData = chatStorage.loadChat(chatId);\n setMessages(chatData?.messages || []);\n return true;\n } catch (error) {\n console.warn('Failed to load selected chat:', error);\n return false;\n }\n }, [chatStorage]);\n\n const deleteChat = useCallback((chatId: string) => {\n try {\n chatStorage.deleteChat(chatId, (wasCurrent) => {\n if (wasCurrent) {\n setMessages([]);\n }\n });\n } catch (error) {\n console.warn('Failed to delete chat:', error);\n }\n }, [chatStorage]);\n\n const resetChat = useCallback(() => {\n setMessages([]);\n chatStorage.setCurrentChatId(null);\n }, [chatStorage]);\n\n return { messages, setMessages, selectChat, deleteChat, resetChat };\n}\n\nexport function HsafaChat(props: HsafaChatProps) {\n const {\n agentId, theme = 'dark', primaryColor, backgroundColor, \n borderColor, textColor, accentColor, width = 420,\n height = '100vh', expandable = true, alwaysOpen = false, \n defaultOpen = false, dir = 'ltr', language,\n floatingButtonPosition = dir === 'rtl' ? { bottom: 16, left: 16 } : { bottom: 16, right: 16 },\n placeholder, title,\n chatContainerClassName = '',\n defaultReasoningOpen = false, hideReasoningContent = false\n } = props;\n\n // Determine language - prioritize explicit language prop, then infer from dir\n const detectedLanguage: SupportedLanguage = language || (dir === 'rtl' ? 'ar' : 'en');\n const { t } = useTranslation(detectedLanguage);\n \n // Use translated defaults if not provided\n const resolvedPlaceholder = placeholder ?? t('input.placeholder');\n const resolvedTitle = title ?? t('general.agent');\n\n const { baseUrl, actions, components, setStreamingState, setChatOpenState } = useHsafa();\n const chatInstanceId = useRef(`chat-${agentId}-${Date.now()}`).current;\n\n // Local state\n const [value, setValue] = useState<string>(\"\");\n const [showChat, setShowChat] = useState<boolean>(() => {\n if (alwaysOpen) return true;\n try {\n const savedShow = localStorage.getItem(`hsafaChat_${agentId}.showChat`);\n return savedShow !== null ? savedShow === 'true' : defaultOpen;\n } catch {\n return defaultOpen;\n }\n });\n\n const [historyOpen, setHistoryOpen] = useState<boolean>(false);\n const [historySearch, setHistorySearch] = useState<string>(\"\");\n const [maximized, setMaximized] = useState<boolean>(false);\n const [chatsListVersion, setChatsListVersion] = useState<number>(0);\n const [editingMessageId, setEditingMessageId] = useState<string | null>(null);\n const [editingMessageText, setEditingMessageText] = useState<string>(\"\");\n const [editingAttachments, setEditingAttachments] = useState<Attachment[]>([]);\n\n // Refs\n const scrollAnchorRef = useRef<HTMLDivElement>(null);\n const [isAtBottom, setIsAtBottom] = useState<boolean>(true);\n const suppressNextScrollRef = useRef<boolean>(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const historyBtnRef = useRef<HTMLButtonElement>(null);\n const componentId = useRef(`hsafa-chat-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);\n\n // Custom hooks\n const chatStorage = useChatStorage(agentId);\n const {\n messages,\n setMessages,\n selectChat,\n deleteChat: deleteStoredChat,\n resetChat\n } = usePersistentChatMessages(chatStorage);\n const streaming = useStreaming();\n const fileUpload = useFileUpload(baseUrl || '');\n const agentStreaming = useAgentStreaming();\n const {\n actionExecMapRef,\n assistantMsgIdRef,\n actionStatuses,\n processActions,\n resetActionTracking,\n } = useActions({ actions, currentChatId: chatStorage.currentChatId });\n\n // Report streaming state to provider\n useEffect(() => {\n setStreamingState(chatInstanceId, streaming.streaming);\n }, [streaming.streaming, chatInstanceId, setStreamingState]);\n\n // Report chat open state to provider\n useEffect(() => {\n setChatOpenState(chatInstanceId, showChat);\n return () => {\n // Cleanup on unmount\n setChatOpenState(chatInstanceId, false);\n setStreamingState(chatInstanceId, false);\n };\n }, [showChat, chatInstanceId, setChatOpenState, setStreamingState]);\n\n // Persist showChat state to localStorage when it changes\n useEffect(() => {\n if (alwaysOpen) return; // Don't persist if alwaysOpen\n try {\n localStorage.setItem(`hsafaChat_${agentId}.showChat`, String(showChat));\n } catch (error) {\n console.warn('Failed to save chat state:', error);\n }\n }, [showChat, agentId, alwaysOpen]);\n\n const {\n attachments,\n uploading,\n fileInputRef,\n formatBytes,\n handleRemoveAttachment,\n handleFileSelection,\n clearAttachments\n } = fileUpload;\n\n // Helper: apply streaming update to a specific assistant message\n const applyStreamUpdateToAssistant = useCallback((assistantId: string, data: AgentStreamData) => {\n setMessages(prev => prev.map(m => {\n if (m.id === assistantId && m.role === 'assistant') {\n const responseAction = data.main_agent.find(action => action.type === 'response');\n const items = responseAction?.type === 'response' ? responseAction.items : [];\n return {\n ...m,\n items,\n mainAgentActions: data.main_agent,\n firstAgentMessage: data.first_agent.message,\n firstAgentContinue: data.first_agent.continue,\n reasoningOpen: m.reasoningOpen,\n };\n }\n return m;\n }));\n }, []);\n\n const executeTurn = useCallback(async ({\n prompt,\n baseMessages,\n userMessage,\n assistantMessageId,\n chatId\n }: ExecuteTurnParams) => {\n if (!agentId) return;\n\n streaming.setError(null);\n streaming.setStreaming(true);\n\n try {\n const history = messagesToAPIFormat(baseMessages);\n history.push({ role: 'user', content: userMessage.content });\n\n // Prepare action processing for this assistant message\n assistantMsgIdRef.current = assistantMessageId;\n resetActionTracking();\n\n await agentStreaming.startStreaming({\n agentId,\n baseUrl,\n body: { prompt, chatId: chatId ?? undefined, messages: history },\n onUpdate: (data: AgentStreamData) => {\n // Update UI state\n applyStreamUpdateToAssistant(assistantMessageId, data);\n // Execute actions on partial updates\n const responseAction = data.main_agent.find(a => a.type === 'response') as any;\n const items = responseAction?.items || [];\n processActions(items, 'partial');\n }\n });\n\n // After streaming completes, ensure final execution for any pending actions\n const lastData = agentStreaming.streamData;\n const finalResponse = lastData?.main_agent?.find(a => a.type === 'response') as any;\n const finalItems = finalResponse?.items || [];\n processActions(finalItems, 'final');\n } catch (e: any) {\n streaming.setError(e?.message || 'Request failed');\n } finally {\n streaming.setStreaming(false);\n }\n }, [agentId, baseUrl, agentStreaming, streaming, applyStreamUpdateToAssistant]);\n\n // Chat history handlers\n const handleChatSelect = useCallback((chatId: string) => {\n if (selectChat(chatId)) {\n setHistoryOpen(false);\n setHistorySearch(\"\");\n }\n }, [selectChat, setHistoryOpen, setHistorySearch]);\n\n const handleChatDelete = useCallback((chatId: string) => {\n deleteStoredChat(chatId);\n // Force re-render to update the chats list\n setChatsListVersion(v => v + 1);\n }, [deleteStoredChat]);\n\n // Theme resolution\n const themeColorScheme = themeColors[theme];\n const resolvedColors: ThemeColors = {\n primaryColor: primaryColor || themeColorScheme.primaryColor,\n backgroundColor: backgroundColor ?? 'transparent',\n borderColor: borderColor || themeColorScheme.borderColor,\n textColor: textColor || themeColorScheme.textColor,\n accentColor: accentColor || themeColorScheme.accentColor,\n mutedTextColor: themeColorScheme.mutedTextColor,\n inputBackground: themeColorScheme.inputBackground,\n cardBackground: themeColorScheme.cardBackground,\n hoverBackground: themeColorScheme.hoverBackground,\n };\n\n // Handle sending messages\n const handleSend = useCallback(async () => {\n if (!agentId) return;\n\n const promptText = value.trim();\n if (!promptText) return;\n\n // Create a new chat if this is the first message\n let chatId = chatStorage.currentChatId;\n if (!chatId) {\n chatId = chatStorage.createNewChat(promptText);\n }\n\n const attachmentsCopy = cloneAttachments(attachments);\n const userMessage = createUserMessage(promptText, attachmentsCopy);\n const assistantMessage = createAssistantMessage(defaultReasoningOpen);\n const baseMessages = messages;\n\n setMessages([...baseMessages, userMessage, assistantMessage]);\n setValue(\"\");\n clearAttachments();\n \n // Enable auto-scroll when sending a new message\n setIsAtBottom(true);\n\n await executeTurn({\n prompt: promptText,\n baseMessages,\n userMessage,\n assistantMessageId: assistantMessage.id,\n chatId\n });\n }, [agentId, value, messages, attachments, clearAttachments, executeTurn, chatStorage, setMessages, setValue]);\n\n // Handle adding attachments during editing\n const handleAddEditingAttachments = useCallback(async (fileList: FileList) => {\n if (!fileList || !baseUrl) return;\n \n const files = Array.from(fileList);\n streaming.setError(null);\n \n const uploaded: Attachment[] = [];\n try {\n for (const file of files) {\n if (file.size > fileUpload.MAX_UPLOAD_SIZE) {\n streaming.setError(`\"${file.name}\" exceeds the ${fileUpload.formatBytes(fileUpload.MAX_UPLOAD_SIZE)} limit.`);\n continue;\n }\n\n try {\n const formData = new FormData();\n formData.append('file', file);\n\n const response = await fetch(`${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 const attachment: Attachment = {\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 uploaded.push(attachment);\n } catch (err: any) {\n console.error('Failed to upload attachment:', err);\n streaming.setError(String(err?.message ?? `Failed to upload ${file.name}`));\n }\n }\n\n if (uploaded.length) {\n setEditingAttachments(prev => [...prev, ...uploaded]);\n }\n } catch (error) {\n console.error('Error adding attachments during edit:', error);\n }\n }, [baseUrl, fileUpload, streaming]);\n\n // Effects\n useEffect(() => {\n // Don't scroll if user manually suppressed it (e.g., toggling reasoning)\n if (suppressNextScrollRef.current) {\n suppressNextScrollRef.current = false;\n return;\n }\n \n // Only auto-scroll if user is at the bottom\n if (!isAtBottom) return;\n \n // Use requestAnimationFrame to ensure DOM has updated\n requestAnimationFrame(() => {\n scrollAnchorRef.current?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n });\n }, [messages, streaming.streaming, isAtBottom]);\n\n // Track scroll position to detect if user is at bottom\n useEffect(() => {\n const scrollContainer = document.querySelector('.chat-scroll-container');\n if (!scrollContainer) return;\n\n const handleScroll = () => {\n const { scrollTop, scrollHeight, clientHeight } = scrollContainer;\n // Smaller threshold (50px) - more sensitive to user scrolling up\n const threshold = 40;\n const atBottom = scrollHeight - scrollTop - clientHeight < threshold;\n setIsAtBottom(atBottom);\n };\n\n scrollContainer.addEventListener('scroll', handleScroll);\n // Check initial state\n handleScroll();\n\n return () => scrollContainer.removeEventListener('scroll', handleScroll);\n }, []);\n\n // Portal container for chat UI\n const chatPortal = typeof document !== 'undefined' ? createPortal(\n <>\n {/* Chat Panel */}\n <div\n className={chatContainerClassName}\n style={{\n width: showChat ? (maximized ? '100%' : (typeof width === 'number' ? `${width}px` : width)) : '0',\n height,\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: showChat ? resolvedColors.backgroundColor : 'transparent',\n opacity: showChat ? 1 : 0,\n padding: showChat ? '24px 16px' : '0',\n transition: 'all 0.3s ease-out',\n position: 'fixed',\n top: 0,\n ...(dir === 'rtl' ? { left: 0 } : { right: 0 }),\n bottom: 0,\n zIndex: maximized ? 9999 : 1000,\n pointerEvents: showChat ? 'auto' : 'none'\n }}\n >\n {/* Header */}\n <ChatHeader\n title={resolvedTitle}\n expandable={expandable}\n alwaysOpen={alwaysOpen}\n maximized={maximized}\n streaming={streaming.streaming}\n dir={dir}\n resolvedColors={resolvedColors}\n onMaximize={() => setMaximized(m => !m)}\n onNew={resetChat}\n onToggleHistory={() => setHistoryOpen(o => !o)}\n onClose={() => setShowChat(false)}\n historyBtnRef={historyBtnRef}\n t={t}\n />\n\n {/* Message List */}\n <MessageList\n messages={messages}\n streaming={streaming.streaming}\n editingMessageId={editingMessageId}\n editingMessageText={editingMessageText}\n editingAttachments={editingAttachments}\n error={streaming.error}\n actionStatuses={actionStatuses}\n components={components}\n theme={theme}\n resolvedColors={resolvedColors}\n hideReasoningContent={hideReasoningContent}\n onEditingTextChange={setEditingMessageText}\n onRemoveAttachment={(id) => {\n setEditingAttachments(prev => prev.filter(att => att.id !== id));\n }}\n onAddAttachments={handleAddEditingAttachments}\n uploading={uploading}\n onStartEdit={(id, text) => {\n const msg = messages.find(m => m.id === id);\n setEditingMessageId(id);\n setEditingMessageText(text);\n if (msg && msg.role === 'user') {\n setEditingAttachments(cloneAttachments(getMessageAttachments(msg)));\n }\n }}\n onCancelEdit={() => {\n setEditingMessageId(null);\n setEditingAttachments([]);\n }}\n onSaveEdit={async (messageId, newText) => {\n const messageIndex = messages.findIndex(m => m.id === messageId);\n if (messageIndex === -1) return;\n\n const targetMessage = messages[messageIndex];\n if (targetMessage.role !== 'user') return;\n\n const trimmedText = newText.trim();\n const updatedMessage = updateUserMessage(\n targetMessage,\n trimmedText,\n cloneAttachments(editingAttachments)\n );\n\n const baseMessages = messages.slice(0, messageIndex);\n const assistantMessage = createAssistantMessage(defaultReasoningOpen);\n\n setMessages([...baseMessages, updatedMessage, assistantMessage]);\n setEditingMessageId(null);\n setEditingAttachments([]);\n\n await executeTurn({\n prompt: trimmedText,\n baseMessages,\n userMessage: updatedMessage,\n assistantMessageId: assistantMessage.id,\n chatId: chatStorage.currentChatId ?? null\n });\n }}\n onToggleReasoning={(messageId) => {\n // Save current scroll position before toggling\n const scrollContainer = document.querySelector('.chat-scroll-container');\n const scrollPos = scrollContainer?.scrollTop || 0;\n \n suppressNextScrollRef.current = true;\n setMessages(prev => prev.map(x => \n x.id === messageId && x.role === 'assistant' \n ? { ...x, reasoningOpen: !x.reasoningOpen } \n : x\n ));\n \n // Restore scroll position after DOM update\n requestAnimationFrame(() => {\n if (scrollContainer) {\n scrollContainer.scrollTop = scrollPos;\n }\n });\n }}\n scrollAnchorRef={scrollAnchorRef}\n t={t}\n />\n\n {/* Chat Input */}\n <ChatInput\n value={value}\n onChange={setValue}\n onSend={handleSend}\n onStop={streaming.handleStop}\n streaming={streaming.streaming}\n placeholder={resolvedPlaceholder}\n attachments={attachments}\n uploading={uploading}\n onRemoveAttachment={handleRemoveAttachment}\n onFileInputClick={() => fileInputRef.current?.click()}\n resolvedColors={resolvedColors}\n formatBytes={formatBytes}\n textareaRef={textareaRef}\n fileInputRef={fileInputRef}\n onFileSelection={(files) => handleFileSelection(files, streaming.setError)}\n t={t}\n dir={dir}\n />\n </div>\n\n {/* Floating Chat Button */}\n <FloatingChatButton\n show={!showChat && !alwaysOpen}\n onClick={() => setShowChat(true)}\n resolvedColors={resolvedColors}\n floatingButtonPosition={floatingButtonPosition}\n />\n\n {/* Chat History Modal */}\n <ChatHistory\n isOpen={historyOpen}\n onClose={() => setHistoryOpen(false)}\n searchQuery={historySearch}\n onSearchChange={setHistorySearch}\n chats={chatStorage.loadChatsIndex()}\n currentChatId={chatStorage.currentChatId}\n onChatSelect={handleChatSelect}\n onChatDelete={handleChatDelete}\n resolvedColors={resolvedColors}\n t={t}\n />\n\n {/* CSS Animations */}\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 @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n \n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n </>,\n document.body\n ) : null;\n\n // Render chat UI via portal - fixed to viewport edge\n return chatPortal;\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 = 450,\n dir = \"ltr\",\n}: ContentContainerProps) {\n const { isAnyStreaming, isAnyChatOpen } = useHsafa();\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[theme];\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 ? dir === \"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.3s 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.3s 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"]}