@hsafa/ui-sdk 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +19 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +67 -7
- package/dist/index.d.ts +67 -7
- package/dist/index.js +19 -13
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Button.module.css","../src/components/Button.tsx","../src/utils/file.ts","../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/components/ChatHeader.tsx","../src/components/ChatInput.tsx","../src/utils/time.ts","../src/components/ChatHistory.tsx","../src/utils/chat-theme.ts","../src/components/HsafaChat.tsx"],"names":["Button_default","Button","variant","size","loading","disabled","children","className","props","buttonClasses","jsxs","jsx","formatBytes","bytes","units","exponent","AttachmentDisplay","attachments","resolvedColors","onRemove","isEditable","att","isImage","File","e","X","fileIcon","Download","MessageEditor","messageId","initialText","editingText","onEditingTextChange","onCancel","onSave","streaming","onRemoveAttachment","onAddAttachments","uploading","t","fileInputRef","React","handleKeyDown","handleFileChange","files","Plus","attachmentToContentPart","attachment","buildUserContent","text","trimmedText","parts","extractTextFromUserContent","content","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","isStreaming","isInputStreaming","isRunning","isError","circleColor","statusText","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","contentContainer","setContentContainer","cancelled","findContainer","registerAction","name","handler","next","unregisterAction","registerComponent","component","unregisterComponent","value","isHsafaChatElement","type","splitTree","node","chats","child","res","Fragment","cloned","chatChildren","contentTree","createPortal","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","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","ChatHeader","expandable","alwaysOpen","maximized","dir","onMaximize","onNew","onToggleHistory","onClose","historyBtnRef","Maximize2","History","ChevronRight","ChatInput","onChange","onSend","onStop","placeholder","onFileInputClick","textareaRef","onFileSelection","textarea","newHeight","Eye","Loader2","Paperclip","Link","Square","ArrowUp","timeAgo","ts","diff","d","w","months","ChatHistory","isOpen","searchQuery","onSearchChange","onChatSelect","onChatDelete","filteredChats","modalContent","Trash2","themeColors","cloneAttachments","buildHistoryPayload","previousMessages","userMessage","HsafaChat","usePersistentChatMessages","chatStorage","setMessages","selectChat","chatId","chatData","deleteChat","wasCurrent","resetChat","primaryColor","backgroundColor","textColor","accentColor","width","height","defaultOpen","enableBorderAnimation","enableContentPadding","borderRadius","enableContentBorder","chatContainerClassName","detectedLanguage","resolvedPlaceholder","resolvedTitle","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","assistantMessageId","handleChatSelect","handleChatDelete","v","themeColorScheme","contentBorderRadius","handleSend","promptText","attachmentsCopy","assistantMessage","handleAddEditingAttachments","scrollContainer","handleScroll","scrollTop","scrollHeight","clientHeight","atBottom","o","newText","messageIndex","targetMessage","updatedMessage","scrollPos"],"mappings":"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","file":"index.cjs","sourcesContent":["/* Base button styles */\n.button {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n border: 1px solid transparent;\n border-radius: 0.75rem;\n font-weight: 600;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n text-decoration: none;\n white-space: nowrap;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n\n.button:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n/* Size variants */\n.sm {\n padding: 0.375rem 0.75rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.md {\n padding: 0.5rem 1rem;\n font-size: 1rem;\n line-height: 1.5rem;\n}\n\n.lg {\n padding: 0.75rem 1.5rem;\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n\n/* Color variants */\n.primary {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n border-color: transparent;\n}\n\n.primary:hover:not(:disabled) {\n background: linear-gradient(135deg, #5a67d8 0%, #6b46c1 100%);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);\n}\n\n.secondary {\n background-color: #f7fafc;\n color: #2d3748;\n border-color: #e2e8f0;\n}\n\n.secondary:hover:not(:disabled) {\n background-color: #edf2f7;\n border-color: #cbd5e0;\n}\n\n.outline {\n background-color: transparent;\n color: #667eea;\n border-color: #667eea;\n}\n\n.outline:hover:not(:disabled) {\n background-color: #667eea;\n color: white;\n}\n\n.ghost {\n background-color: transparent;\n color: #4a5568;\n border-color: transparent;\n}\n\n.ghost:hover:not(:disabled) {\n background-color: #f7fafc;\n color: #2d3748;\n}\n\n/* Loading state */\n.loading {\n pointer-events: none;\n}\n\n.hiddenText {\n opacity: 0;\n}\n\n.spinner {\n position: absolute;\n width: 1rem;\n height: 1rem;\n border: 2px solid transparent;\n border-top: 2px solid currentColor;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n","import React from \"react\";\nimport styles from \"./Button.module.css\";\n\n/**\n * Props for the Button component\n */\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Visual style variant of the button */\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\";\n /** Size of the button */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Whether the button is in a loading state */\n loading?: boolean;\n /** Content to be displayed inside the button */\n children: React.ReactNode;\n}\n\n/**\n * A versatile button component with multiple variants, sizes, and states.\n * \n * @example\n * ```tsx\n * // Basic usage\n * <Button>Click me</Button>\n * \n * // With variant and size\n * <Button variant=\"secondary\" size=\"lg\">Large Secondary Button</Button>\n * \n * // Loading state\n * <Button loading>Processing...</Button>\n * \n * // With click handler\n * <Button onClick={() => console.log('Clicked!')}>Click me</Button>\n * ```\n */\nexport const Button: React.FC<ButtonProps> = ({\n variant = \"primary\",\n size = \"md\",\n loading = false,\n disabled,\n children,\n className,\n ...props\n}) => {\n const buttonClasses = [\n styles.button,\n styles[variant],\n styles[size],\n loading && styles.loading,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n className={buttonClasses}\n disabled={disabled || loading}\n {...props}\n >\n {loading && <span className={styles.spinner} />}\n <span className={loading ? styles.hiddenText : undefined}>\n {children}\n </span>\n </button>\n );\n};\n","/**\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 { Download, File, X } from 'lucide-react';\nimport { Attachment } from '../types/chat';\nimport { formatBytes } from '../utils/file';\nimport { ThemeColors } from '../utils/chat-theme';\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 isEditable = typeof onRemove === 'function';\n\n return (\n <div style={{\n marginTop: '12px',\n display: 'flex',\n flexWrap: 'wrap',\n gap: '8px'\n }}>\n {attachments.map((att) => {\n const isImage = att.mimeType?.startsWith('image/');\n \n if (isEditable) {\n // Editable mode - show as div with remove button\n return (\n <div\n key={att.id}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '6px 10px',\n backgroundColor: resolvedColors.inputBackground,\n borderRadius: '8px',\n border: `1px solid ${resolvedColors.borderColor}`,\n fontSize: '11px',\n color: resolvedColors.textColor,\n maxWidth: '200px',\n position: 'relative'\n }}\n >\n {/* Thumbnail or icon */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n borderRadius: '3px',\n backgroundColor: isImage ? 'transparent' : resolvedColors.accentColor,\n flexShrink: 0\n }}>\n {isImage ? (\n <img \n src={att.url} \n alt={att.name}\n style={{\n width: '16px',\n height: '16px',\n borderRadius: '3px',\n objectFit: 'cover'\n }}\n />\n ) : (\n <File \n size=\"10\" \n strokeWidth=\"2\" \n style={{ color: resolvedColors.mutedTextColor }} \n />\n )}\n </div>\n \n {/* File name and size */}\n <div style={{\n minWidth: '0',\n flex: '1'\n }}>\n <div \n title={att.name}\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontWeight: '500'\n }}\n >\n {att.name}\n </div>\n <div style={{\n fontSize: '9px',\n color: resolvedColors.mutedTextColor,\n marginTop: '1px'\n }}>\n {formatBytes(att.size)}\n </div>\n </div>\n \n {/* Remove button */}\n <button\n onClick={() => onRemove(att.id)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\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 = 'rgba(239, 68, 68, 0.1)';\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 );\n }\n \n // View mode - show as link\n return (\n <a\n key={att.id}\n href={att.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '6px 10px',\n backgroundColor: resolvedColors.inputBackground,\n borderRadius: '8px',\n border: `1px solid ${resolvedColors.borderColor}`,\n fontSize: '11px',\n color: resolvedColors.textColor,\n textDecoration: 'none',\n transition: 'all 0.2s',\n cursor: 'pointer',\n maxWidth: '200px'\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 {/* Thumbnail or icon */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n borderRadius: '3px',\n backgroundColor: isImage ? 'transparent' : resolvedColors.accentColor,\n flexShrink: 0\n }}>\n {isImage ? (\n <img \n src={att.url} \n alt={att.name}\n style={{\n width: '16px',\n height: '16px',\n borderRadius: '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=\"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 }}>\n <div \n title={att.name}\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontWeight: '500'\n }}\n >\n {att.name}\n </div>\n <div style={{\n fontSize: '9px',\n color: resolvedColors.mutedTextColor,\n marginTop: '1px'\n }}>\n {formatBytes(att.size)}\n </div>\n </div>\n \n {/* Download icon */}\n <Download \n size=\"10\" \n strokeWidth=\"2\" \n style={{ \n color: resolvedColors.mutedTextColor,\n flexShrink: 0\n }} \n />\n </a>\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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Apply inline formatting (links, bold, italic, code)\n */\nexport function inlineFormat(s: string): string {\n s = s.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline; color: inherit; opacity: 0.8;\">$1</a>');\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n s = s.replace(/\\*([^*\\n]+)\\*/g, '<em>$1</em>');\n s = s.replace(/`([^`]+)`/g, '<code style=\"padding: 2px 4px; border-radius: 4px; background-color: rgba(0,0,0,0.1); font-family: monospace;\">$1</code>');\n return s;\n}\n\n/**\n * Render markdown to HTML with mermaid detection\n */\nexport function renderMarkdownToHtmlSafe(input: string, theme: 'light' | 'dark' = 'dark'): { html: string; hasMermaid: boolean } {\n const lines = (input || '').replace(/\\r\\n/g, '\\n').split('\\n');\n let html = '';\n let inCode = false;\n let codeLang = '';\n let codeBuffer: string[] = [];\n let inUl = false;\n let inOl = false;\n let hasMermaid = false;\n\n const borderColor = theme === 'dark' ? '#374151' : '#D1D5DB';\n const bgColor = theme === 'dark' ? '#1F2937' : '#F9FAFB';\n const codeBlockBg = theme === 'dark' ? '#111827' : '#F3F4F6';\n const codeTextColor = theme === 'dark' ? '#E5E7EB' : '#374151';\n\n const closeLists = () => {\n if (inUl) { html += '</ul>'; inUl = false; }\n if (inOl) { html += '</ol>'; inOl = false; }\n };\n\n for (let i = 0; i < lines.length; i++) {\n let raw = lines[i];\n const fenceMatch = raw.match(/^```\\s*(\\w+)?\\s*$/);\n \n if (fenceMatch) {\n if (!inCode) {\n closeLists();\n inCode = true;\n codeLang = fenceMatch[1] ? String(fenceMatch[1]) : '';\n codeBuffer = [];\n } else {\n // Check if this is a mermaid diagram\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n inCode = false;\n codeLang = '';\n codeBuffer = [];\n }\n continue;\n }\n\n if (inCode) {\n codeBuffer.push(raw);\n continue;\n }\n\n // Horizontal rules\n if (/^\\s*(---|\\*\\*\\*|___)\\s*$/.test(raw)) {\n closeLists();\n html += '<hr style=\"margin: 12px 0; opacity: 0.6; border: none; border-top: 1px solid currentColor;\" />';\n continue;\n }\n\n // Headers\n const h = raw.match(/^(#{1,6})\\s+(.+)$/);\n if (h) {\n closeLists();\n const level = h[1].length;\n const content = inlineFormat(escapeHtml(h[2].trim()));\n const size = level <= 2 ? '18px' : level === 3 ? '16px' : '14px';\n html += `<h${level} style=\"font-size: ${size}; font-weight: 600; margin: 8px 0 4px 0;\">${content}</h${level}>`;\n continue;\n }\n\n // Lists\n const ulItem = raw.match(/^\\s*[-*]\\s+(.+)$/);\n const olItem = raw.match(/^\\s*\\d+\\.\\s+(.+)$/);\n if (ulItem) {\n if (!inUl) { closeLists(); html += '<ul style=\"list-style-type: disc; padding-left: 24px; margin: 4px 0;\">'; inUl = true; }\n const content = inlineFormat(escapeHtml(ulItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n if (olItem) {\n if (!inOl) { closeLists(); html += '<ol style=\"list-style-type: decimal; padding-left: 24px; margin: 4px 0;\">'; inOl = true; }\n const content = inlineFormat(escapeHtml(olItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n\n // Empty lines\n if (raw.trim().length === 0) {\n closeLists();\n html += '<div style=\"height: 8px;\"></div>';\n } else {\n closeLists();\n const content = inlineFormat(escapeHtml(raw));\n html += `<p style=\"line-height: 1.6; margin: 4px 0; word-break: break-word;\">${content}</p>`;\n }\n }\n\n // Handle unclosed code blocks\n if (inCode) {\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n }\n if (inUl) html += '</ul>';\n if (inOl) html += '</ol>';\n \n return { html, hasMermaid };\n}\n","import React, { useMemo } from 'react';\nimport { MermaidDiagram } from './MermaidDiagram';\nimport { escapeHtml } from '../utils/markdown';\n\nfunction inlineFormat(s: string) {\n s = s.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline; color: inherit; opacity: 0.8;\">$1</a>');\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n s = s.replace(/\\*([^*\\n]+)\\*/g, '<em>$1</em>');\n s = s.replace(/`([^`]+)`/g, '<code style=\"padding: 2px 4px; border-radius: 4px; background-color: rgba(0,0,0,0.1); font-family: monospace;\">$1</code>');\n return s;\n}\n\nfunction renderMarkdownToHtmlSafe(input: string, theme: 'light' | 'dark' = 'dark'): { html: string; hasMermaid: boolean } {\n const lines = (input || '').replace(/\\r\\n/g, '\\n').split('\\n');\n let html = '';\n let inCode = false;\n let codeLang = '';\n let codeBuffer: string[] = [];\n let inUl = false;\n let inOl = false;\n let hasMermaid = false;\n\n const borderColor = theme === 'dark' ? '#374151' : '#D1D5DB';\n const bgColor = theme === 'dark' ? '#1F2937' : '#F9FAFB';\n const codeBlockBg = theme === 'dark' ? '#111827' : '#F3F4F6';\n const codeTextColor = theme === 'dark' ? '#E5E7EB' : '#374151';\n\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(/</g, '<')\n .replace(/>/g, '>')\n .replace(/&/g, '&')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n \n elements.push(\n React.createElement(MermaidDiagram, {\n key: `mermaid-${index}`,\n chart: mermaidCode,\n theme: theme\n })\n );\n }\n } else if (part.trim()) {\n // Regular HTML content\n elements.push(\n React.createElement('div', {\n key: `html-${index}`,\n style: {\n fontSize: '14px',\n lineHeight: '1.6',\n wordBreak: 'break-word',\n maxWidth: '100%',\n overflow: 'hidden'\n },\n dangerouslySetInnerHTML: { __html: part }\n })\n );\n }\n });\n\n return React.createElement(React.Fragment, {}, ...elements);\n}\n","import React, { 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\n// Helper to calculate total duration from actions\nfunction calculateTotalDuration(actions: MainAgentAction[]): number {\n let total = 0;\n \n for (const action of actions) {\n if ('startDate' in action && 'endDate' in action && action.startDate && action.endDate) {\n total += action.endDate - action.startDate;\n }\n }\n \n return total;\n}\n\n// Helper to format duration in a human-readable way\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${Math.round(ms)}ms`;\n } else if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n } else {\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/**\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 // Calculate duration from startDate and endDate\n let duration: string | null = null;\n if ('startDate' in action && 'endDate' in action && action.startDate && action.endDate) {\n duration = formatDuration(action.endDate - action.startDate);\n }\n \n if (action.type === 'reasoning') {\n const isStreaming = action.status === 'streaming';\n return (\n <div style={{\n display: 'flex',\n gap: '12px',\n paddingBottom: isLast ? '0' : '16px',\n position: 'relative',\n marginBottom: '6px'\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 {/* Dot */}\n <div style={{\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: resolvedColors.borderColor,\n marginTop: '6px',\n zIndex: 1\n }} />\n {/* Vertical line */}\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: resolvedColors.borderColor,\n }} />\n )}\n </div>\n {/* Content */}\n <div style={{\n flex: 1,\n minWidth: 0\n }}>\n <div style={{\n fontSize: '11px',\n color: resolvedColors.mutedTextColor,\n marginBottom: '4px',\n fontWeight: 500,\n display: 'flex',\n alignItems: 'center',\n gap: '6px'\n }}>\n <span>Reasoning</span>\n {duration && (\n <span style={{\n fontFamily: 'monospace',\n fontSize: '10px',\n color: resolvedColors.mutedTextColor,\n }}>\n {duration}\n </span>\n )}\n </div>\n {!hideReasoningContent && (\n <div style={{\n fontSize: '13px',\n color: resolvedColors.mutedTextColor,\n lineHeight: '1.6',\n maxWidth: '100%',\n opacity: isStreaming ? 0.8 : 1\n }}>\n <MarkdownRendererWithMermaid content={action.reasoning} theme={theme} />\n \n </div>\n )}\n </div>\n </div>\n );\n }\n\n if (action.type === 'tool-call') {\n // Determine tool state from status field\n const isInputStreaming = action.status === 'input_streaming';\n const isRunning = action.status === 'running';\n const isFinished = action.status === 'finished';\n const isError = action.status === 'error';\n\n // Determine circle color (theme-aware)\n let circleColor = theme === 'dark' ? '#10b981' : '#059669'; // green for finished\n if (isInputStreaming) circleColor = theme === 'dark' ? '#eab308' : '#d97706'; // yellow for inputting\n if (isRunning) circleColor = theme === 'dark' ? '#3b82f6' : '#2563eb'; // blue for running\n if (isError) circleColor = theme === 'dark' ? '#ef4444' : '#dc2626'; // red for error\n\n // Determine status text\n let statusText = `Called`;\n if (isInputStreaming) statusText = `Inputting`;\n if (isRunning) statusText = `Running`;\n if (isError) statusText = `Error`;\n\n return (\n <div style={{\n display: 'flex',\n gap: '12px',\n paddingBottom: isLast ? '0' : '16px',\n position: 'relative',\n marginBottom: '6px'\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 {/* Dot */}\n <div style={{\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: circleColor,\n marginTop: '6px',\n zIndex: 1\n }} />\n {/* Vertical line */}\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 )}\n </div>\n {/* Content */}\n <div style={{\n flex: 1,\n minWidth: 0\n }}>\n <div style={{\n fontSize: '12px',\n color: resolvedColors.mutedTextColor,\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n flexWrap: 'wrap'\n }}>\n <span style={{\n fontWeight: 500,\n opacity: theme === 'dark' ? 0.7 : 0.6\n }}>\n {statusText}\n </span>\n <span style={{\n color: resolvedColors.mutedTextColor,\n fontWeight: 500\n }}>\n {action.toolName || 'tool'}\n </span>\n {duration && (\n <span style={{\n fontFamily: 'monospace',\n fontSize: '10px',\n color: resolvedColors.mutedTextColor,\n opacity: theme === 'dark' ? 0.5 : 0.6\n }}>\n {duration}\n </span>\n )}\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, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\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}\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 [contentContainer, setContentContainer] = useState<HTMLElement | null>(null);\n\n // Locate the Hsafa content box in the DOM and keep a stable reference\n useEffect(() => {\n let cancelled = false;\n\n const findContainer = () => {\n if (cancelled) return;\n const el = typeof document !== 'undefined' ? document.getElementById('hsafa-content-box') : null;\n if (el) {\n setContentContainer(el);\n } else {\n // Retry shortly until the chat mounts its content box\n setTimeout(findContainer, 100);\n }\n };\n\n findContainer();\n return () => { cancelled = true; };\n }, []);\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 value: HsafaContextValue = useMemo(() => ({\n baseUrl,\n actions,\n components,\n registerAction,\n unregisterAction,\n registerComponent,\n unregisterComponent,\n }), [baseUrl, actions, components, registerAction, unregisterAction, registerComponent, unregisterComponent]);\n\n // Helper: detect HsafaChat components\n const isHsafaChatElement = (el: React.ReactElement<any>): boolean => {\n const type: any = el.type as any;\n const name = type?.displayName || type?.name;\n return name === 'HsafaChat';\n };\n\n // Recursively split children tree into chat elements and content tree (with chats removed)\n function splitTree(node: React.ReactNode): { chats: React.ReactNode[]; content: React.ReactNode | null } {\n if (node == null || typeof node === 'boolean') return { chats: [], content: null };\n if (typeof node === 'string' || typeof node === 'number') return { chats: [], content: node };\n\n if (Array.isArray(node)) {\n const chats: React.ReactNode[] = [];\n const contentParts: React.ReactNode[] = [];\n for (const child of node) {\n const res = splitTree(child);\n chats.push(...res.chats);\n if (res.content !== null) contentParts.push(res.content);\n }\n return { chats, content: contentParts.length ? <>{contentParts}</> : null };\n }\n\n if (React.isValidElement(node)) {\n if (isHsafaChatElement(node)) {\n return { chats: [node], content: null };\n }\n const res = splitTree((node as any).props?.children);\n const cloned = React.cloneElement(node, (node as any).props, res.content);\n return { chats: res.chats, content: cloned };\n }\n\n return { chats: [], content: node };\n }\n\n const { chats: chatChildren, content: contentTree } = splitTree(children);\n\n return (\n <HsafaContext.Provider value={value}>\n {/* Always render chat components normally */}\n {chatChildren}\n {/* Render content inline until the content box exists (so chat can mount and create it) */}\n {!contentContainer ? contentTree : null}\n {/* Once content box exists, portal only the content there */}\n {contentContainer && contentTree ? createPortal(<>{contentTree}</>, contentContainer) : null}\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 };\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 React from 'react';\nimport { Maximize2, Plus, History, ChevronRight } from 'lucide-react';\nimport { ThemeColors } from '../utils/chat-theme';\nimport type { TranslationKeys } from '../i18n/translations';\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 {/* Expand / Pop-out */}\n {expandable && (\n <button\n aria-label={maximized ? t('header.minimize') : t('header.maximize')}\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={onMaximize}\n >\n <Maximize2 size=\"20\" strokeWidth=\"2\" />\n </button>\n )}\n \n {/* New */}\n <button\n aria-label={t('header.new')}\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={() => {\n if (!streaming) onNew();\n }}\n >\n <Plus size=\"20\" strokeWidth=\"2\" />\n </button>\n \n {/* History */}\n <button\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 ref={historyBtnRef}\n >\n <History size=\"20\" strokeWidth=\"2\" />\n </button>\n \n {/* Close */}\n {!alwaysOpen && (\n <button\n aria-label={t('header.close')}\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={onClose}\n >\n <ChevronRight size=\"20\" strokeWidth=\"2\" style={{ transform: dir === 'rtl' ? 'rotate(180deg)' : 'none' }} />\n </button>\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 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 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 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 buildHistoryPayload(\n previousMessages: ChatMessage[],\n userMessage: UserChatMessage\n) {\n const history = messagesToAPIFormat(previousMessages);\n history.push({\n role: 'user',\n content: userMessage.content\n });\n return history;\n}\n\n// Help external code (like HsafaProvider) reliably detect this component by name\nHsafaChat.displayName = 'HsafaChat';\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 = true, dir = 'ltr', language,\n floatingButtonPosition = dir === 'rtl' ? { bottom: 16, left: 16 } : { bottom: 16, right: 16 },\n enableBorderAnimation = true, enableContentPadding = true,\n borderRadius = 16, enableContentBorder = true,\n placeholder, title,\n className = '', 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, components } = useHsafa();\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\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 = buildHistoryPayload(baseMessages, userMessage);\n await agentStreaming.startStreaming({\n agentId,\n baseUrl,\n body: {\n prompt,\n chatId: chatId ?? undefined,\n messages: history,\n },\n onUpdate: (data: AgentStreamData) => applyStreamUpdateToAssistant(assistantMessageId, data)\n });\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 || themeColorScheme.backgroundColor,\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 // Content border radius calculation\n const contentBorderRadius = typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius;\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 // Save show/hide state to localStorage\n useEffect(() => {\n if (!alwaysOpen) {\n try {\n localStorage.setItem(`hsafaChat_${agentId}.showChat`, String(showChat));\n } catch {\n // Ignore localStorage errors\n }\n }\n }, [showChat, agentId, alwaysOpen]);\n\n // Render everything in a single portal\n if (typeof document === 'undefined') return null;\n\n return createPortal(\n <>\n {/* Main Row Container - Chat Panel + Content Box */}\n <div\n className={className}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n width: '100%',\n height,\n display: 'flex',\n flexDirection: dir === 'rtl' ? 'row-reverse' : 'row',\n backgroundColor: resolvedColors.backgroundColor,\n color: resolvedColors.textColor,\n fontFamily: 'Rubik, ui-sans-serif, system-ui, sans-serif',\n zIndex: 999\n }}\n dir={dir}\n >\n {/* Content Box - Always visible, shrinks when chat opens */}\n <div\n style={{\n flex: 1,\n display: 'flex',\n height: '100%',\n transition: 'all 0.3s ease-out',\n padding: showChat && enableContentPadding ? '16px' : '0'\n }}\n >\n <div\n style={{\n position: 'relative',\n display: 'flex',\n width: '100%',\n height: '100%',\n transition: 'all 0.3s ease-out',\n borderRadius: showChat && enableContentBorder ? contentBorderRadius : '0',\n border: showChat && enableContentBorder && !(streaming.streaming && enableBorderAnimation) \n ? `1px solid ${resolvedColors.borderColor}` \n : 'none',\n padding: showChat && enableContentBorder && streaming.streaming && enableBorderAnimation ? '1.5px' : '0',\n background: showChat && enableContentBorder && streaming.streaming && 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: showChat && enableContentBorder && streaming.streaming && enableBorderAnimation ? '300% 300%' : 'auto',\n animation: showChat && enableContentBorder && streaming.streaming && enableBorderAnimation ? `${componentId.current}-border-flow 3s ease-in-out infinite` : 'none',\n filter: showChat && enableContentBorder && streaming.streaming && enableBorderAnimation ? `drop-shadow(0 0 10px ${resolvedColors.primaryColor}40)` : 'none'\n }}\n >\n <div\n id=\"hsafa-content-box\"\n className=\"content-container\"\n style={{\n width: '100%',\n height: '100%',\n borderRadius: showChat && enableContentBorder ? contentBorderRadius : '0',\n backgroundColor: resolvedColors.backgroundColor,\n overflowY: 'auto',\n overflowX: 'hidden',\n position: 'relative',\n scrollbarWidth: 'thin',\n scrollbarColor: `${resolvedColors.mutedTextColor}40 transparent`\n }}\n >\n {/* User app content will be rendered here via portal or directly */}\n </div>\n </div>\n </div>\n\n {/* Chat Panel - Slides in/out */}\n <div\n className={chatContainerClassName}\n style={{\n width: showChat ? (maximized ? '100%' : (typeof width === 'number' ? `${width}px` : width)) : '0',\n height: '100%',\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 overflow: 'hidden',\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={streaming.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 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 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 </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 );\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/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","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","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","contentBorderRadius","chatWidthPx"],"mappings":"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","file":"index.cjs","sourcesContent":["/* Base button styles */\n.button {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n border: 1px solid transparent;\n border-radius: 0.75rem;\n font-weight: 600;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n text-decoration: none;\n white-space: nowrap;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n\n.button:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n/* Size variants */\n.sm {\n padding: 0.375rem 0.75rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.md {\n padding: 0.5rem 1rem;\n font-size: 1rem;\n line-height: 1.5rem;\n}\n\n.lg {\n padding: 0.75rem 1.5rem;\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n\n/* Color variants */\n.primary {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n border-color: transparent;\n}\n\n.primary:hover:not(:disabled) {\n background: linear-gradient(135deg, #5a67d8 0%, #6b46c1 100%);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);\n}\n\n.secondary {\n background-color: #f7fafc;\n color: #2d3748;\n border-color: #e2e8f0;\n}\n\n.secondary:hover:not(:disabled) {\n background-color: #edf2f7;\n border-color: #cbd5e0;\n}\n\n.outline {\n background-color: transparent;\n color: #667eea;\n border-color: #667eea;\n}\n\n.outline:hover:not(:disabled) {\n background-color: #667eea;\n color: white;\n}\n\n.ghost {\n background-color: transparent;\n color: #4a5568;\n border-color: transparent;\n}\n\n.ghost:hover:not(:disabled) {\n background-color: #f7fafc;\n color: #2d3748;\n}\n\n/* Loading state */\n.loading {\n pointer-events: none;\n}\n\n.hiddenText {\n opacity: 0;\n}\n\n.spinner {\n position: absolute;\n width: 1rem;\n height: 1rem;\n border: 2px solid transparent;\n border-top: 2px solid currentColor;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n","import React from \"react\";\nimport styles from \"./Button.module.css\";\n\n/**\n * Props for the Button component\n */\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Visual style variant of the button */\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\";\n /** Size of the button */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Whether the button is in a loading state */\n loading?: boolean;\n /** Content to be displayed inside the button */\n children: React.ReactNode;\n}\n\n/**\n * A versatile button component with multiple variants, sizes, and states.\n * \n * @example\n * ```tsx\n * // Basic usage\n * <Button>Click me</Button>\n * \n * // With variant and size\n * <Button variant=\"secondary\" size=\"lg\">Large Secondary Button</Button>\n * \n * // Loading state\n * <Button loading>Processing...</Button>\n * \n * // With click handler\n * <Button onClick={() => console.log('Clicked!')}>Click me</Button>\n * ```\n */\nexport const Button: React.FC<ButtonProps> = ({\n variant = \"primary\",\n size = \"md\",\n loading = false,\n disabled,\n children,\n className,\n ...props\n}) => {\n const buttonClasses = [\n styles.button,\n styles[variant],\n styles[size],\n loading && styles.loading,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n className={buttonClasses}\n disabled={disabled || loading}\n {...props}\n >\n {loading && <span className={styles.spinner} />}\n <span className={loading ? styles.hiddenText : undefined}>\n {children}\n </span>\n </button>\n );\n};\n","/**\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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Apply inline formatting (links, bold, italic, code)\n */\nexport function inlineFormat(s: string): string {\n s = s.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline; color: inherit; opacity: 0.8;\">$1</a>');\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n s = s.replace(/\\*([^*\\n]+)\\*/g, '<em>$1</em>');\n s = s.replace(/`([^`]+)`/g, '<code style=\"padding: 2px 4px; border-radius: 4px; background-color: rgba(0,0,0,0.1); font-family: monospace;\">$1</code>');\n return s;\n}\n\n/**\n * Render markdown to HTML with mermaid detection\n */\nexport function renderMarkdownToHtmlSafe(input: string, theme: 'light' | 'dark' = 'dark'): { html: string; hasMermaid: boolean } {\n const lines = (input || '').replace(/\\r\\n/g, '\\n').split('\\n');\n let html = '';\n let inCode = false;\n let codeLang = '';\n let codeBuffer: string[] = [];\n let inUl = false;\n let inOl = false;\n let hasMermaid = false;\n\n const borderColor = theme === 'dark' ? '#374151' : '#D1D5DB';\n const bgColor = theme === 'dark' ? '#1F2937' : '#F9FAFB';\n const codeBlockBg = theme === 'dark' ? '#111827' : '#F3F4F6';\n const codeTextColor = theme === 'dark' ? '#E5E7EB' : '#374151';\n\n const closeLists = () => {\n if (inUl) { html += '</ul>'; inUl = false; }\n if (inOl) { html += '</ol>'; inOl = false; }\n };\n\n for (let i = 0; i < lines.length; i++) {\n let raw = lines[i];\n const fenceMatch = raw.match(/^```\\s*(\\w+)?\\s*$/);\n \n if (fenceMatch) {\n if (!inCode) {\n closeLists();\n inCode = true;\n codeLang = fenceMatch[1] ? String(fenceMatch[1]) : '';\n codeBuffer = [];\n } else {\n // Check if this is a mermaid diagram\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n inCode = false;\n codeLang = '';\n codeBuffer = [];\n }\n continue;\n }\n\n if (inCode) {\n codeBuffer.push(raw);\n continue;\n }\n\n // Horizontal rules\n if (/^\\s*(---|\\*\\*\\*|___)\\s*$/.test(raw)) {\n closeLists();\n html += '<hr style=\"margin: 12px 0; opacity: 0.6; border: none; border-top: 1px solid currentColor;\" />';\n continue;\n }\n\n // Headers\n const h = raw.match(/^(#{1,6})\\s+(.+)$/);\n if (h) {\n closeLists();\n const level = h[1].length;\n const content = inlineFormat(escapeHtml(h[2].trim()));\n const size = level <= 2 ? '18px' : level === 3 ? '16px' : '14px';\n html += `<h${level} style=\"font-size: ${size}; font-weight: 600; margin: 8px 0 4px 0;\">${content}</h${level}>`;\n continue;\n }\n\n // Lists\n const ulItem = raw.match(/^\\s*[-*]\\s+(.+)$/);\n const olItem = raw.match(/^\\s*\\d+\\.\\s+(.+)$/);\n if (ulItem) {\n if (!inUl) { closeLists(); html += '<ul style=\"list-style-type: disc; padding-left: 24px; margin: 4px 0;\">'; inUl = true; }\n const content = inlineFormat(escapeHtml(ulItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n if (olItem) {\n if (!inOl) { closeLists(); html += '<ol style=\"list-style-type: decimal; padding-left: 24px; margin: 4px 0;\">'; inOl = true; }\n const content = inlineFormat(escapeHtml(olItem[1]));\n html += `<li style=\"margin: 2px 0;\">${content}</li>`;\n continue;\n }\n\n // Empty lines\n if (raw.trim().length === 0) {\n closeLists();\n html += '<div style=\"height: 8px;\"></div>';\n } else {\n closeLists();\n const content = inlineFormat(escapeHtml(raw));\n html += `<p style=\"line-height: 1.6; margin: 4px 0; word-break: break-word;\">${content}</p>`;\n }\n }\n\n // Handle unclosed code blocks\n if (inCode) {\n if (codeLang === 'mermaid') {\n hasMermaid = true;\n const mermaidCode = codeBuffer.join('\\n');\n html += `<div class=\"mermaid-placeholder\" data-mermaid=\"${escapeHtml(mermaidCode)}\"></div>`;\n } else {\n const codeHtml = escapeHtml(codeBuffer.join('\\n'));\n const cls = codeLang ? `language-${codeLang}` : '';\n html += `<pre style=\"border-radius: 8px; padding: 12px; background-color: ${codeBlockBg}; color: ${codeTextColor}; border: 1px solid ${borderColor}; overflow-x: auto; white-space: pre-wrap; word-break: break-all;\"><code class=\"${cls}\">${codeHtml}</code></pre>`;\n }\n }\n if (inUl) html += '</ul>';\n if (inOl) html += '</ol>';\n \n return { html, hasMermaid };\n}\n","import React, { useMemo } from 'react';\nimport { MermaidDiagram } from './MermaidDiagram';\nimport { escapeHtml } from '../utils/markdown';\n\nfunction inlineFormat(s: string) {\n s = s.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline; color: inherit; opacity: 0.8;\">$1</a>');\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n s = s.replace(/\\*([^*\\n]+)\\*/g, '<em>$1</em>');\n s = s.replace(/`([^`]+)`/g, '<code style=\"padding: 2px 4px; border-radius: 4px; background-color: rgba(0,0,0,0.1); font-family: monospace;\">$1</code>');\n return s;\n}\n\nfunction renderMarkdownToHtmlSafe(input: string, theme: 'light' | 'dark' = 'dark'): { html: string; hasMermaid: boolean } {\n const lines = (input || '').replace(/\\r\\n/g, '\\n').split('\\n');\n let html = '';\n let inCode = false;\n let codeLang = '';\n let codeBuffer: string[] = [];\n let inUl = false;\n let inOl = false;\n let hasMermaid = false;\n\n const borderColor = theme === 'dark' ? '#374151' : '#D1D5DB';\n const bgColor = theme === 'dark' ? '#1F2937' : '#F9FAFB';\n const codeBlockBg = theme === 'dark' ? '#111827' : '#F3F4F6';\n const codeTextColor = theme === 'dark' ? '#E5E7EB' : '#374151';\n\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(/</g, '<')\n .replace(/>/g, '>')\n .replace(/&/g, '&')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n \n elements.push(\n React.createElement(MermaidDiagram, {\n key: `mermaid-${index}`,\n chart: mermaidCode,\n theme: theme\n })\n );\n }\n } else if (part.trim()) {\n // Regular HTML content\n elements.push(\n React.createElement('div', {\n key: `html-${index}`,\n style: {\n fontSize: '14px',\n lineHeight: '1.6',\n wordBreak: 'break-word',\n maxWidth: '100%',\n overflow: 'hidden'\n },\n dangerouslySetInnerHTML: { __html: part }\n })\n );\n }\n });\n\n return React.createElement(React.Fragment, {}, ...elements);\n}\n","import React, { 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 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 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 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 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, 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\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 await agentStreaming.startStreaming({\n agentId,\n baseUrl,\n body: { prompt, chatId: chatId ?? undefined, messages: history },\n onUpdate: (data: AgentStreamData) => applyStreamUpdateToAssistant(assistantMessageId, data)\n });\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 || themeColorScheme.backgroundColor,\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={streaming.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, { useRef } from \"react\";\nimport { useHsafa } from \"../providers/HsafaProvider\";\nimport { ThemeColors, themeColors } from \"../utils/chat-theme\";\n\nexport interface ContentContainerProps {\n children: React.ReactNode;\n theme?: \"dark\" | \"light\";\n primaryColor?: string;\n backgroundColor?: string;\n borderColor?: string;\n textColor?: string;\n mutedTextColor?: string;\n enableBorderAnimation?: boolean;\n borderRadius?: number | string;\n enableContentBorder?: boolean;\n className?: string;\n enableMargin?: boolean; // Enable/disable margin when chat is open\n chatWidth?: number | string; // Width of the chat panel (default: 420)\n dir?: \"ltr\" | \"rtl\"; // Text direction for margin side\n}\n\n/**\n * ContentContainer component that wraps your content and applies animations\n * based on HsafaChat state (streaming and open state).\n *\n * Features:\n * - Detects if any chat under HsafaProvider is streaming and applies border animation\n * - Detects if any HsafaChat is open and applies radius, border, and margin with animation\n * - Automatically adjusts margin based on chat width and direction (RTL/LTR)\n *\n * @example\n * ```tsx\n * // Basic usage\n * <HsafaProvider baseUrl=\"http://localhost:3000\">\n * <ContentContainer theme=\"dark\" enableBorderAnimation>\n * <YourApp />\n * </ContentContainer>\n * <HsafaChat agentId=\"agent-1\" width={450} />\n * </HsafaProvider>\n *\n * // With custom chat width and RTL support\n * <HsafaProvider baseUrl=\"http://localhost:3000\">\n * <ContentContainer \n * theme=\"dark\" \n * chatWidth={450}\n * dir=\"rtl\"\n * enableMargin={true}\n * >\n * <YourApp />\n * </ContentContainer>\n * <HsafaChat agentId=\"agent-1\" width={450} dir=\"rtl\" />\n * </HsafaProvider>\n *\n * // Disable margin (content stays full width)\n * <HsafaProvider baseUrl=\"http://localhost:3000\">\n * <ContentContainer enableMargin={false}>\n * <YourApp />\n * </ContentContainer>\n * <HsafaChat agentId=\"agent-1\" />\n * </HsafaProvider>\n * ```\n */\nexport function ContentContainer({\n children,\n theme = \"dark\",\n primaryColor,\n backgroundColor,\n borderColor,\n textColor,\n mutedTextColor,\n enableBorderAnimation = true,\n borderRadius = 16,\n enableContentBorder = true,\n className = \"\",\n enableMargin = true,\n chatWidth = 420,\n dir = \"ltr\",\n}: ContentContainerProps) {\n const { isAnyStreaming, isAnyChatOpen } = useHsafa();\n const componentId = useRef(\n `content-container-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\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 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 return (\n <>\n <div\n className={className}\n style={{\n width: \"100%\",\n height: \"100%\",\n transition: \"all 0.3s ease-out\",\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: 'all 0.3s ease-out',\n borderRadius: contentBorderRadius,\n border: isAnyStreaming && enableBorderAnimation ? 'none' : `1px solid ${resolvedColors.borderColor}`,\n padding: isAnyStreaming && enableBorderAnimation ? '1.5px' : '0',\n background: 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: isAnyStreaming && enableBorderAnimation ? '300% 300%' : 'auto',\n animation: isAnyStreaming && enableBorderAnimation ? `${componentId.current}-border-flow 3s ease-in-out infinite` : 'none',\n filter: 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"]}
|