@burtson-labs/bandit-engine 2.0.8

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.
Files changed (184) hide show
  1. package/LICENSE +43 -0
  2. package/README.md +1235 -0
  3. package/dist/aiProviderStore-YWJHSWFA.mjs +9 -0
  4. package/dist/aiProviderStore-YWJHSWFA.mjs.map +1 -0
  5. package/dist/chat-QXB526NZ.mjs +11 -0
  6. package/dist/chat-QXB526NZ.mjs.map +1 -0
  7. package/dist/chunk-AVC6IZJQ.mjs +2157 -0
  8. package/dist/chunk-AVC6IZJQ.mjs.map +1 -0
  9. package/dist/chunk-BIPELT57.mjs +24183 -0
  10. package/dist/chunk-BIPELT57.mjs.map +1 -0
  11. package/dist/chunk-BJTO5JO5.mjs +11 -0
  12. package/dist/chunk-BJTO5JO5.mjs.map +1 -0
  13. package/dist/chunk-IXIM7BNO.mjs +39 -0
  14. package/dist/chunk-IXIM7BNO.mjs.map +1 -0
  15. package/dist/chunk-KCI46M23.mjs +106 -0
  16. package/dist/chunk-KCI46M23.mjs.map +1 -0
  17. package/dist/chunk-WYS5CZVG.mjs +843 -0
  18. package/dist/chunk-WYS5CZVG.mjs.map +1 -0
  19. package/dist/cli/cli.js +1808 -0
  20. package/dist/cli/cli.js.map +1 -0
  21. package/dist/index.d.mts +1636 -0
  22. package/dist/index.d.ts +1636 -0
  23. package/dist/index.js +40601 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/index.mjs +12477 -0
  26. package/dist/index.mjs.map +1 -0
  27. package/dist/memoryUtils-33TZKHSQ.mjs +223 -0
  28. package/dist/memoryUtils-33TZKHSQ.mjs.map +1 -0
  29. package/dist/modelStore-Y3LZWRQC.mjs +9 -0
  30. package/dist/modelStore-Y3LZWRQC.mjs.map +1 -0
  31. package/dist/shared/custom-element.js +73 -0
  32. package/dist/shared/custom-element.js.map +1 -0
  33. package/dist/shared/custom-element.mjs +8 -0
  34. package/dist/shared/custom-element.mjs.map +1 -0
  35. package/docs/00_intro.md +26 -0
  36. package/docs/01_quickstart.md +54 -0
  37. package/docs/02_gateway_api.md +64 -0
  38. package/docs/03_provider_integration.md +38 -0
  39. package/docs/04_local_dev.md +43 -0
  40. package/docs/05_cli_quickstart.md +89 -0
  41. package/docs/05_contributing.md +33 -0
  42. package/docs/06_busl_licensing.md +25 -0
  43. package/docs/README.md +9 -0
  44. package/docs/api_reference/.nojekyll +1 -0
  45. package/docs/api_reference/assets/highlight.css +141 -0
  46. package/docs/api_reference/assets/icons.js +18 -0
  47. package/docs/api_reference/assets/icons.svg +1 -0
  48. package/docs/api_reference/assets/main.js +60 -0
  49. package/docs/api_reference/assets/navigation.js +1 -0
  50. package/docs/api_reference/assets/search.js +1 -0
  51. package/docs/api_reference/assets/style.css +1493 -0
  52. package/docs/api_reference/classes/DebugLogger.html +29 -0
  53. package/docs/api_reference/classes/FeatureFlagService.html +28 -0
  54. package/docs/api_reference/classes/NotificationService.html +21 -0
  55. package/docs/api_reference/classes/StreamingTTSClient.html +19 -0
  56. package/docs/api_reference/classes/VectorDatabaseService.html +63 -0
  57. package/docs/api_reference/classes/VectorMigrationService.html +27 -0
  58. package/docs/api_reference/classes/VoiceService.html +4 -0
  59. package/docs/api_reference/enums/TTSState.html +6 -0
  60. package/docs/api_reference/functions/Chat.html +1 -0
  61. package/docs/api_reference/functions/ChatModal.html +29 -0
  62. package/docs/api_reference/functions/ChatProvider.html +29 -0
  63. package/docs/api_reference/functions/FeatureFlagProvider.html +30 -0
  64. package/docs/api_reference/functions/FeedbackButton.html +29 -0
  65. package/docs/api_reference/functions/FeedbackModal.html +29 -0
  66. package/docs/api_reference/functions/Management.html +1 -0
  67. package/docs/api_reference/functions/NotificationProvider.html +29 -0
  68. package/docs/api_reference/functions/SubscriptionExpiredGuard.html +31 -0
  69. package/docs/api_reference/functions/SubscriptionExpiredModal.html +31 -0
  70. package/docs/api_reference/functions/defineCustomElement.html +1 -0
  71. package/docs/api_reference/functions/getCriticalConfig.html +1 -0
  72. package/docs/api_reference/functions/getFeatureMatrix.html +1 -0
  73. package/docs/api_reference/functions/getStreamingTTSClient.html +1 -0
  74. package/docs/api_reference/functions/getSystemConstants.html +1 -0
  75. package/docs/api_reference/functions/getTTSState.html +1 -0
  76. package/docs/api_reference/functions/handleHttpError.html +2 -0
  77. package/docs/api_reference/functions/handleSubscriptionUpgrade.html +1 -0
  78. package/docs/api_reference/functions/handleValidationError.html +2 -0
  79. package/docs/api_reference/functions/initializeCoreSystem.html +1 -0
  80. package/docs/api_reference/functions/pauseTTS.html +1 -0
  81. package/docs/api_reference/functions/previewTierUpgrade.html +1 -0
  82. package/docs/api_reference/functions/resumeTTS.html +1 -0
  83. package/docs/api_reference/functions/showInfoNotification.html +2 -0
  84. package/docs/api_reference/functions/showSuccessNotification.html +2 -0
  85. package/docs/api_reference/functions/speakWithStreaming.html +1 -0
  86. package/docs/api_reference/functions/stopTTS.html +1 -0
  87. package/docs/api_reference/functions/syncSubscriptionWithAPI.html +1 -0
  88. package/docs/api_reference/functions/updateSubscriptionTier.html +2 -0
  89. package/docs/api_reference/functions/useFeatureFlag.html +2 -0
  90. package/docs/api_reference/functions/useFeatureVisibility.html +2 -0
  91. package/docs/api_reference/functions/useFeatures.html +2 -0
  92. package/docs/api_reference/functions/useGatewayHealth.html +1 -0
  93. package/docs/api_reference/functions/useGatewayMemory.html +1 -0
  94. package/docs/api_reference/functions/useGatewayModels.html +1 -0
  95. package/docs/api_reference/functions/useGlobalTTS.html +2 -0
  96. package/docs/api_reference/functions/useNotification.html +1 -0
  97. package/docs/api_reference/functions/useNotificationService.html +6 -0
  98. package/docs/api_reference/functions/useTTS.html +2 -0
  99. package/docs/api_reference/functions/useVectorStore.html +13 -0
  100. package/docs/api_reference/functions/useVoiceStore.html +8 -0
  101. package/docs/api_reference/functions/useVoices.html +3 -0
  102. package/docs/api_reference/functions/validateEnvironment.html +1 -0
  103. package/docs/api_reference/functions/validateSystemIntegrity.html +1 -0
  104. package/docs/api_reference/index.html +756 -0
  105. package/docs/api_reference/interfaces/AIChatRequest.html +8 -0
  106. package/docs/api_reference/interfaces/AIChatResponse.html +3 -0
  107. package/docs/api_reference/interfaces/AIGenerateRequest.html +5 -0
  108. package/docs/api_reference/interfaces/AIGenerateResponse.html +3 -0
  109. package/docs/api_reference/interfaces/AIMessage.html +4 -0
  110. package/docs/api_reference/interfaces/AIModel.html +6 -0
  111. package/docs/api_reference/interfaces/AIProviderConfig.html +9 -0
  112. package/docs/api_reference/interfaces/ChatConfig.html +5 -0
  113. package/docs/api_reference/interfaces/CreateMemoryOptions.html +7 -0
  114. package/docs/api_reference/interfaces/FeatureEvaluation.html +14 -0
  115. package/docs/api_reference/interfaces/FeatureFlagConfig.html +18 -0
  116. package/docs/api_reference/interfaces/FeatureFlagContextValue.html +16 -0
  117. package/docs/api_reference/interfaces/FeatureFlagProviderProps.html +4 -0
  118. package/docs/api_reference/interfaces/FeedbackButtonProps.html +19 -0
  119. package/docs/api_reference/interfaces/FeedbackCategories.html +6 -0
  120. package/docs/api_reference/interfaces/FeedbackModalProps.html +4 -0
  121. package/docs/api_reference/interfaces/FeedbackPriorities.html +5 -0
  122. package/docs/api_reference/interfaces/FeedbackRequest.html +12 -0
  123. package/docs/api_reference/interfaces/FeedbackResponse.html +7 -0
  124. package/docs/api_reference/interfaces/FileUploadResult.html +4 -0
  125. package/docs/api_reference/interfaces/GatewayChatRequest.html +12 -0
  126. package/docs/api_reference/interfaces/GatewayChatResponse.html +7 -0
  127. package/docs/api_reference/interfaces/GatewayContract.html +4 -0
  128. package/docs/api_reference/interfaces/GatewayGenerateRequest.html +8 -0
  129. package/docs/api_reference/interfaces/GatewayGenerateResponse.html +12 -0
  130. package/docs/api_reference/interfaces/GatewayHealthResponse.html +5 -0
  131. package/docs/api_reference/interfaces/GatewayMemoryRecord.html +7 -0
  132. package/docs/api_reference/interfaces/GatewayMemoryResponse.html +4 -0
  133. package/docs/api_reference/interfaces/GatewayMessage.html +5 -0
  134. package/docs/api_reference/interfaces/GatewayMessageContent.html +4 -0
  135. package/docs/api_reference/interfaces/GatewayModel.html +9 -0
  136. package/docs/api_reference/interfaces/GatewayModelsResponse.html +2 -0
  137. package/docs/api_reference/interfaces/MemorySearchFilters.html +5 -0
  138. package/docs/api_reference/interfaces/MigrationProgress.html +6 -0
  139. package/docs/api_reference/interfaces/MigrationStatus.html +7 -0
  140. package/docs/api_reference/interfaces/NotificationConfig.html +5 -0
  141. package/docs/api_reference/interfaces/NotificationContextType.html +6 -0
  142. package/docs/api_reference/interfaces/NotificationProviderProps.html +4 -0
  143. package/docs/api_reference/interfaces/PackageSettings.html +11 -0
  144. package/docs/api_reference/interfaces/SearchOptions.html +6 -0
  145. package/docs/api_reference/interfaces/SearchResult.html +5 -0
  146. package/docs/api_reference/interfaces/SubscriptionExpiredGuardProps.html +7 -0
  147. package/docs/api_reference/interfaces/SubscriptionExpiredModalProps.html +6 -0
  148. package/docs/api_reference/interfaces/TTSOptions.html +5 -0
  149. package/docs/api_reference/interfaces/TTSProgress.html +6 -0
  150. package/docs/api_reference/interfaces/TrialUsage.html +6 -0
  151. package/docs/api_reference/interfaces/UploadRequest.html +9 -0
  152. package/docs/api_reference/interfaces/UseTTSReturn.html +14 -0
  153. package/docs/api_reference/interfaces/VectorDocument.html +11 -0
  154. package/docs/api_reference/interfaces/VectorMemory.html +12 -0
  155. package/docs/api_reference/interfaces/VectorMemoryMetadata.html +7 -0
  156. package/docs/api_reference/interfaces/VectorStoreStatus.html +7 -0
  157. package/docs/api_reference/interfaces/VoiceModelsResponse.html +4 -0
  158. package/docs/api_reference/interfaces/VoiceState.html +12 -0
  159. package/docs/api_reference/media/02_gateway_api.md +64 -0
  160. package/docs/api_reference/media/05_cli_quickstart.md +89 -0
  161. package/docs/api_reference/media/LICENSE +43 -0
  162. package/docs/api_reference/media/PRE-PUSH-CHECKLIST.md +10 -0
  163. package/docs/api_reference/media/PROTECTION-NOTICE.md +60 -0
  164. package/docs/api_reference/media/PROTECTION-README.md +41 -0
  165. package/docs/api_reference/media/README-1.md +23 -0
  166. package/docs/api_reference/media/README.md +9 -0
  167. package/docs/api_reference/modules.html +123 -0
  168. package/docs/api_reference/types/FeatureKey.html +2 -0
  169. package/docs/api_reference/types/FeatureMatrix.html +2 -0
  170. package/docs/api_reference/types/GatewayQueryOptions.html +1 -0
  171. package/docs/api_reference/types/LogContext.html +14 -0
  172. package/docs/api_reference/types/SubscriptionTier.html +2 -0
  173. package/docs/api_reference/variables/DEFAULT_TIER_FEATURES.html +2 -0
  174. package/docs/api_reference/variables/FeatureFlagContext.html +1 -0
  175. package/docs/api_reference/variables/OSS_DEFAULT_FEATURES.html +2 -0
  176. package/docs/api_reference/variables/SYSTEM_FLAGS.html +1 -0
  177. package/docs/api_reference/variables/authenticationService.html +1 -0
  178. package/docs/api_reference/variables/debugLogger-1.html +1 -0
  179. package/docs/api_reference/variables/featureFlagService-1.html +2 -0
  180. package/docs/api_reference/variables/notificationService-1.html +1 -0
  181. package/docs/api_reference/variables/vectorDatabaseService-1.html +1 -0
  182. package/docs/api_reference/variables/vectorMigrationService-1.html +1 -0
  183. package/docs/api_reference/variables/voiceService-1.html +1 -0
  184. package/package.json +103 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chat/chat.tsx","../src/chat/custom-logo.tsx","#style-inject:#style-inject","../src/chat/chat.css","../src/services/branding/brandingService.ts","../src/store/aiQueryStore.ts","../src/chat/chat-scroll-to-bottom-button.tsx","../src/chat/bandit-chat-logo.tsx","../src/chat/chat-messages.tsx","../src/modals/chat-modal/ai-response-text-field.tsx","../src/shared/DocumentCard.tsx","../src/chat/hooks/useKnowledgeStore.tsx","../src/store/knowledgeStore.ts","../src/services/prompts/conversationStarters.ts","../src/util.ts","../src/prompts/getStableQuestionPrompt.ts","../src/services/prompts/promptUtils.ts","../src/services/notification/notificationService.ts","../src/services/prompts/moodDetection.ts","../src/services/prompts/detectUserInterestAndExcitement.ts","../src/services/prompts/documentSummarization.ts","../src/services/prompts/documentRelevance.ts","../src/services/prompts/dateTimeContext.ts","../src/store/memoryStore.ts","../src/services/embedding/embeddingService.tsx","../src/services/vectorDatabase/vectorDatabaseService.ts","../src/hooks/useVectorStore.tsx","../src/services/vectorDatabase/vectorMigrationService.ts","../src/store/authenticationStore.ts","../src/hooks/useFeatures.ts","../src/contexts/FeatureFlagContext.tsx","../src/types/featureFlags.ts","../src/store/conversationSyncStore.ts","../src/store/conversationStore.ts","../src/util/conversationMigration.ts","../src/store/conversationSyncEvents.ts","../src/store/projectStore.ts","../src/services/auth/authenticationService.ts","../src/services/conversationSync/conversationSyncService.ts","../src/modals/knowlege/knowledge-file-modal.tsx","../src/utils/lowlight.ts","../src/utils/markdownRendering.tsx","../src/modals/chat-modal/ai-response-action-bar.tsx","../src/store/voiceStore.ts","../src/services/tts/voiceService.ts","../src/services/tts/streaming-tts.ts","../src/services/tts/tts-client.ts","../src/services/tts/ttsSanitizer.ts","../src/hooks/useTTS.ts","../src/components/StreamingMarkdown.tsx","../src/chat/chat-input.tsx","../src/services/stt/transcriber.tsx","../src/services/stt/sound-recorder.service.ts","../src/services/stt/create-audio-blob.ts","../src/services/stt/stt-client.ts","../src/chat/memory-modal.tsx","../src/components/feedback/FeedbackModal.tsx","../src/store/voiceModeStore.ts","../src/chat/hooks/useAIProvider.tsx","../src/chat/hooks/useMemoryEnhancer.tsx","../src/chat/hooks/useMoodEngine.tsx","../src/store/mcpToolsStore.ts","../src/services/mcp/mcpService.ts","../src/hooks/useAutoScroll.ts","../src/hooks/useNetworkStatus.ts","../src/chat/chat-app-bar.tsx","../src/chat/conversation-drawer.tsx","../src/chat/project-management-modal.tsx","../src/chat/move-conversation-modal.tsx","../src/chat/simple-conversation-item.tsx","../src/chat/project-header.tsx","../src/chat/enhanced-mobile-conversations-modal.tsx","../src/chat/hooks/useConversationNameGenerator.tsx","../src/chat/query-suggestion-picker.tsx","../src/theme/banditTheme.ts","../src/theme/corporateTheme.ts","../src/theme/neutralTheme.ts","../src/theme/cyberPunkTheme.ts","../src/theme/dawnTheme.ts","../src/theme/mistTheme.ts","../src/theme/sageTheme.ts","../src/theme/stoneTheme.ts","../src/theme/oceanTheme.ts","../src/theme/neonTheme.ts","../src/theme/forestTheme.ts","../src/theme/sunsetTheme.ts","../src/theme/volcanicTheme.ts","../src/theme/themeMap.ts","../../../src/pages/under-review.tsx","../src/components/feedback/FeedbackButton.tsx","../src/hooks/useNotificationService.ts","../src/shared/components/NotificationProvider.tsx","../src/components/ConnectionStatus.tsx","../src/hooks/useVoiceMode.ts"],"sourcesContent":["/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-ADA1-C10301\nconst __banditFingerprint_chat_chattsx = 'BL-FP-CFC9B2-7718';\nconst __auditTrail_chat_chattsx = 'BL-AU-MGOIKVUY-9KCZ';\n// File: chat.tsx | Path: src/chat/chat.tsx | Hash: ada17718\n\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport CustomLogo from \"./custom-logo\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport { Box, ThemeProvider, CssBaseline } from \"@mui/material\";\nimport { useAIQueryStore } from \"../store/aiQueryStore\";\nimport { useModelStore } from \"../store/modelStore\";\nimport { Navigate } from \"react-router-dom\";\nimport ChatScrollToBottomButton from \"./chat-scroll-to-bottom-button\";\nimport BanditChatLogo from \"./bandit-chat-logo\";\nimport ChatMessages from \"./chat-messages\";\nimport ChatInput from \"./chat-input\";\nimport { useAIProvider } from \"./hooks/useAIProvider\";\nimport { SCROLL_STATE_CHANGED_EVENT, useAutoScroll } from \"../hooks/useAutoScroll\";\nimport { useNetworkStatus } from \"../hooks/useNetworkStatus\";\nimport \"./chat.css\";\nimport { useVoiceStore } from \"../store/voiceStore\";\nimport { useAIProviderStore } from \"../store/aiProviderStore\";\nimport { useTTS } from \"../hooks/useTTS\";\nimport ChatAppBar from \"./chat-app-bar\";\nimport { useConversationStore } from \"../store/conversationStore\";\nimport { useConversationNameGenerator } from \"./hooks/useConversationNameGenerator\";\nimport { usePackageSettingsStore } from \"../store/packageSettingsStore\";\nimport { QuerySuggestionPicker } from \"./query-suggestion-picker\";\nimport { authenticationService } from \"../services/auth/authenticationService\";\nimport themeMap from \"../theme/themeMap\";\nimport { banditDarkTheme } from \"../theme/banditTheme\";\nimport UnderReview from \"../../../../src/pages/under-review\";\nimport { usePreferencesStore } from \"../store/preferencesStore\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport { stopTTS } from \"../services/tts/streaming-tts\";\nimport { FeedbackButton } from \"../components/feedback/FeedbackButton\";\nimport { useNotificationService } from \"../hooks/useNotificationService\";\nimport { ConnectionStatus } from \"../components/ConnectionStatus\";\nimport { useVoiceMode } from \"../hooks/useVoiceMode\";\nimport { useVoiceModeStore } from \"../store/voiceModeStore\";\nimport { sanitizeForTTS } from \"../services/tts/ttsSanitizer\";\nimport { StoredBanditConfigRecord, StoredBrandingConfig } from \"../types/config\";\nimport { useFeatureFlag } from \"../contexts/FeatureFlagContext\";\n\nconst ChatContent = () => {\n const packageSettings = usePackageSettingsStore((state) => state.settings);\n const featureFlag = useFeatureFlag();\n const { isOSSMode } = featureFlag;\n const ossMode = isOSSMode() || !packageSettings?.featureFlags?.subscriptionType;\n const notificationService = useNotificationService();\n const [selectedTheme, setSelectedTheme] = useState<string | null>(null);\n const [themeLoading, setThemeLoading] = useState(true);\n \n // Check for super-admin role\n const token = authenticationService.getToken();\n const claims = token ? authenticationService.parseJwtClaims(token) : null;\n const banditTheme = themeMap[selectedTheme ?? \"bandit-dark\"] || banditDarkTheme;\n\n const {\n inputValue,\n setInputValue,\n setResponse,\n history,\n addHistory,\n setComponentStatus,\n setPreviousQuestion,\n componentStatus,\n hydrated,\n } = useAIQueryStore();\n\n const { availableModels, selectedModel, setSelectedModel } = useModelStore();\n const { \n availableVoices, \n selectedVoice, \n setSelectedVoice,\n isServiceAvailable,\n loadVoicesFromAPI,\n initialized\n } = useVoiceStore();\n const isVoiceModeEnabled = useVoiceModeStore((state) => state.enabled);\n const previousVoiceModeEnabledRef = useRef(isVoiceModeEnabled);\n const historyRef = useRef(history);\n\n useEffect(() => {\n historyRef.current = history;\n }, [history]);\n \n // TTS functionality\n const {\n speak: ttsSpeak,\n stop: ttsStop,\n isAvailable: isTTSAvailable,\n } = useTTS();\n \n // Initialize voice loading when component mounts\n useEffect(() => {\n // Force voice loading with a small delay to ensure package settings are ready\n const timer = setTimeout(() => {\n const isAuthenticated = authenticationService.isAuthenticated();\n \n if (!initialized || availableVoices.length === 0) {\n if (token && isAuthenticated) {\n debugLogger.debug('Chat: Voices not initialized or unavailable, attempting to load from API');\n loadVoicesFromAPI();\n } else {\n debugLogger.debug('Chat: No valid JWT token available - skipping voice loading');\n }\n }\n }, 500); // 500ms delay to ensure gateway URL is configured\n\n return () => clearTimeout(timer);\n }, [initialized, availableVoices.length, loadVoicesFromAPI, token]);\n\n // Also try to load voices when package settings become available\n useEffect(() => {\n const isAuthenticated = authenticationService.isAuthenticated();\n \n if (packageSettings?.gatewayApiUrl && availableVoices.length === 0 && !initialized) {\n if (token && isAuthenticated) {\n debugLogger.debug('Chat: Gateway URL available and no voices loaded, attempting to load from API');\n loadVoicesFromAPI();\n } else {\n debugLogger.debug('Chat: Gateway URL available but no valid JWT token - skipping voice loading');\n }\n }\n }, [packageSettings?.gatewayApiUrl, availableVoices.length, initialized, loadVoicesFromAPI, token]);\n\n const provider = useAIProviderStore((state) => state.provider);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [pastedImages, setPastedImages] = useState<string[]>([]);\n const inputContainerRef = useRef<HTMLDivElement | null>(null);\n const [inputHeight, setInputHeight] = useState(80);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [pendingMessage, setPendingMessage] = useState<{\n question: string;\n images?: string[];\n } | null>(null);\n\n const { conversations, currentId, _hasHydrated, hydrate } = useConversationStore();\n const [isMobile, setIsMobile] = useState(false);\n const [drawerOpen, setDrawerOpen] = useState(false);\n const { generateName } = useConversationNameGenerator();\n const { preferences } = usePreferencesStore();\n\n // Enhanced UX with auto-scroll and network awareness (after isMobile is defined)\n const { containerRef: chatContainerRef, targetRef: scrollTargetRef, scrollToBottom, getScrollState } = useAutoScroll({\n threshold: 16, // Smaller threshold so the button shows with light upward scrolls\n behavior: \"smooth\",\n isMobile: isMobile,\n });\n const chatContainerEl = chatContainerRef.current;\n const scrollTargetEl = scrollTargetRef.current;\n const { isSlowConnection, connectionQuality, trackRequestStart, trackRequestEnd } = useNetworkStatus();\n \n const [showScrollToBottom, setShowScrollToBottom] = useState(false);\n const [streamBuffer, setStreamBuffer] = useState(\"\");\n const [responseStarted, setResponseStarted] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const initialLogoState = history.length === 0;\n const [logoVisible, setLogoVisible] = useState(initialLogoState);\n const [logoShouldRender, setLogoShouldRender] = useState(initialLogoState);\n\n // Keep previous message slightly visible during the first moments of a new stream\n const streamingGraceUntilRef = useRef<number>(0);\n const GRACE_MS = 450; // duration of scroll grace\n const GRACE_OFFSET_DESKTOP = 28; // px reserved above bottom to keep previous answer visible\n const GRACE_OFFSET_MOBILE = 20;\n\n // Track whether we should follow the stream based on user's position at send time\n const followStreamRef = useRef<boolean>(true);\n const lastSpokenResponseRef = useRef<string | null>(null);\n const previousConversationIdRef = useRef<string | null>(null);\n const logoFadeTimeoutRef = useRef<number | null>(null);\n\n const [branding, setBranding] = useState<{ brandingText?: string, logoBase64?: string } | null>(null);\n const [brandingLoading, setBrandingLoading] = useState(true);\n const isBrandingLoadInProgressRef = useRef(false);\n const logoOnly = history.length === 0 && !brandingLoading;\n\n useEffect(() => {\n const isEmptyConversation = (history?.length ?? 0) === 0;\n const isSending = Boolean(pendingMessage);\n const shouldShowLogo = isEmptyConversation && !isSending;\n\n if (shouldShowLogo) {\n if (logoFadeTimeoutRef.current) {\n window.clearTimeout(logoFadeTimeoutRef.current);\n logoFadeTimeoutRef.current = null;\n }\n\n setLogoShouldRender((prev) => {\n if (prev) return prev;\n return true;\n });\n\n setLogoVisible((prev) => {\n if (prev) return prev;\n return true;\n });\n\n return;\n }\n\n setLogoVisible((prev) => {\n if (!prev) return prev;\n return false;\n });\n\n if (!logoFadeTimeoutRef.current) {\n logoFadeTimeoutRef.current = window.setTimeout(() => {\n setLogoShouldRender(false);\n logoFadeTimeoutRef.current = null;\n }, 500);\n }\n }, [history, pendingMessage]);\n\n useEffect(() => () => {\n if (logoFadeTimeoutRef.current) {\n window.clearTimeout(logoFadeTimeoutRef.current);\n logoFadeTimeoutRef.current = null;\n }\n }, []);\n\n // Ensure conversation store is hydrated on component mount\n useEffect(() => {\n // When a new stream starts, start a short grace window to avoid snapping to absolute bottom\n if (isStreaming && streamBuffer.trim() === \"\") {\n streamingGraceUntilRef.current = Date.now() + GRACE_MS;\n }\n }, [isStreaming, streamBuffer]);\n\n useEffect(() => {\n if (!isStreaming) return;\n const container = chatContainerRef.current;\n if (!container) return;\n const now = Date.now();\n if (now <= streamingGraceUntilRef.current && followStreamRef.current) {\n const offset = isMobile ? GRACE_OFFSET_MOBILE : GRACE_OFFSET_DESKTOP;\n const targetTop = Math.max(0, container.scrollHeight - container.clientHeight - offset);\n // Use smooth behavior to keep motion gentle\n container.scrollTo({ top: targetTop, behavior: \"smooth\" });\n }\n }, [streamBuffer, isStreaming, isMobile, chatContainerRef]);\n\n useEffect(() => {\n if (!_hasHydrated) {\n debugLogger.info(\"Chat component triggering conversation store hydration\");\n hydrate();\n }\n }, [_hasHydrated, hydrate]);\n\n useEffect(() => {\n const loadBrandingAndTheme = async () => {\n // Prevent concurrent loading\n if (isBrandingLoadInProgressRef.current) {\n debugLogger.warn(\"Branding loading already in progress, skipping\");\n return;\n }\n \n // Check if we're on management page and add delay to avoid conflicts\n const isManagementPage = window.location.pathname.includes('/management');\n if (isManagementPage) {\n debugLogger.info(\"Chat: Detected management page, adding delay before branding load\");\n await new Promise(resolve => setTimeout(resolve, 200));\n \n // Double-check if branding is still not being loaded\n if (isBrandingLoadInProgressRef.current) {\n debugLogger.info(\"Chat: Management branding load detected, skipping chat branding load\");\n return;\n }\n }\n \n isBrandingLoadInProgressRef.current = true;\n \n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n const config = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n \n const brandingConfig = config?.branding;\n\n debugLogger.info(\"Branding load attempt\", {\n hasConfig: !!config,\n hasBrandingObject: !!brandingConfig,\n brandingContent: brandingConfig ? {\n hasText: !!brandingConfig.brandingText,\n hasLogo: !!brandingConfig.logoBase64,\n hasTheme: !!brandingConfig.theme,\n textValue: brandingConfig.brandingText,\n themeValue: brandingConfig.theme\n } : null\n });\n \n let loadedFromIndexedDB = false;\n let cdnBranding: StoredBrandingConfig | null = null;\n \n // NUCLEAR OPTION: If IndexedDB has ANY branding object at all, NEVER touch CDN\n const hasAnyBrandingObject = !!brandingConfig;\n \n // Enhanced protection: also check if any meaningful branding data exists\n const hasAnyBrandingData = brandingConfig && (\n brandingConfig.brandingText || \n brandingConfig.logoBase64 || \n brandingConfig.theme ||\n brandingConfig.hasTransparentLogo !== undefined ||\n brandingConfig.userSaved !== undefined\n );\n \n // Check if there's any evidence of user models (indicating user has used Management)\n const hasUserModels = await indexedDBService.getAll<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n storeConfigs\n );\n const hasCustomContent = hasUserModels.some(entry => \n entry.id !== \"main\" && \n entry.id !== \"deletedModels\" && \n entry.id !== \"preferences\" && \n entry.id !== \"mcpTools\" && \n entry.id !== \"knowledgeDocs\"\n );\n \n // ABSOLUTE NUCLEAR PROTECTION: If there's ANY trace of branding or user activity, skip CDN entirely\n const shouldSkipCDN = hasAnyBrandingObject || hasAnyBrandingData || hasCustomContent;\n \n if (shouldSkipCDN) {\n debugLogger.info(\"🚫 NUCLEAR PROTECTION ACTIVATED - COMPLETELY SKIPPING CDN\", {\n hasAnyBrandingObject,\n hasAnyBrandingData,\n hasCustomContent,\n brandingKeys: brandingConfig ? Object.keys(brandingConfig) : [],\n brandingValues: brandingConfig\n });\n \n // Use whatever is in IndexedDB, even if empty values\n if (brandingConfig) {\n setBranding({\n brandingText: brandingConfig.brandingText || \"\",\n logoBase64: brandingConfig.logoBase64 ?? undefined\n });\n \n if (brandingConfig.brandingText) {\n document.title = brandingConfig.brandingText;\n }\n \n setSelectedTheme(brandingConfig.theme || \"bandit-dark\");\n } else {\n setBranding(null);\n setSelectedTheme(\"bandit-dark\");\n }\n loadedFromIndexedDB = true;\n }\n \n if (!loadedFromIndexedDB) {\n // Enhanced protection: Double-check that we should really load from CDN\n if (shouldSkipCDN) {\n debugLogger.warn(\"🚫 CDN LOAD BLOCKED: Branding protection still active even with !loadedFromIndexedDB\");\n setBranding(null);\n setSelectedTheme(\"bandit-dark\");\n loadedFromIndexedDB = true; // Prevent further CDN attempts\n } else {\n // No meaningful branding in IndexedDB, try to load from CDN config\n debugLogger.info(\"No meaningful branding found in IndexedDB, checking CDN config\", {\n hasConfig: !!config,\n hasBrandingObject: !!brandingConfig,\n brandingKeys: brandingConfig ? Object.keys(brandingConfig) : []\n });\n const packageSettings = usePackageSettingsStore.getState().getSettings();\n \n if (packageSettings?.brandingConfigUrl) {\n try {\n const configResponse = await fetch(packageSettings.brandingConfigUrl);\n const configData: unknown = await configResponse.json();\n if (configData && typeof configData === \"object\" && \"branding\" in configData) {\n const maybeBranding = (configData as { branding?: unknown }).branding;\n if (maybeBranding && typeof maybeBranding === \"object\") {\n cdnBranding = maybeBranding as StoredBrandingConfig;\n }\n }\n } catch (err) {\n debugLogger.warn(\"Failed to load CDN branding config:\", { error: err });\n }\n }\n\n if (cdnBranding) {\n debugLogger.info(\"Loading branding and theme from CDN config\");\n \n // Set branding state\n setBranding({\n brandingText: cdnBranding.brandingText,\n logoBase64: cdnBranding.logoBase64 ?? undefined\n });\n \n // Set document title\n if (cdnBranding.brandingText) {\n document.title = cdnBranding.brandingText;\n }\n \n // Set theme\n setSelectedTheme(cdnBranding.theme || \"bandit-dark\");\n \n // NEVER save CDN branding to IndexedDB if ANY branding already exists\n // This prevents CDN from ever overwriting existing branding\n try {\n // Double-check that no branding exists before saving\n const existingConfig = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n const hasAnyExistingBranding = existingConfig?.branding && (\n existingConfig.branding.brandingText || \n existingConfig.branding.logoBase64 || \n existingConfig.branding.theme\n );\n \n if (!hasAnyExistingBranding) {\n debugLogger.info(\"Saving CDN branding to IndexedDB as absolutely no branding exists\");\n \n // Get current config to preserve any other data\n const currentConfig: StoredBanditConfigRecord = existingConfig ?? { id: \"main\" };\n \n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", {\n ...currentConfig,\n id: \"main\",\n branding: {\n ...currentConfig.branding,\n ...cdnBranding,\n userSaved: false, // Mark as CDN-loaded, not user-saved\n },\n }, storeConfigs);\n \n debugLogger.info(\"CDN branding saved successfully\");\n } else {\n debugLogger.warn(\"SKIPPING CDN save - existing branding detected!\", {\n existingBranding: {\n hasText: !!existingConfig.branding?.brandingText,\n hasLogo: !!existingConfig.branding?.logoBase64,\n hasTheme: !!existingConfig.branding?.theme,\n userSaved: existingConfig.branding?.userSaved\n }\n });\n }\n } catch (putError) {\n debugLogger.warn(\"Failed to save CDN branding to IndexedDB:\", { error: putError });\n }\n } else {\n // Fall back to Bandit defaults\n debugLogger.info(\"Using Bandit default branding and theme\");\n setBranding(null);\n setSelectedTheme(\"bandit-dark\");\n }\n }\n }\n } catch (err) {\n debugLogger.error(\"Failed to load branding and theme from IndexedDB\", {\n error: err instanceof Error ? err.message : String(err),\n });\n // Fallback to default on error\n setBranding(null);\n setSelectedTheme(\"bandit-dark\");\n } finally {\n setThemeLoading(false);\n setBrandingLoading(false);\n isBrandingLoadInProgressRef.current = false;\n }\n };\n\n loadBrandingAndTheme();\n\n // Listen for custom theme change events\n const handleThemeChange = () => {\n debugLogger.info(\"Chat received bandit-theme-changed event - checking if reload needed\");\n \n // Don't reload if branding is already being loaded by another component\n if (isBrandingLoadInProgressRef.current) {\n debugLogger.info(\"Chat: Skipping branding reload - already in progress\");\n return;\n }\n \n // Add a small delay to avoid race conditions with Management component\n setTimeout(() => {\n if (!isBrandingLoadInProgressRef.current) {\n debugLogger.info(\"Chat: Reloading branding after theme change\");\n loadBrandingAndTheme();\n } else {\n debugLogger.info(\"Chat: Skipping delayed branding reload - still in progress\");\n }\n }, 100);\n };\n\n window.addEventListener('bandit-theme-changed', handleThemeChange);\n\n return () => {\n window.removeEventListener('bandit-theme-changed', handleThemeChange);\n };\n }, []);\n\n useEffect(() => {\n if (!chatContainerEl) return;\n const blurInputOnScroll = () => inputRef.current?.blur();\n chatContainerEl.addEventListener(\"scroll\", blurInputOnScroll);\n return () => chatContainerEl.removeEventListener(\"scroll\", blurInputOnScroll);\n }, [chatContainerEl]);\n\n useEffect(() => {\n const handleResize = () => setIsMobile(window.innerWidth <= 768);\n handleResize();\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n useEffect(() => {\n const setViewportHeight = () => {\n document.documentElement.style.setProperty(\n \"--vh\",\n `${window.innerHeight * 0.01}px`\n );\n };\n setViewportHeight();\n window.addEventListener(\"resize\", setViewportHeight);\n return () => window.removeEventListener(\"resize\", setViewportHeight);\n }, []);\n\n // Minimal visibility logic: show only when there is scrollable content and not at the bottom\n useEffect(() => {\n if (!chatContainerEl) return;\n\n let rafId: number | null = null;\n const update = () => {\n if (rafId) cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(() => {\n const s = getScrollState();\n setShowScrollToBottom(s.canScroll && !s.isNearBottom);\n });\n };\n\n update();\n // Listen to both native scroll and our custom state-changed event\n chatContainerEl.addEventListener('scroll', update, { passive: true });\n chatContainerEl.addEventListener(SCROLL_STATE_CHANGED_EVENT, update as EventListener);\n return () => {\n if (rafId) cancelAnimationFrame(rafId);\n chatContainerEl.removeEventListener('scroll', update as EventListener);\n chatContainerEl.removeEventListener(SCROLL_STATE_CHANGED_EVENT, update as EventListener);\n };\n }, [chatContainerEl, getScrollState]);\n\n // IntersectionObserver-based visibility: observe the bottom sentinel (robust to padding)\n useEffect(() => {\n if (!chatContainerEl) return;\n\n let observer: IntersectionObserver | null = null;\n let rafId: number | null = null;\n let cancelled = false;\n\n const setup = () => {\n if (cancelled) return;\n const target = scrollTargetRef.current ?? scrollTargetEl;\n if (!target) {\n // Try again on the next frame (child may not be mounted yet)\n rafId = requestAnimationFrame(setup);\n return;\n }\n\n // If the sentinel is on-screen, we're at/near the bottom; otherwise show the button\n observer = new IntersectionObserver(\n (entries) => {\n const [entry] = entries;\n const atBottom = entry?.isIntersecting ?? false;\n const s = getScrollState();\n setShowScrollToBottom(s.canScroll && !atBottom);\n },\n {\n root: chatContainerEl,\n threshold: 0.0,\n // Account for bottom padding (inputHeight) so \"near bottom\" counts as bottom\n rootMargin: `0px 0px ${Math.max(24, inputHeight + 48)}px 0px`,\n }\n );\n\n observer.observe(target);\n };\n\n rafId = requestAnimationFrame(setup);\n return () => {\n cancelled = true;\n if (rafId) cancelAnimationFrame(rafId);\n if (observer) observer.disconnect();\n };\n }, [chatContainerEl, scrollTargetEl, scrollTargetRef, getScrollState, inputHeight, history.length]);\n\n // Also update scroll button when content changes - but avoid during transitions\n useEffect(() => {\n // If we're transitioning between loading and content, delay the scroll state update\n const isTransitioning = isStreaming || (streamBuffer.trim() === \"\");\n const delay = isTransitioning ? 400 : 100; // Wait for transitions to complete\n \n const timer = setTimeout(() => {\n const scrollState = getScrollState();\n setShowScrollToBottom(scrollState.canScroll && !scrollState.isNearBottom);\n }, delay); // Small delay to let DOM update\n\n return () => clearTimeout(timer);\n }, [history, streamBuffer, getScrollState, isStreaming]);\n\n // Auto-scroll when new content is added - with smarter completion behavior\n useLayoutEffect(() => {\n const scrollState = getScrollState();\n const now = Date.now();\n\n if (isStreaming && scrollState.shouldAutoScroll && followStreamRef.current) {\n // During the initial grace window, avoid snapping to bottom so the previous answer stays visible\n if (now <= streamingGraceUntilRef.current) {\n return; // Grace effect handles offset scrolling\n }\n // After grace: follow the stream to bottom\n const scrollTimer = setTimeout(() => {\n scrollToBottom();\n }, 50);\n return () => clearTimeout(scrollTimer);\n } else if (!isStreaming && scrollState.shouldAutoScroll) {\n // When streaming completes: wait for transition to complete before scrolling\n const scrollTimer = setTimeout(() => {\n const container = chatContainerRef.current;\n if (container && history.length > 0) {\n const lastMessage = history[history.length - 1];\n const isLongResponse = lastMessage?.answer && lastMessage.answer.length > 500;\n // Decide whether to follow the stream for the next turn based on current position\n followStreamRef.current = getScrollState().isNearBottom;\n\n if (isMobile) {\n // Mobile: Always scroll to show input on completion (better UX for thumb typing)\n scrollToBottom();\n } else if (!isLongResponse) {\n // Desktop: Auto-scroll for short responses\n scrollToBottom();\n }\n // For long responses on desktop: let user decide (don't auto-scroll)\n }\n \n // Update button visibility after auto-scroll decision\n if (!isMobile) {\n setTimeout(() => {\n const s = getScrollState();\n setShowScrollToBottom(s.canScroll && !s.isNearBottom);\n }, 100);\n }\n }, 350); // Wait for transition to complete\n return () => clearTimeout(scrollTimer);\n }\n // else: do nothing\n }, [history, isStreaming, scrollToBottom, getScrollState, isMobile, chatContainerRef]);\n\n useEffect(() => {\n const observer = new ResizeObserver(() => {\n if (inputContainerRef.current)\n setInputHeight(inputContainerRef.current.offsetHeight);\n });\n if (inputContainerRef.current) {\n observer.observe(inputContainerRef.current);\n setInputHeight(inputContainerRef.current.offsetHeight);\n }\n return () => observer.disconnect();\n }, []);\n useEffect(() => {\n if (!hydrated || !_hasHydrated) return;\n\n if (currentId === null) {\n useAIQueryStore.setState({ history: [] });\n setInputValue(\"\");\n setResponse(\"\");\n setComponentStatus(\"Idle\");\n previousConversationIdRef.current = null;\n return;\n }\n\n const match = conversations.find((c) => c.id === currentId);\n if (!match) {\n return;\n }\n\n const conversationChanged = previousConversationIdRef.current !== match.id;\n\n useAIQueryStore.setState({ history: match.history });\n\n if (conversationChanged) {\n previousConversationIdRef.current = match.id;\n\n // Reset scroll button state when switching conversations\n setShowScrollToBottom(false);\n\n setInputValue(\"\");\n setResponse(\"\");\n setComponentStatus(\"Idle\");\n setLogoVisible(true); // Explicitly show the logo when a new conversation starts or is hydrated\n\n // Update inputHeight in case of hard reload\n if (inputContainerRef.current) {\n setInputHeight(inputContainerRef.current.offsetHeight);\n }\n\n // Ensure scroll after layout on conversation switch or hard reload\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n scrollToBottom();\n // Update scroll button state after conversation loads and scrolls\n setTimeout(() => {\n const scrollState = getScrollState();\n setShowScrollToBottom(scrollState.canScroll && !scrollState.isNearBottom);\n }, 150); // Allow time for scroll animation to complete\n });\n });\n return;\n }\n\n // For same conversation updates, keep the previous id reference but do not clear the input\n previousConversationIdRef.current = match.id;\n }, [\n hydrated,\n _hasHydrated,\n currentId,\n conversations,\n scrollToBottom,\n getScrollState,\n setInputValue,\n setResponse,\n setComponentStatus\n ]);\n\n // Debug conversation store state\n useEffect(() => {\n debugLogger.info(\"Chat component conversation state\", {\n hasHydrated: _hasHydrated,\n conversationCount: conversations.length,\n currentId,\n firstFewConversations: conversations.slice(0, 3).map(c => ({ id: c.id, name: c.name, historyLength: c.history.length })),\n storeState: \"main-chat\"\n });\n }, [_hasHydrated, conversations, currentId]);\n\n // Initial scroll button state check after component fully loads\n useEffect(() => {\n if (!_hasHydrated || !chatContainerEl) return;\n\n // Sync via rAF to catch layout after content renders\n let rafId: number | null = null;\n const sync = () => {\n rafId = requestAnimationFrame(() => {\n const scrollState = getScrollState();\n setShowScrollToBottom(scrollState.canScroll && !scrollState.isNearBottom);\n });\n };\n sync();\n return () => { if (rafId) cancelAnimationFrame(rafId); };\n }, [_hasHydrated, chatContainerEl, getScrollState, history.length]);\n\n const aiProvider = useAIProvider({\n overrideComponentStatus: setComponentStatus,\n setIsSubmitting,\n setIsStreaming,\n setResponseStarted,\n setResponse,\n setStreamBuffer,\n setPreviousQuestion,\n addHistory,\n setInputValue,\n setPastedImages,\n setPendingMessage,\n setLogoVisible,\n inputRef,\n isMobile,\n history,\n onError: (error) => {\n // Use the notification service to handle HTTP errors properly\n notificationService?.handleHttpError(error);\n },\n });\n\n const handleStop = useCallback(() => {\n try {\n aiProvider.cancel();\n } catch (error) {\n debugLogger.warn(\"AI provider cancel failed\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }, [aiProvider]);\n\n const handleVoiceInterrupt = useCallback(() => {\n try {\n ttsStop();\n } catch (error) {\n debugLogger.warn(\"Voice interrupt failed to stop TTS hook\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n try {\n stopTTS();\n } catch (error) {\n debugLogger.warn(\"Voice interrupt failed to stop streaming TTS\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n if (isStreaming) {\n handleStop();\n }\n }, [ttsStop, isStreaming, handleStop]);\n\n const handleSend = useCallback(\n (question: string, images: string[], displayQuestion?: string) => {\n const requestStartTime = trackRequestStart();\n \n // Immediate feedback - set pending message and loading state right away\n const questionForDisplay = displayQuestion || question;\n setPendingMessage({ question: questionForDisplay, images });\n setIsStreaming(true); // Show skeleton immediately\n setResponseStarted(true); // Show loading feedback\n setStreamBuffer(\"\"); // Clear any previous buffer\n \n // Immediately add placeholder entry to history for smooth UX\n const { addToCurrent } = useConversationStore.getState();\n addToCurrent({ question: questionForDisplay, answer: \"...\", images });\n \n const getCurrentModel = useModelStore.getState().getCurrentModel;\n const systemPrompt =\n getCurrentModel()?.systemPrompt ?? \"You are a helpful assistant.\";\n\n const { currentId, conversations, createConversation, renameConversation } =\n useConversationStore.getState();\n const existing = conversations.find((c) => c.id === currentId);\n\n if (!existing) {\n generateName(question).then((name) => {\n createConversation(name || question);\n\n setLogoVisible(true);\n\n setTimeout(() => {\n const newCurrentId = useConversationStore.getState().currentId;\n if (!newCurrentId) return;\n\n setResponse(\"\");\n \n // Add placeholder entry for new conversation too\n const { addToCurrent: addToNew } = useConversationStore.getState();\n addToNew({ question: questionForDisplay, answer: \"...\", images });\n \n aiProvider(systemPrompt, question, images);\n }, 0);\n });\n return;\n }\n\n // If the conversation is \"New Conversation\", rename it after first user message\n if (existing.name === \"New Conversation\") {\n generateName(question).then((newName) => {\n if (newName) {\n renameConversation(existing.id, newName);\n }\n });\n }\n \n // Decide whether to follow the stream for this message based on current position\n followStreamRef.current = getScrollState().isNearBottom;\n\n // Smart scrolling: on mobile, scroll to show AI response area; on desktop, scroll near-bottom (grace)\n if (isMobile) {\n // On mobile, scroll to position the AI response (skeleton) at the top of the viewport\n setTimeout(() => {\n const container = chatContainerRef.current;\n if (container) {\n // Wait for DOM to update with the new pending message\n setTimeout(() => {\n // Strategy: Find the AI response container and position it at the top of viewport\n // The skeleton appears in the last AIResponseTextField, so scroll to show that\n const containerHeight = container.clientHeight;\n const scrollHeight = container.scrollHeight;\n \n // Calculate position to show the AI response area where skeleton will appear\n // We want the AI response container to be at the top of the viewport\n // Leave a small buffer (about 50px) from the very top for breathing room\n const topBuffer = 50; \n const targetPosition = Math.max(0, scrollHeight - containerHeight + topBuffer);\n \n if (followStreamRef.current) {\n container.scrollTo({\n top: targetPosition,\n behavior: \"smooth\"\n });\n }\n }, 100); // Delay for DOM updates\n }\n }, 50);\n } else {\n // On desktop, avoid snapping to absolute bottom at stream start\n // Respect the grace offset so the previous answer remains visible briefly\n setTimeout(() => {\n const container = chatContainerRef.current;\n if (container) {\n const offset = isMobile ? 20 : 28; // mirror GRACE_OFFSETs\n const targetTop = Math.max(0, container.scrollHeight - container.clientHeight - offset);\n if (followStreamRef.current) {\n container.scrollTo({ top: targetTop, behavior: \"smooth\" });\n }\n } else {\n // Fallback\n if (followStreamRef.current) scrollToBottom();\n }\n \n // Update button state after scroll\n setTimeout(() => {\n const scrollState = getScrollState();\n setShowScrollToBottom(scrollState.canScroll && !scrollState.isNearBottom);\n }, 120);\n }, 50);\n }\n \n setResponse(\"\");\n \n aiProvider(systemPrompt, question, images);\n },\n [\n aiProvider,\n chatContainerRef,\n generateName,\n getScrollState,\n isMobile,\n scrollToBottom,\n setIsStreaming,\n setLogoVisible,\n setPendingMessage,\n setResponse,\n setResponseStarted,\n setShowScrollToBottom,\n setStreamBuffer,\n trackRequestStart\n ]\n );\n\n const handleVoiceTranscription = useCallback(\n (text: string) => {\n const cleaned = text.trim();\n if (!cleaned) {\n return;\n }\n\n setInputValue(\"\");\n setPastedImages([]);\n handleSend(cleaned, [], cleaned);\n },\n [handleSend, setInputValue, setPastedImages]\n );\n\n useVoiceMode({\n onTranscription: handleVoiceTranscription,\n onInterrupt: handleVoiceInterrupt,\n onError: (message) => notificationService?.showError?.(message),\n });\n\n useEffect(() => {\n const previouslyEnabled = previousVoiceModeEnabledRef.current;\n previousVoiceModeEnabledRef.current = isVoiceModeEnabled;\n\n if (!previouslyEnabled && isVoiceModeEnabled) {\n const latest = historyRef.current[historyRef.current.length - 1];\n lastSpokenResponseRef.current = latest?.answer ?? null;\n }\n\n if (previouslyEnabled && !isVoiceModeEnabled) {\n lastSpokenResponseRef.current = null;\n try {\n ttsStop();\n } catch (error) {\n debugLogger.warn(\"Voice mode disable failed to stop TTS hook\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n try {\n stopTTS();\n } catch (error) {\n debugLogger.warn(\"Voice mode disable failed to stop streaming TTS\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }, [isVoiceModeEnabled, ttsStop]);\n\n useEffect(() => {\n if (!isVoiceModeEnabled || !isStreaming) {\n return;\n }\n\n try {\n ttsStop();\n } catch (error) {\n debugLogger.warn(\"Voice mode stream start failed to stop TTS hook\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n try {\n stopTTS();\n } catch (error) {\n debugLogger.warn(\"Voice mode stream start failed to stop streaming TTS\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n lastSpokenResponseRef.current = null;\n }, [isStreaming, isVoiceModeEnabled, ttsStop]);\n\n useEffect(() => {\n if (!isVoiceModeEnabled) {\n lastSpokenResponseRef.current = null;\n return;\n }\n\n if (isStreaming) {\n return;\n }\n\n if (!isTTSAvailable || history.length === 0) {\n return;\n }\n\n const latest = history[history.length - 1];\n if (!latest?.answer || latest.answer === \"...\" || !latest.answer.trim()) {\n return;\n }\n\n if (lastSpokenResponseRef.current === latest.answer) {\n return;\n }\n\n const sanitizedAnswer = sanitizeForTTS(latest.answer);\n if (!sanitizedAnswer) {\n return;\n }\n\n let cancelled = false;\n\n (async () => {\n try {\n await ttsSpeak(sanitizedAnswer, { useStreaming: true, useRealtime: true });\n if (!cancelled) {\n lastSpokenResponseRef.current = latest.answer;\n }\n } catch (error) {\n if (!cancelled) {\n debugLogger.error(\"Voice mode auto playback failed\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [history, isStreaming, isVoiceModeEnabled, isTTSAvailable, ttsSpeak]);\n\n const handleModelChange = useCallback(\n (modelId: string) => {\n setSelectedModel(modelId);\n },\n [setSelectedModel]\n );\n\n const handleVoiceChange = useCallback(async (voiceId: string) => {\n // Stop any current TTS playback FIRST\n ttsStop();\n stopTTS(); // Extra insurance against voice mixing\n \n // Then set the new voice\n setSelectedVoice(voiceId);\n \n const voiceName = voiceId.split(\"-\")[1];\n const defaultModel = usePackageSettingsStore.getState().settings?.defaultModel;\n \n // Get the friendly display name for the personality (use selectedModel which is the Bandit personality)\n const currentModelConfig = availableModels.find(m => m.name === selectedModel);\n const personalityName = currentModelConfig ? currentModelConfig.name.replace(\"Bandit-\", \"Bandit \") : (selectedModel || defaultModel || \"Bandit\");\n \n if (isTTSAvailable) {\n try {\n // Small delay to ensure TTS cleanup is complete and new voice is set\n await new Promise(resolve => setTimeout(resolve, 150));\n \n // Create the greeting directly - no AI generation needed\n const greetingText = `Hi, I'm ${personalityName} speaking with ${voiceName}'s voice.`;\n \n // Speak the greeting directly\n await ttsSpeak(greetingText, { useStreaming: true });\n \n } catch (ttsError) {\n debugLogger.error('TTS failed for voice greeting:', { error: ttsError instanceof Error ? ttsError.message : String(ttsError) });\n }\n }\n }, [availableModels, selectedModel, isTTSAvailable, ttsStop, ttsSpeak, setSelectedVoice]);\n\n const handleScrollToBottomClick = () => {\n scrollToBottom();\n // Proactively re-check visibility on the next frame(s)\n const container = chatContainerRef.current;\n if (container) {\n let frames = 0;\n const pump = () => {\n frames += 1;\n const s = getScrollState();\n setShowScrollToBottom(s.canScroll && !s.isNearBottom);\n if (frames < 6) requestAnimationFrame(pump);\n };\n requestAnimationFrame(pump);\n }\n };\n\n\n\n\n if (!hydrated || brandingLoading || themeLoading) return null;\n\n const userHasAccess =\n ossMode ||\n claims?.roles?.includes(\"super-user\") ||\n claims?.roles?.includes(\"admin\");\n\n if (!userHasAccess) {\n return (\n <ThemeProvider theme={banditTheme}>\n <CssBaseline />\n <UnderReview />\n </ThemeProvider>\n );\n }\n\n return (\n <ThemeProvider theme={banditTheme}>\n <CssBaseline />\n <Box\n sx={(theme) => ({\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100dvh\",\n maxHeight: \"100dvh\",\n overflow: \"hidden\",\n bgcolor: theme.palette.chat.shell,\n color: theme.palette.text.primary,\n position: \"fixed\",\n top: 0,\n left: drawerOpen && !isMobile ? \"340px\" : 0,\n width: drawerOpen && !isMobile ? \"calc(100vw - 340px)\" : \"100vw\",\n zIndex: 0,\n transition: \"left 0.3s ease-in-out, width 0.3s ease-in-out\",\n })}\n >\n <ChatAppBar\n availableModels={availableModels}\n handleModelChange={handleModelChange}\n selectedVoice={selectedVoice}\n availableVoices={availableVoices}\n handleVoiceChange={handleVoiceChange}\n drawerOpen={drawerOpen}\n setDrawerOpen={setDrawerOpen}\n />\n <Box\n ref={chatContainerRef}\n sx={{\n flex: 1,\n overflowY: logoOnly ? \"hidden\" : \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n px: isMobile ? 1 : 2, // Reduce padding on mobile for better width utilization\n pb: logoOnly ? 0 : `${inputHeight + 24}px`,\n maxHeight: isMobile ? \"calc(var(--vh, 1vh) * 100)\" : \"100%\",\n WebkitOverflowScrolling: \"touch\",\n overscrollBehavior: \"contain\",\n position: \"relative\",\n scrollbarWidth: \"none\",\n msOverflowStyle: \"none\",\n \"&::-webkit-scrollbar\": { display: \"none\" },\n }}\n >\n <Box\n sx={{\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 2,\n pt: 2,\n }}\n >\n {logoShouldRender && !brandingLoading && (\n branding?.logoBase64 ? (\n <CustomLogo visible={logoVisible} atTop />\n ) : (\n <BanditChatLogo visible={logoVisible} atTop />\n )\n )}\n <Box\n sx={{\n margin: \"0 auto\",\n width: \"100%\",\n maxWidth: isMobile ? \"100%\" : \"768px\",\n flexShrink: 0,\n px: isMobile ? 0 : 0,\n }}\n >\n <ChatMessages\n isStreaming={isStreaming}\n history={history}\n pendingMessage={pendingMessage}\n streamBuffer={streamBuffer}\n isMobile={isMobile}\n scrollTargetRef={scrollTargetRef}\n responseStarted={responseStarted}\n isNetworkSlow={isSlowConnection}\n showInstantFeedback={true}\n selectedModel={selectedModel}\n availableModels={availableModels}\n />\n </Box>\n </Box>\n </Box>\n\n {showScrollToBottom && (\n <ChatScrollToBottomButton\n inputHeight={inputHeight}\n drawerOpen={drawerOpen}\n isMobile={isMobile}\n onClick={handleScrollToBottomClick}\n />\n )}\n\n {history.length === 0 && componentStatus !== \"Loading\" && !isMobile && (\n <Box\n sx={(theme) => ({\n position: \"absolute\",\n bottom: `${inputHeight + 160}px`,\n textAlign: \"center\",\n width: \"100%\",\n color: theme.palette.mode === \"light\" ? \"#555\" : \"#ccc\",\n fontSize: \"0.95rem\",\n fontWeight: 500,\n fontStyle: \"italic\",\n opacity: 0.9,\n textShadow:\n theme.palette.mode === \"dark\"\n ? \"0 0 4px rgba(0,0,0,0.4)\"\n : \"0 0 2px rgba(255,255,255,0.4)\",\n transition: \"opacity 0.3s ease\",\n pointerEvents: \"none\",\n })}\n >\n </Box>\n )}\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n margin: \"auto\",\n width: \"100vw\",\n maxWidth: \"768px\",\n }}\n >\n <Box sx={{ flex: \"1 1 auto\" }}></Box>\n {history.length === 0 && componentStatus !== \"Loading\" && !pendingMessage && preferences.chatSuggestionsEnabled && (\n <Box sx={{ marginBottom: \"20px\" }}>\n <QuerySuggestionPicker onSend={handleSend} inputHeight={inputHeight} />\n </Box>\n )}\n\n <ChatInput\n inputValue={inputValue}\n setInputValue={setInputValue}\n pastedImages={pastedImages}\n setPastedImages={setPastedImages}\n inputRef={inputRef}\n inputContainerRef={inputContainerRef}\n isMobile={isMobile}\n inputHeight={inputHeight}\n setInputHeight={setInputHeight}\n isSubmitting={isSubmitting}\n isStreaming={isStreaming}\n onSend={handleSend}\n onStop={handleStop}\n selectedModel={selectedModel}\n availableModels={availableModels}\n handleModelChange={handleModelChange}\n selectedVoice={selectedVoice}\n availableVoices={availableVoices}\n handleVoiceChange={handleVoiceChange}\n />\n </Box>\n\n {preferences.feedbackEnabled && !isMobile && (\n <FeedbackButton \n fullScreen={false}\n zIndex={1300}\n feedbackEmail={packageSettings?.feedbackEmail}\n absolute={true}\n position={{\n bottom: 20,\n right: 20,\n }}\n />\n )}\n\n {/* Connection status indicator */}\n <ConnectionStatus position=\"top\" showWhenGood={false} />\n </Box>\n </ThemeProvider>\n );\n};\n\nconst Chat = () => {\n const featureFlag = useFeatureFlag();\n const { isOSSMode } = featureFlag;\n const packageSettings = usePackageSettingsStore((state) => state.settings);\n\n if (!packageSettings) {\n return null;\n }\n\n const ossConfigured = !packageSettings.featureFlags?.subscriptionType;\n const allowUnauthenticated = isOSSMode() || ossConfigured;\n debugLogger.info(\"Chat authentication gate\", {\n ossConfigured,\n isOSSMode: isOSSMode(),\n tier: featureFlag.getEvaluation()?.tier,\n hasToken: authenticationService.isAuthenticated(),\n });\n\n if (!allowUnauthenticated && !authenticationService.isAuthenticated()) {\n debugLogger.debug(\"User is not authenticated, redirecting to login\");\n return <Navigate to=\"/login\" replace />;\n }\n\n return <ChatContent />;\n};\n\nexport default Chat;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-33AD-0DA2DC\nconst __banditFingerprint_chat_customlogotsx = 'BL-FP-2A41D9-C05C';\nconst __auditTrail_chat_customlogotsx = 'BL-AU-MGOIKVV0-YYER';\n// File: custom-logo.tsx | Path: src/chat/custom-logo.tsx | Hash: 33adc05c\n\nimport React, { useEffect } from \"react\";\nimport { Box, Avatar, useMediaQuery } from \"@mui/material\";\nimport { useTheme } from \"@mui/material/styles\";\nimport \"./chat.css\";\nimport brandingService from \"../services/branding/brandingService\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\n\ninterface BanditLogoProps {\n visible: boolean;\n atTop?: boolean;\n}\n\nconst Logo: React.FC<BanditLogoProps> = ({ visible, atTop = false }) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down(\"sm\"));\n\n const [logoBase64, setLogoBase64] = React.useState<string | null>(null);\n const [hasTransparentLogo, setHasTransparentLogo] = React.useState<boolean>(true);\n const [loading, setLoading] = React.useState(true);\n\n useEffect(() => {\n const loadBranding = async () => {\n try {\n const brandingData = await brandingService.getBranding();\n if (brandingData) {\n setLogoBase64(brandingData.logoBase64 || null);\n setHasTransparentLogo(brandingData.hasTransparentLogo ?? true);\n }\n } catch (e) {\n debugLogger.error(\"Failed to load branding from service\", { error: e });\n } finally {\n setLoading(false);\n }\n };\n loadBranding();\n }, []);\n\n return (\n logoBase64 &&\n <>\n {loading ? null : hasTransparentLogo ? (\n <Box\n component=\"img\"\n src={logoBase64}\n alt=\"Custom Logo\"\n className={`logo-container ${visible ? \"fade-in\" : \"fade-out\"} logo-animated`}\n sx={{\n width: isMobile ? \"80vw\" : \"60vw\",\n maxWidth: 600,\n aspectRatio: \"1 / 1\",\n margin: \"0 auto\",\n mt: atTop ? 2 : 6,\n }}\n />\n ) : (\n <Avatar\n src={logoBase64}\n variant=\"circular\"\n className={`logo-container ${visible ? \"fade-in\" : \"fade-out\"} logo-animated`}\n sx={{\n width: isMobile ? \"50vw\" : \"400px\",\n height: isMobile ? \"50vw\" : \"400px\",\n maxWidth: 400,\n maxHeight: 400,\n aspectRatio: \"1 / 1\",\n bgcolor: theme.palette.background.paper,\n margin: \"0 auto\",\n mt: atTop ? 2 : 6,\n boxShadow: \"0px 8px 24px rgba(0,0,0,0.3)\",\n objectFit: \"cover\",\n }}\n />\n )}\n </>\n );\n};\n\nexport default Logo;\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".typing-only {\\n display: inline-flex;\\n gap: 0.4rem;\\n padding: 0;\\n background: transparent;\\n border-radius: 999px;\\n box-shadow: none;\\n}\\n.typing-only .dot {\\n width: 6px;\\n height: 6px;\\n background: #a78bfa;\\n border-radius: 50%;\\n animation: bounce 1.3s infinite ease-in-out;\\n}\\n.typing-only .dot:nth-child(2) {\\n animation-delay: 0.2s;\\n}\\n.typing-only .dot:nth-child(3) {\\n animation-delay: 0.4s;\\n}\\n@keyframes bounce {\\n 0%, 80%, 100% {\\n transform: translateY(0);\\n opacity: 0.3;\\n }\\n 40% {\\n transform: translateY(-6px);\\n opacity: 1;\\n }\\n}\\n@keyframes float {\\n 0% {\\n transform: translateY(0);\\n }\\n 50% {\\n transform: translateY(-8px);\\n }\\n 100% {\\n transform: translateY(0);\\n }\\n}\\n.logo-animated {\\n animation: pulseBandit 4s infinite ease-in-out;\\n transition: transform 0.3s ease-in-out;\\n}\\n@keyframes pulseBandit {\\n 0% {\\n transform: scale(1) rotate(0deg);\\n opacity: 0.85;\\n }\\n 50% {\\n transform: scale(1.05) rotate(1deg);\\n opacity: 1;\\n }\\n 100% {\\n transform: scale(1) rotate(0deg);\\n opacity: 0.85;\\n }\\n}\\n.logo-container {\\n transition: opacity 0.5s ease, transform 0.5s ease;\\n}\\n.fade-in {\\n opacity: 1;\\n transform: scale(1);\\n}\\n.fade-out {\\n opacity: 0;\\n transform: translateY(-16px) scale(0.95);\\n}\\n@keyframes fadeOut {\\n to {\\n opacity: 0;\\n transform: translateY(-5px);\\n visibility: hidden;\\n }\\n}\\n\")","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-E9FE-428463\nconst __banditFingerprint_branding_brandingServicets = 'BL-FP-1B6B43-3127';\nconst __auditTrail_branding_brandingServicets = 'BL-AU-MGOIKVVR-8NMV';\n// File: brandingService.ts | Path: src/services/branding/brandingService.ts | Hash: e9fe3127\n\nimport indexedDBService from '../indexedDB/indexedDBService';\nimport { debugLogger } from '../logging/debugLogger';\n\nexport interface BrandingData {\n logoBase64?: string;\n hasTransparentLogo?: boolean;\n brandingText?: string;\n}\n\ntype BrandingRecord = BrandingData & {\n theme?: string;\n userSaved?: boolean;\n [key: string]: unknown;\n};\n\ninterface StoredBrandingConfig {\n id: string;\n branding?: BrandingRecord;\n}\n\nexport interface BrandingConfigPayload {\n branding?: BrandingRecord;\n [key: string]: unknown;\n}\n\nclass BrandingService {\n private readonly DB_NAME = \"banditConfig\";\n private readonly DB_VERSION = 1;\n private readonly STORE_NAME = \"config\";\n private readonly STORE_CONFIGS = [{ name: \"config\", keyPath: \"id\" }];\n\n public async getBranding(): Promise<BrandingData | null> {\n try {\n const data = await indexedDBService.get<StoredBrandingConfig>(\n this.DB_NAME,\n this.DB_VERSION,\n this.STORE_NAME,\n \"main\",\n this.STORE_CONFIGS\n );\n\n // Only return branding if it has meaningful data\n if (data?.branding && (data.branding.logoBase64 || data.branding.hasTransparentLogo !== undefined || data.branding.brandingText)) {\n return {\n logoBase64: data.branding.logoBase64,\n hasTransparentLogo: data.branding.hasTransparentLogo,\n brandingText: data.branding.brandingText,\n };\n }\n return null;\n } catch (error) {\n throw error;\n }\n }\n\n public async setBrandingFromConfig(config: BrandingConfigPayload): Promise<void> {\n try {\n const existing = await indexedDBService.get<StoredBrandingConfig>(\n this.DB_NAME,\n this.DB_VERSION,\n this.STORE_NAME,\n \"main\",\n this.STORE_CONFIGS\n ) || { id: \"main\" };\n\n // 🛡️ NUCLEAR PROTECTION: Never overwrite user-saved branding\n if (existing.branding?.userSaved) {\n debugLogger.debug(\"🛡️ BrandingService: User branding detected, blocking CDN config override\");\n return;\n }\n\n // Also check for any trace of user branding data\n const hasUserBranding = existing.branding && (\n existing.branding.logoBase64 ||\n existing.branding.brandingText ||\n existing.branding.theme ||\n existing.branding.hasTransparentLogo !== undefined\n );\n\n if (hasUserBranding) {\n debugLogger.debug(\"🛡️ BrandingService: Detected user branding data, blocking CDN config override\");\n return;\n }\n\n debugLogger.debug(\"🔧 BrandingService: No user branding detected, applying CDN config\");\n\n const branding = config.branding || {};\n\n const updated = {\n ...existing,\n branding: {\n ...existing.branding,\n ...branding\n }\n };\n\n await indexedDBService.put(\n this.DB_NAME,\n this.DB_VERSION,\n this.STORE_NAME,\n updated,\n this.STORE_CONFIGS\n );\n } catch (error) {\n throw error;\n }\n }\n}\n\nconst brandingService = new BrandingService();\nexport default brandingService;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-206C-8462DB\nconst __banditFingerprint_store_aiQueryStorets = 'BL-FP-38ACD0-3815';\nconst __auditTrail_store_aiQueryStorets = 'BL-AU-MGOIKVW3-J9DR';\n// File: aiQueryStore.ts | Path: src/store/aiQueryStore.ts | Hash: 206c3815\n\nimport { create } from \"zustand\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport { KnowledgeDoc } from \"./knowledgeStore\";\n\nexport type Position = { x: number; y: number };\nexport type HistoryEntry = {\n id?: string;\n question: string;\n answer: string;\n images?: string[];\n sourceFiles?: KnowledgeDoc[];\n memoryUpdated?: boolean;\n cancelled?: boolean;\n};\n\nexport type ComponentStatus = \"Idle\" | \"Loading\" | \"Error\";\n\ninterface AIQueryState {\n inputValue: string;\n response: string;\n previousQuestion: string;\n position: Position;\n componentStatus: ComponentStatus;\n history: HistoryEntry[];\n apiKey: string;\n hydrated: boolean;\n\n setInputValue: (value: string) => void;\n setResponse: (response: string) => void;\n setPreviousQuestion: (question: string) => void;\n setPosition: (position: Position) => void;\n setComponentStatus: (status: ComponentStatus) => void;\n addHistory: (entry: HistoryEntry) => void;\n clearHistory: () => void;\n setApiKey: (key: string) => void;\n setHydrated: () => void;\n reset: () => void;\n hydrate: () => Promise<void>;\n}\n\nconst DB_NAME = \"ai-query-db\";\nconst STORE_NAME = \"ai-query\";\nconst DB_VERSION = 1;\nconst STORAGE_KEY = \"singleton\";\n\nconst storeConfigs = [{ name: STORE_NAME }];\n\nasync function saveStateToDB(state: Partial<AIQueryState>) {\n await indexedDBService.put(DB_NAME, DB_VERSION, STORE_NAME, state, storeConfigs, STORAGE_KEY);\n}\n\nasync function loadStateFromDB(): Promise<Partial<AIQueryState> | undefined> {\n return indexedDBService.get(DB_NAME, DB_VERSION, STORE_NAME, STORAGE_KEY, storeConfigs);\n}\n\nexport const useAIQueryStore = create<AIQueryState>((set, get) => ({\n inputValue: \"\",\n response: \"\",\n previousQuestion: \"\",\n position: { x: window.innerWidth / 2 - 300, y: window.innerHeight - 350 },\n componentStatus: \"Idle\",\n history: [],\n apiKey: \"\",\n hydrated: false,\n\n setInputValue: (value) => {\n set({ inputValue: value });\n saveStateToDB({ inputValue: value });\n },\n setResponse: (response) => {\n set({ response });\n saveStateToDB({ response });\n },\n setPreviousQuestion: (question) => {\n set({ previousQuestion: question });\n saveStateToDB({ previousQuestion: question });\n },\n setPosition: (position) => {\n set({ position });\n saveStateToDB({ position });\n },\n setComponentStatus: (status) => set({ componentStatus: status }),\n addHistory: (entry) => {\n const newHistory = [...get().history, entry];\n set({ history: newHistory });\n saveStateToDB({ history: newHistory });\n },\n clearHistory: () => {\n set({ history: [] });\n saveStateToDB({ history: [] });\n },\n setApiKey: (key) => {\n set({ apiKey: key });\n saveStateToDB({ apiKey: key });\n },\n setHydrated: () => set({ hydrated: true }),\n\n reset: () => {\n const resetState = {\n inputValue: \"\",\n response: \"\",\n previousQuestion: \"\",\n position: { x: window.innerWidth / 2 - 300, y: window.innerHeight - 350 },\n componentStatus: \"Idle\",\n history: [],\n apiKey: \"\",\n } as Partial<AIQueryState>;\n set(resetState);\n saveStateToDB(resetState);\n },\n\n hydrate: async () => {\n const storedState = await loadStateFromDB();\n if (storedState) {\n set({\n inputValue: storedState.inputValue ?? \"\",\n response: storedState.response ?? \"\",\n previousQuestion: storedState.previousQuestion ?? \"\",\n position: storedState.position ?? { x: window.innerWidth / 2 - 300, y: window.innerHeight - 350 },\n componentStatus: \"Idle\",\n history: storedState.history ?? [],\n apiKey: storedState.apiKey ?? \"\",\n hydrated: true,\n });\n } else {\n set({ hydrated: true });\n }\n },\n}));\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-22A7-982C6E\nconst __banditFingerprint_chat_chatscrolltobottombuttontsx = 'BL-FP-4E93B8-6C94';\nconst __auditTrail_chat_chatscrolltobottombuttontsx = 'BL-AU-MGOIKVUX-MLTK';\n// File: chat-scroll-to-bottom-button.tsx | Path: src/chat/chat-scroll-to-bottom-button.tsx | Hash: 22a76c94\n\nimport React from \"react\";\nimport { IconButton } from \"@mui/material\";\nimport ArrowDownwardIcon from \"@mui/icons-material/ArrowDownward\";\n\ninterface Props {\n inputHeight: number;\n onClick: () => void;\n drawerOpen?: boolean;\n isMobile?: boolean;\n}\n\nconst ChatScrollToBottomButton: React.FC<Props> = ({ \n inputHeight, \n onClick, \n drawerOpen = false, \n isMobile = false \n}) => {\n \n return (\n <IconButton\n onClick={onClick}\n sx={{\n position: \"fixed\",\n left: drawerOpen && !isMobile ? \"calc(50% + 170px)\" : \"50%\",\n transform: \"translateX(-50%)\",\n bottom: inputHeight + 10,\n bgcolor: (theme) => theme.palette.background.paper,\n color: (theme) => theme.palette.text.primary,\n border: \"1px solid\",\n borderColor: (theme) => theme.palette.divider,\n zIndex: 999,\n boxShadow: 3,\n transition: \"bottom 0.3s ease, left 0.3s ease-in-out\",\n \"&:hover\": {\n bgcolor: (theme) => theme.palette.action.hover,\n },\n }}\n >\n <ArrowDownwardIcon sx={{ color: \"inherit\" }} />\n </IconButton>\n );\n};\n\nexport default ChatScrollToBottomButton;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-C315-723983\nconst __banditFingerprint_chat_banditchatlogotsx = 'BL-FP-B03B6D-55C4';\nconst __auditTrail_chat_banditchatlogotsx = 'BL-AU-MGOIKVUW-H7IF';\n// File: bandit-chat-logo.tsx | Path: src/chat/bandit-chat-logo.tsx | Hash: c31555c4\n\nimport React, { useEffect, useState } from \"react\";\nimport { useTheme } from \"@mui/material/styles\";\nconst darkLogo = \"https://cdn.burtson.ai/logos/bandit-ai-logo-simple.png\";\nconst lightLogo = \"https://cdn.burtson.ai/logos/bandit-ai-logo-simple-alt.png\";\n\ninterface BanditChatLogoProps {\n atTop?: boolean;\n visible?: boolean;\n}\n\nconst BanditChatLogo: React.FC<BanditChatLogoProps> = ({ atTop = false, visible = false }) => {\n const theme = useTheme();\n const logoUrl = theme.palette.mode === \"light\" ? lightLogo : darkLogo;\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n if (visible) {\n const timeout = setTimeout(() => setIsVisible(true), 50);\n return () => clearTimeout(timeout);\n }\n\n setIsVisible(false);\n }, [visible]);\n\n const backgroundStyle = { backgroundImage: `url(${logoUrl})` };\n const className = `bandit-logo ${isVisible ? \"bandit-logo-visible\" : \"bandit-logo-hidden\"}`;\n\n return (\n <div className=\"bandit-logo-container\" style={atTop ? { alignItems: 'flex-start' } : undefined}>\n <div\n className={className}\n style={{\n ...backgroundStyle,\n ...(atTop ? { height: '40vh', marginTop: '16px' } : {}),\n }}\n />\n </div>\n );\n};\nexport default BanditChatLogo;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-0913-A560CB\nconst __banditFingerprint_chat_chatmessagestsx = 'BL-FP-2C7887-6AEC';\nconst __auditTrail_chat_chatmessagestsx = 'BL-AU-MGOIKVUX-4EHG';\n// File: chat-messages.tsx | Path: src/chat/chat-messages.tsx | Hash: 09136aec\n\nimport React from \"react\";\nimport { Box } from \"@mui/material\";\nimport AIResponseTextField from \"../modals/chat-modal/ai-response-text-field\";\nimport StreamingMarkdown from \"../components/StreamingMarkdown\";\nimport { KnowledgeDoc } from \"../store/knowledgeStore\";\nimport { HistoryEntry } from \"../store/aiQueryStore\";\nimport { useConversationStore } from \"../store/conversationStore\";\nimport type { BanditPersonality } from \"../store/modelStore\";\n\ninterface ChatMessagesProps {\n history: HistoryEntry[];\n pendingMessage: {\n question: string;\n images?: string[];\n } | null;\n streamBuffer: string;\n isMobile: boolean;\n scrollTargetRef: React.RefObject<HTMLDivElement>;\n responseStarted: boolean;\n isStreaming: boolean;\n isNetworkSlow?: boolean;\n showInstantFeedback?: boolean;\n selectedModel?: string;\n availableModels?: BanditPersonality[];\n}\n\ntype SourceFileCandidate = KnowledgeDoc & { chunks?: string[] } & Record<string, unknown>;\n\nconst ChatMessages: React.FC<ChatMessagesProps> = ({\n pendingMessage,\n streamBuffer,\n isMobile,\n scrollTargetRef,\n responseStarted,\n isStreaming,\n isNetworkSlow = false,\n showInstantFeedback = true,\n selectedModel,\n availableModels,\n}) => {\n void availableModels;\n const { currentId, conversations } = useConversationStore();\n const history = conversations.find((c) => c.id === currentId)?.history ?? [];\n\n const lastIndex = history.length - 1;\n const hasActivePlaceholder = lastIndex >= 0 && history[lastIndex]?.answer === \"...\";\n\n if (!responseStarted && !pendingMessage && history.length === 0) return null;\n\n return (\n <Box sx={{ px: isMobile ? 0 : 0, pt: \"100px\", display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n {/* Instant feedback disabled - was interfering with loading indicator */}\n\n {history.map((entry, index) => {\n const isLast = index === lastIndex;\n const isPlaceholder = entry.answer === \"...\";\n\n const showLoader = isLast && isStreaming && streamBuffer.trim() === \"\";\n const content = isLast\n ? (isStreaming ? (streamBuffer || \"\") : (isPlaceholder ? \"\" : entry.answer))\n : entry.answer;\n\n const rawSources = entry.sourceFiles as SourceFileCandidate[] | undefined;\n const sourceSummaries = rawSources\n ? rawSources\n .filter((doc) => doc && typeof doc.name === \"string\" && doc.name.trim())\n .map((doc) => ({ id: doc.id || doc.name, name: doc.name.trim() }))\n : undefined;\n\n const responseNode = (\n <Box\n sx={{\n minHeight: isLast ? (isMobile ? \"80px\" : \"60px\") : undefined,\n position: \"relative\",\n overflow: \"hidden\",\n transition: \"min-height 0.25s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n >\n {/* Loader stays mounted but only visible for the last item during pre-first-token */}\n <Box\n sx={{\n position: showLoader ? \"static\" : \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n opacity: showLoader ? 1 : 0,\n transform: showLoader ? \"translateY(0)\" : \"translateY(-6px)\",\n transition: \"all 220ms cubic-bezier(0.4, 0, 0.2, 1)\",\n pointerEvents: showLoader ? \"auto\" : \"none\",\n zIndex: showLoader ? 1 : 0,\n }}\n >\n <Box sx={{ display: \"flex\", alignItems: \"center\", minHeight: \"40px\", pl: 2 }}>\n <div className=\"typing-only\">\n <span className=\"dot\" />\n <span className=\"dot\" />\n <span className=\"dot\" />\n </div>\n </Box>\n </Box>\n\n {/* Streaming or final content, same component for all entries to avoid swaps */}\n <Box\n sx={{\n position: showLoader ? \"absolute\" : \"static\",\n top: 0,\n left: 0,\n right: 0,\n opacity: showLoader ? 0 : 1,\n transform: showLoader ? \"translateY(6px)\" : \"translateY(0)\",\n transition: \"all 220ms cubic-bezier(0.4, 0, 0.2, 1)\",\n pointerEvents: showLoader ? \"none\" : \"auto\",\n zIndex: 1,\n }}\n >\n <StreamingMarkdown\n content={content}\n isStreaming={isStreaming && isLast}\n sources={sourceSummaries}\n />\n </Box>\n </Box>\n );\n\n return (\n <Box key={index}>\n <AIResponseTextField\n question={entry.question}\n response={responseNode}\n responseText={isLast ? (isStreaming ? (streamBuffer || \"\") : (isPlaceholder ? \"\" : entry.answer)) : entry.answer}\n backgroundColor=\"#444\"\n images={entry.images}\n memoryUpdated={entry.memoryUpdated && !isPlaceholder}\n sourceFiles={rawSources}\n isMobile={isMobile}\n cancelled={entry.cancelled}\n />\n </Box>\n );\n })}\n\n <div style={{ height: \"1px\" }} ref={scrollTargetRef} />\n </Box>\n );\n};\n\nexport default ChatMessages;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-02BB-817687\nconst __banditFingerprint_chatmodal_airesponsetextfieldtsx = 'BL-FP-5F1C0D-1D01';\nconst __auditTrail_chatmodal_airesponsetextfieldtsx = 'BL-AU-MGOIKVVM-OZSJ';\n// File: ai-response-text-field.tsx | Path: src/modals/chat-modal/ai-response-text-field.tsx | Hash: 02bb1d01\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport DocumentCard from \"../../shared/DocumentCard\";\nimport KnowledgeFileModal from \"../../modals/knowlege/knowledge-file-modal\";\nimport { KnowledgeDoc } from \"../../store/knowledgeStore\";\nimport { useKnowledgeStore } from \"../../chat/hooks/useKnowledgeStore\";\nimport { useTheme, alpha } from \"@mui/material/styles\";\nimport type { Theme } from \"@mui/material/styles\";\nimport ReactMarkdown, { type Components as ReactMarkdownComponents, type ExtraProps as ReactMarkdownExtraProps } from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeSanitize from \"rehype-sanitize\";\nimport { debugLogger } from \"../../services/logging/debugLogger\";\nimport {\n Avatar,\n Box,\n IconButton,\n Modal,\n Tooltip,\n Typography,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Paper,\n} from \"@mui/material\";\nimport ContentCopyIcon from \"@mui/icons-material/ContentCopy\";\nimport CheckIcon from \"@mui/icons-material/Check\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport { useModelStore } from \"../../store/modelStore\";\nimport type { Element, Text, Root } from \"hast\";\nimport { getHighlightTree } from \"../../utils/lowlight\";\nimport { markdownSanitizeSchema, renderLowlightChildren } from \"../../utils/markdownRendering\";\nconst brainIcon = \"https://cdn.burtson.ai/images/brain-icon.png\";\n\nconst avatarFilenames: Record<string, string> = {\n \"Bandit-Core\": \"core-avatar.png\",\n \"Bandit-Muse\": \"muse-avatar.png\",\n \"Bandit-Logic\": \"logic-avatar.png\",\n \"Bandit-D1VA\": \"d1va-avatar.png\",\n \"Bandit-Exec\": \"exec-avatar.png\",\n \"default\": \"bandit-head.png\",\n};\n\nconst banditHead = `https://cdn.burtson.ai/images/bandit-head.png`;\nimport AiResponseActionsBar from \"./ai-response-action-bar\";\nimport brandingService from \"../../services/branding/brandingService\";\n\n\nconst resolveAvatar = (selectedModel: string): string => {\n const model = useModelStore.getState().availableModels.find(\n (m) => m.name === selectedModel\n );\n if (model?.avatarBase64) {\n return model.avatarBase64;\n }\n \n const avatarFilename = avatarFilenames[selectedModel] || avatarFilenames[\"default\"];\n return `https://cdn.burtson.ai/avatars/${avatarFilename}`;\n};\n\ninterface AIResponseTextFieldProps {\n question: string;\n response: string | React.ReactNode;\n responseText?: string; // raw markdown/text used for actions bar (feedback/tts/copy)\n images?: string[];\n backgroundColor?: string;\n memoryUpdated?: boolean;\n sourceFiles?: SourceFileInput[];\n isMobile?: boolean;\n cancelled?: boolean;\n}\n\nconst normalizeTables = (markdown: string): string => {\n const lines = markdown.split(\"\\n\");\n const output: string[] = [];\n let inTable = false;\n let tableRows: string[][] = [];\n\n const flushTable = () => {\n if (tableRows.length === 0) return;\n\n const maxCols = Math.max(...tableRows.map((r) => r.length));\n const padded = tableRows.map((row) => {\n return [...row, ...Array(maxCols - row.length).fill(\"\")];\n });\n\n const header = padded[0];\n const separator = Array(maxCols).fill(\"---\");\n\n output.push(\"| \" + header.join(\" | \") + \" |\");\n output.push(\"| \" + separator.join(\" | \") + \" |\");\n for (let i = 1; i < padded.length; i++) {\n const row = padded[i];\n // Skip rows that are just separators (all dashes)\n if (row.every((cell) => /^-+$/.test(cell))) continue;\n output.push(\"| \" + row.join(\" | \") + \" |\");\n }\n\n tableRows = [];\n inTable = false;\n };\n\n for (const line of lines) {\n if (/^\\s*\\|.*\\|\\s*$/.test(line)) {\n inTable = true;\n const cells = line\n .trim()\n .slice(1, -1)\n .split(\"|\")\n .map((c) => c.trim());\n tableRows.push(cells);\n } else {\n if (inTable) flushTable();\n output.push(line);\n }\n }\n\n flushTable();\n return output.join(\"\\n\");\n};\n\ntype ChatResponsePalette = {\n codeBackground?: string;\n codeText?: string;\n aiBackground?: string;\n aiText?: string;\n aiBorder?: string;\n};\n\ntype VectorResultLike = {\n id?: string;\n fileId?: string;\n _id?: string;\n [key: string]: unknown;\n};\n\ntype KnowledgeDocCandidate = Partial<KnowledgeDoc> & {\n fileId?: string;\n _id?: string;\n filename?: string;\n uploadedAt?: string | Date;\n createdAt?: string | Date;\n mimeType?: string;\n content?: string | null;\n rawData?: string;\n embedding?: unknown;\n size?: number;\n uploadedBy?: string;\n userId?: string;\n userEmail?: string;\n bucket?: string;\n key?: string;\n s3Url?: string;\n teamSid?: string;\n contentSource?: \"team\" | \"user\";\n isUserContent?: boolean;\n isTeamContent?: boolean;\n _vectorResult?: VectorResultLike | null;\n metadata?: VectorResultLike | null;\n chunks?: string[];\n [key: string]: unknown;\n};\n\ntype SourceFileInput = KnowledgeDocCandidate;\n\ntype MarkdownComponentProps<Tag extends keyof JSX.IntrinsicElements> =\n React.ComponentPropsWithoutRef<Tag> & ReactMarkdownExtraProps;\n\nconst isNonEmptyString = (value: unknown): value is string =>\n typeof value === \"string\" && value.trim().length > 0;\n\nconst toDateSafe = (value: unknown): Date | undefined => {\n if (value instanceof Date && !Number.isNaN(value.getTime())) {\n return value;\n }\n if (typeof value === \"string\" && value.trim()) {\n const parsed = new Date(value);\n if (!Number.isNaN(parsed.getTime())) {\n return parsed;\n }\n }\n return undefined;\n};\n\nconst toNumberArray = (value: unknown): number[] | undefined => {\n if (!Array.isArray(value)) {\n return undefined;\n }\n const numbers = value.filter((item): item is number => typeof item === \"number\" && Number.isFinite(item));\n return numbers.length ? numbers : undefined;\n};\n\ninterface MarkdownCodeBlockProps extends React.HTMLAttributes<HTMLElement> {\n inline?: boolean;\n className?: string;\n children: React.ReactNode;\n theme: Theme;\n chatResponse?: ChatResponsePalette;\n}\n\nconst MarkdownCodeBlock: React.FC<MarkdownCodeBlockProps> = ({\n inline,\n className,\n children,\n theme,\n chatResponse,\n ...props\n}) => {\n const match = /language-([\\w-]+)/.exec(className || \"\");\n const requestedLanguage = match?.[1]?.toLowerCase() || \"\";\n const codeText = String(children).replace(/\\n$/, \"\");\n const isProbablyBlock = codeText.includes(\"\\n\") || Boolean(requestedLanguage);\n\n const [copied, setCopied] = useState(false);\n const handleCopy = () => {\n navigator.clipboard.writeText(codeText);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const highlightTree = useMemo<Root | null>(\n () =>\n isProbablyBlock ? getHighlightTree(codeText, requestedLanguage) : null,\n [codeText, requestedLanguage, isProbablyBlock]\n );\n const highlightedNodes = useMemo(\n () =>\n isProbablyBlock\n ? renderLowlightChildren(\n (highlightTree?.children || []).filter((node): node is Element | Text => {\n if (!node) {\n return false;\n }\n return node.type === \"element\" || node.type === \"text\";\n }),\n `hl-${requestedLanguage || \"auto\"}`\n )\n : [],\n [highlightTree, requestedLanguage, isProbablyBlock]\n );\n\n const resolvedLanguage = (\n requestedLanguage ||\n highlightTree?.data?.language ||\n \"code\"\n ).toString();\n const languageLabel = resolvedLanguage.toUpperCase();\n const languageClass = resolvedLanguage.toLowerCase();\n\n const highlightColors =\n theme.palette.mode === \"dark\"\n ? {\n background: chatResponse?.codeBackground || \"#0f172a\",\n text: chatResponse?.codeText || \"#e2e8f0\",\n keyword: \"#c792ea\",\n string: \"#7fdbca\",\n number: \"#f78c6c\",\n comment: \"#64748b\",\n function: \"#82aaff\",\n variable: \"#f07178\",\n }\n : {\n background: chatResponse?.codeBackground || \"#f4f6ff\",\n text: chatResponse?.codeText || \"#1e293b\",\n keyword: \"#7c3aed\",\n string: \"#0f766e\",\n number: \"#b45309\",\n comment: \"#6b7280\",\n function: \"#2563eb\",\n variable: \"#d97706\",\n };\n\n if (!isProbablyBlock) {\n return (\n <code\n style={{\n borderRadius: \"4px\",\n fontSize: \"0.9em\",\n fontFamily:\n \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\",\n }}\n {...props}\n >\n {children}\n </code>\n );\n }\n\n return (\n <Box\n sx={{\n borderRadius: \"4px\",\n overflow: \"auto\",\n my: \"0.5rem\",\n px: 0,\n py: 0,\n mt: 1,\n mb: 0.5,\n fontSize: \"0.9rem\",\n position: \"relative\",\n fontFamily:\n \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\",\n width: \"100%\",\n maxWidth: \"100%\",\n }}\n >\n <Box\n sx={{\n px: 2,\n py: 1,\n bgcolor:\n chatResponse?.aiBackground ||\n (theme.palette.mode === \"dark\"\n ? alpha(theme.palette.common.white, 0.04)\n : alpha(theme.palette.text.primary, 0.04)),\n color: chatResponse?.aiText || theme.palette.text.secondary,\n fontSize: \"0.75rem\",\n borderBottom: `1px solid ${\n chatResponse?.aiBorder || alpha(theme.palette.text.primary, 0.1)\n }`,\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n fontFamily: \"inherit\",\n }}\n >\n <span>{languageLabel}</span>\n <Tooltip title={copied ? \"Copied!\" : \"Copy\"} arrow>\n <IconButton\n size=\"small\"\n onClick={handleCopy}\n sx={{\n color: copied\n ? theme.palette.success.main\n : theme.palette.text.secondary,\n \"&:hover\": { color: theme.palette.text.primary },\n padding: \"4px\",\n }}\n >\n {copied ? <CheckIcon fontSize=\"small\" /> : <ContentCopyIcon fontSize=\"small\" />}\n </IconButton>\n </Tooltip>\n </Box>\n <Box\n sx={{\n overflowX: \"auto\",\n maxWidth: \"100%\",\n \"& .hljs\": {\n display: \"block\",\n overflowX: \"auto\",\n padding: \"16px\",\n margin: 0,\n backgroundColor: highlightColors.background,\n color: highlightColors.text,\n fontSize: \"0.9rem\",\n },\n \"& .hljs-comment, & .hljs-quote\": {\n color: highlightColors.comment,\n fontStyle: \"italic\",\n },\n \"& .hljs-keyword, & .hljs-selector-tag, & .hljs-literal, & .hljs-built_in\": {\n color: highlightColors.keyword,\n },\n \"& .hljs-string, & .hljs-doctag, & .hljs-template-tag, & .hljs-attr\": {\n color: highlightColors.string,\n },\n \"& .hljs-number, & .hljs-symbol, & .hljs-bullet, & .hljs-meta\": {\n color: highlightColors.number,\n },\n \"& .hljs-title, & .hljs-section, & .hljs-selector-id, & .hljs-function\": {\n color: highlightColors.function,\n },\n \"& .hljs-variable, & .hljs-params, & .hljs-property\": {\n color: highlightColors.variable,\n },\n }}\n >\n <pre className={`hljs language-${languageClass}`} {...props}>\n <code className=\"hljs\">{highlightedNodes}</code>\n </pre>\n </Box>\n </Box>\n );\n};\n\nconst AIResponseTextField: React.FC<AIResponseTextFieldProps> = ({\n question,\n response,\n responseText,\n backgroundColor,\n images,\n memoryUpdated,\n sourceFiles,\n isMobile = false,\n cancelled = false,\n}) => {\n // Warn if response is not a string, to help debug [object Object] issues\n useEffect(() => {\n if (typeof response !== \"string\" && !React.isValidElement(response)) {\n debugLogger.warn(\"⚠️ AIResponseTextField received a non-string, non-ReactElement response:\", { response });\n }\n }, [response]);\n const [openImage, setOpenImage] = useState<string | null>(null);\n const [showMemoryUpdated, setShowMemoryUpdated] = useState(memoryUpdated ?? false);\n const [openDoc, setOpenDoc] = useState<KnowledgeDoc | null>(null);\n const { isVectorDocument } = useKnowledgeStore();\n\n // Convert API response format to KnowledgeDoc format (same as KnowledgeTab)\n const normalizeSourceFiles = useCallback((files: SourceFileInput[]): KnowledgeDoc[] => {\n return files\n .map((file) => {\n const vectorResult = file._vectorResult ?? undefined;\n const metadata = file.metadata ?? undefined;\n\n const candidateId =\n [\n file.id,\n file.fileId,\n file._id,\n vectorResult?.id,\n vectorResult?.fileId,\n vectorResult?._id,\n metadata?.id,\n metadata?.fileId,\n metadata?._id,\n ].find(isNonEmptyString) ?? null;\n\n if (!candidateId) {\n debugLogger.error(\"Missing document identifier in AI response file\", {\n file,\n availableProperties: Object.keys(file),\n vectorResultProperties: vectorResult ? Object.keys(vectorResult) : undefined,\n });\n return null;\n }\n\n const resolvedId = candidateId;\n const filename =\n (isNonEmptyString(file.name) && file.name) ||\n (isNonEmptyString(file.filename) && file.filename) ||\n \"Unknown Document\";\n const timestamp = file.uploadedAt ?? file.createdAt;\n const addedDate = toDateSafe(timestamp) ?? new Date();\n const mimeType =\n (isNonEmptyString(file.mimeType) && file.mimeType) ||\n (isNonEmptyString(file.type) && file.type) ||\n \"application/pdf\";\n const contentValue = typeof file.content === \"string\" ? file.content : \"\";\n const hasInlineContent = contentValue.trim().length > 0;\n const looksLikeMongoId = /^[0-9a-f]{24}$/i.test(resolvedId);\n const isFromVectorDB =\n Boolean(file._vectorResult) ||\n isNonEmptyString(file.s3Url) ||\n (looksLikeMongoId && !hasInlineContent);\n\n debugLogger.debug(\"Normalizing AI response source file\", {\n docId: resolvedId,\n filename,\n isFromVectorDB,\n hasContent: hasInlineContent,\n });\n\n const embedding = toNumberArray(file.embedding) ?? [];\n const rawData = typeof file.rawData === \"string\" ? file.rawData : undefined;\n const size = typeof file.size === \"number\" && Number.isFinite(file.size) ? file.size : 0;\n const uploadedBy =\n (isNonEmptyString(file.uploadedBy) && file.uploadedBy) ||\n (isNonEmptyString(file.userId) && file.userId) ||\n \"\";\n const userEmail = (isNonEmptyString(file.userEmail) && file.userEmail) || \"\";\n const bucket = (isNonEmptyString(file.bucket) && file.bucket) || \"\";\n const key = (isNonEmptyString(file.key) && file.key) || resolvedId;\n const teamSid = (isNonEmptyString(file.teamSid) && file.teamSid) || undefined;\n const explicitContentSource =\n file.contentSource === \"team\" || file.contentSource === \"user\" ? file.contentSource : undefined;\n const contentSource = explicitContentSource ?? (teamSid ? \"team\" : \"user\");\n const isTeamContent = file.isTeamContent ?? contentSource === \"team\";\n const isUserContent = file.isUserContent ?? contentSource === \"user\";\n const resolvedS3Url =\n (isNonEmptyString(file.s3Url) && file.s3Url) ||\n (isFromVectorDB ? resolvedId : undefined);\n\n const normalizedDoc: KnowledgeDoc = {\n id: resolvedId,\n name: filename,\n content: isFromVectorDB ? \"\" : contentValue,\n rawData,\n type: mimeType,\n addedDate,\n embedding,\n size,\n uploadedBy,\n userEmail,\n bucket,\n key,\n isUserContent,\n isTeamContent,\n contentSource,\n teamSid,\n mimeType,\n originalFileName: filename,\n s3Url: resolvedS3Url,\n };\n\n return normalizedDoc;\n })\n .filter((doc): doc is KnowledgeDoc => doc !== null);\n }, []);\n\n // Normalize the source files\n const normalizedSourceFiles = useMemo(\n () => (sourceFiles ? normalizeSourceFiles(sourceFiles) : []),\n [sourceFiles, normalizeSourceFiles]\n );\n\n const sourceCacheRef = useRef<KnowledgeDoc[]>([]);\n\n const displaySourceFiles = useMemo(() => {\n if (normalizedSourceFiles.length > 0) {\n sourceCacheRef.current = normalizedSourceFiles;\n return normalizedSourceFiles;\n }\n\n if (sourceFiles === undefined) {\n return sourceCacheRef.current;\n }\n\n sourceCacheRef.current = [];\n return [];\n }, [normalizedSourceFiles, sourceFiles]);\n\n const sourcesMarkdownList = displaySourceFiles.map((doc, index) => `- ${index + 1}. ${doc.name}`);\n\n // Debug logging\n useEffect(() => {\n if (sourceFiles && sourceFiles.length > 0) {\n debugLogger.debug(\"AI response source files normalization\", {\n sourceFileCount: sourceFiles.length,\n normalizedFileCount: normalizedSourceFiles.length,\n });\n }\n }, [sourceFiles, normalizedSourceFiles]);\n\n useEffect(() => {\n if (!memoryUpdated) return;\n setShowMemoryUpdated(true);\n const timeout = setTimeout(() => setShowMemoryUpdated(false), 3000);\n return () => clearTimeout(timeout);\n }, [memoryUpdated]);\n\n const selectedModel = useModelStore((state) => state.selectedModel);\n\n\n const [userAvatar, setUserAvatar] = useState<string>(banditHead);\n useEffect(() => {\n const fetchBranding = async () => {\n const branding = await brandingService.getBranding();\n setUserAvatar(branding?.logoBase64 || banditHead);\n };\n fetchBranding();\n }, []);\n\n const theme = useTheme();\n const chatResponse = theme.palette.chat?.response as NonNullable<typeof theme.palette.chat>[\"response\"];\n \n // Choose syntax highlighting theme based on current theme mode\n\n const sanitizeMarkdown = (raw: string): string => {\n // Strip start/end of turn tags, including malformed or alternate versions\n let sanitized = raw.replace(/<[/]?start_of_turn>|<[/]?end[_]?of[_]?turn>/gi, \"\");\n\n // 1) Unwrap any stray <div class=\"MuiBox-root\"> wrappers\n sanitized = sanitized\n .replace(/<div class=\"MuiBox-root[^\"]*\"[^>]*>([\\s\\S]*?)<\\/div>/g, (_, inner) =>\n inner.trim()\n )\n .replace(/<div[^>]*>\\s*<\\/div>/g, \"\");\n\n // Collapse newline before colon or comma into inline punctuation\n sanitized = sanitized.replace(/\\r?\\n\\s*:\\s*/g, \": \");\n sanitized = sanitized.replace(/\\r?\\n\\s*,\\s*/g, \", \");\n\n // 2) Normalize all pipe‑tables in one go\n sanitized = normalizeTables(sanitized);\n\n return sanitized;\n };\n\n const enrichedMarkdown = useMemo(() => {\n if (typeof response !== \"string\") {\n return null;\n }\n\n const sanitized = sanitizeMarkdown(response);\n\n if (!sourcesMarkdownList.length) {\n return sanitized;\n }\n\n if (/\\*\\*Sources?\\*\\*/i.test(sanitized)) {\n return sanitized;\n }\n\n return `${sanitized}\\n\\n**Sources**\\n${sourcesMarkdownList.join(\"\\n\")}`;\n }, [response, sourcesMarkdownList]);\n\n const components: ReactMarkdownComponents = {\n mark({ children, node: _node, className, style, ...markProps }: MarkdownComponentProps<\"mark\">) {\n const contentText = React.Children.toArray(children)\n .map((child) => (typeof child === \"string\" ? child : \"\"))\n .join(\"\")\n .trim();\n\n return (\n <Box\n component=\"span\"\n className={className}\n style={style}\n {...markProps}\n sx={{\n display: \"inline-block\",\n backgroundColor: \"#2a3c4f\",\n color: \"#e0f7fa\",\n px: 1,\n py: 0.25,\n borderRadius: \"4px\",\n fontWeight: 500,\n fontSize: \"0.95rem\",\n lineHeight: 1.4,\n whiteSpace: \"normal\",\n width: \"fit-content\",\n maxWidth: \"100%\",\n }}\n >\n {contentText}\n </Box>\n );\n },\n code({ inline, className, children, node: _node, ...codeProps }: MarkdownComponentProps<\"code\">) {\n return (\n <MarkdownCodeBlock\n inline={inline}\n className={className}\n {...codeProps}\n theme={theme}\n chatResponse={chatResponse}\n >\n {children}\n </MarkdownCodeBlock>\n );\n },\n a({ href, children, node: _node, style, ...anchorProps }: MarkdownComponentProps<\"a\">) {\n return (\n <a\n href={href}\n {...anchorProps}\n style={{\n color: theme.palette.primary.main,\n textDecoration: \"underline\",\n ...(style ?? {}),\n }}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </a>\n );\n },\n em({ children, node: _node, className, style, ...emProps }: MarkdownComponentProps<\"em\">) {\n // Check for Bandit's weird <em><div class=\"MuiBox-root\">CODE</div></em>\n const onlyChild =\n Array.isArray(children) && children.length === 1 ? children[0] : null;\n\n if (\n onlyChild &&\n typeof onlyChild === \"object\" &&\n onlyChild.type === \"div\" &&\n onlyChild.props?.className?.includes(\"MuiBox-root\")\n ) {\n const inner = onlyChild.props.children;\n\n // Optional: skip rendering if it's literally the word \"CODE\"\n if (typeof inner === \"string\" && inner.trim().toUpperCase() === \"CODE\") {\n return null;\n }\n\n // Otherwise render nicely\n return (\n <Box\n sx={{\n fontFamily: \"monospace\",\n fontSize: \"0.9rem\",\n backgroundColor: theme.palette.background.default,\n color: theme.palette.text.primary,\n padding: \"12px 16px\",\n borderRadius: \"4px\",\n border: `1px solid ${theme.palette.divider}`,\n my: 1,\n display: \"inline-block\",\n }}\n >\n {inner}\n </Box>\n );\n }\n\n return (\n <em className={className} style={style} {...emProps}>\n {children}\n </em>\n );\n },\n ol({ children, node: _node, style, ...orderedListProps }: MarkdownComponentProps<\"ol\">) {\n const childArray = React.Children.toArray(children);\n const cleanedChildren: React.ReactNode[] = [];\n\n for (let i = 0; i < childArray.length; i++) {\n const item = childArray[i];\n\n // Remove raw colon-only text lines\n if (typeof item === \"string\" && item.trim() === \":\") {\n continue;\n }\n\n // If colon-prefixed string explanation\n if (typeof item === \"string\" && item.trim().startsWith(\":\")) {\n cleanedChildren.push(\n <Typography\n key={`ol-expl-${i}`}\n sx={{\n fontSize: \"0.875rem\",\n color: \"#aaa\",\n fontStyle: \"italic\",\n mt: 0.5,\n ml: 2,\n }}\n >\n {item.replace(/^:\\s*/, \"\")}\n </Typography>\n );\n } else {\n cleanedChildren.push(item);\n }\n }\n\n return (\n <ol\n {...orderedListProps}\n style={{\n paddingLeft: 24,\n marginLeft: 16,\n listStyleType: \"decimal\",\n ...(style ?? {}),\n }}\n >\n {cleanedChildren}\n </ol>\n );\n },\n\n ul({ children, node: _node, style, ...unorderedListProps }: MarkdownComponentProps<\"ul\">) {\n return (\n <ul\n {...unorderedListProps}\n style={{\n paddingLeft: \"1.5rem\",\n marginTop: \"0.5rem\",\n marginBottom: \"0.25rem\",\n listStyle: \"disc\",\n ...(style ?? {}),\n }}\n >\n {React.Children.toArray(children).filter((child) => {\n if (typeof child === \"string\" && child.trim() === \":\") return false;\n return true;\n })}\n </ul>\n );\n },\n li({ children, node: _node, style, ...listItemProps }: MarkdownComponentProps<\"li\">) {\n const childArray = React.Children.toArray(children);\n // New logic: If first child is <strong> whose text ends with a colon, and rest is inline/plain\n if (\n childArray.length >= 2 &&\n React.isValidElement(childArray[0]) &&\n childArray[0].type === \"strong\"\n ) {\n // Extract label text from <strong>\n let labelText = \"\";\n const strongChild = childArray[0];\n if (typeof strongChild.props.children === \"string\") {\n labelText = strongChild.props.children;\n } else if (Array.isArray(strongChild.props.children)) {\n labelText = strongChild.props.children.join(\"\");\n }\n // Replace [object Object] with \"Item\"\n if (labelText?.includes(\"[object Object]\")) {\n labelText = \"Item\";\n }\n if (typeof labelText === \"string\" && labelText.trim().endsWith(\":\")) {\n // Check if all rest are inline/plain (no Box)\n const rest = childArray.slice(1);\n const isAllInline = rest.every(\n (el) =>\n typeof el === \"string\" ||\n (React.isValidElement(el) &&\n // allow inline tags, but not <Box>\n el.type !== Box)\n );\n if (isAllInline) {\n // Remove trailing colon from label for rendering\n const displayLabel = labelText.replace(/:\\s*$/, \"\");\n return (\n <li\n style={{\n marginBottom: \"0.5rem\",\n lineHeight: 1.4,\n whiteSpace: \"pre-wrap\",\n ...(style ?? {}),\n }}\n {...listItemProps}\n >\n <strong>{displayLabel}:</strong>\n {rest.length > 0 && <> {rest}</>}\n </li>\n );\n }\n }\n }\n // Special-case: <strong>Label:</strong> followed by a Box description\n if (\n childArray.length === 2 &&\n React.isValidElement(childArray[0]) &&\n childArray[0].type === \"strong\" &&\n React.isValidElement(childArray[1]) &&\n childArray[1].type === Box\n ) {\n const label = childArray[0].props.children;\n const desc = childArray[1].props.children;\n return (\n <li\n style={{ marginBottom: \"0.5rem\", lineHeight: 1.4, whiteSpace: \"pre-wrap\" }}\n {...listItemProps}\n >\n <span>\n <strong>{label}</strong> {desc}\n </span>\n </li>\n );\n }\n const contentArray = childArray;\n const filtered: React.ReactNode[] = [];\n\n for (let i = 0; i < contentArray.length; i++) {\n const item = contentArray[i];\n\n if (typeof item === \"string\" && item.trim() === \":\") continue;\n\n // Safer merge: use prev variable and check before merge\n if (i > 0 && typeof item === \"string\" && item.trim().startsWith(\":\")) {\n const prev = contentArray[i - 1];\n if (React.isValidElement(prev) && prev.type === \"strong\") {\n const desc = item.replace(/^:\\s*/, \"\");\n const prevKey = React.isValidElement(prev) && prev.key != null ? prev.key : `li-strong-${i}`;\n filtered.pop();\n filtered.push(\n <span key={`li-merge-${prevKey}`}>\n {prev}\n {\": \"}\n {desc}\n </span>\n );\n continue;\n }\n }\n filtered.push(item);\n }\n\n return (\n <li\n {...listItemProps}\n style={{\n marginBottom: \"0.5rem\",\n lineHeight: 1.4,\n whiteSpace: \"pre-wrap\",\n ...(style ?? {}),\n }}\n >\n {filtered}\n </li>\n );\n },\n table({ children, node: _node, className, style, ...tableProps }: MarkdownComponentProps<\"table\">) {\n return (\n <TableContainer\n component={Paper}\n className={className}\n style={style}\n sx={{ my: 2, bgcolor: theme.palette.background.paper }}\n >\n <Table size=\"small\" {...tableProps}>\n {children}\n </Table>\n </TableContainer>\n );\n },\n thead({ children, node: _node, ...tableHeadProps }: MarkdownComponentProps<\"thead\">) {\n return <TableHead {...tableHeadProps}>{children}</TableHead>;\n },\n tbody({ children, node: _node, ...tableBodyProps }: MarkdownComponentProps<\"tbody\">) {\n const rows = React.Children.toArray(children).filter((row: React.ReactNode) => {\n // Keep non-React elements\n if (!React.isValidElement(row)) return true;\n // Extract cell elements for this row\n const cells = React.Children.toArray(row.props.children);\n // Filter out rows where every cell is a string of hyphens\n return !cells.every(\n (cell) =>\n React.isValidElement(cell) &&\n typeof cell.props.children === \"string\" &&\n /^-+$/.test(cell.props.children.trim())\n );\n });\n return <TableBody {...tableBodyProps}>{rows}</TableBody>;\n },\n tr({ children, node: _node, ...tableRowProps }: MarkdownComponentProps<\"tr\">) {\n return <TableRow {...tableRowProps}>{children}</TableRow>;\n },\n th({ children, node: _node, ...tableCellProps }: MarkdownComponentProps<\"th\">) {\n return (\n <TableCell\n {...tableCellProps}\n sx={{\n fontWeight: \"bold\",\n color: theme.palette.text.primary,\n bgcolor: theme.palette.action.hover,\n textAlign: \"left\",\n padding: \"8px 12px\",\n whiteSpace: \"nowrap\",\n }}\n >\n {children}\n </TableCell>\n );\n },\n td({ children, node: _node, ...tableCellProps }: MarkdownComponentProps<\"td\">) {\n return (\n <TableCell\n {...tableCellProps}\n sx={{\n color: theme.palette.text.primary,\n fontSize: \"0.875rem\",\n padding: \"8px 12px\",\n verticalAlign: \"top\",\n }}\n >\n {children}\n </TableCell>\n );\n },\n p({ children, node: _node, className, style, ...paragraphProps }: MarkdownComponentProps<\"p\">) {\n // Flatten children and detect block-level elements\n const flattened = React.Children.toArray(children).flat();\n const hasBlock = flattened.some(\n (child) =>\n typeof child === \"object\" &&\n child !== null &&\n \"type\" in child &&\n typeof child.type === \"string\" &&\n [\"div\", \"Box\", \"section\", \"ul\", \"ol\", \"table\"].includes(child.type)\n );\n // If a block element is present, render without wrapping\n if (hasBlock) {\n return <>{flattened}</>;\n }\n // Otherwise wrap inline text in a div\n return (\n <Box component=\"div\" sx={{ margin: \"0.25rem 0\" }}>\n <Typography\n component=\"div\"\n variant=\"body2\"\n className={className}\n style={style}\n sx={{ color: theme.palette.text.primary, lineHeight: 1.6, display: \"inline\" }}\n {...paragraphProps}\n >\n {flattened}\n </Typography>\n </Box>\n );\n },\n };\n\n return (\n <>\n <Box\n sx={{\n width: '100%',\n maxWidth: '100%',\n flexGrow: 1,\n alignSelf: 'stretch',\n display: 'flex',\n flexDirection: 'column',\n bgcolor: chatResponse.containerBackground,\n color: chatResponse.aiText || \"#fff\",\n p: isMobile ? 1 : 2,\n borderRadius: \"4px\",\n userSelect: \"text\",\n border: \"1px solid \" + (chatResponse.aiBorder || \"#ccc\"),\n boxShadow: \"0 0 6px rgba(0,0,0,0.3)\",\n }}\n >\n {/* User message bubble, right-aligned on desktop */}\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: {\n xs: \"flex-start\",\n sm: \"flex-end\",\n },\n gap: 2,\n mb: 2,\n justifyContent: \"flex-end\",\n }}\n >\n {/* User avatar and caption - now at the top */}\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n }}\n >\n <Avatar\n alt=\"You\"\n src={userAvatar}\n sx={{\n display: { xs: \"none\", sm: \"flex\" },\n width: { sm: 72 },\n height: { sm: 72 },\n bgcolor: chatResponse.userAvatarBackground || (theme.palette.mode === \"dark\" ? \"transparent\" : \"#eee\"),\n color: \"#fff\",\n fontWeight: \"bold\",\n fontSize: { sm: \"1.1rem\" },\n border: \"2px solid #a78bfa\",\n boxShadow: \"0 0 8px rgba(167, 139, 250, 0.3)\",\n transform: \"scaleX(1)\",\n }}\n ></Avatar>\n <Typography\n variant=\"caption\"\n sx={{ color: chatResponse.modelLabel || \"#888\", mt: 1, fontStyle: \"italic\" }}\n >\n You said\n </Typography>\n </Box>\n {/* Message bubble */}\n <Box sx={{ flex: 1 }}>\n <Box\n sx={{\n display: \"inline-block\",\n textAlign: \"left\",\n bgcolor: chatResponse.userBubble || \"#1f1f1f\",\n borderRadius: \"4px\",\n px: isMobile ? 1 : 2,\n py: 1.5,\n width: isMobile ? \"100%\" : \"fit-content\",\n maxWidth: \"100%\",\n border: \"1px solid \" + (chatResponse.aiBorder || \"#444\"),\n wordBreak: \"break-word\",\n whiteSpace: \"pre-wrap\",\n overflowWrap: \"break-word\",\n mt: { xs: 0.5, sm: 0.25 },\n }}\n >\n <Typography\n sx={{\n color: chatResponse.userText || \"#6C9AC5\",\n fontStyle: \"italic\",\n wordBreak: \"break-word\",\n whiteSpace: \"pre-wrap\",\n }}\n >\n {question}\n </Typography>\n </Box>\n {/* Images, if any */}\n {images && images.length > 0 && (\n <Box sx={{ display: \"flex\", gap: 1, mt: 1, flexWrap: \"wrap\" }}>\n {images.map((img, i) => (\n <Avatar\n key={i}\n src={img}\n variant=\"rounded\"\n onClick={() => setOpenImage(img)}\n sx={{\n width: 64,\n height: 64,\n borderRadius: 2,\n cursor: \"pointer\",\n \"&:hover\": { boxShadow: `0 0 0 2px ${theme.palette.primary.main}` },\n }}\n />\n ))}\n </Box>\n )}\n </Box>\n </Box>\n\n {/* Divider */}\n <Box sx={{ borderBottom: `1px solid ${theme.palette.divider}`, my: 2 }} />\n\n {/* AI avatar and response bubble, left-aligned like a chat bubble */}\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: {\n xs: \"center\",\n sm: \"flex-start\",\n },\n gap: 2,\n mb: 2,\n }}\n >\n {/* AI avatar above the message bubble */}\n {typeof response === \"string\" && response.trim() !== \"\" && (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n mr: 2,\n position: \"relative\",\n }}\n >\n <Avatar\n src={resolveAvatar(selectedModel)}\n alt={selectedModel}\n sx={{\n display: { xs: \"none\", sm: \"flex\" },\n width: 72,\n height: 72,\n border: \"1px solid #888\",\n boxShadow: \"0 0 6px rgba(136, 136, 136, 0.4)\",\n filter: \"brightness(1.6)\",\n }}\n />\n <Box sx={{ display: { xs: \"none\", sm: \"block\" } }}>\n <Typography\n variant=\"caption\"\n sx={{ color: chatResponse.modelLabel || \"#888\", mt: 1, fontStyle: \"italic\" }}\n >\n {selectedModel} says\n </Typography>\n </Box>\n </Box>\n )}\n {/* Model name above AI response bubble (mobile only) */}\n <Box\n sx={{\n display: { xs: \"flex\", sm: \"none\" },\n justifyContent: \"right\",\n width: \"100%\",\n mt: -1,\n mb: 1,\n }}\n >\n <Typography\n variant=\"caption\"\n sx={{ fontStyle: \"italic\", color: chatResponse.modelLabel || \"#888\" }}\n >\n {selectedModel} says\n </Typography>\n </Box>\n {/* AI chat bubble and memory update indicator wrapper */}\n <Box sx={{ position: \"relative\", width: \"100%\" }}>\n {cancelled && (\n <Box\n sx={{\n position: \"absolute\",\n top: -24,\n left: 0,\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n pl: 1,\n zIndex: 1,\n }}\n >\n <Typography variant=\"caption\" sx={{ fontStyle: \"italic\", opacity: 0.85 }}>\n Cancelled by you\n </Typography>\n </Box>\n )}\n {showMemoryUpdated && (\n <Box\n sx={{\n position: \"absolute\",\n top: -24,\n right: 0,\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n pr: 1,\n animation: \"fadeOut 0.3s ease-in 2.7s forwards\",\n zIndex: 1,\n }}\n >\n <img\n src={brainIcon}\n alt=\"Memory\"\n style={{ width: 18, height: 18 }}\n />\n <Typography\n variant=\"caption\"\n sx={{ color: chatResponse.memoryText || \"#2e7d32\", fontStyle: \"italic\" }}\n >\n Bandit added to memory\n </Typography>\n </Box>\n )}\n <Box\n sx={{\n bgcolor: chatResponse.aiBubble ?? \"#2f2f2f\",\n borderRadius: \"4px\",\n px: isMobile ? 1 : 1.5, // Reduced padding on mobile\n py: 1.25,\n width: \"100%\",\n maxWidth: isMobile ? \"100%\" : \"768px\", // Full width on mobile\n border: \"1px solid \" + (chatResponse.aiBorder || \"#ccc\"),\n wordBreak: \"break-word\",\n alignSelf: \"flex-start\",\n mt: { xs: 0.5, sm: 0.25 },\n }}\n >\n <Box sx={{ width: '100%', maxWidth: '100%' }}>\n {typeof response === \"string\" ? (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw, [rehypeSanitize, markdownSanitizeSchema]]}\n components={components}\n >\n {enrichedMarkdown ?? sanitizeMarkdown(response)}\n </ReactMarkdown>\n ) : React.isValidElement(response) ? (\n response\n ) : (\n <Typography color=\"error\">⚠️ Invalid AI response</Typography>\n )}\n </Box>\n </Box>\n </Box>\n </Box>\n {/* Actions bar at the bottom */}\n {!!(responseText || (typeof response === \"string\" && response)) && (\n <AiResponseActionsBar text={(responseText || (response as string)) as string} />\n )}\n {displaySourceFiles && displaySourceFiles.length > 0 && (\n <Box sx={{ mt: 1.5, display: \"flex\", gap: 2, flexWrap: \"wrap\", justifyContent: \"flex-start\" }}>\n {displaySourceFiles.map((doc, idx) => {\n debugLogger.debug(\"Rendering DocumentCard in AI response\", {\n index: idx,\n id: doc.id,\n name: doc.name,\n });\n return (\n <DocumentCard \n key={idx} \n doc={doc} \n onView={() => setOpenDoc(doc)}\n variant=\"mini\"\n isHistoricalReference={true}\n allowErrorStates={true}\n />\n );\n })}\n </Box>\n )}\n </Box>\n\n {/* Fullscreen image preview modal */}\n <Modal open={!!openImage} onClose={() => setOpenImage(null)}>\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100vh\",\n bgcolor: \"rgba(0, 0, 0, 0.9)\",\n p: 2,\n position: \"relative\",\n }}\n >\n <IconButton\n onClick={() => setOpenImage(null)}\n sx={{\n position: \"absolute\",\n top: 16,\n right: 16,\n color: \"#fff\",\n bgcolor: \"rgba(0,0,0,0.6)\",\n \"&:hover\": {\n bgcolor: \"rgba(255,255,255,0.2)\",\n },\n }}\n >\n <CloseIcon />\n </IconButton>\n <Box\n component=\"img\"\n src={openImage || \"\"}\n alt=\"Full-size\"\n sx={{\n maxHeight: \"90vh\",\n maxWidth: \"90vw\",\n borderRadius: 2,\n boxShadow: 24,\n cursor: \"zoom-out\",\n }}\n onClick={() => setOpenImage(null)}\n />\n </Box>\n </Modal>\n <KnowledgeFileModal \n open={!!openDoc} \n onClose={() => setOpenDoc(null)} \n doc={openDoc} \n isVectorDocument={openDoc ? (() => {\n const isVector = isVectorDocument(openDoc);\n debugLogger.debug(\"Knowledge file modal open request\", {\n documentId: openDoc.id,\n name: openDoc.name,\n isVector,\n });\n return isVector;\n })() : false}\n />\n </>\n );\n};\n\nexport default AIResponseTextField;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-AC9A-B43BC2\nconst __banditFingerprint_shared_DocumentCardtsx = 'BL-FP-3F514D-0451';\nconst __auditTrail_shared_DocumentCardtsx = 'BL-AU-MGOIKVW1-S428';\n// File: DocumentCard.tsx | Path: src/shared/DocumentCard.tsx | Hash: ac9a0451\n\nimport React, { useState, useEffect } from \"react\";\nimport {\n Box,\n Typography,\n Button,\n Tooltip,\n Card,\n CardContent,\n IconButton,\n Chip,\n Alert,\n} from \"@mui/material\";\nimport SearchIcon from \"@mui/icons-material/Search\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport InfoIcon from \"@mui/icons-material/Info\";\nimport DeleteIcon from \"@mui/icons-material/Delete\";\nimport ErrorOutlineIcon from \"@mui/icons-material/ErrorOutline\";\nimport CloudOffIcon from \"@mui/icons-material/CloudOff\";\nimport PictureAsPdfIcon from \"@mui/icons-material/PictureAsPdf\";\nimport DescriptionIcon from \"@mui/icons-material/Description\";\nimport ArticleIcon from \"@mui/icons-material/Article\";\nimport CodeIcon from \"@mui/icons-material/Code\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport DataObjectIcon from \"@mui/icons-material/DataObject\";\nimport PersonIcon from \"@mui/icons-material/Person\";\nimport CloudIcon from \"@mui/icons-material/Cloud\";\nimport { KnowledgeDoc } from \"../store/knowledgeStore\";\nimport { useKnowledgeStore } from \"../chat/hooks/useKnowledgeStore\";\nimport { useVectorStore } from \"../hooks/useVectorStore\";\nimport { useTheme } from \"@mui/material/styles\";\n\ninterface DocumentCardProps {\n doc: KnowledgeDoc;\n onView: () => void;\n onDelete?: (id: string) => void;\n onSelect?: (id: string) => void;\n isSelected?: boolean;\n isDeleting?: boolean; // For deletion animation\n variant?: 'mini' | 'full'; // Mini for chat responses, full for knowledge tab\n showSelection?: boolean;\n showDelete?: boolean;\n showPreview?: boolean;\n // New props for handling error states\n isHistoricalReference?: boolean; // True when this card is from a past conversation\n allowErrorStates?: boolean; // Whether to show error states instead of hiding the card\n}\n\ntype FileTypeInfo = {\n icon: React.ElementType;\n color: string;\n category: string;\n language?: string;\n};\n\n// Enhanced file type detection (from KnowledgeTab)\nconst getFileTypeInfo = (filename: string): FileTypeInfo => {\n const ext = filename.split('.').pop()?.toLowerCase() || '';\n \n const languageMap: Record<string, FileTypeInfo> = {\n // Documents\n 'pdf': { icon: PictureAsPdfIcon, color: '#d32f2f', category: 'Document' },\n 'doc': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n 'docx': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n 'odt': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n 'rtf': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n \n // Text files\n 'txt': { icon: DescriptionIcon, color: '#388e3c', category: 'Text' },\n 'md': { icon: DescriptionIcon, color: '#388e3c', category: 'Text', language: 'Markdown' },\n 'markdown': { icon: DescriptionIcon, color: '#388e3c', category: 'Text', language: 'Markdown' },\n \n // Programming languages\n 'js': { icon: CodeIcon, color: '#f7df1e', category: 'Code', language: 'JavaScript' },\n 'jsx': { icon: CodeIcon, color: '#61dafb', category: 'Code', language: 'React' },\n 'ts': { icon: CodeIcon, color: '#3178c6', category: 'Code', language: 'TypeScript' },\n 'tsx': { icon: CodeIcon, color: '#61dafb', category: 'Code', language: 'React TS' },\n 'py': { icon: CodeIcon, color: '#3776ab', category: 'Code', language: 'Python' },\n 'java': { icon: CodeIcon, color: '#ed8b00', category: 'Code', language: 'Java' },\n 'c': { icon: CodeIcon, color: '#a8b9cc', category: 'Code', language: 'C' },\n 'cpp': { icon: CodeIcon, color: '#00599c', category: 'Code', language: 'C++' },\n 'cs': { icon: CodeIcon, color: '#239120', category: 'Code', language: 'C#' },\n 'go': { icon: CodeIcon, color: '#00add8', category: 'Code', language: 'Go' },\n 'rs': { icon: CodeIcon, color: '#dea584', category: 'Code', language: 'Rust' },\n 'php': { icon: CodeIcon, color: '#777bb4', category: 'Code', language: 'PHP' },\n 'rb': { icon: CodeIcon, color: '#cc342d', category: 'Code', language: 'Ruby' },\n 'kt': { icon: CodeIcon, color: '#7f52ff', category: 'Code', language: 'Kotlin' },\n 'swift': { icon: CodeIcon, color: '#fa7343', category: 'Code', language: 'Swift' },\n \n // Data files\n 'json': { icon: DataObjectIcon, color: '#ffd600', category: 'Data', language: 'JSON' },\n 'xml': { icon: DataObjectIcon, color: '#ff6600', category: 'Data', language: 'XML' },\n 'yaml': { icon: DataObjectIcon, color: '#cb171e', category: 'Data', language: 'YAML' },\n 'yml': { icon: DataObjectIcon, color: '#cb171e', category: 'Data', language: 'YAML' },\n 'csv': { icon: DataObjectIcon, color: '#14a085', category: 'Data', language: 'CSV' },\n };\n\n return languageMap[ext] || { icon: DescriptionIcon, color: '#666', category: 'File' };\n};\n\n// Content source info (from KnowledgeTab)\nconst getContentSourceInfo = (doc: KnowledgeDoc, shouldUseVector: boolean) => {\n if (shouldUseVector && doc.s3Url) {\n // Vector database document\n return {\n icon: CloudIcon,\n label: doc.isTeamContent ? 'Team Cloud' : 'Cloud',\n color: '#1976d2',\n bgColor: '#1976d220',\n };\n } else {\n // Local document\n return {\n icon: PersonIcon,\n label: 'Local',\n color: '#388e3c',\n bgColor: '#388e3c20',\n };\n }\n};\n\n// Format file size utility\nconst formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\n};\n\nconst DocumentCard: React.FC<DocumentCardProps> = ({\n doc,\n onView,\n onDelete,\n onSelect,\n isSelected = false,\n isDeleting = false,\n variant = 'mini',\n showSelection = false,\n showDelete = false,\n showPreview = true,\n isHistoricalReference = false,\n allowErrorStates = true,\n}) => {\n const theme = useTheme();\n const { isVectorDocument } = useKnowledgeStore();\n const { downloadVectorFile, isVectorEnabled } = useVectorStore();\n const [documentState, setDocumentState] = useState<'available' | 'unavailable' | 'access-changed' | 'checking'>('checking');\n const [errorMessage, setErrorMessage] = useState<string>('');\n\n // Check document availability and access status\n useEffect(() => {\n const checkDocumentStatus = async () => {\n try {\n const isVector = isVectorDocument(doc);\n \n // Case 1: Vector document but vector access is now disabled\n if (isVector && !isVectorEnabled) {\n setDocumentState('access-changed');\n setErrorMessage('Vector database access disabled. Document not accessible.');\n return;\n }\n \n // Case 2: Vector document - try to verify it exists\n if (isVector) {\n try {\n // Attempt to get file blob to verify existence\n const fileId = doc.s3Url || doc.id;\n // Note: We don't actually fetch here to avoid performance issues,\n // but this is where we could add a lightweight existence check\n setDocumentState('available');\n } catch (error) {\n setDocumentState('unavailable');\n setErrorMessage('Document no longer exists in cloud storage.');\n }\n }\n // Case 3: Local document - check if it has content or rawData\n else {\n if (!doc.content && !doc.rawData) {\n setDocumentState('unavailable');\n setErrorMessage('Document content not available.');\n } else {\n setDocumentState('available');\n }\n }\n } catch (error) {\n setDocumentState('unavailable');\n setErrorMessage('Unable to verify document status.');\n }\n };\n\n if (isHistoricalReference) {\n checkDocumentStatus();\n } else {\n setDocumentState('available');\n }\n }, [doc, isHistoricalReference, isVectorEnabled, isVectorDocument]);\n \n const fileInfo = getFileTypeInfo(doc.name);\n const IconComponent = fileInfo.icon;\n const shouldUseVector = isVectorEnabled;\n const sourceInfo = getContentSourceInfo(doc, shouldUseVector);\n\n // Don't render if document is unavailable and error states are not allowed\n if (documentState === 'unavailable' && !allowErrorStates) {\n return null;\n }\n\n const handleDownload = async (e: React.MouseEvent) => {\n e.stopPropagation();\n \n // Prevent download if document is not available\n if (documentState !== 'available') {\n debugLogger.warn('Cannot download document - not available', { documentState, documentId: doc.id });\n return;\n }\n \n try {\n const isVector = isVectorDocument(doc);\n debugLogger.debug('Document download initiated', { name: doc.name, isVector });\n \n if (isVector) {\n const fileId = doc.s3Url || doc.id;\n debugLogger.debug('Downloading vector document', { fileId, name: doc.name });\n await downloadVectorFile(fileId, doc.name);\n } else {\n if (doc.rawData) {\n debugLogger.debug('Downloading local document from raw data', { name: doc.name });\n const binaryString = atob(doc.rawData);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n const mimeType = doc.type || doc.mimeType || 'application/octet-stream';\n const blob = new Blob([bytes], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = doc.name;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n } else {\n debugLogger.debug('Downloading local document from content fallback', { name: doc.name });\n const content = doc.content || '';\n const mimeType = doc.type || doc.mimeType || 'text/plain';\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = doc.name;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n }\n } catch (error) {\n debugLogger.error('DocumentCard download failed', { error, documentId: doc.id, name: doc.name });\n }\n };\n\n const handleCardClick = (e: React.MouseEvent) => {\n // Prevent interaction if document is not available\n if (documentState !== 'available') {\n e.stopPropagation();\n return;\n }\n \n if (e.ctrlKey || e.metaKey) {\n onSelect?.(doc.id);\n } else {\n onView();\n }\n };\n\n // Helper function to get error state styling\n const getErrorStateStyles = () => {\n if (documentState === 'available') return {};\n \n return {\n opacity: 0.6,\n position: 'relative',\n pointerEvents: documentState === 'checking' ? 'none' : 'auto',\n '&::after': (documentState === 'unavailable' || documentState === 'access-changed') ? {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n background: 'rgba(0, 0, 0, 0.1)',\n backdropFilter: 'blur(1px)',\n borderRadius: 'inherit',\n pointerEvents: 'none',\n } : {},\n };\n };\n\n // Helper function to render error message overlay\n const renderErrorOverlay = () => {\n if (documentState === 'available' || documentState === 'checking') return null;\n \n const errorIcon = documentState === 'access-changed' ? CloudOffIcon : ErrorOutlineIcon;\n const ErrorIcon = errorIcon;\n \n return (\n <Box\n sx={{\n position: 'absolute',\n top: 8,\n right: 8,\n zIndex: 2,\n }}\n >\n <Tooltip title={errorMessage} arrow>\n <ErrorIcon \n sx={{ \n fontSize: variant === 'mini' ? 16 : 20,\n color: 'error.main',\n filter: 'drop-shadow(0 1px 2px rgba(0,0,0,0.3))',\n }} \n />\n </Tooltip>\n </Box>\n );\n };\n\n if (variant === 'mini') {\n return (\n <Card\n sx={{\n p: 1.5,\n borderRadius: 2,\n border: \"1px solid\",\n borderColor: isSelected ? \"primary.main\" : \"divider\",\n bgcolor: isSelected ? \"primary.main\" + \"08\" : \"background.paper\",\n boxShadow: 4,\n width: 180,\n textAlign: \"center\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n minHeight: 160,\n cursor: documentState === 'available' ? \"pointer\" : \"not-allowed\",\n transition: \"all 0.2s ease-in-out\",\n '&:hover': documentState === 'available' ? {\n boxShadow: 6,\n borderColor: \"primary.light\",\n transform: \"translateY(-2px)\",\n } : {},\n ...getErrorStateStyles(),\n }}\n onClick={handleCardClick}\n >\n {renderErrorOverlay()}\n \n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n mb: 1,\n }}\n >\n <IconComponent sx={{ fontSize: 32, color: fileInfo.color }} />\n </Box>\n \n <Tooltip title={doc.name} arrow>\n <Typography\n variant=\"caption\"\n sx={{\n display: \"block\",\n color: \"text.primary\",\n fontWeight: 500,\n mb: 1,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n width: \"100%\",\n }}\n >\n {doc.name}\n </Typography>\n </Tooltip>\n\n <Box sx={{ display: \"flex\", gap: 0.5, mb: 1, flexWrap: \"wrap\", justifyContent: \"center\" }}>\n <Chip\n icon={<sourceInfo.icon sx={{ fontSize: '0.8rem !important' }} />}\n label={sourceInfo.label}\n size=\"small\"\n sx={{\n bgcolor: sourceInfo.bgColor,\n color: sourceInfo.color,\n fontWeight: 600,\n fontSize: '0.65rem',\n }}\n />\n <Chip \n label={fileInfo.category} \n size=\"small\" \n sx={{ \n bgcolor: fileInfo.color + '20',\n color: fileInfo.color,\n fontWeight: 500,\n fontSize: '0.65rem',\n }}\n />\n </Box>\n\n <Box sx={{ display: \"flex\", gap: 1, mt: 1 }}>\n <Tooltip title={documentState === 'available' ? \"View\" : \"Document not available\"}>\n <span>\n <Button\n size=\"small\"\n variant=\"contained\"\n color=\"primary\"\n disabled={documentState !== 'available'}\n sx={{\n px: 1.5,\n borderRadius: \"999px\",\n minWidth: 0,\n height: 32,\n }}\n onClick={(e) => {\n e.stopPropagation();\n if (documentState === 'available') onView();\n }}\n >\n <SearchIcon fontSize=\"small\" />\n </Button>\n </span>\n </Tooltip>\n <Tooltip title={documentState === 'available' ? \"Download\" : errorMessage}>\n <span>\n <Button\n size=\"small\"\n variant=\"outlined\"\n color=\"secondary\"\n disabled={documentState !== 'available'}\n sx={{\n px: 1.5,\n borderRadius: \"999px\",\n minWidth: 0,\n height: 32,\n }}\n onClick={handleDownload}\n >\n <DownloadIcon fontSize=\"small\" />\n </Button>\n </span>\n </Tooltip>\n </Box>\n </Card>\n );\n }\n\n // Full variant for Knowledge Tab\n return (\n <Card\n sx={{\n position: \"relative\",\n height: { xs: 260, sm: 280, md: 300 },\n cursor: documentState === 'available' ? \"pointer\" : \"not-allowed\",\n transition: \"all 0.3s ease-in-out\",\n border: isSelected ? `2px solid ${theme.palette?.primary?.main}` : `1px solid ${theme.palette?.divider}`,\n \"&:hover\": documentState === 'available' ? {\n boxShadow: 6,\n transform: isDeleting ? 'scale(0.9)' : 'translateY(-2px)',\n } : {},\n bgcolor: isSelected ? `${theme.palette?.primary?.main}08` : 'background.paper',\n display: 'flex',\n flexDirection: 'column',\n opacity: isDeleting ? 0.4 : 1,\n transform: isDeleting ? 'scale(0.9)' : 'scale(1)',\n ...getErrorStateStyles(),\n }}\n onClick={handleCardClick}\n >\n {renderErrorOverlay()}\n \n <CardContent sx={{ \n p: { xs: 1.5, sm: 2 }, \n height: '100%', \n display: 'flex', \n flexDirection: 'column',\n overflow: 'hidden'\n }}>\n {/* File Type Icon and Actions */}\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', mb: 1, height: 32 }}>\n <IconComponent sx={{ fontSize: 32, color: fileInfo.color, flexShrink: 0 }} />\n <Box sx={{ display: 'flex', gap: 0.5, flexShrink: 0 }}>\n {showSelection && (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n onSelect?.(doc.id);\n }}\n sx={{ \n width: 24, \n height: 24,\n bgcolor: isSelected ? 'primary.main' : 'transparent',\n color: isSelected ? 'primary.contrastText' : 'text.secondary',\n '&:hover': {\n bgcolor: isSelected ? 'primary.dark' : 'action.hover',\n }\n }}\n >\n {isSelected ? '✓' : '○'}\n </IconButton>\n )}\n {showDelete && (\n <IconButton\n size=\"small\"\n color=\"error\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete?.(doc.id);\n }}\n sx={{ width: 24, height: 24 }}\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n </Box>\n\n {/* Document Preview */}\n {showPreview && (\n <Box\n sx={{\n mb: 1.5,\n p: { xs: 1, sm: 1.5 },\n borderRadius: 1.5,\n bgcolor: 'background.paper',\n border: '1px solid',\n borderColor: 'divider',\n overflow: 'hidden',\n position: 'relative',\n height: { xs: 60, sm: 70, md: 80 },\n display: 'flex',\n alignItems: 'center',\n }}\n >\n {doc.content && doc.content.length > 0 ? (\n <Typography\n variant=\"body2\"\n sx={{\n display: \"-webkit-box\",\n WebkitLineClamp: 3,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n color: 'text.secondary',\n lineHeight: 1.3,\n fontSize: '0.8rem',\n }}\n >\n {doc.content.substring(0, 100)}...\n </Typography>\n ) : (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, opacity: 0.6 }}>\n <InfoIcon sx={{ fontSize: 16 }} />\n <Typography variant=\"caption\" color=\"text.disabled\">\n No preview available\n </Typography>\n </Box>\n )}\n </Box>\n )}\n\n {/* Document Name */}\n <Tooltip title={doc.name} arrow>\n <Typography\n variant=\"body2\"\n sx={{\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n mb: 1,\n color: 'text.primary',\n fontSize: { xs: '0.8rem', sm: '0.875rem' },\n height: { xs: '1.2rem', sm: '1.3rem' },\n }}\n >\n {doc.name}\n </Typography>\n </Tooltip>\n \n {/* Tags and size */}\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', mb: 1, minHeight: 40 }}>\n <Box sx={{ display: 'flex', gap: 0.5, flexWrap: 'wrap', flex: 1, mr: 1 }}>\n <Chip\n icon={<sourceInfo.icon sx={{ fontSize: '0.9rem !important' }} />}\n label={sourceInfo.label}\n size=\"small\"\n sx={{\n bgcolor: sourceInfo.bgColor,\n color: sourceInfo.color,\n fontWeight: 700,\n fontSize: '0.75rem',\n border: `2px solid ${sourceInfo.color}60`,\n '& .MuiChip-icon': {\n color: `${sourceInfo.color} !important`,\n },\n boxShadow: `0 2px 4px ${sourceInfo.color}20`,\n }}\n />\n \n <Chip \n label={fileInfo.category} \n size=\"small\" \n sx={{ \n bgcolor: fileInfo.color + '20',\n color: fileInfo.color,\n fontWeight: 500,\n fontSize: '0.65rem',\n }}\n />\n {fileInfo.language && (\n <Chip \n label={fileInfo.language} \n size=\"small\" \n sx={{ \n bgcolor: fileInfo.color + '15',\n color: fileInfo.color,\n fontWeight: 400,\n fontSize: '0.6rem',\n border: `1px solid ${fileInfo.color}30`,\n }}\n />\n )}\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ flexShrink: 0 }}>\n {formatFileSize((doc.content?.length || 0) * 2)}\n </Typography>\n </Box>\n\n {/* Download Button */}\n <Box sx={{ mt: 'auto' }}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n fullWidth\n disabled={documentState !== 'available'}\n sx={{ \n textTransform: 'none',\n height: { xs: 32, sm: 36, md: 40 },\n flexShrink: 0,\n borderWidth: 2,\n fontSize: { xs: '0.75rem', sm: '0.8rem', md: '0.875rem' },\n fontWeight: 600,\n '&:hover': documentState === 'available' ? {\n borderWidth: 2,\n bgcolor: 'primary.main',\n color: 'primary.contrastText',\n transform: 'translateY(-1px)',\n boxShadow: 2,\n } : {},\n '&.Mui-disabled': {\n opacity: 0.6,\n borderColor: 'action.disabled',\n color: 'text.disabled',\n },\n }}\n onClick={handleDownload}\n startIcon={<DownloadIcon sx={{ fontSize: { xs: '1rem', sm: '1.1rem' } }} />}\n >\n {documentState === 'available' ? 'Download' : 'Unavailable'}\n </Button>\n \n {/* Error message for full variant */}\n {documentState !== 'available' && documentState !== 'checking' && (\n <Alert \n severity=\"warning\" \n sx={{ \n mt: 1, \n fontSize: '0.75rem',\n '& .MuiAlert-icon': { fontSize: '1rem' },\n '& .MuiAlert-message': { padding: '0' },\n }}\n >\n {errorMessage}\n </Alert>\n )}\n </Box>\n </CardContent>\n </Card>\n );\n};\n\nexport default DocumentCard;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-85A0-F6B027\nconst __banditFingerprint_hooks_useKnowledgeStoretsx = 'BL-FP-418893-DFF3';\nconst __auditTrail_hooks_useKnowledgeStoretsx = 'BL-AU-MGOIKVV2-OGXL';\n// File: useKnowledgeStore.tsx | Path: src/chat/hooks/useKnowledgeStore.tsx | Hash: 85a0dff3\n\nimport { useState, useCallback, useMemo } from \"react\";\nimport { useKnowledgeStore as useZustandKnowledgeStore, KnowledgeDoc } from \"../../store/knowledgeStore\";\nimport indexedDBService from \"../../services/indexedDB/indexedDBService\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport mammoth from \"mammoth\";\nimport * as pdfjsLib from \"pdfjs-dist/legacy/build/pdf\";\nimport type { TextItem, TextMarkedContent } from \"pdfjs-dist/types/src/display/api\";\nimport { embeddingService } from \"../../services/embedding/embeddingService\";\nimport { debugLogger } from \"../../services/logging/debugLogger\";\nimport { vectorDatabaseService } from \"../../services/vectorDatabase/vectorDatabaseService\";\nimport { useVectorStore } from \"../../hooks/useVectorStore\";\n\n// Re-export for backward compatibility\nexport type { KnowledgeDoc };\n\n/**\n * Knowledge Store Hook - Dual Storage Pattern\n * \n * This hook supports two different storage patterns based on user subscription and preferences:\n * \n * 1. **Local Storage (Basic Users)**:\n * - Users without vector DB access (lower tier subscriptions)\n * - Files are parsed locally and content + embeddings stored in IndexedDB\n * - Uses fake embedding service for similarity search\n * - Supports text files, DOCX, and limited PDF text extraction\n * \n * 2. **Vector Database + S3 (Advanced Users)**:\n * - Users with enhanced search features enabled\n * - Files uploaded to S3, embeddings generated server-side\n * - Only metadata stored in IndexedDB (lightweight references)\n * - Full PDF preview and advanced semantic search capabilities\n * \n * The storage method is automatically determined by `isVectorEnabled` from useVectorStore.\n */\n\n// PDF worker will be configured when package settings are available\n// pdfjsLib.GlobalWorkerOptions.workerSrc = \"/pdf.worker.js\";\n\nconst DB_NAME = \"banditKnowledge\";\nconst STORE_NAME = \"documents\";\nconst MAX_FILES = 20;\n\ntype KnowledgeDocWithVectorMetadata = KnowledgeDoc & { _vectorResult?: unknown };\n\nconst hasVectorMetadata = (doc: KnowledgeDoc): doc is KnowledgeDocWithVectorMetadata =>\n typeof doc === \"object\" && doc !== null && \"_vectorResult\" in doc;\n\nconst isTextItem = (item: TextItem | TextMarkedContent): item is TextItem =>\n typeof item === \"object\" && item !== null && \"str\" in item;\n\nexport const useKnowledgeStore = () => {\n const [documents, setDocuments] = useState<KnowledgeDoc[]>([]);\n\n const vectorStore = useVectorStore();\n const { isVectorEnabled, uploadDocument } = vectorStore;\n\n const storeConfigs = useMemo(() => [{ name: STORE_NAME, keyPath: \"id\" }], []);\n\n const loadDocuments = useCallback(async () => {\n const docs = await indexedDBService.getAll<KnowledgeDoc>(DB_NAME, 1, STORE_NAME, storeConfigs);\n setDocuments(docs);\n \n // Sync with zustand store - set the docs directly\n useZustandKnowledgeStore.setState({ \n docs: docs || [], \n isLoaded: true \n });\n debugLogger.debug(\"Synced knowledge docs with store\", { count: docs?.length || 0 });\n }, [storeConfigs]);\n\n const removeDocument = async (id: string) => {\n try {\n // First, try to delete from Gateway API (vector database, S3, and MongoDB)\n // This handles vector documents stored in the cloud\n const gatewayDeleteSuccess = await vectorDatabaseService.deleteDocument(id);\n if (gatewayDeleteSuccess) {\n debugLogger.info(\"Document deleted from Gateway API\", { id });\n } else {\n debugLogger.warn(\"Failed to delete from Gateway API or document not found\", { id });\n }\n } catch (error) {\n debugLogger.error(\"Error deleting from Gateway API\", { id, error });\n }\n\n try {\n // Always remove from local IndexedDB storage\n await indexedDBService.delete(DB_NAME, 1, STORE_NAME, id, storeConfigs);\n debugLogger.debug(\"Document removed from IndexedDB\", { id });\n } catch (error) {\n debugLogger.error(\"Failed to remove from IndexedDB\", { id, error });\n }\n\n // Reload documents to refresh the UI\n await loadDocuments();\n };\n\n const clearAllDocuments = async () => {\n await indexedDBService.clear(DB_NAME, 1, STORE_NAME, storeConfigs);\n await loadDocuments();\n };\n\n const addDocuments = async (files: File[]) => {\n const allKeys = await indexedDBService.getAllKeys(DB_NAME, 1, STORE_NAME, storeConfigs);\n if (allKeys.length + files.length > MAX_FILES) {\n throw new Error(`Max ${MAX_FILES} documents allowed.`);\n }\n\n const successfulUploads: KnowledgeDoc[] = [];\n \n for (const file of files) {\n try {\n debugLogger.debug(\"Processing file\", { filename: file.name, type: file.type });\n \n if (isVectorEnabled && uploadDocument) {\n // Advanced users: Use vector database + S3 storage (like Knowledge Tab)\n const result = await uploadDocument(file, true);\n \n if (result.success && result.fileId) {\n const doc: KnowledgeDoc = {\n id: uuidv4(),\n name: file.name,\n originalFileName: file.name,\n s3Url: result.fileId, // Store fileId as s3Url for file access\n addedDate: new Date(),\n content: \"\", // Content is in vector DB, not stored locally\n embedding: [], // Embedding is in vector DB\n mimeType: file.type,\n size: file.size,\n };\n \n // Save metadata to IndexedDB (lightweight reference)\n await indexedDBService.put(DB_NAME, 1, STORE_NAME, doc, storeConfigs);\n successfulUploads.push(doc);\n \n debugLogger.debug(\"Document uploaded to vector database\", { filename: file.name, fileId: result.fileId });\n } else {\n throw new Error(result.error || 'Vector upload failed');\n }\n } else {\n // Basic users: Use local IndexedDB storage with parsed content and embeddings\n const parseResult = await parseFile(file);\n if (parseResult.trim().length === 0) {\n debugLogger.warn(\"File has no content\", { filename: file.name });\n continue;\n }\n \n debugLogger.debug(\"File content parsed\", { filename: file.name, contentLength: parseResult.length });\n \n // Store raw file data as base64 for consistent download behavior\n const arrayBuffer = await file.arrayBuffer();\n // Use chunked approach to avoid \"Maximum call stack size exceeded\" for large files\n const uint8Array = new Uint8Array(arrayBuffer);\n let binaryString = '';\n const chunkSize = 8192; // Process 8KB chunks to avoid stack overflow\n \n for (let i = 0; i < uint8Array.length; i += chunkSize) {\n const chunk = uint8Array.slice(i, i + chunkSize);\n binaryString += String.fromCharCode.apply(null, Array.from(chunk));\n }\n \n const base64Data = btoa(binaryString);\n debugLogger.debug(\"Raw file data encoded\", { filename: file.name, rawDataLength: base64Data.length });\n \n const embedding = await embeddingService.generate(parseResult);\n debugLogger.debug(\"Embedding generated\", { filename: file.name, embeddingLength: embedding?.length });\n \n const doc: KnowledgeDoc = {\n id: uuidv4(),\n name: file.name,\n content: parseResult,\n rawData: base64Data, // Store original file data\n originalFileName: file.name,\n embedding,\n addedDate: new Date(),\n mimeType: file.type,\n size: file.size,\n };\n \n await indexedDBService.put(DB_NAME, 1, STORE_NAME, doc, storeConfigs);\n successfulUploads.push(doc);\n \n debugLogger.debug(\"Document saved to IndexedDB\", { filename: file.name, id: doc.id });\n }\n \n } catch (error) {\n debugLogger.error(\"Failed to process file\", { filename: file.name, error });\n throw new Error(`Failed to process ${file.name}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n \n if (successfulUploads.length === 0) {\n throw new Error(\"No files were successfully processed\");\n }\n \n // Reload documents and sync with zustand store\n await loadDocuments();\n \n debugLogger.info(\"Documents added successfully\", { \n count: successfulUploads.length,\n filenames: successfulUploads.map(d => d.name),\n storageMethod: isVectorEnabled ? 'vector-db' : 'indexed-db'\n });\n };\n\n // Helper function to determine if a document is stored in vector DB\n const isVectorDocument = (doc: KnowledgeDoc): boolean => {\n if (!doc) return false;\n\n const hasExplicitVectorMarker = Boolean(\n (doc.s3Url && String(doc.s3Url).trim().length > 0) ||\n (hasVectorMetadata(doc) && doc._vectorResult)\n );\n\n if (hasExplicitVectorMarker) {\n return true;\n }\n\n const looksLikeMongoId = typeof doc.id === \"string\" && /^[0-9a-f]{24}$/i.test(doc.id);\n const lacksInlineContent = !doc.content || doc.content.length === 0;\n\n return looksLikeMongoId && lacksInlineContent;\n };\n\n const parseFile = async (file: File): Promise<string> => {\n const name = file.name.toLowerCase();\n\n try {\n debugLogger.debug(\"Parsing file\", { filename: file.name, type: file.type, size: file.size });\n \n if (\n file.type.startsWith(\"text/\") ||\n name.endsWith(\".txt\") ||\n name.endsWith(\".md\") ||\n name.endsWith(\".json\") ||\n name.endsWith(\".cs\") ||\n name.endsWith(\".js\") ||\n name.endsWith(\".ts\") ||\n name.endsWith(\".tsx\") ||\n name.endsWith(\".jsx\") ||\n name.endsWith(\".py\") ||\n name.endsWith(\".java\") ||\n name.endsWith(\".cpp\") ||\n name.endsWith(\".c\") ||\n name.endsWith(\".html\") ||\n name.endsWith(\".css\") ||\n name.endsWith(\".php\") ||\n name.endsWith(\".rb\") ||\n name.endsWith(\".go\") ||\n name.endsWith(\".rs\") ||\n name.endsWith(\".kt\") ||\n name.endsWith(\".swift\") ||\n name.endsWith(\".scala\") ||\n name.endsWith(\".sh\") ||\n name.endsWith(\".bat\") ||\n name.endsWith(\".ps1\") ||\n name.endsWith(\".xml\") ||\n name.endsWith(\".yaml\") ||\n name.endsWith(\".yml\") ||\n name.endsWith(\".csv\")\n ) {\n const content = await file.text();\n debugLogger.debug(\"Text file parsed\", { filename: file.name, contentLength: content.length });\n return content;\n }\n\n if (name.endsWith(\".docx\")) {\n debugLogger.debug(\"Parsing DOCX file\", { filename: file.name });\n const arrayBuffer = await file.arrayBuffer();\n const { value } = await mammoth.extractRawText({ arrayBuffer });\n debugLogger.debug(\"DOCX file parsed\", { filename: file.name, contentLength: value.length });\n return value;\n }\n\n if (name.endsWith(\".pdf\")) {\n debugLogger.debug(\"Parsing PDF file\", { filename: file.name });\n // Use Burtson CDN PDF worker\n pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdn.burtson.ai/scripts/pdf.worker.js';\n \n const buffer = await file.arrayBuffer();\n const pdf = await pdfjsLib.getDocument({ data: buffer }).promise;\n\n const pages = await Promise.all(\n Array.from({ length: Math.min(10, pdf.numPages) }, async (_, i) => {\n const page = await pdf.getPage(i + 1);\n const content = await page.getTextContent();\n const items = content.items as Array<TextItem | TextMarkedContent>;\n return items\n .map((item) => (isTextItem(item) ? item.str : \"\"))\n .join(\" \");\n })\n );\n const result = pages.join(\"\\n\\n\");\n \n debugLogger.debug(\"PDF file parsed\", { filename: file.name, contentLength: result.length, pageCount: pdf.numPages });\n return result;\n }\n \n debugLogger.warn(\"Unsupported file type\", { filename: file.name, type: file.type });\n throw new Error(`Unsupported file type: ${file.type}`);\n \n } catch (err) {\n debugLogger.error(\"Failed to parse file\", { filename: file.name, error: err });\n throw err;\n }\n };\n\n const searchDocuments = async (query: string): Promise<KnowledgeDoc[]> => {\n if (!query.trim()) return [];\n\n const queryEmbedding = await embeddingService.generate(query);\n const scored: { doc: KnowledgeDoc; score: number }[] = [];\n\n for (const doc of documents) {\n if (doc.embedding) {\n const score = embeddingService.cosineSimilarity(queryEmbedding, doc.embedding);\n scored.push({ doc, score });\n }\n }\n\n scored.sort((a, b) => b.score - a.score);\n const topMatches = scored.filter((entry) => entry.score >= 0.6).map((entry) => entry.doc);\n\n return topMatches;\n };\n\n return {\n documents,\n addDocuments,\n removeDocument,\n clearAllDocuments,\n loadDocuments,\n searchDocuments,\n isVectorDocument,\n };\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-05A8-49CD8F\nconst __banditFingerprint_store_knowledgeStorets = 'BL-FP-602E09-4421';\nconst __auditTrail_store_knowledgeStorets = 'BL-AU-MGOIKVW4-CU0K';\n// File: knowledgeStore.ts | Path: src/store/knowledgeStore.ts | Hash: 05a84421\n\nimport { create } from \"zustand\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\n\nexport interface KnowledgeDoc {\n id: string;\n name: string;\n content: string;\n embedding?: number[];\n rawData?: string;\n type?: string;\n addedDate?: Date;\n size?: number;\n uploadedBy?: string;\n userEmail?: string;\n bucket?: string;\n key?: string; \n\n isUserContent?: boolean;\n isTeamContent?: boolean;\n contentSource?: 'user' | 'team';\n teamSid?: string;\n\n mimeType?: string;\n originalFileName?: string;\n s3Url?: string;\n}\n\ninterface KnowledgeStore {\n docs: KnowledgeDoc[];\n isLoaded: boolean;\n addDoc: (doc: Omit<KnowledgeDoc, \"id\">) => void;\n removeDoc: (id: string) => void;\n clearDocs: () => void;\n loadDocs: () => Promise<void>;\n saveDocs: () => Promise<void>;\n}\n\nexport const useKnowledgeStore = create<KnowledgeStore>((set, get) => ({\n docs: [],\n isLoaded: false,\n \n addDoc: (doc) => {\n const current = get().docs;\n if (current.length >= 20) {\n debugLogger.warn(\"⚠️ Maximum of 20 knowledge docs reached.\");\n return;\n }\n\n const newDoc: KnowledgeDoc = {\n id: uuidv4(),\n name: doc.name,\n content: doc.content,\n embedding: doc.embedding,\n rawData: doc.rawData,\n mimeType: doc.mimeType,\n originalFileName: doc.originalFileName,\n s3Url: doc.s3Url,\n type: doc.type,\n addedDate: doc.addedDate,\n size: doc.size,\n uploadedBy: doc.uploadedBy,\n userEmail: doc.userEmail,\n bucket: doc.bucket,\n key: doc.key,\n isUserContent: doc.isUserContent,\n isTeamContent: doc.isTeamContent,\n contentSource: doc.contentSource,\n };\n\n set({ docs: [...current, newDoc] });\n \n // Save individual doc to IndexedDB\n (async () => {\n try {\n const storeConfigs = [{ name: \"documents\", keyPath: \"id\" }];\n await indexedDBService.put(\"banditKnowledge\", 1, \"documents\", newDoc, storeConfigs);\n debugLogger.debug(\"Knowledge doc added to IndexedDB\", { id: newDoc.id, name: newDoc.name });\n } catch (error) {\n debugLogger.error(\"Failed to save new knowledge doc to IndexedDB\", { error });\n }\n })();\n },\n \n removeDoc: (id) => {\n set((state) => ({\n docs: state.docs.filter((d) => d.id !== id),\n }));\n \n // Remove from IndexedDB\n (async () => {\n try {\n const storeConfigs = [{ name: \"documents\", keyPath: \"id\" }];\n await indexedDBService.delete(\"banditKnowledge\", 1, \"documents\", id, storeConfigs);\n debugLogger.debug(\"Knowledge doc removed from IndexedDB\", { id });\n } catch (error) {\n debugLogger.error(\"Failed to remove knowledge doc from IndexedDB\", { error });\n }\n })();\n },\n \n clearDocs: () => {\n set({ docs: [] });\n \n // Clear IndexedDB\n (async () => {\n try {\n const storeConfigs = [{ name: \"documents\", keyPath: \"id\" }];\n await indexedDBService.clear(\"banditKnowledge\", 1, \"documents\", storeConfigs);\n debugLogger.debug(\"All knowledge docs cleared from IndexedDB\");\n } catch (error) {\n debugLogger.error(\"Failed to clear knowledge docs from IndexedDB\", { error });\n }\n })();\n },\n \n loadDocs: async () => {\n try {\n const storeConfigs = [{ name: \"documents\", keyPath: \"id\" }];\n const docs = await indexedDBService.getAll<KnowledgeDoc>(\"banditKnowledge\", 1, \"documents\", storeConfigs);\n \n set({ \n docs: docs || [],\n isLoaded: true \n });\n debugLogger.info(\"Knowledge docs loaded from IndexedDB\", { count: docs?.length || 0 });\n } catch (error) {\n debugLogger.error(\"Failed to load knowledge docs from IndexedDB\", { error });\n set({ isLoaded: true }); // Mark as loaded even if failed, so UI can render\n }\n },\n \n saveDocs: async () => {\n try {\n const { docs } = get();\n const storeConfigs = [{ name: \"documents\", keyPath: \"id\" }];\n \n // Clear existing docs and save new ones individually\n await indexedDBService.clear(\"banditKnowledge\", 1, \"documents\", storeConfigs);\n \n for (const doc of docs) {\n await indexedDBService.put(\"banditKnowledge\", 1, \"documents\", doc, storeConfigs);\n }\n \n debugLogger.debug(\"Knowledge docs saved to IndexedDB\", { count: docs.length });\n } catch (error) {\n debugLogger.error(\"Failed to save knowledge docs to IndexedDB\", { error });\n }\n },\n}));","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-0A5F-162413\nconst __banditFingerprint_prompts_conversationStartersts = 'BL-FP-AC04B3-EC33';\nconst __auditTrail_prompts_conversationStartersts = 'BL-AU-MGOIKVVX-L4QX';\n// File: conversationStarters.ts | Path: src/services/prompts/conversationStarters.ts | Hash: 0a5fec33\n\nimport { lastValueFrom, map } from \"rxjs\";\nimport { useAIProviderStore } from \"../../store/aiProviderStore\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { getStableQuestionPrompt, QuestionPromptArgs } from \"../../prompts/getStableQuestionPrompt\";\nimport { debugLogger } from \"../logging/debugLogger\";\nimport { enhancePromptWithContext } from \"./promptUtils\";\nimport { notificationService } from \"../notification/notificationService\";\n\n/**\n * Generates conversation starter prompts based on topics of interest.\n * \n * @param parameters - Parameters for generating conversation starters\n * @param parameters.limit - Number of questions to generate (1-10)\n * @param parameters.topicOfInterest - Default topic e.g \"sports, travel, being Mark Burtson, technology, coding, .NET, kite flying, etc.\"\n * @returns A promise that resolves to an array of conversation starters\n */\nexport const generateConversationStarters = async (args: QuestionPromptArgs): Promise<string[]> => {\n const provider = useAIProviderStore.getState().provider;\n if (!provider) {\n debugLogger.error(\"No AI provider available for generating conversation starters\");\n return [];\n }\n\n const modelName = usePackageSettingsStore.getState().settings?.defaultModel || \"default-model-fallback\";\n \n try {\n const data$ = provider.generate({\n model: modelName,\n prompt: enhancePromptWithContext(getStableQuestionPrompt(args)),\n stream: false,\n options: { temperature: 1.5, num_predict: 250 },\n });\n const questions$ = data$.pipe(map((d) => {\n // Split by newlines and filter out empty/meaningless responses\n const lines = d.response.split(\"\\n\")\n .map(line => line.trim())\n .filter(line => {\n // Filter out empty lines, very short responses, or common meaningless responses\n return line.length > 10 && \n !line.toLowerCase().includes('sorry') &&\n !line.toLowerCase().includes('i cannot') &&\n !line.toLowerCase().includes('i can\\'t') &&\n !line.toLowerCase().includes('unable to') &&\n !line.toLowerCase().startsWith('as an ai') &&\n line.includes('?'); // Should be a question\n });\n return lines;\n }));\n const starters = await lastValueFrom(questions$);\n \n // Only return meaningful conversation starters\n if (starters.length === 0) {\n debugLogger.warn(\"No meaningful conversation starters generated\");\n return [];\n }\n \n return starters;\n } catch (err) {\n debugLogger.error(\"❌ Failed to generate conversation starters:\", { error: err });\n \n // Show notification to user for conversation starter generation failures\n notificationService.handleHttpError(err);\n \n return [];\n }\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-881F-0475DF\nconst __banditFingerprint_utilts = 'BL-FP-8CD496-6839';\nconst __auditTrail_utilts = 'BL-AU-MGOIKVW9-4I28';\n// File: util.ts | Path: src/util.ts | Hash: 881f6839\n\nimport { debugLogger } from \"./services/logging/debugLogger\";\n\nexport const toTitleCase = (str: string) => str.toLowerCase().split(' ').map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ')\n\n/**\n * Generates a random number between min and max (inclusive).\n * @param min the minimum value \n * @param max the maximum value \n * @returns \n */\nexport const randomRange = (min: number, max: number) => Math.floor(Math.random() * (max - min + 1)) + min;\n\nexport const generateSeed = () => Math.floor(Math.random() * 10000)\n\nexport const fetchAndConvertToBase64 = async (src: string): Promise<string> => {\n const response = await fetch(src);\n const blob = await response.blob();\n return await new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n};\n\nexport const detectTransparency = (imageSrc: string): Promise<boolean> => {\n return new Promise((resolve) => {\n const img = new window.Image();\n img.crossOrigin = \"Anonymous\";\n img.onload = () => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return resolve(false);\n ctx.drawImage(img, 0, 0);\n const imageData = ctx.getImageData(0, 0, img.width, img.height).data;\n for (let i = 3; i < imageData.length; i += 4) {\n if (imageData[i] < 255) {\n debugLogger.debug(\"Detected transparency in image\");\n resolve(true);\n return;\n }\n }\n debugLogger.debug(\"No transparency detected in image\");\n resolve(false);\n };\n img.src = imageSrc;\n });\n};\n\nconst banditHead = \"https://cdn.burtson.ai/logos/bandit-head.png\";\n\nexport const modelAvatars: Record<string, string> = {\n \"Bandit-Core\": \"https://cdn.burtson.ai/avatars/core-avatar.png\",\n \"Bandit-Muse\": \"https://cdn.burtson.ai/avatars/muse-avatar.png\",\n \"Bandit-Logic\": \"https://cdn.burtson.ai/avatars/logic-avatar.png\",\n \"Bandit-D1VA\": \"https://cdn.burtson.ai/avatars/d1va-avatar.png\",\n \"Bandit-Exec\": \"https://cdn.burtson.ai/avatars/exec-avatar.png\",\n};\n\ntype ModelLike = {\n name?: string;\n avatarBase64?: string | null;\n};\n\nexport const resolveAvatar = (model: ModelLike | null | undefined): string => {\n // If no model provided, return banditHead URL\n if (!model) return banditHead;\n\n // If model has base64 avatar\n if (model.avatarBase64 && model.avatarBase64.startsWith(\"data:image\")) {\n return model.avatarBase64;\n }\n\n // If model is a known Bandit model\n const banditAvatar = model.name ? modelAvatars[model.name] : undefined;\n if (banditAvatar) {\n return banditAvatar;\n }\n\n return banditHead;\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-426C-2EC0F0\nconst __banditFingerprint_prompts_getStableQuestionPromptts = 'BL-FP-1BF51B-C535';\nconst __auditTrail_prompts_getStableQuestionPromptts = 'BL-AU-MGOIKVVP-0EFF';\n// File: getStableQuestionPrompt.ts | Path: src/prompts/getStableQuestionPrompt.ts | Hash: 426cc535\n\nimport { generateSeed, randomRange } from \"../util\";\nexport type GeneralTopicOfInterest = typeof TOPICS[number];\nexport const TOPICS = [\"everyday life\", \"finance\", \"sports\", \"travel\", \"technology\", \"politics\", \"health\", \"food\", \"entertainment\", \"education\", \"science\", \"history\", \"art\", \"music\", \"literature\", \"philosophy\", \"psychology\", \"sociology\", \"environmental issues\", \"current events\"] as const;\n\nexport const getRandomTopicOfInterest = (): GeneralTopicOfInterest => {\n const minIndex = 0;\n // Use length - 1 to get the last index because `randomRange` is inclusive\n const maxIndex = TOPICS.length - 1;\n const randomIndex = randomRange(minIndex, maxIndex);\n const randomTopic = TOPICS[randomIndex];\n return randomTopic;\n}\n\n\nexport interface QuestionPromptArgs {\n /**\n * Number of questions to generate (1-10)\n * Values outside this range will throw an error\n */\n limit: number;\n /**\n * Must be a string containing a topic of interest, prepositions, conjuctions, adverbs, and adjectives will produce undesirable results.\n * GOOD EXAMPLE: \"sports, travel, Mark Burtson, Bandit Labs, technology, coding, .NET, kite flying\"\n * BAD EXMAPLE: \"in, and, quickly, beautiful\" do not make sense as a topic of interest.\n */\n topicOfInterest: string;\n /**\n * Optional system prompt from the selected model to tailor suggestions\n */\n modelSystemPrompt?: string;\n}\n\n/**\n * @param limit - Number of questions to generate (1-10)\n * @param topicOfInterest - Default topic e.g \"sports, travel, being Mark Burtson, technology, coding, .NET, kite flying, etc.\" \n * @returns A prompt string for generating questions\n */\nexport const getStableQuestionPrompt = (args: QuestionPromptArgs): string => {\n const { limit, topicOfInterest, modelSystemPrompt } = args;\n if (limit < 1 || limit > 10) {\n throw new Error(\"Limit must be between 1 and 10\");\n }\n const seed = generateSeed();\n \n // Build the base prompt\n let prompt = `You are a helpful assistant.\n\nThe following seed uniquely identifies the topic: \"${seed}\"`;\n\n // Add model-specific context if available\n if (modelSystemPrompt && modelSystemPrompt.trim()) {\n prompt += `\n\nBased on this specialized assistant profile: \"${modelSystemPrompt.trim()}\"`;\n }\n\n prompt += `\n\nGenerate ${limit} concise (5–20 words, try to use this entire range), natural-sounding questions a user might ask${modelSystemPrompt ? ' this specialized assistant' : ' an AI assistant'}. These should be:\n\n- Relevant to ${topicOfInterest}`;\n\n // Add model-specific relevance if we have a system prompt\n if (modelSystemPrompt && modelSystemPrompt.trim()) {\n prompt += `\n- Aligned with the assistant's specialized capabilities and knowledge area`;\n }\n\n prompt += `\n- Specific enough to be practical\n- Easy to understand and not abstract\n\nDo not:\n- Refer to yourself or use phrases like \"As an AI...\"\n- Include greetings, explanations, or personality\n- Include jokes, fiction, or quotes\n\nOutput only ${limit} questions — one per line.`;\n\n return prompt.trim();\n}","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-77E3-745FE7\nconst __banditFingerprint_prompts_promptUtilsts = 'BL-FP-11EE62-0A9F';\nconst __auditTrail_prompts_promptUtilsts = 'BL-AU-MGOIKVVY-OO1C';\n// File: promptUtils.ts | Path: src/services/prompts/promptUtils.ts | Hash: 77e30a9f\n\n/**\n * Utility functions for prompt context and formatting\n */\n\n/**\n * Gets the current date and time in a human-readable format for LLM context\n * @returns Formatted date string for prompt injection\n */\nexport const getCurrentDateTimeContext = (): string => {\n const now = new Date();\n \n // Format: \"Wednesday, July 3, 2025 at 2:45 PM PST\"\n const dateString = now.toLocaleDateString('en-US', {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n });\n \n const timeString = now.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n timeZoneName: 'short'\n });\n \n return `${dateString} at ${timeString}`;\n};\n\n/**\n * Creates a standardized context header for prompts\n * @param includeDateTime - Whether to include current date/time\n * @returns Context header string\n */\nexport const createPromptContext = (includeDateTime: boolean = true): string => {\n if (!includeDateTime) {\n return '';\n }\n \n return `Current date and time: ${getCurrentDateTimeContext()}\\n\\n`;\n};\n\n/**\n * Wraps a prompt with standard context information\n * @param prompt - The main prompt content\n * @param includeDateTime - Whether to include current date/time context\n * @returns Enhanced prompt with context\n */\nexport const enhancePromptWithContext = (prompt: string, includeDateTime: boolean = true): string => {\n const context = createPromptContext(includeDateTime);\n return `${context}${prompt}`;\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-E089-EB279A\nconst __banditFingerprint_notification_notificationServicets = 'BL-FP-FFADE7-4599';\nconst __auditTrail_notification_notificationServicets = 'BL-AU-MGOIKVVV-ZTFN';\n// File: notificationService.ts | Path: src/services/notification/notificationService.ts | Hash: e0894599\n\nimport { debugLogger } from '../logging/debugLogger';\nimport type { NotificationContextType } from '../../shared/components/NotificationProvider';\n\ntype HttpErrorShape = {\n response?: {\n status?: number;\n data?: Record<string, unknown>;\n };\n message?: string;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === 'object';\nconst getRecordString = (record: Record<string, unknown> | undefined, key: string): string | undefined =>\n record && typeof record[key] === 'string' ? (record[key] as string) : undefined;\n\n\n/**\n * Global notification handler that can be used throughout the application\n */\nexport class NotificationService {\n private notificationContext: NotificationContextType | null = null;\n\n /**\n * Set the notification context (usually called from a component that has access to useNotification)\n */\n setContext(context: NotificationContextType) {\n this.notificationContext = context;\n }\n\n /**\n * Show a generic notification\n */\n show(message: string, severity: 'success' | 'error' | 'warning' | 'info' = 'info') {\n if (this.notificationContext) {\n this.notificationContext.showNotification({ message, severity });\n } else {\n // Fallback to console logging if notification context is not available\n debugLogger.warn('Notification context not available, falling back to console:', { message, severity });\n console.warn(`[${severity.toUpperCase()}] ${message}`);\n }\n }\n\n /**\n * Show an error notification\n */\n showError(message: string) {\n this.show(message, 'error');\n }\n\n /**\n * Show a success notification\n */\n showSuccess(message: string) {\n this.show(message, 'success');\n }\n\n /**\n * Show a warning notification\n */\n showWarning(message: string) {\n this.show(message, 'warning');\n }\n\n /**\n * Show an info notification\n */\n showInfo(message: string) {\n this.show(message, 'info');\n }\n\n /**\n * Handle HTTP errors and show appropriate notifications\n */\n handleHttpError(error: unknown, customMessage?: string) {\n let message = customMessage || 'An error occurred';\n const httpError = error as HttpErrorShape;\n\n if (httpError?.response) {\n // HTTP error response\n const status = httpError.response?.status;\n const data = httpError.response?.data;\n \n // Extract detailed error information\n // For your API structure with nested error objects: { error: { message: \"...\", type: \"...\", code: \"...\" } }\n const nestedError = isRecord(data?.error) ? data.error : undefined;\n const errorMessage =\n getRecordString(nestedError, 'message') ||\n getRecordString(data, 'message') ||\n getRecordString(data, 'detail');\n const errorType =\n getRecordString(nestedError, 'type') ||\n getRecordString(data, 'type');\n const errorCode =\n getRecordString(nestedError, 'code') ||\n getRecordString(data, 'code') ||\n getRecordString(data, 'error_code') ||\n (typeof data?.error === 'string' ? data.error : undefined);\n \n // Debug logging to see what we're extracting\n debugLogger.info('Processing HTTP error response:', {\n status,\n errorMessage,\n errorType,\n errorCode,\n rawData: data\n });\n \n // Build detailed message with error code and specific message\n const buildDetailedMessage = (defaultMsg: string) => {\n // If we have a specific error message, prioritize showing that\n if (errorMessage) {\n // For detailed error messages like yours, just show the message directly\n // as it's already comprehensive and user-friendly\n return errorMessage;\n } else if (errorCode) {\n // If we only have an error code, show it with context\n return `Error: ${errorCode}`;\n } else if (errorType) {\n // If we only have an error type, show it with context\n return `Error: ${errorType}`;\n } else {\n // For 400-level errors without specific messages, include status code\n if (typeof status === 'number' && status >= 400 && status < 500) {\n return `HTTP ${status}: ${defaultMsg}`;\n }\n return defaultMsg;\n }\n };\n\n switch (status) {\n case 400:\n message = buildDetailedMessage('Bad request - please check your input');\n break;\n case 401:\n message = buildDetailedMessage('Authentication required - please log in');\n break;\n case 403:\n message = buildDetailedMessage('Access denied - you don\\'t have permission for this action');\n break;\n case 404:\n message = buildDetailedMessage('Resource not found');\n break;\n case 422:\n message = buildDetailedMessage('Validation failed - please check your input');\n break;\n case 429:\n message = buildDetailedMessage('Too many requests - please try again later');\n break;\n case 500:\n message = buildDetailedMessage('Server error - please try again later');\n break;\n case 502:\n case 503:\n case 504:\n message = buildDetailedMessage('Service temporarily unavailable - please try again later');\n break;\n default:\n // For any other 400-level errors, show detailed info\n if (typeof status === 'number' && status >= 400 && status < 500) {\n message = buildDetailedMessage(`Client error (${typeof status === 'number' ? status : 'unknown'})`);\n } else {\n message = buildDetailedMessage(`Request failed with status ${typeof status === 'number' ? status : 'unknown'}`);\n }\n }\n } else if (httpError?.message) {\n message = httpError.message;\n }\n\n debugLogger.error('HTTP Error handled by notification service:', { error, message });\n this.showError(message);\n }\n\n /**\n * Handle network/connection errors\n */\n handleNetworkError(error: unknown, customMessage?: string) {\n const message = customMessage || 'Network error - please check your connection and try again';\n debugLogger.error('Network Error handled by notification service:', { error, message });\n this.showError(message);\n }\n\n /**\n * Handle validation errors\n */\n handleValidationError(errors: readonly string[] | string, customMessage?: string) {\n let message: string;\n if (typeof customMessage === 'string' && customMessage.length > 0) {\n message = customMessage;\n } else if (Array.isArray(errors)) {\n message = (errors as readonly string[]).join(', ');\n } else {\n message = errors as string;\n }\n debugLogger.warn('Validation Error handled by notification service:', { errors, message });\n this.showWarning(message);\n }\n}\n\nexport const notificationService = new NotificationService();\nexport default notificationService;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-C82D-3600CB\nconst __banditFingerprint_prompts_moodDetectionts = 'BL-FP-DC31B2-A7D0';\nconst __auditTrail_prompts_moodDetectionts = 'BL-AU-MGOIKVVX-475M';\n// File: moodDetection.ts | Path: src/services/prompts/moodDetection.ts | Hash: c82da7d0\n\nimport { map, toArray } from \"rxjs\";\nimport { useAIProviderStore } from \"../../store/aiProviderStore\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { debugLogger } from \"../logging/debugLogger\";\nimport { enhancePromptWithContext } from \"./promptUtils\";\n\n/**\n * Detects the emotional tone of the user's message using the AI provider.\n * This helps drive token budgeting, avatar mood, and reinforcement logic.\n *\n * @param message - The user's message to analyze\n * @returns Promise resolving to emotional tone: \"high\" | \"neutral\" | \"low\"\n */\nexport const detectMessageMood = async (\n message: string\n): Promise<\"high\" | \"neutral\" | \"low\"> => {\n // Get the provider fresh each time the function is called\n const provider = useAIProviderStore.getState().provider;\n\n if (!provider) {\n debugLogger.error(\"No AI provider available for mood detection\");\n return \"neutral\";\n }\n\n const prompt = `\nRate the emotional tone of the user's message. Only respond with \"high\", \"neutral\", or \"low\".\n\nIf the message expresses strong enthusiasm, joy, or excitement, respond with \"high\".\nIf the message feels calm, polite, or ordinary, respond with \"neutral\".\nIf the message feels sad, bored, or frustrated, respond with \"low\".\n\nMessage: \"${message}\"\n\nResponse:`;\n\n const modelName = usePackageSettingsStore.getState().settings?.defaultModel || \"bandit-core\";\n\n try {\n debugLogger.llmDebug(\"detectMessageMood\", { message: message.slice(0, 100) });\n\n const response$ = provider.generate({\n model: modelName,\n prompt: enhancePromptWithContext(prompt),\n stream: false,\n options: { temperature: 0.3, num_predict: 10 },\n });\n\n const chunks$ = response$.pipe(\n map((chunk) => chunk.response.trim().toLowerCase()),\n toArray()\n );\n\n const result = await chunks$.toPromise();\n const finalResult = (result || []).join(\"\").trim();\n\n debugLogger.llmDebug(\"detectMessageMood result\", { finalResult });\n\n // Validate the response\n if (finalResult.includes(\"high\")) return \"high\";\n if (finalResult.includes(\"low\")) return \"low\";\n return \"neutral\";\n } catch (error) {\n debugLogger.error(\"Error detecting mood:\", { error });\n return \"neutral\";\n }\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-9F14-B1A808\nconst __banditFingerprint_prompts_detectUserInterestAndExcitementts = 'BL-FP-B4BAD5-BF82';\nconst __auditTrail_prompts_detectUserInterestAndExcitementts = 'BL-AU-MGOIKVVX-79NP';\n// File: detectUserInterestAndExcitement.ts | Path: src/services/prompts/detectUserInterestAndExcitement.ts | Hash: 9f14bf82\n\nimport { lastValueFrom, map, toArray } from \"rxjs\";\nimport { useAIProviderStore } from \"../../store/aiProviderStore\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\n/**\n * Determines if user input contains meaningful information that shows their interests, \n * excitement, or engagement - focusing on what could enhance their experience.\n * \n * This replaces the old \"personal information\" approach which was too broad and intrusive.\n * Now we focus on user interest signals and engagement rather than demographic collection.\n * \n * @param question - The user's input message\n * @param response - The AI's response (currently unused but available for context)\n * @returns Promise resolving to true if user interest/excitement is detected\n */\nexport const detectUserInterestAndExcitement = async (question: string, response: string): Promise<boolean> => {\n // Get the provider fresh each time the function is called\n const provider = useAIProviderStore.getState().provider;\n\n if (!provider) {\n debugLogger.error(\"No AI provider available for personal content detection\");\n return false;\n }\n\n const prompt = `\n Detect if the user shared something meaningful that shows their interests, excitement, or personal connection.\n\n Look for USER INTEREST & EXCITEMENT signals:\n - User expressing enthusiasm, excitement, or passion about something\n - User sharing goals, dreams, or aspirations they care about\n - User mentioning preferences that affect their experience (tools, formats, workflows)\n - User revealing meaningful life experiences or achievements\n - User discussing plans, projects, or activities they're invested in\n - User sharing challenges they want to overcome or skills they want to develop\n\n IGNORE routine mentions:\n - Simple factual statements without emotional investment\n - Casual location references without context\n - Generic preferences without personal significance\n - Basic demographic info (age, location) without meaningful context\n - Complaints or negative experiences without constructive elements\n\n Focus on what could enhance their experience or help me serve them better.\n \n Reply \"YES\" only if the user shared something they care about or are excited about.\n Reply \"NO\" for routine information or casual mentions.\n \n User input:\n \"${question}\"\n \n Response:`;\n\n const modelName = usePackageSettingsStore.getState().settings?.defaultModel || \"bandit-core\";\n\n try {\n debugLogger.llmDebug(\"detectUserInterestAndExcitement\", { question: question.slice(0, 100) });\n\n const response$ = provider.generate({\n model: modelName,\n prompt,\n stream: false,\n options: { temperature: 0.1, num_predict: 5 },\n });\n\n const chunks$ = response$.pipe(\n map((chunk) => chunk.response.trim().toUpperCase()),\n toArray()\n );\n\n const result = await lastValueFrom(chunks$);\n const decision = result.join(\"\").trim();\n\n debugLogger.llmDebug(\"detectUserInterestAndExcitement result\", { decision });\n\n return decision.includes(\"YES\");\n } catch (error) {\n debugLogger.error(\"Error detecting personal content:\", { error });\n return false;\n }\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-5E11-84C444\nconst __banditFingerprint_prompts_documentSummarizationts = 'BL-FP-AEED1A-6849';\nconst __auditTrail_prompts_documentSummarizationts = 'BL-AU-MGOIKVVX-RYY6';\n// File: documentSummarization.ts | Path: src/services/prompts/documentSummarization.ts | Hash: 5e116849\n\nimport { lastValueFrom, map } from \"rxjs\";\nimport { useAIProviderStore } from \"../../store/aiProviderStore\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\n/**\n * Summarizes document content for indexing in the AI knowledge system.\n * \n * @param name - The filename of the document\n * @param content - The document content to summarize\n * @returns Promise resolving to a concise summary string\n */\nexport const summarizeDocument = async (name: string, content: string): Promise<string> => {\n // Get the provider fresh each time the function is called\n const provider = useAIProviderStore.getState().provider;\n\n if (!provider) {\n debugLogger.error(\"No AI provider available for document summarization\");\n return `Summary unavailable for ${name}`;\n }\n\n const prompt = `\nYou are an assistant designed to summarize documents for indexing in an AI knowledge system.\nSummarize the following document in 1-2 concise sentences.\nOnly describe the content — do not add commentary, humor, or emojis.\nIf the file has a specific structure (e.g., C# code, policy, technical reference), mention that in the summary.\n\nFilename: ${name}\nContent:\n${content.slice(0, 4000)}\n`.trim();\n\n try {\n debugLogger.ragDebug(\"summarizeDocument\", { name, contentLength: content.length });\n\n const data$ = provider.generate({\n model: usePackageSettingsStore.getState().settings?.defaultModel || \"bandit-core\",\n prompt,\n stream: false,\n options: { temperature: 0.3, num_predict: 100 },\n });\n\n const summary$ = data$.pipe(map((d) => d.response.trim()));\n const summary = await lastValueFrom(summary$);\n\n debugLogger.ragDebug(\"summarizeDocument result\", { name, summary });\n\n return summary || `Document summary for ${name}`;\n } catch (error) {\n debugLogger.error(\"Error summarizing document:\", { error, name });\n return `Summary error for ${name}`;\n }\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-37EB-889E8F\nconst __banditFingerprint_prompts_documentRelevancets = 'BL-FP-678FBC-87EF';\nconst __auditTrail_prompts_documentRelevancets = 'BL-AU-MGOIKVVX-8TXA';\n// File: documentRelevance.ts | Path: src/services/prompts/documentRelevance.ts | Hash: 37eb87ef\n\nimport { lastValueFrom, map, toArray } from \"rxjs\";\nimport { useAIProviderStore } from \"../../store/aiProviderStore\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\n/**\n * Determines which documents are relevant to the user's question for RAG (Retrieval-Augmented Generation).\n * \n * @param question - The user's question or prompt\n * @param docs - Array of documents with name and chunk content\n * @returns Promise resolving to array of relevant document indices\n */\nexport const determineRelevantDocuments = async (\n question: string,\n docs: { name: string; chunks: string[] }[]\n): Promise<number[]> => {\n const provider = useAIProviderStore.getState().provider;\n if (!provider) {\n debugLogger.error(\"No AI provider available for knowledge relevance vetting\");\n return [];\n }\n\n const vetPrompt = `\nYou are a context-aware assistant. The user is asking:\n\n\"${question}\"\n\nHere are some documents:\n${docs\n .map(\n (d, i) =>\n `Doc ${i + 1} - \"${d.name}\":\\n${d.chunks.slice(0, 2).join(\"\\n\").slice(0, 1000)}\\n`\n )\n .join(\"\\n\")}\n\nOnly include documents if the user's question explicitly relates to their contents.\n\nReply with a comma-separated list of document numbers (e.g., \"1,3,5\") or \"none\" if no documents are relevant.\n\nResponse:`;\n\n const modelName = usePackageSettingsStore.getState().settings?.defaultModel || \"bandit-core\";\n\n try {\n debugLogger.ragDebug(\"determineRelevantDocuments\", {\n question: question.slice(0, 100),\n docCount: docs.length,\n docNames: docs.map(d => d.name)\n });\n\n const response$ = provider.generate({\n model: modelName,\n prompt: vetPrompt,\n stream: false,\n options: { temperature: 0.2, num_predict: 50 },\n });\n\n const chunks$ = response$.pipe(\n map((chunk) => chunk.response.trim()),\n toArray()\n );\n\n const result = await lastValueFrom(chunks$);\n const vetResult = result.join(\"\").trim().toLowerCase();\n\n debugLogger.ragDebug(\"determineRelevantDocuments result\", { vetResult });\n\n if (vetResult.includes(\"none\") || !vetResult) {\n return [];\n }\n\n // Parse comma-separated numbers\n const relevantIndices = vetResult\n .split(\",\")\n .map((s) => parseInt(s.trim()) - 1) // Convert to 0-based index\n .filter((i) => !isNaN(i) && i >= 0 && i < docs.length);\n\n debugLogger.ragDebug(\"determineRelevantDocuments parsed\", { relevantIndices });\n\n return relevantIndices;\n } catch (error) {\n debugLogger.error(\"Error determining relevant documents:\", { error });\n return [];\n }\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-3792-494067\nconst __banditFingerprint_prompts_dateTimeContextts = 'BL-FP-40AA97-710C';\nconst __auditTrail_prompts_dateTimeContextts = 'BL-AU-MGOIKVVX-VAO3';\n// File: dateTimeContext.ts | Path: src/services/prompts/dateTimeContext.ts | Hash: 3792710c\n\n/**\n * Utility function to get the current date and time in a readable format for AI context.\n * \n * @returns A formatted string with current date and time information\n */\nexport const getCurrentDateTimeContext = (): string => {\n const now = new Date();\n \n // Format: \"Today is Thursday, July 3, 2025 at 2:30 PM EST\"\n const options: Intl.DateTimeFormatOptions = {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n timeZoneName: 'short'\n };\n \n const formattedDate = now.toLocaleDateString('en-US', options);\n \n return `\\n\\nCurrent context: Today is ${formattedDate}.`;\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-8FA7-51595A\nconst __banditFingerprint_store_memoryStorets = 'BL-FP-C3FA6C-E06F';\nconst __auditTrail_store_memoryStorets = 'BL-AU-MGOIKVW4-KK1J';\n// File: memoryStore.ts | Path: src/store/memoryStore.ts | Hash: 8fa7e06f\n\nimport { create } from \"zustand\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\n\nexport interface MemoryEntry {\n id: string;\n content: string;\n tags?: string[];\n timestamp: number;\n source: \"auto\" | \"user\";\n embedding?: number[];\n pinned?: boolean;\n}\n\ninterface MemoryStore {\n entries: MemoryEntry[];\n _hasHydrated: boolean;\n addMemory: (\n content: string,\n tags?: string[],\n source?: \"auto\" | \"user\",\n embedding?: number[],\n pinned?: boolean\n ) => Promise<void>;\n searchMemory: (query: string) => MemoryEntry[];\n findRelevantMemories: (query: string, limit?: number) => MemoryEntry[];\n togglePinMemory: (id: string) => Promise<void>;\n hydrate: () => Promise<void>;\n removeMemory: (id: string) => Promise<void>;\n clearMemories: () => Promise<void>;\n}\n\nconst DB_NAME = \"bandit-memory-db\";\nconst STORE_NAME = \"bandit-memory\";\nconst storeConfigs = [{ name: STORE_NAME, keyPath: \"id\" }];\n\n// Helper: Normalize text for basic matching\nconst normalize = (text: string) =>\n text\n .toLowerCase()\n .replace(/[^\\w\\s]|_/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n\nexport const useMemoryStore = create<MemoryStore>((set, get) => ({\n entries: [],\n _hasHydrated: false,\n\n hydrate: async () => {\n const allEntries = await indexedDBService.getAll<MemoryEntry>(DB_NAME, 1, STORE_NAME, storeConfigs);\n set({ \n entries: allEntries,\n _hasHydrated: true \n });\n },\n\n addMemory: async (\n content,\n tags = [],\n source = \"user\",\n embedding,\n pinned = false\n ) => {\n const newEntry: MemoryEntry = {\n id: crypto.randomUUID(),\n content,\n tags,\n timestamp: Date.now(),\n source,\n embedding,\n pinned,\n };\n await indexedDBService.put(DB_NAME, 1, STORE_NAME, newEntry, storeConfigs);\n set((state) => ({\n entries: [...state.entries, newEntry],\n }));\n },\n\n removeMemory: async (id: string) => {\n await indexedDBService.delete(DB_NAME, 1, STORE_NAME, id, storeConfigs);\n set((state) => ({\n entries: state.entries.filter((entry) => entry.id !== id),\n }));\n },\n\n clearMemories: async () => {\n await indexedDBService.clear(DB_NAME, 1, STORE_NAME, storeConfigs);\n set({ \n entries: [],\n _hasHydrated: true // Keep hydrated flag true after clearing\n });\n },\n\n searchMemory: (query) => {\n const lc = query.toLowerCase();\n return get().entries.filter((entry) => entry.content.toLowerCase().includes(lc));\n },\n\n findRelevantMemories: (query, limit = 3) => {\n const normQuery = normalize(query);\n const queryWords = normQuery.split(\" \");\n\n const scored = get().entries.map((entry) => {\n const normContent = normalize(entry.content);\n const matchCount = queryWords.filter((word) =>\n normContent.includes(word)\n ).length;\n return { entry, score: matchCount };\n });\n\n return scored\n .filter((item) => item.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n .map((item) => item.entry);\n },\n\n togglePinMemory: async (id: string) => {\n set((state) => {\n const updatedEntries = state.entries.map((entry) =>\n entry.id === id ? { ...entry, pinned: !entry.pinned } : entry\n );\n (async () => {\n const updatedEntry = updatedEntries.find((entry) => entry.id === id);\n if (updatedEntry) {\n await indexedDBService.put(DB_NAME, 1, STORE_NAME, updatedEntry, storeConfigs);\n }\n })();\n return { entries: updatedEntries };\n });\n },\n}));\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-80DE-7F9B86\nconst __banditFingerprint_embedding_embeddingServicetsx = 'BL-FP-F2415E-F7A3';\nconst __auditTrail_embedding_embeddingServicetsx = 'BL-AU-MGOIKVVS-XRZD';\n// File: embeddingService.tsx | Path: src/services/embedding/embeddingService.tsx | Hash: 80def7a3\n\nimport { summarizeDocument } from \"../prompts\";\nimport { useMemoryStore } from \"../../store/memoryStore\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\nexport class EmbeddingService {\n /**\n * Generates a basic \"fake\" embedding based on word length.\n * (Replaceable later with true model-based embeddings.)\n */\n async generate(text: string): Promise<number[]> {\n const words = text.toLowerCase().split(/\\s+/);\n return words.slice(0, 5).map((w) => w.length / 10);\n }\n\n private generateTFEmbedding(text: string, topN = 10): number[] {\n const words = text\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \"\")\n .split(/\\s+/)\n .filter(Boolean);\n\n const freq: Record<string, number> = {};\n for (const word of words) {\n freq[word] = (freq[word] || 0) + 1;\n }\n\n const topWords = Object.entries(freq)\n .sort((a, b) => b[1] - a[1])\n .slice(0, topN)\n .map(([word]) => word);\n\n return topWords.map((w) => freq[w] / words.length);\n }\n\n /**\n * Computes cosine similarity between two embedding vectors.\n */\n cosineSimilarity(a: number[], b: number[]): number {\n const dot = a.reduce((sum, ai, i) => sum + ai * (b[i] ?? 0), 0);\n const magA = Math.sqrt(a.reduce((sum, ai) => sum + ai * ai, 0));\n const magB = Math.sqrt(b.reduce((sum, bi) => sum + bi * bi, 0));\n if (magA === 0 || magB === 0) return 0;\n return dot / (magA * magB);\n }\n\n /**\n * Backfills any missing memory embeddings in the memory store.\n */\n async backfillMissingEmbeddings(): Promise<void> {\n const { entries } = useMemoryStore.getState();\n const updates: { id: string; embedding: number[] }[] = [];\n\n for (const entry of entries) {\n if (!entry.embedding) {\n const embedding = await this.generate(entry.content);\n updates.push({ id: entry.id, embedding });\n }\n }\n\n if (updates.length > 0) {\n useMemoryStore.setState((state) => ({\n entries: state.entries.map((entry) => {\n const updated = updates.find((u) => u.id === entry.id);\n return updated ? { ...entry, embedding: updated.embedding } : entry;\n }),\n }));\n debugLogger.debug(`✅ Backfilled ${updates.length} memory embeddings.`);\n } else {\n debugLogger.debug(\"✅ No missing embeddings — all memories are up to date!\");\n }\n }\n\n /**\n * Estimates token usage for a given memory content.\n * Rough formula: word count × 1.3 (average token inflation).\n */\n estimateTokens(text: string): number {\n const wordCount = text.trim().split(/\\s+/).length;\n return Math.ceil(wordCount * 1.3);\n }\n\n /**\n * Calculates total estimated token usage for pinned memories.\n */\n estimatePinnedMemoryTokens(): number {\n const { entries } = useMemoryStore.getState();\n const pinned = entries.filter((entry) => entry.pinned);\n return pinned.reduce((sum, entry) => sum + this.estimateTokens(entry.content), 0);\n }\n\n /**\n * Selects the most relevant memories for injection based on:\n * 1. Always include pinned memories first.\n * 2. Then select top semantic matches by cosine similarity.\n * 3. Stay within an approximate max token budget.\n */\n async selectRelevantMemories(question: string, maxTokens = 750): Promise<string[]> {\n if (!question.trim()) return [];\n\n const { entries } = useMemoryStore.getState();\n if (entries.length === 0) return [];\n\n const questionEmbedding = await this.generate(question);\n\n const pinned = entries.filter((entry) => entry.pinned);\n const unpinned = entries.filter((entry) => !entry.pinned);\n\n // Score unpinned memories\n const scored: { content: string; score: number }[] = [];\n\n for (const entry of unpinned) {\n if (entry.embedding) {\n const sim = this.cosineSimilarity(questionEmbedding, entry.embedding);\n scored.push({ content: entry.content, score: sim });\n }\n }\n\n scored.sort((a, b) => b.score - a.score);\n\n const threshold = 0.6;\n const topMatches = scored.filter((s) => s.score >= threshold);\n\n const selected: string[] = [];\n let tokensUsed = 0;\n\n // 1. Add all pinned memories first (if they fit)\n for (const entry of pinned) {\n const tokensNeeded = this.estimateTokens(entry.content);\n if (tokensUsed + tokensNeeded > maxTokens) {\n break;\n }\n selected.push(entry.content);\n tokensUsed += tokensNeeded;\n }\n\n // 2. Then fill remaining budget with best unpinned matches\n for (const match of topMatches) {\n const tokensNeeded = this.estimateTokens(match.content);\n if (tokensUsed + tokensNeeded > maxTokens) {\n break;\n }\n selected.push(match.content);\n tokensUsed += tokensNeeded;\n }\n\n debugLogger.debug(\n \"🎯 Selected memories (pinned + semantic):\",\n { \n memories: selected.map((m) => `${m.slice(0, 60)}${m.length > 60 ? \"...\" : \"\"}`)\n }\n );\n\n return selected;\n }\n\n /**\n * Splits raw text into smaller chunks (approx. ~500 chars each).\n * Useful for embedding code or reference documents.\n */\n chunkText(text: string, maxLen = 500): string[] {\n const lines = text.split(/\\r?\\n/);\n const chunks: string[] = [];\n let currentChunk = \"\";\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const nextChunk = currentChunk + line + \"\\n\";\n\n if (nextChunk.length > maxLen) {\n if (currentChunk.trim()) {\n chunks.push(currentChunk.trim());\n currentChunk = line + \"\\n\";\n } else {\n chunks.push(line.trim());\n currentChunk = \"\";\n }\n } else {\n currentChunk = nextChunk;\n }\n }\n\n if (currentChunk.trim()) {\n chunks.push(currentChunk.trim());\n }\n\n return chunks;\n }\n\n /**\n * Prepares a document (like a code file) for embedding.\n */\n async embedDocument(name: string, content: string) {\n const chunks = this.chunkText(content);\n const summary = await summarizeDocument(name, content);\n const embeddings = chunks.map((chunk) => this.generateTFEmbedding(chunk));\n\n return {\n name,\n summary,\n chunks,\n embeddings,\n };\n }\n}\n\nexport const embeddingService = new EmbeddingService();\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-8982-9742E4\nconst __banditFingerprint_vectorDatabase_vectorDatabaseServicets = 'BL-FP-D2339E-A5C8';\nconst __auditTrail_vectorDatabase_vectorDatabaseServicets = 'BL-AU-MGOIKVW1-FS6U';\n// File: vectorDatabaseService.ts | Path: src/services/vectorDatabase/vectorDatabaseService.ts | Hash: 8982a5c8\n\nimport { debugLogger } from '../logging/debugLogger';\n\nexport interface VectorMemory {\n id: string;\n content: string;\n title?: string;\n tags?: string[];\n score?: number;\n uploadedBy: string;\n uploadedAt: string;\n source?: 'auto' | 'user'; // Indicates if memory was created automatically or by user\n pinned?: boolean;\n lastReferencedAt?: string;\n metadata?: VectorMemoryMetadata;\n}\n\nexport interface VectorMemoryMetadata {\n personalConfidence?: number;\n topic?: string;\n engagement?: number;\n extractedFrom?: string;\n tags?: string[];\n additionalProperties?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface VectorDocument {\n id: string;\n filename: string;\n content: string;\n mimeType: string;\n score?: number;\n uploadedBy: string;\n uploadedAt: string;\n isUserContent: boolean;\n isTeamContent: boolean;\n contentSource: 'user' | 'team';\n}\n\nexport interface SearchResult {\n memories: VectorMemory[];\n documents: VectorDocument[];\n success: boolean;\n message?: string;\n}\n\ninterface MemoryResultsEnvelope extends Record<string, unknown> {\n success?: boolean;\n results?: unknown[];\n memories?: unknown[];\n message?: string;\n totalCount?: number;\n}\n\ninterface DocumentSearchResponse extends Record<string, unknown> {\n success?: boolean;\n results?: VectorDocument[];\n message?: string;\n}\n\ntype RawFileRecord = Record<string, unknown>;\n\n// Optional search filters aligned with New_Memories_API.md\nexport interface MemorySearchFilters {\n includePinned?: boolean;\n topics?: string[];\n source?: Array<'auto' | 'user'>;\n tags?: string[];\n}\n\nexport interface CreateMemoryOptions {\n title?: string;\n tags?: string[];\n source?: 'auto' | 'user';\n pinned?: boolean;\n metadata?: VectorMemoryMetadata;\n lastReferencedAt?: string;\n}\n\nexport interface FileUploadResult {\n success: boolean;\n fileId: string;\n message?: string;\n}\n\n/**\n * Upload request structure that matches the backend C# UploadRequest class\n */\nexport interface UploadRequest {\n /** The file to upload */\n file: File;\n /** \n * Indicates whether the file should be shared with the team.\n * If true and the user has team information, the file will be saved to the team bucket.\n * If false, the file will be saved to the user's personal bucket regardless of team membership.\n * Defaults to true for backward compatibility.\n */\n shareWithTeam: boolean;\n}\n\n/**\n * Vector Database Service for Advanced Semantic Search\n * \n * This service handles storage and retrieval of memories and documents\n * in the vector database when advanced semantic search is enabled.\n * \n * Feature Gating:\n * - Requires admin authorization, pro subscription, or team subscription\n * - Supports admin users and pro/team subscription tiers\n * - Only active when advancedMemories feature is enabled\n */\nexport class VectorDatabaseService {\n private baseUrl: string;\n private s3ApiUrl: string;\n private token: string | null = null;\n private lastAvailabilityState: boolean | undefined;\n private lastConfigState: string | undefined;\n\n constructor(gatewayApiUrl?: string, s3ApiUrl?: string) {\n // Use provided URLs or fallback to defaults\n // For local development, use HTTPS localhost Gateway API (matches working curl command)\n this.baseUrl = gatewayApiUrl || 'https://localhost:5001/api';\n this.s3ApiUrl = s3ApiUrl || 'https://localhost:5001/api';\n \n debugLogger.info('Vector database service initialized', {\n baseUrl: this.baseUrl,\n s3ApiUrl: this.s3ApiUrl,\n hasToken: Boolean(this.token),\n });\n }\n\n /**\n * Set authentication token for API calls\n */\n setAuthToken(token: string) {\n this.token = token;\n }\n\n /**\n * Get authorization headers\n */\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.token) {\n headers['Authorization'] = `Bearer ${this.token}`;\n }\n\n return headers;\n }\n\n /**\n * Check if vector database is available and configured\n */\n isAvailable(): boolean {\n const available = !!(this.baseUrl && this.s3ApiUrl && this.token);\n // Only log on first check or when availability changes\n if (this.lastAvailabilityState !== available) {\n debugLogger.debug('Vector service availability check', {\n baseUrl: this.baseUrl,\n s3ApiUrl: this.s3ApiUrl,\n hasToken: Boolean(this.token),\n available,\n });\n this.lastAvailabilityState = available;\n }\n return available;\n }\n\n // ===== MEMORY OPERATIONS =====\n\n /**\n * Create and embed a memory in the vector database\n */\n async createMemory(\n content: string,\n options: CreateMemoryOptions = {}\n ): Promise<{ success: boolean; memoryId?: string; message?: string }> {\n if (!this.isAvailable()) {\n throw new Error('Vector database service not available');\n }\n\n try {\n const {\n title,\n tags,\n source = 'user',\n pinned = false,\n metadata,\n lastReferencedAt,\n } = options;\n\n debugLogger.info('Creating vector memory', { \n contentLength: content.length, \n title, \n tagsCount: tags?.length || 0,\n source,\n pinned,\n });\n\n const response = await fetch(`${this.baseUrl}/embedding/embed-memory`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n content,\n title,\n tags: tags || [],\n source,\n pinned,\n metadata,\n lastReferencedAt,\n })\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `API request failed: ${response.status}`);\n }\n\n const result = await response.json();\n \n debugLogger.info('Vector memory created successfully', { \n memoryId: result.memoryId,\n contentLength: result.contentLength \n });\n\n return {\n success: true,\n memoryId: result.memoryId,\n message: result.message\n };\n } catch (error) {\n debugLogger.error('Failed to create vector memory', { \n error: error instanceof Error ? error.message : String(error) \n });\n \n throw new Error(`Failed to create memory: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Search memories in the vector database\n */\n private coerceStringArray(value: unknown): string[] {\n if (!value) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value\n .map((item) => (typeof item === 'string' ? item : String(item)))\n .map((item) => item.trim())\n .filter(Boolean);\n }\n\n if (typeof value === 'string') {\n return value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n }\n\n return [];\n }\n private coerceString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n }\n\n private coerceBoolean(value: unknown): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined;\n }\n\n private coerceNumber(value: unknown): number | undefined {\n return typeof value === 'number' ? value : undefined;\n }\n\n private asRecord(value: unknown): Record<string, unknown> | undefined {\n if (value && typeof value === 'object') {\n return value as Record<string, unknown>;\n }\n return undefined;\n }\n\n\n private toRecordArray(values: unknown[]): RawFileRecord[] {\n return values.reduce<RawFileRecord[]>((acc, item) => {\n const record = this.asRecord(item);\n if (record) {\n acc.push(record);\n }\n return acc;\n }, []);\n }\n\n private buildMetadata(primary?: Record<string, unknown>, fallback?: Record<string, unknown>): VectorMemoryMetadata | undefined {\n const metadata: VectorMemoryMetadata = {};\n let hasMetadata = false;\n\n const sources = [primary, fallback].filter(\n (source): source is Record<string, unknown> => Boolean(source) && typeof source === 'object'\n );\n\n const tagsSet = new Set<string>();\n\n for (const source of sources) {\n if (typeof source.personalConfidence === 'number') {\n metadata.personalConfidence = source.personalConfidence;\n hasMetadata = true;\n }\n if (typeof source.topic === 'string' && source.topic.trim()) {\n metadata.topic = source.topic.trim();\n hasMetadata = true;\n }\n if (typeof source.engagement === 'number') {\n metadata.engagement = source.engagement;\n hasMetadata = true;\n }\n if (typeof source.extractedFrom === 'string' && source.extractedFrom.trim()) {\n metadata.extractedFrom = source.extractedFrom.trim();\n hasMetadata = true;\n }\n\n this.coerceStringArray(source.tags).forEach((tag) => {\n tagsSet.add(tag);\n hasMetadata = true;\n });\n\n const additionalSource = source.additionalProperties;\n if (additionalSource && typeof additionalSource === 'object') {\n metadata.additionalProperties = {\n ...(metadata.additionalProperties || {}),\n ...additionalSource,\n };\n hasMetadata = true;\n }\n\n for (const [key, value] of Object.entries(source)) {\n if (\n key === 'personalConfidence' ||\n key === 'topic' ||\n key === 'engagement' ||\n key === 'extractedFrom' ||\n key === 'tags' ||\n key === 'additionalProperties'\n ) {\n continue;\n }\n\n if (key === 'vectorMemory') {\n continue;\n }\n\n metadata.additionalProperties = {\n ...(metadata.additionalProperties || {}),\n [key]: value,\n };\n hasMetadata = true;\n }\n }\n\n if (tagsSet.size > 0) {\n metadata.tags = Array.from(tagsSet);\n }\n\n return hasMetadata ? metadata : undefined;\n }\n\n private normalizeMemoryResult(rawInput: unknown): VectorMemory {\n const raw = this.asRecord(rawInput) ?? {};\n const rawMetadata = this.asRecord(raw['metadata']);\n const vectorMetadata = rawMetadata ? this.asRecord(rawMetadata['vectorMemory']) : undefined;\n const vector = vectorMetadata ?? raw;\n const vectorInnerMetadata = this.asRecord(vector['metadata']);\n\n const metadata = this.buildMetadata(vectorInnerMetadata, rawMetadata);\n\n const tagsSet = new Set<string>();\n this.coerceStringArray(vector['tags']).forEach((tag) => tagsSet.add(tag));\n this.coerceStringArray(raw['tags']).forEach((tag) => tagsSet.add(tag));\n metadata?.tags?.forEach((tag) => tagsSet.add(tag));\n\n const scoreCandidates = [\n this.coerceNumber(vector['score']),\n this.coerceNumber(raw['score']),\n ];\n const normalizedScore = scoreCandidates.find((value): value is number => typeof value === 'number');\n\n const pinnedValue =\n this.coerceBoolean(vector['pinned']) ??\n this.coerceBoolean(rawMetadata ? rawMetadata['pinned'] : undefined) ??\n this.coerceBoolean(raw['pinned']);\n\n const lastReferencedAt =\n this.coerceString(vector['lastReferencedAt']) ??\n this.coerceString(rawMetadata ? rawMetadata['lastReferencedAt'] : undefined) ??\n this.coerceString(raw['lastReferencedAt']);\n\n const uploadedAt =\n this.coerceString(vector['uploadedAt']) ??\n this.coerceString(raw['uploadedAt']) ??\n new Date().toISOString();\n\n const sourceValue = this.coerceString(vector['source']) ?? this.coerceString(raw['source']);\n const normalizedSource =\n sourceValue === 'auto' || sourceValue === 'user' ? sourceValue : undefined;\n\n const idValue = this.coerceString(vector['id']) ?? this.coerceString(raw['id']) ?? '';\n const contentValue = this.coerceString(vector['content']) ?? this.coerceString(raw['content']) ?? '';\n const titleValue =\n this.coerceString(vector['title']) ??\n this.coerceString(raw['title']) ??\n this.coerceString(raw['filename']) ??\n undefined;\n const uploadedByValue =\n this.coerceString(vector['uploadedBy']) ??\n this.coerceString(raw['uploadedBy']) ??\n 'unknown';\n\n return {\n id: idValue,\n content: contentValue,\n title: titleValue,\n tags: tagsSet.size > 0 ? Array.from(tagsSet) : undefined,\n score: normalizedScore,\n uploadedBy: uploadedByValue,\n uploadedAt,\n source: normalizedSource,\n pinned: pinnedValue,\n lastReferencedAt,\n metadata,\n };\n }\n /**\n * Search memories in the vector database\n */\n async searchMemories(\n query: string,\n limit = 10,\n scoreThreshold = 0.6,\n filters?: MemorySearchFilters\n ): Promise<VectorMemory[]> {\n if (!this.isAvailable()) {\n return [];\n }\n\n try {\n debugLogger.info('Searching vector memories', { query: query.slice(0, 100), limit, scoreThreshold });\n\n const response = await fetch(`${this.baseUrl}/embedding/search-memories`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n query,\n limit,\n scoreThreshold,\n // Only include filters when provided\n ...(filters ? { filters } : {})\n })\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Search request failed: ${response.status}`);\n }\n\n const statsHeader = response.headers.get('X-Memory-Stats');\n if (statsHeader) {\n debugLogger.memoryDebug('Vector memory search diagnostics', {\n header: statsHeader\n });\n }\n\n const result = (await response.json()) as MemoryResultsEnvelope;\n \n if (result.success === false) {\n throw new Error(result.message || 'Search was not successful');\n }\n\n const searchResults = Array.isArray(result.results) ? result.results : [];\n const normalizedResults = searchResults.map((entry) =>\n this.normalizeMemoryResult(entry)\n );\n\n debugLogger.info('Vector memory search completed', { \n resultsCount: normalizedResults.length,\n message: result.message \n });\n\n return normalizedResults;\n } catch (error) {\n debugLogger.error('Failed to search vector memories', { \n error: error instanceof Error ? error.message : String(error) \n });\n \n return [];\n }\n }\n\n /**\n * Get user's memories with pagination\n */\n async getMyMemories(skip = 0, limit = 50): Promise<VectorMemory[]> {\n if (!this.isAvailable()) {\n return [];\n }\n\n try {\n const response = await fetch(`${this.baseUrl}/embedding/my-memories?skip=${skip}&limit=${limit}`, {\n method: 'GET',\n headers: this.getHeaders()\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch memories: ${response.status}`);\n }\n\n const result = (await response.json()) as MemoryResultsEnvelope;\n debugLogger.debug('Vector getMyMemories API response', result);\n \n // Handle both 'memories' and 'results' response formats for compatibility\n const rawMemories = Array.isArray(result.memories)\n ? result.memories\n : Array.isArray(result.results)\n ? result.results\n : [];\n const memories = rawMemories.map((entry) => this.normalizeMemoryResult(entry));\n\n debugLogger.info('Vector memories fetched successfully', { \n count: memories.length, \n totalCount: result.totalCount,\n responseStructure: Object.keys(result)\n });\n \n return memories;\n } catch (error) {\n debugLogger.error('Failed to fetch user memories', { error });\n return [];\n }\n }\n\n /**\n * Delete a memory from the vector database\n */\n async deleteMemory(memoryId: string): Promise<boolean> {\n if (!this.isAvailable()) {\n return false;\n }\n\n try {\n const response = await fetch(`${this.baseUrl}/embedding/memory/${memoryId}`, {\n method: 'DELETE',\n headers: this.getHeaders()\n });\n\n if (!response.ok) {\n throw new Error(`Failed to delete memory: ${response.status}`);\n }\n\n const result = await response.json();\n debugLogger.info('Vector memory deleted successfully', { memoryId, result });\n return result.success || true;\n } catch (error) {\n debugLogger.error('Failed to delete vector memory', { memoryId, error });\n return false;\n }\n }\n\n /**\n * Update a memory in the vector database (e.g., pin/unpin)\n */\n async updateMemory(memoryId: string, updates: { pinned?: boolean; content?: string; title?: string; tags?: string[] }): Promise<boolean> {\n if (!this.isAvailable()) {\n return false;\n }\n\n try {\n // Use the specific pin endpoint for pinning operations\n if (updates.pinned !== undefined) {\n const response = await fetch(`${this.baseUrl}/embedding/memory/${memoryId}/pin`, {\n method: 'PUT',\n headers: this.getHeaders(),\n body: JSON.stringify({ pinned: updates.pinned })\n });\n\n if (!response.ok) {\n throw new Error(`Failed to update memory pin status: ${response.status}`);\n }\n\n const result = await response.json();\n debugLogger.info('Vector memory pin status updated successfully', { memoryId, pinned: updates.pinned, result });\n return result.success || true;\n }\n\n // For other updates, we'd need a general update endpoint (not specified in API doc)\n debugLogger.warn('General memory updates not supported yet', { memoryId, updates });\n return false;\n } catch (error) {\n debugLogger.error('Failed to update vector memory', { memoryId, error });\n return false;\n }\n }\n\n /**\n * Batch create memories in the vector database\n */\n async batchCreateMemories(\n memories: Array<{ content: string; title?: string; tags?: string[] }>,\n mode: 'append' | 'replace' | 'smartDedupe' = 'append',\n clearExisting: boolean = false\n ): Promise<{\n success: boolean;\n message: string;\n results: Array<{\n content: string;\n success: boolean;\n memoryId?: string;\n mongoId?: string;\n contentLength?: number;\n message: string;\n action: string;\n }>;\n summary: {\n mode: string;\n totalProcessed: number;\n successCount: number;\n failureCount: number;\n skippedCount: number;\n clearedExistingCount: number;\n clearedExisting: boolean;\n };\n }> {\n if (!this.isAvailable()) {\n throw new Error('Vector database service is not available');\n }\n\n try {\n const requestBody = {\n memories,\n mode,\n clearExisting\n };\n\n debugLogger.info('Batch creating memories', {\n count: memories.length,\n mode,\n clearExisting,\n firstMemoryPreview: memories[0]?.content?.substring(0, 50) || '',\n });\n\n const response = await fetch(`${this.baseUrl}/embedding/batch-embed-memories`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify(requestBody)\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Batch memory creation failed: ${response.status}`);\n }\n\n const result = await response.json();\n \n debugLogger.info('Batch memory creation completed', {\n mode,\n totalMemories: memories.length,\n successCount: result.summary?.successCount || 0,\n failureCount: result.summary?.failureCount || 0\n });\n\n return result;\n } catch (error) {\n debugLogger.error('Failed to batch create memories', { \n error, \n memoriesCount: memories.length,\n mode \n });\n throw error;\n }\n }\n\n /**\n * Advanced batch create memories with chunking and progress reporting\n */\n async batchCreateMemoriesAdvanced(\n memories: Array<{ content: string; title?: string; tags?: string[] }>,\n options: {\n mode?: 'append' | 'replace' | 'smartDedupe';\n clearExisting?: boolean;\n chunkSize?: number;\n onProgress?: (current: number, total: number, message: string) => void;\n validateContent?: boolean;\n } = {}\n ): Promise<{\n success: boolean;\n message: string;\n totalMemories: number;\n successCount: number;\n failureCount: number;\n skippedCount: number;\n errors: string[];\n warnings: string[];\n chunks: number;\n duration: number;\n }> {\n const startTime = Date.now();\n const {\n mode = 'append',\n clearExisting = false,\n chunkSize = 50,\n onProgress,\n validateContent = true\n } = options;\n\n // Import memory utilities\n const { MemoryUtils } = await import('../../utils/memoryUtils');\n\n try {\n // Validate memories if requested\n let validMemories = memories;\n const warnings: string[] = [];\n \n if (validateContent) {\n const validation = MemoryUtils.validateMemories(memories);\n validMemories = validation.valid;\n \n if (validation.invalid.length > 0) {\n warnings.push(`${validation.invalid.length} memories failed validation and were skipped`);\n debugLogger.warn('Some memories failed validation', { \n invalidCount: validation.invalid.length,\n firstError: validation.invalid[0]?.error \n });\n }\n }\n\n if (validMemories.length === 0) {\n return {\n success: false,\n message: 'No valid memories to process',\n totalMemories: memories.length,\n successCount: 0,\n failureCount: 0,\n skippedCount: memories.length,\n errors: ['All memories failed validation'],\n warnings,\n chunks: 0,\n duration: Date.now() - startTime\n };\n }\n\n // Chunk memories for better performance\n const chunks = MemoryUtils.chunkMemories(validMemories, chunkSize);\n let totalSuccessCount = 0;\n let totalFailureCount = 0;\n const errors: string[] = [];\n\n onProgress?.(0, validMemories.length, 'Starting batch operation...');\n\n // Process chunks sequentially to avoid overwhelming the server\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n const chunkStartIndex = i * chunkSize;\n \n try {\n onProgress?.(\n chunkStartIndex,\n validMemories.length,\n `Processing chunk ${i + 1}/${chunks.length}...`\n );\n\n const chunkResult = await this.batchCreateMemories(\n chunk,\n i === 0 ? mode : 'append', // Only use special modes on first chunk\n i === 0 ? clearExisting : false // Only clear on first chunk\n );\n\n totalSuccessCount += chunkResult.summary.successCount;\n totalFailureCount += chunkResult.summary.failureCount;\n\n // Collect errors from failed results\n chunkResult.results\n .filter(r => !r.success)\n .forEach(r => errors.push(r.message));\n\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n errors.push(`Chunk ${i + 1} failed: ${errorMsg}`);\n totalFailureCount += chunk.length;\n \n debugLogger.error('Chunk processing failed', { \n chunkIndex: i,\n chunkSize: chunk.length,\n error: errorMsg\n });\n }\n\n // Brief pause between chunks to be respectful to the server\n if (i < chunks.length - 1) {\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n }\n\n const duration = Date.now() - startTime;\n const success = totalFailureCount === 0;\n const skippedCount = memories.length - validMemories.length;\n\n onProgress?.(\n validMemories.length,\n validMemories.length,\n success ? 'Batch operation completed successfully!' : 'Batch operation completed with errors'\n );\n\n const result = {\n success,\n message: `Processed ${totalSuccessCount}/${validMemories.length} memories successfully` + \n (skippedCount > 0 ? ` (${skippedCount} skipped)` : ''),\n totalMemories: memories.length,\n successCount: totalSuccessCount,\n failureCount: totalFailureCount,\n skippedCount,\n errors,\n warnings,\n chunks: chunks.length,\n duration\n };\n\n debugLogger.info('Advanced batch operation completed', result);\n return result;\n\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorMsg = error instanceof Error ? error.message : String(error);\n \n debugLogger.error('Advanced batch operation failed', { \n error: errorMsg,\n memoriesCount: memories.length,\n duration\n });\n\n return {\n success: false,\n message: `Batch operation failed: ${errorMsg}`,\n totalMemories: memories.length,\n successCount: 0,\n failureCount: memories.length,\n skippedCount: 0,\n errors: [errorMsg],\n warnings: [],\n chunks: 0,\n duration\n };\n }\n }\n\n // ===== DOCUMENT OPERATIONS =====\n\n /**\n * Upload file to S3 API and get file ID\n * \n * @param file - The file to upload\n * @param shareWithTeam - Whether to share the file with team members.\n * If true and user has team info, file goes to team bucket.\n * If false, file goes to user's personal bucket.\n * Defaults to true for backward compatibility.\n * @returns Promise<FileUploadResult> with success status and file ID\n */\n async uploadFile(file: File, shareWithTeam = true): Promise<FileUploadResult> {\n if (!this.s3ApiUrl) {\n throw new Error('S3 API URL not configured');\n }\n\n if (!this.token) {\n throw new Error('Authentication token not available');\n }\n\n try {\n const formData = new FormData();\n formData.append('file', file);\n formData.append('shareWithTeam', shareWithTeam.toString());\n\n debugLogger.info('Uploading file to S3 API', { \n filename: file.name, \n size: file.size, \n type: file.type,\n shareWithTeam: shareWithTeam,\n s3ApiUrl: this.s3ApiUrl\n });\n\n const response = await fetch(`${this.s3ApiUrl}/file/upload`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.token}`\n },\n body: formData\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `S3 upload failed: ${response.status}`);\n }\n\n const result = await response.json();\n \n // S3 API returns 'id' field, but we need 'fileId'\n const fileId = result.fileId || result.id;\n \n debugLogger.debug('S3 upload response', result);\n debugLogger.debug('Extracted vector file id', { fileId });\n \n debugLogger.info('File uploaded successfully to S3', { \n fileId: fileId,\n filename: file.name,\n originalResponse: result\n });\n\n return {\n success: true,\n fileId: fileId,\n message: result.message\n };\n } catch (error) {\n debugLogger.error('Failed to upload file to S3', { error });\n throw new Error(`S3 file upload failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Embed a document in the vector database via Gateway API\n */\n async embedDocument(\n fileId: string, \n shareWithTeam = true\n ): Promise<{ success: boolean; message?: string }> {\n debugLogger.debug('Embedding document request', { fileId, shareWithTeam });\n \n if (!this.baseUrl) {\n debugLogger.error('Gateway API URL not configured', { baseUrl: this.baseUrl });\n throw new Error('Gateway API URL not configured');\n }\n\n if (!this.token) {\n debugLogger.error('Authentication token not available');\n throw new Error('Authentication token not available');\n }\n\n try {\n const endpoint = `${this.baseUrl}/embedding/embed-document`;\n const payload = {\n FileId: fileId,\n Options: null, // EmbeddingOptions - can be null for default options\n ShareWithTeam: shareWithTeam\n };\n \n debugLogger.debug('Making Gateway API call', {\n endpoint,\n method: 'POST',\n payload,\n hasToken: Boolean(this.token),\n tokenPreview: `${this.token.substring(0, 20)}...`,\n });\n\n debugLogger.info('Embedding document via Gateway API', { \n fileId, \n shareWithTeam,\n gatewayUrl: this.baseUrl\n });\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify(payload)\n });\n\n debugLogger.debug('Gateway API response headers', {\n status: response.status,\n statusText: response.statusText,\n ok: response.ok,\n headers: Object.fromEntries(response.headers.entries())\n });\n\n // Try to get response text for better error debugging\n let responseText = '';\n let parsedResponse: unknown;\n \n try {\n responseText = await response.text();\n debugLogger.debug('Gateway API raw response text', {\n preview: responseText.substring(0, 500),\n });\n \n if (responseText) {\n parsedResponse = JSON.parse(responseText);\n }\n } catch (parseError) {\n debugLogger.warn('Could not parse Gateway API response as JSON', { error: parseError });\n }\n\n const responseRecord = this.asRecord(parsedResponse);\n const responseMessage = responseRecord && typeof responseRecord['message'] === 'string' ? (responseRecord['message'] as string) : undefined;\n\n if (!response.ok) {\n debugLogger.error('Gateway API error response', {\n status: response.status,\n statusText: response.statusText,\n responseData: responseRecord ?? { rawResponse: responseText },\n endpoint,\n payload\n });\n \n // Check for specific error types\n if (response.status === 404) {\n throw new Error(`Gateway API endpoint not found: ${endpoint}. Check if Gateway API is running and endpoint exists.`);\n } else if (response.status === 401 || response.status === 403) {\n throw new Error(`Authentication failed: ${response.status}. Check if auth token is valid.`);\n } else if (response.status === 500) {\n throw new Error(`Gateway API server error: ${responseMessage || responseText || 'Unknown server error'}`);\n } else {\n throw new Error(responseMessage || responseText || `Gateway embedding failed: ${response.status}`);\n }\n }\n\n debugLogger.debug('Gateway API success response', responseRecord ?? { rawResponse: responseText });\n \n const responseFileId = responseRecord && typeof responseRecord['fileId'] === 'string' ? (responseRecord['fileId'] as string) : undefined;\n\n debugLogger.info('Document embedded successfully via Gateway API', { \n fileId: responseFileId || fileId,\n message: responseMessage \n });\n\n return {\n success: true,\n message: responseMessage || 'Document embedded successfully'\n };\n } catch (error) {\n debugLogger.error('Failed to embed document via Gateway API', { fileId, error });\n \n // Provide more specific error messages\n if (error instanceof TypeError && error.message.includes('fetch')) {\n throw new Error(`Cannot connect to Gateway API at ${this.baseUrl}. Check if Gateway API server is running.`);\n } else {\n throw new Error(`Gateway embedding failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n\n /**\n * Search documents in the vector database\n */\n async searchDocuments(\n query: string, \n limit = 20, \n scoreThreshold = 0.5\n ): Promise<VectorDocument[]> {\n if (!this.isAvailable()) {\n return [];\n }\n\n try {\n debugLogger.info('Searching vector documents', { query: query.slice(0, 100), limit, scoreThreshold });\n\n const response = await fetch(`${this.baseUrl}/embedding/search`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n query,\n limit,\n scoreThreshold\n })\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Search failed: ${response.status}`);\n }\n\n const result = (await response.json()) as DocumentSearchResponse;\n \n if (result.success === false) {\n throw new Error(result.message || 'Search was not successful');\n }\n\n const documents = Array.isArray(result.results) ? result.results : [];\n\n debugLogger.info('Vector document search completed', { \n resultsCount: documents.length \n });\n\n return documents;\n } catch (error) {\n debugLogger.error('Failed to search vector documents', { error });\n return [];\n }\n }\n\n /**\n * Get available files that haven't been embedded\n */\n async getAvailableFiles(skip = 0, limit = 50): Promise<RawFileRecord[]> {\n if (!this.isAvailable()) {\n return [];\n }\n\n try {\n const response = await fetch(`${this.baseUrl}/embedding/available-files?skip=${skip}&limit=${limit}`, {\n method: 'GET',\n headers: this.getHeaders()\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch available files: ${response.status}`);\n }\n\n const result = await response.json();\n if (Array.isArray(result)) {\n return this.toRecordArray(result);\n }\n\n if (result && Array.isArray(result.files)) {\n return this.toRecordArray(result.files);\n }\n\n return [];\n } catch (error) {\n debugLogger.error('Failed to fetch available files', { error });\n return [];\n }\n }\n\n /**\n * Get user's files - tries both Gateway API and S3 API\n */\n async getUserFiles(skip = 0, limit = 50): Promise<RawFileRecord[]> {\n if (!this.isAvailable()) {\n return [];\n }\n\n try {\n debugLogger.debug('Fetching user files from Gateway API', { skip, limit });\n // First try Gateway API\n const response = await fetch(`${this.baseUrl}/embedding/files?skip=${skip}&limit=${limit}`, {\n method: 'GET',\n headers: this.getHeaders()\n });\n\n if (!response.ok) {\n debugLogger.warn('Gateway API files endpoint failed, falling back to S3 API', {\n status: response.status,\n });\n // If Gateway API fails, try S3 API\n return await this.getUserFilesFromS3(skip, limit);\n }\n\n const result = await response.json();\n debugLogger.debug('Gateway API files response', result);\n\n if (Array.isArray(result)) {\n return this.toRecordArray(result);\n }\n\n if (result && Array.isArray(result.files)) {\n return this.toRecordArray(result.files);\n }\n\n return [];\n } catch (error) {\n debugLogger.error('Gateway API failed while fetching user files, trying S3 API', { error });\n // Fallback to S3 API\n return await this.getUserFilesFromS3(skip, limit);\n }\n }\n\n /**\n * Get user's files from S3 API as fallback\n */\n private async getUserFilesFromS3(skip = 0, limit = 50): Promise<RawFileRecord[]> {\n try {\n debugLogger.debug('Fetching user files from S3 API', { skip, limit });\n const response = await fetch(`${this.s3ApiUrl}/file/files?skip=${skip}&limit=${limit}`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${this.token}`,\n 'Content-Type': 'application/json'\n }\n });\n\n if (!response.ok) {\n throw new Error(`S3 API failed: ${response.status}`);\n }\n\n const result = await response.json();\n debugLogger.debug('S3 API files response', result);\n \n if (Array.isArray(result)) {\n return this.toRecordArray(result);\n }\n\n if (result && Array.isArray(result.files)) {\n return this.toRecordArray(result.files);\n }\n\n return [];\n } catch (error) {\n debugLogger.error('Failed to fetch user files from S3 API', { error });\n return [];\n }\n }\n\n /**\n * Download a file using MongoDB ObjectId (secure method)\n */\n async downloadFile(fileId: string, filename: string): Promise<void> {\n if (!this.isAvailable()) {\n throw new Error('Vector database service not available');\n }\n\n try {\n debugLogger.debug('Downloading vector file', { fileId, filename });\n \n // Download from S3 API using MongoDB ObjectId (correct S3 API format)\n const response = await fetch(`${this.s3ApiUrl}/file/download/${fileId}`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${this.token}`\n }\n });\n\n if (!response.ok) {\n throw new Error(`Download failed: ${response.status} ${response.statusText}`);\n }\n\n // Get the file as a blob\n const blob = await response.blob();\n \n // Create download link\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n \n // Clean up the blob URL\n URL.revokeObjectURL(url);\n \n debugLogger.info('Vector file downloaded successfully', { fileId, filename });\n \n } catch (error) {\n debugLogger.error('Failed to download vector file', { fileId, filename, error });\n throw new Error(`Failed to download ${filename}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Get file blob using MongoDB ObjectId (for displaying content in modal)\n */\n async getFileBlob(fileId: string): Promise<Blob> {\n if (!this.isAvailable()) {\n throw new Error('Vector database service not available');\n }\n\n try {\n debugLogger.debug('Fetching vector file blob', { fileId });\n \n // Get file from S3 API using MongoDB ObjectId\n const response = await fetch(`${this.s3ApiUrl}/file/download/${fileId}`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${this.token}`\n }\n });\n\n if (!response.ok) {\n throw new Error(`Failed to get file: ${response.status} ${response.statusText}`);\n }\n\n const blob = await response.blob();\n debugLogger.info('Successfully retrieved vector file blob', { fileId, size: blob.size });\n \n return blob;\n \n } catch (error) {\n debugLogger.error('Failed to get file blob', { fileId, error });\n throw new Error(`Failed to get file: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Get file content for preview using MongoDB ObjectId (from Gateway API metadata)\n */\n async getFilePreview(fileId: string, maxSize = 1024 * 1024): Promise<{ content: string; mimeType: string } | null> {\n if (!this.isAvailable()) {\n return null;\n }\n\n try {\n debugLogger.debug('Fetching vector file preview', { fileId });\n \n // Get file metadata from Gateway API which includes the preview content\n const response = await fetch(`${this.baseUrl}/embedding/files`, {\n method: 'GET',\n headers: this.getHeaders()\n });\n\n if (!response.ok) {\n debugLogger.warn('Failed to retrieve files list before preview', { status: response.status });\n return null;\n }\n\n const filesResponse = await response.json();\n const fileCandidates = Array.isArray(filesResponse)\n ? this.toRecordArray(filesResponse)\n : filesResponse && Array.isArray(filesResponse.files)\n ? this.toRecordArray(filesResponse.files)\n : [];\n \n const targetFile = fileCandidates.find((file) => this.coerceString(file['id']) === fileId);\n const previewContent = targetFile ? this.coerceString(targetFile['preview']) : undefined;\n const mimeType = targetFile ? this.coerceString(targetFile['mimeType']) : undefined;\n \n if (!previewContent) {\n debugLogger.warn('Preview not available for file', { fileId });\n return null;\n }\n\n return {\n content: previewContent,\n mimeType: mimeType || 'text/plain'\n };\n \n } catch (error) {\n debugLogger.error('Failed to get file preview', { fileId, error });\n return null;\n }\n }\n\n /**\n * Delete a document from vector database\n */\n async deleteDocument(fileId: string): Promise<boolean> {\n if (!this.isAvailable()) {\n return false;\n }\n\n try {\n const response = await fetch(`${this.baseUrl}/embedding/${fileId}`, {\n method: 'DELETE',\n headers: this.getHeaders()\n });\n\n if (!response.ok) {\n throw new Error(`Failed to delete document: ${response.status}`);\n }\n\n debugLogger.info('Vector document deleted successfully', { fileId });\n return true;\n } catch (error) {\n debugLogger.error('Failed to delete vector document', { fileId, error });\n return false;\n }\n }\n\n // ===== COMBINED SEARCH =====\n\n /**\n * Search both memories and documents simultaneously\n */\n async searchAll(\n query: string,\n memoryLimit = 10,\n documentLimit = 20,\n scoreThreshold = 0.6\n ): Promise<SearchResult> {\n if (!this.isAvailable()) {\n return {\n memories: [],\n documents: [],\n success: false,\n message: 'Vector database service not available'\n };\n }\n\n try {\n const [memories, documents] = await Promise.all([\n this.searchMemories(query, memoryLimit, scoreThreshold),\n this.searchDocuments(query, documentLimit, scoreThreshold)\n ]);\n\n return {\n memories,\n documents,\n success: true,\n message: `Found ${memories.length} memories and ${documents.length} documents`\n };\n } catch (error) {\n debugLogger.error('Failed to search all content', { error });\n return {\n memories: [],\n documents: [],\n success: false,\n message: error instanceof Error ? error.message : 'Search failed'\n };\n }\n }\n /**\n * Configure the service with API URLs\n * This should be called by the main application with environment variables\n */\n configure(gatewayApiUrl: string, s3ApiUrl: string) {\n this.baseUrl = gatewayApiUrl;\n this.s3ApiUrl = s3ApiUrl;\n \n // Only log configuration changes, not repetitive calls\n if (this.lastConfigState !== `${gatewayApiUrl}|${s3ApiUrl}`) {\n debugLogger.info('Vector database service configured', {\n baseUrl: this.baseUrl,\n s3ApiUrl: this.s3ApiUrl,\n hasToken: Boolean(this.token),\n });\n this.lastConfigState = `${gatewayApiUrl}|${s3ApiUrl}`;\n }\n }\n\n /**\n * Manual debug function to test Gateway API connection\n * Call this from browser console to debug API issues\n */\n async debugTestConnection(): Promise<void> {\n debugLogger.info('Testing Gateway API connection');\n debugLogger.info('Vector service status snapshot', {\n baseUrl: this.baseUrl,\n s3ApiUrl: this.s3ApiUrl,\n hasToken: Boolean(this.token),\n tokenLength: this.token?.length || 0,\n tokenPreview: this.token ? `${this.token.substring(0, 30)}...` : undefined,\n isAvailable: this.isAvailable()\n });\n\n // Test basic connectivity\n try {\n debugLogger.debug('Testing basic connectivity to Gateway API');\n const response = await fetch(`${this.baseUrl}/health`, {\n method: 'GET',\n headers: this.getHeaders()\n });\n\n debugLogger.debug('Gateway API health check response', {\n status: response.status,\n statusText: response.statusText,\n ok: response.ok\n });\n\n if (response.ok) {\n const result = await response.text();\n debugLogger.info('Gateway API is reachable', { result });\n } else {\n debugLogger.warn('Gateway API health check failed');\n }\n } catch (error) {\n debugLogger.error('Cannot reach Gateway API', { error });\n }\n\n // Test S3 API connectivity\n try {\n debugLogger.debug('Testing S3 API connectivity');\n const files = await this.getUserFilesFromS3(0, 5);\n debugLogger.info('S3 API files response', {\n count: files.length,\n files: files.slice(0, 3) // Show first 3 files\n });\n } catch (error) {\n debugLogger.error('S3 API test failed', { error });\n }\n\n // Test embedding endpoint specifically\n try {\n debugLogger.debug('Testing embedding endpoint availability');\n const testResponse = await fetch(`${this.baseUrl}/embedding/available-files?limit=1`, {\n method: 'GET',\n headers: this.getHeaders()\n });\n\n debugLogger.debug('Embedding endpoint response', {\n status: testResponse.status,\n ok: testResponse.ok,\n statusText: testResponse.statusText\n });\n\n if (testResponse.ok) {\n const result = await testResponse.json();\n debugLogger.info('Embedding endpoint is available', { result });\n }\n } catch (error) {\n debugLogger.error('Embedding endpoint test failed', { error });\n }\n }\n\n /**\n * Test embedding a specific file ID that you know exists\n */\n async debugTestEmbedding(fileId: string): Promise<void> {\n debugLogger.info('Testing embedding for file', { fileId });\n \n try {\n const result = await this.embedDocument(fileId, true);\n debugLogger.info('Embedding test result', result);\n } catch (error) {\n debugLogger.error('Embedding test failed', { error });\n }\n }\n}\n\n// Export singleton instance\nexport const vectorDatabaseService = new VectorDatabaseService();\n\n// Expose to global scope for debugging in development\nif (typeof window !== 'undefined') {\n const globalWindow = window as Window & { vectorDatabaseService?: VectorDatabaseService };\n globalWindow.vectorDatabaseService = vectorDatabaseService;\n debugLogger.info('Vector database service exposed globally for debugging');\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-3B4B-14DF77\nconst __banditFingerprint_hooks_useVectorStoretsx = 'BL-FP-CA5CF8-985C';\nconst __auditTrail_hooks_useVectorStoretsx = 'BL-AU-MGOIKVVG-347B';\n// File: useVectorStore.tsx | Path: src/hooks/useVectorStore.tsx | Hash: 3b4b985c\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { debugLogger } from '../services/logging/debugLogger';\nimport { vectorDatabaseService, type VectorMemoryMetadata, type VectorMemory, type MemorySearchFilters, type VectorDocument, type SearchResult } from '../services/vectorDatabase/vectorDatabaseService';\nimport { vectorMigrationService, MigrationStatus, MigrationProgress } from '../services/vectorDatabase/vectorMigrationService';\nimport { useMemoryStore } from '../store/memoryStore';\nimport type { MemoryEntry } from '../store/memoryStore';\nimport { useKnowledgeStore } from '../store/knowledgeStore';\nimport type { KnowledgeDoc } from '../store/knowledgeStore';\nimport { useAuthenticationStore } from '../store/authenticationStore';\nimport { usePackageSettingsStore } from '../store/packageSettingsStore';\nimport { useFeatures } from './useFeatures';\nimport { useConversationSyncStore } from '../store/conversationSyncStore';\n\nexport interface VectorStoreStatus {\n isEnabled: boolean;\n isAvailable: boolean;\n isMigrating: boolean;\n migrationRequired: boolean;\n migrationProgress?: MigrationProgress;\n lastError?: string;\n}\n\nexport interface SearchOptions {\n memoryLimit?: number;\n documentLimit?: number;\n scoreThreshold?: number;\n useVector?: boolean; // Override auto-detection\n filters?: MemorySearchFilters;\n}\n\nconst toIsoString = (timestamp: number | Date): string => {\n if (timestamp instanceof Date) {\n return timestamp.toISOString();\n }\n return new Date(timestamp).toISOString();\n};\n\nconst memoryEntryToVectorMemory = (entry: MemoryEntry): VectorMemory => ({\n id: entry.id,\n content: entry.content,\n tags: entry.tags,\n score: undefined,\n uploadedBy: 'local',\n uploadedAt: toIsoString(entry.timestamp),\n source: entry.source,\n pinned: entry.pinned,\n lastReferencedAt: toIsoString(entry.timestamp),\n metadata: undefined,\n});\n\nconst knowledgeDocToVectorDocument = (doc: KnowledgeDoc): VectorDocument => ({\n id: doc.id,\n filename: doc.name,\n content: doc.content,\n mimeType: doc.mimeType || 'application/octet-stream',\n score: undefined,\n uploadedBy: doc.uploadedBy || 'local',\n uploadedAt: doc.addedDate ? doc.addedDate.toISOString() : new Date().toISOString(),\n isUserContent: doc.isUserContent ?? true,\n isTeamContent: doc.isTeamContent ?? false,\n contentSource: doc.contentSource ?? (doc.isTeamContent ? 'team' : 'user'),\n});\n\ntype RawFileRecord = Record<string, unknown>;\n\nconst rawFileRecordToVectorDocument = (record: RawFileRecord): VectorDocument | null => {\n if (!record || typeof record !== 'object') {\n return null;\n }\n\n const id = typeof record.id === 'string'\n ? record.id\n : typeof record.fileId === 'string'\n ? record.fileId\n : undefined;\n\n if (!id) {\n return null;\n }\n\n const filename = typeof record.filename === 'string'\n ? record.filename\n : typeof record.fileName === 'string'\n ? record.fileName\n : 'Untitled Document';\n\n const preview = typeof record.preview === 'string'\n ? record.preview\n : typeof record.summary === 'string'\n ? record.summary\n : typeof record.snippet === 'string'\n ? record.snippet\n : undefined;\n\n const content = typeof record.content === 'string' && record.content.trim().length > 0\n ? record.content\n : preview ?? '';\n const mimeType = typeof record.mimeType === 'string' ? record.mimeType : 'application/octet-stream';\n const uploadedBy = typeof record.uploadedBy === 'string' ? record.uploadedBy : 'unknown';\n const uploadedAt = typeof record.uploadedAt === 'string' ? record.uploadedAt : new Date().toISOString();\n const isUserContent = typeof record.isUserContent === 'boolean' ? record.isUserContent : true;\n const isTeamContent = typeof record.isTeamContent === 'boolean' ? record.isTeamContent : false;\n const contentSource = record.contentSource === 'team' ? 'team' : 'user';\n const score = typeof record.score === 'number' ? record.score : undefined;\n\n return {\n id,\n filename,\n content,\n mimeType,\n uploadedBy,\n uploadedAt,\n isUserContent,\n isTeamContent,\n contentSource,\n score\n };\n};\n\n/**\n * Advanced Vector Storage Hook\n * \n * Manages the transition between IndexedDB and Vector Database storage\n * when advanced semantic search is enabled. Handles feature gating,\n * migration, and unified API for both storage backends.\n * \n * Features:\n * - Automatic migration when advanced search is first enabled\n * - Unified API that works with both IndexedDB and Vector DB\n * - Feature gating based on subscription tier and admin claims\n * - Progress tracking for migration operations\n * - Fallback to IndexedDB if vector service unavailable\n */\nexport const useVectorStore = () => {\n const [status, setStatus] = useState<VectorStoreStatus>({\n isEnabled: false,\n isAvailable: false,\n isMigrating: false,\n migrationRequired: false\n });\n\n // Store access\n const memoryStore = useMemoryStore();\n const knowledgeStore = useKnowledgeStore();\n const authStore = useAuthenticationStore();\n const features = useFeatures();\n const isAdvancedVectorFeaturesEnabled = useConversationSyncStore((state) => state.isAdvancedVectorFeaturesEnabled);\n\n const hasAnyAdvancedFeatures = isAdvancedVectorFeaturesEnabled;\n const hasVectorAccess = features.isAdmin() || features.hasAdvancedSearch() || features.hasAdvancedMemories();\n\n // Check if using compatible AI provider (Ollama or Gateway with Ollama)\n const [hasCompatibleProvider, setHasCompatibleProvider] = useState(false);\n\n const checkProviderCompatibility = useCallback(async () => {\n try {\n const { useAIProviderStore } = await import('../store/aiProviderStore');\n const aiProviderState = useAIProviderStore.getState();\n const provider = aiProviderState.provider;\n const config = aiProviderState.config;\n \n if (!provider || !config) {\n setHasCompatibleProvider(false);\n return false;\n }\n\n // Check if provider type is ollama or gateway with ollama backend\n const isOllama = config.type === 'ollama';\n const isGatewayWithOllama = config.type === 'gateway' && config.provider === 'ollama';\n const isCompatible = isOllama || isGatewayWithOllama;\n \n setHasCompatibleProvider(isCompatible);\n return isCompatible;\n } catch (error) {\n debugLogger.warn('Could not check AI provider for vector compatibility', { error });\n setHasCompatibleProvider(false);\n return false;\n }\n }, []);\n\n // Check provider compatibility on mount and when dependencies change\n useEffect(() => {\n checkProviderCompatibility();\n }, [checkProviderCompatibility]);\n\n // Also check when AI provider store changes\n useEffect(() => {\n const checkOnProviderChange = async () => {\n // Add a small delay to ensure provider store is updated\n setTimeout(() => {\n checkProviderCompatibility();\n }, 100);\n };\n\n checkOnProviderChange();\n }, [authStore.token, checkProviderCompatibility]); // Re-check when auth token changes (which affects provider initialization)\n\n // Force a periodic check to catch late provider initialization\n useEffect(() => {\n const interval = setInterval(() => {\n if (!hasCompatibleProvider) {\n checkProviderCompatibility();\n }\n }, 2000); // Check every 2 seconds if not compatible\n\n return () => clearInterval(interval);\n }, [hasCompatibleProvider, checkProviderCompatibility]);\n\n /**\n * Initialize vector database service with auth token\n */\n const initializeVectorService = useCallback(async () => {\n try {\n // Get configuration from package settings instead of direct environment access\n const packageSettings = usePackageSettingsStore.getState().getSettings();\n \n if (!packageSettings) {\n debugLogger.warn('Package settings not available for vector service initialization');\n return;\n }\n \n const gatewayApiUrl = packageSettings.gatewayApiUrl;\n const s3ApiUrl = packageSettings.s3ApiUrl || packageSettings.gatewayApiUrl; // Fallback to gateway URL if S3 not specified\n \n vectorDatabaseService.configure(gatewayApiUrl, s3ApiUrl);\n\n if (authStore.token) {\n vectorDatabaseService.setAuthToken(authStore.token);\n }\n\n const isAvailable = vectorDatabaseService.isAvailable();\n const enabledCondition = hasAnyAdvancedFeatures && hasVectorAccess && isAvailable && hasCompatibleProvider;\n \n setStatus(prev => ({\n ...prev,\n isAvailable,\n isEnabled: enabledCondition,\n migrationRequired: isAvailable && enabledCondition && !vectorMigrationService.isMigrationCompleted()\n }));\n\n debugLogger.info('Vector service initialized', {\n isAvailable,\n isAdvancedVectorFeaturesEnabled,\n hasVectorAccess,\n migrationRequired: !vectorMigrationService.isMigrationCompleted()\n });\n\n } catch (error) {\n debugLogger.error('Failed to initialize vector service', { error });\n setStatus(prev => ({\n ...prev,\n isAvailable: false,\n isEnabled: false,\n lastError: error instanceof Error ? error.message : String(error)\n }));\n }\n }, [authStore.token, hasAnyAdvancedFeatures, hasVectorAccess, hasCompatibleProvider, isAdvancedVectorFeaturesEnabled]);\n\n // Initialize vector service when dependencies change\n useEffect(() => {\n initializeVectorService();\n }, [initializeVectorService]);\n\n /**\n * Perform migration from IndexedDB to Vector Database\n */\n const performMigration = useCallback(async (options?: { cleanupAfterMigration?: boolean }): Promise<MigrationStatus> => {\n debugLogger.info('Starting vector database migration');\n \n setStatus(prev => ({ ...prev, isMigrating: true, lastError: undefined }));\n\n // Set up progress tracking\n const progressCallback = (progress: MigrationProgress) => {\n setStatus(prev => ({ ...prev, migrationProgress: progress }));\n };\n\n vectorMigrationService.onProgress(progressCallback);\n\n try {\n const result = await vectorMigrationService.performMigration(options);\n \n setStatus(prev => ({\n ...prev,\n isMigrating: false,\n migrationRequired: !result.success,\n migrationProgress: undefined,\n lastError: result.success ? undefined : result.errors.join('; ')\n }));\n\n if (result.success) {\n debugLogger.info('Vector migration completed successfully', result);\n // Refresh stores to ensure they're updated\n await memoryStore.hydrate();\n await knowledgeStore.loadDocs();\n } else {\n debugLogger.error('Vector migration failed', result);\n }\n\n return result;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n debugLogger.error('Migration failed with exception', { error: errorMsg });\n \n setStatus(prev => ({\n ...prev,\n isMigrating: false,\n lastError: errorMsg\n }));\n\n return {\n success: false,\n migratedMemories: 0,\n migratedDocuments: 0,\n errors: [errorMsg],\n warnings: [],\n totalTime: 0\n };\n } finally {\n vectorMigrationService.removeProgressCallback(progressCallback);\n }\n }, [memoryStore, knowledgeStore]);\n\n /**\n * Add a memory using the appropriate storage backend\n */\n const addMemory = useCallback(async (\n content: string,\n tags: string[] = [],\n source: 'auto' | 'user' = 'user',\n options: {\n metadata?: VectorMemoryMetadata;\n pinned?: boolean;\n title?: string;\n lastReferencedAt?: string;\n } = {}\n ): Promise<{ success: boolean; id?: string; error?: string }> => {\n if (status.isEnabled && !status.migrationRequired) {\n // Use vector database\n try {\n const result = await vectorDatabaseService.createMemory(\n content,\n {\n title: options.title ?? `Memory from ${new Date().toLocaleDateString()}`,\n tags,\n source,\n pinned: options.pinned,\n metadata: options.metadata,\n lastReferencedAt: options.lastReferencedAt,\n }\n );\n \n if (result.success) {\n debugLogger.info('Memory added to vector database', { memoryId: result.memoryId });\n return { success: true, id: result.memoryId };\n } else {\n throw new Error(result.message || 'Unknown error');\n }\n } catch (error) {\n debugLogger.error('Failed to add memory to vector database', { error });\n return { \n success: false, \n error: error instanceof Error ? error.message : String(error) \n };\n }\n } else {\n // Use IndexedDB fallback\n try {\n await memoryStore.addMemory(content, tags, source);\n debugLogger.info('Memory added to IndexedDB', { content: content.slice(0, 100) });\n return { success: true };\n } catch (error) {\n debugLogger.error('Failed to add memory to IndexedDB', { error });\n return { \n success: false, \n error: error instanceof Error ? error.message : String(error) \n };\n }\n }\n }, [status.isEnabled, status.migrationRequired, memoryStore]);\n\n /**\n * Search memories using the appropriate backend\n */\n const searchMemories = useCallback(async (\n query: string,\n options: SearchOptions = {}\n ): Promise<VectorMemory[]> => {\n const { \n memoryLimit = 10, \n scoreThreshold = 0.6, \n useVector = status.isEnabled && !status.migrationRequired \n } = options;\n\n if (useVector) {\n // Use vector database search\n try {\n const results = await vectorDatabaseService.searchMemories(query, memoryLimit, scoreThreshold, options.filters);\n debugLogger.info('Vector memory search completed', { \n query: query.slice(0, 50), \n resultsCount: results.length \n });\n return results;\n } catch (error) {\n debugLogger.error('Vector memory search failed, falling back to IndexedDB', { error });\n // Fall through to IndexedDB search\n }\n }\n\n // Use IndexedDB search\n const results = memoryStore.searchMemory(query);\n debugLogger.info('IndexedDB memory search completed', { \n query: query.slice(0, 50), \n resultsCount: results.length \n });\n\n return results.slice(0, memoryLimit).map((entry) => ({\n id: entry.id,\n content: entry.content,\n title: undefined,\n tags: entry.tags,\n score: undefined,\n uploadedBy: 'local',\n uploadedAt: new Date(entry.timestamp).toISOString(),\n source: entry.source,\n pinned: entry.pinned,\n lastReferencedAt: new Date(entry.timestamp).toISOString(),\n metadata: undefined,\n }));\n }, [status.isEnabled, status.migrationRequired, memoryStore]);\n\n /**\n * Get user's memories with pagination\n */\n const getUserMemories = useCallback(async (\n skip = 0, \n limit = 50\n ): Promise<VectorMemory[]> => {\n if (status.isEnabled && !status.migrationRequired) {\n // Use vector database\n try {\n const results = await vectorDatabaseService.getMyMemories(skip, limit);\n debugLogger.info('Vector memories retrieved', { count: results.length });\n return results;\n } catch (error) {\n debugLogger.error('Failed to get vector memories, falling back to IndexedDB', { error });\n // Fall through to IndexedDB\n }\n }\n\n // Use IndexedDB fallback\n await memoryStore.hydrate();\n const allEntries = memoryStore.entries;\n const paginatedEntries = allEntries.slice(skip, skip + limit);\n debugLogger.info('IndexedDB memories retrieved', { count: paginatedEntries.length });\n return paginatedEntries.map(memoryEntryToVectorMemory);\n }, [status.isEnabled, status.migrationRequired, memoryStore]);\n\n /**\n * Delete a memory\n */\n const deleteMemory = useCallback(async (\n memoryId: string\n ): Promise<{ success: boolean; error?: string }> => {\n if (status.isEnabled && !status.migrationRequired) {\n // Use vector database\n try {\n const success = await vectorDatabaseService.deleteMemory(memoryId);\n if (success) {\n debugLogger.info('Memory deleted from vector database', { memoryId });\n return { success: true };\n } else {\n throw new Error('Vector deletion failed');\n }\n } catch (error) {\n debugLogger.error('Failed to delete vector memory', { memoryId, error });\n return { \n success: false, \n error: error instanceof Error ? error.message : String(error) \n };\n }\n } else {\n // Use IndexedDB fallback\n try {\n await memoryStore.removeMemory(memoryId);\n debugLogger.info('Memory deleted from IndexedDB', { memoryId });\n return { success: true };\n } catch (error) {\n debugLogger.error('Failed to delete IndexedDB memory', { memoryId, error });\n return { \n success: false, \n error: error instanceof Error ? error.message : String(error) \n };\n }\n }\n }, [status.isEnabled, status.migrationRequired, memoryStore]);\n\n /**\n * Update a memory using the appropriate storage backend\n */\n const updateMemory = useCallback(async (\n memoryId: string,\n updates: { pinned?: boolean; content?: string; title?: string; tags?: string[] }\n ): Promise<{ success: boolean; error?: string }> => {\n if (status.isEnabled && !status.migrationRequired) {\n // Use vector database\n try {\n const success = await vectorDatabaseService.updateMemory(memoryId, updates);\n if (success) {\n debugLogger.info('Memory updated in vector database', { memoryId, updates });\n return { success: true };\n } else {\n throw new Error('Vector update failed');\n }\n } catch (error) {\n debugLogger.error('Failed to update vector memory', { memoryId, error });\n return { \n success: false, \n error: error instanceof Error ? error.message : String(error) \n };\n }\n } else {\n // Use IndexedDB fallback - for pinning\n if (updates.pinned !== undefined) {\n try {\n await memoryStore.togglePinMemory(memoryId);\n debugLogger.info('Memory pin status updated in IndexedDB', { memoryId });\n return { success: true };\n } catch (error) {\n debugLogger.error('Failed to update IndexedDB memory pin', { memoryId, error });\n return { \n success: false, \n error: error instanceof Error ? error.message : String(error) \n };\n }\n }\n return { success: false, error: 'Update not supported for IndexedDB' };\n }\n }, [status.isEnabled, status.migrationRequired, memoryStore]);\n\n /**\n * Batch create memories using the appropriate storage backend\n */\n const batchCreateMemories = useCallback(async (\n memories: Array<{ content: string; title?: string; tags?: string[] }>,\n mode: 'append' | 'replace' | 'smartDedupe' = 'append',\n clearExisting: boolean = false\n ): Promise<{\n success: boolean;\n message: string;\n results: Array<{\n content: string;\n success: boolean;\n memoryId?: string;\n mongoId?: string;\n contentLength?: number;\n message: string;\n action: string;\n }>;\n summary: {\n mode: string;\n totalProcessed: number;\n successCount: number;\n failureCount: number;\n skippedCount: number;\n clearedExistingCount: number;\n clearedExisting: boolean;\n };\n }> => {\n if (status.isEnabled && !status.migrationRequired) {\n // Use vector database\n try {\n const result = await vectorDatabaseService.batchCreateMemories(memories, mode, clearExisting);\n debugLogger.info('Batch memories created in vector database', { \n total: memories.length,\n successful: result.summary.successCount,\n mode \n });\n return result;\n } catch (error) {\n debugLogger.error('Failed to batch create vector memories', { error });\n throw error;\n }\n } else {\n // Use IndexedDB fallback - simulate batch response\n const results: Array<{\n content: string;\n success: boolean;\n memoryId?: string;\n mongoId?: string;\n contentLength?: number;\n message: string;\n action: string;\n }> = [];\n\n let successCount = 0;\n let failureCount = 0;\n\n // Handle clear existing for replace mode\n if (mode === 'replace' || clearExisting) {\n try {\n await memoryStore.clearMemories();\n debugLogger.info('Cleared existing IndexedDB memories for batch replace');\n } catch (error) {\n debugLogger.error('Failed to clear existing memories', { error });\n }\n }\n\n // Add each memory to IndexedDB\n for (const memory of memories) {\n try {\n await memoryStore.addMemory(memory.content, memory.tags || [], 'user');\n results.push({\n content: memory.content.substring(0, 100) + '...',\n success: true,\n contentLength: memory.content.length,\n message: 'Memory added successfully to IndexedDB',\n action: 'added'\n });\n successCount++;\n } catch (error) {\n results.push({\n content: memory.content.substring(0, 100) + '...',\n success: false,\n message: error instanceof Error ? error.message : String(error),\n action: 'failed'\n });\n failureCount++;\n }\n }\n\n debugLogger.info('Batch memories created in IndexedDB', { \n total: memories.length,\n successful: successCount,\n failed: failureCount,\n mode \n });\n\n return {\n success: failureCount === 0,\n message: `Batch processing completed. ${successCount}/${memories.length} memories added successfully (IndexedDB fallback).`,\n results,\n summary: {\n mode: mode.charAt(0).toUpperCase() + mode.slice(1),\n totalProcessed: memories.length,\n successCount,\n failureCount,\n skippedCount: 0,\n clearedExistingCount: mode === 'replace' || clearExisting ? 1 : 0,\n clearedExisting: mode === 'replace' || clearExisting\n }\n };\n }\n }, [status.isEnabled, status.migrationRequired, memoryStore]);\n\n /**\n * Advanced batch create memories with progress reporting and chunking\n */\n const batchCreateMemoriesAdvanced = useCallback(async (\n memories: Array<{ content: string; title?: string; tags?: string[] }>,\n options: {\n mode?: 'append' | 'replace' | 'smartDedupe';\n clearExisting?: boolean;\n chunkSize?: number;\n onProgress?: (current: number, total: number, message: string) => void;\n validateContent?: boolean;\n } = {}\n ) => {\n if (status.isEnabled && !status.migrationRequired) {\n // Use vector database with advanced features\n return await vectorDatabaseService.batchCreateMemoriesAdvanced(memories, options);\n } else {\n // Fallback to basic batch operation for IndexedDB\n const basicResult = await batchCreateMemories(\n memories, \n options.mode || 'append', \n options.clearExisting || false\n );\n \n // Convert to advanced result format\n return {\n success: basicResult.success,\n message: basicResult.message,\n totalMemories: memories.length,\n successCount: basicResult.summary.successCount,\n failureCount: basicResult.summary.failureCount,\n skippedCount: basicResult.summary.skippedCount,\n errors: basicResult.results.filter(r => !r.success).map(r => r.message),\n warnings: [],\n chunks: 1,\n duration: 0\n };\n }\n }, [status.isEnabled, status.migrationRequired, batchCreateMemories]);\n\n /**\n * Batch import memories from local storage to vector database\n * This is useful for migrating existing IndexedDB memories to vector storage\n */\n const batchImportMemories = useCallback(async (\n fromIndexedDB: boolean = true,\n mode: 'append' | 'replace' | 'smartDedupe' = 'append'\n ): Promise<{\n success: boolean;\n message: string;\n migratedCount: number;\n totalMemories: number;\n errors: string[];\n }> => {\n if (!status.isEnabled || status.migrationRequired) {\n return {\n success: false,\n message: 'Vector database not available for import',\n migratedCount: 0,\n totalMemories: 0,\n errors: ['Vector database not enabled or migration required']\n };\n }\n\n if (!fromIndexedDB) {\n return {\n success: false,\n message: 'Only IndexedDB import is currently supported',\n migratedCount: 0,\n totalMemories: 0,\n errors: ['Unsupported import source']\n };\n }\n\n try {\n // Get all memories from IndexedDB\n await memoryStore.hydrate();\n const indexedDBMemories = memoryStore.entries;\n\n if (indexedDBMemories.length === 0) {\n return {\n success: true,\n message: 'No memories found in IndexedDB to import',\n migratedCount: 0,\n totalMemories: 0,\n errors: []\n };\n }\n\n // Convert IndexedDB format to vector format\n const memoriesToImport = indexedDBMemories.map(entry => ({\n content: entry.content,\n title: `Imported Memory - ${new Date(entry.timestamp).toLocaleDateString()}`,\n tags: entry.tags || []\n }));\n\n debugLogger.info('Starting batch import from IndexedDB', {\n totalMemories: memoriesToImport.length,\n mode\n });\n\n // Import to vector database\n const result = await vectorDatabaseService.batchCreateMemories(memoriesToImport, mode, false);\n\n return {\n success: result.success,\n message: `Import completed: ${result.summary.successCount}/${memoriesToImport.length} memories imported`,\n migratedCount: result.summary.successCount,\n totalMemories: memoriesToImport.length,\n errors: result.results\n .filter(r => !r.success)\n .map(r => r.message)\n };\n\n } catch (error) {\n debugLogger.error('Failed to import memories from IndexedDB', { error });\n return {\n success: false,\n message: error instanceof Error ? error.message : String(error),\n migratedCount: 0,\n totalMemories: 0,\n errors: [error instanceof Error ? error.message : String(error)]\n };\n }\n }, [status.isEnabled, status.migrationRequired, memoryStore]);\n\n /**\n * Upload and embed document\n */\n const uploadDocument = useCallback(async (\n file: File, \n shareWithTeam = true\n ): Promise<{ success: boolean; fileId?: string; error?: string }> => {\n if (!status.isEnabled || status.migrationRequired) {\n return { \n success: false, \n error: 'Vector database not available - document upload requires advanced features' \n };\n }\n\n try {\n // Upload file to S3\n const uploadResult = await vectorDatabaseService.uploadFile(file, shareWithTeam);\n \n if (!uploadResult.success || !uploadResult.fileId) {\n throw new Error(uploadResult.message || 'Upload failed');\n }\n\n // Embed in vector database\n const embedResult = await vectorDatabaseService.embedDocument(uploadResult.fileId, shareWithTeam);\n \n if (!embedResult.success) {\n throw new Error(embedResult.message || 'Embedding failed');\n }\n\n debugLogger.info('Document uploaded and embedded successfully', { \n filename: file.name,\n fileId: uploadResult.fileId \n });\n\n return { success: true, fileId: uploadResult.fileId };\n } catch (error) {\n debugLogger.error('Failed to upload document', { filename: file.name, error });\n return { \n success: false, \n error: error instanceof Error ? error.message : String(error) \n };\n }\n }, [status.isEnabled, status.migrationRequired]);\n\n /**\n * Search documents using vector database\n */\n const searchDocuments = useCallback(async (\n query: string, \n options: SearchOptions = {}\n ): Promise<VectorDocument[]> => {\n const { documentLimit = 20, scoreThreshold = 0.7 } = options;\n\n if (!status.isEnabled || status.migrationRequired) {\n debugLogger.warn('Vector document search not available, falling back to knowledge store');\n // Fallback to basic knowledge store search\n const docs = knowledgeStore.docs.filter(doc => \n doc.content.toLowerCase().includes(query.toLowerCase()) ||\n doc.name.toLowerCase().includes(query.toLowerCase())\n );\n return docs.slice(0, documentLimit).map(knowledgeDocToVectorDocument);\n }\n\n try {\n const results = await vectorDatabaseService.searchDocuments(query, documentLimit, scoreThreshold);\n debugLogger.info('Vector document search completed', { \n query: query.slice(0, 50), \n resultsCount: results.length \n });\n return results;\n } catch (error) {\n debugLogger.error('Vector document search failed', { error });\n return [];\n }\n }, [status.isEnabled, status.migrationRequired, knowledgeStore.docs]);\n\n /**\n * Combined search across both memories and documents\n */\n const searchAll = useCallback(async (\n query: string, \n options: SearchOptions = {}\n ): Promise<SearchResult> => {\n if (status.isEnabled && !status.migrationRequired) {\n // Use vector database combined search\n try {\n const result = await vectorDatabaseService.searchAll(\n query,\n options.memoryLimit,\n options.documentLimit,\n options.scoreThreshold\n );\n \n debugLogger.info('Vector combined search completed', result);\n return result;\n } catch (error) {\n debugLogger.error('Vector combined search failed, falling back', { error });\n // Fall through to fallback\n }\n }\n\n // Fallback to separate searches\n try {\n const [memories, documents] = await Promise.all([\n searchMemories(query, { ...options, useVector: false }),\n searchDocuments(query, options)\n ]);\n\n return {\n memories,\n documents,\n success: true,\n message: `Found ${memories.length} memories and ${documents.length} documents (fallback search)`,\n };\n } catch (error) {\n debugLogger.error('Fallback combined search failed', { error });\n return {\n memories: [],\n documents: [],\n success: false,\n message: error instanceof Error ? error.message : String(error)\n };\n }\n }, [status.isEnabled, status.migrationRequired, searchMemories, searchDocuments]);\n\n /**\n * Get migration estimation\n */\n const getMigrationEstimate = useCallback(async () => {\n return vectorMigrationService.estimateMigration();\n }, []);\n\n // Initialize on mount and when dependencies change\n useEffect(() => {\n initializeVectorService();\n }, [initializeVectorService]);\n\n /**\n * Get user's uploaded documents from vector database\n */\n const getUserDocuments = useCallback(async (\n skip = 0, \n limit = 50\n ): Promise<VectorDocument[]> => {\n if (!status.isEnabled || status.migrationRequired) {\n return [];\n }\n\n try {\n const records = await vectorDatabaseService.getUserFiles(skip, limit);\n const documents = records\n .map(rawFileRecordToVectorDocument)\n .filter((doc): doc is VectorDocument => doc !== null);\n\n debugLogger.info('Retrieved user documents from vector database', { \n count: documents.length \n });\n return documents;\n } catch (error) {\n debugLogger.error('Failed to get user documents', { error });\n return [];\n }\n }, [status.isEnabled, status.migrationRequired]);\n\n /**\n * Delete a document from vector database\n */\n const deleteDocument = useCallback(async (\n fileId: string\n ): Promise<{ success: boolean; error?: string }> => {\n if (!status.isEnabled || status.migrationRequired) {\n return { \n success: false, \n error: 'Vector database not available' \n };\n }\n\n try {\n const success = await vectorDatabaseService.deleteDocument(fileId);\n if (success) {\n debugLogger.info('Document deleted from vector database', { fileId });\n return { success: true };\n } else {\n throw new Error('Document deletion failed');\n }\n } catch (error) {\n debugLogger.error('Failed to delete document', { fileId, error });\n return { \n success: false, \n error: error instanceof Error ? error.message : String(error) \n };\n }\n }, [status.isEnabled, status.migrationRequired]);\n\n // Auto-trigger migration if required and user just gained access\n useEffect(() => {\n if (status.migrationRequired && status.isAvailable && !status.isMigrating) {\n debugLogger.info('Auto-triggering vector migration for newly enabled advanced features');\n // Auto-migrate when vector storage becomes available for users with access\n performMigration({ cleanupAfterMigration: false }).then(result => {\n debugLogger.info('Migration completed', { result });\n }).catch(error => {\n debugLogger.error('Auto-triggered migration failed', { error });\n });\n }\n }, [status.migrationRequired, status.isAvailable, status.isMigrating, performMigration]);\n\n /**\n * Download a file from vector database/S3 using MongoDB ObjectId\n */\n const downloadVectorFile = useCallback(async (\n fileId: string,\n filename: string\n ): Promise<void> => {\n if (!status.isEnabled) {\n throw new Error('Vector database not enabled');\n }\n\n try {\n await vectorDatabaseService.downloadFile(fileId, filename);\n debugLogger.info('File downloaded successfully', { fileId, filename });\n } catch (error) {\n debugLogger.error('Failed to download file', { fileId, filename, error });\n throw error;\n }\n }, [status.isEnabled]);\n\n /**\n * Get file preview content using MongoDB ObjectId\n */\n const getFilePreview = useCallback(async (\n fileId: string\n ): Promise<{ content: string; mimeType: string } | null> => {\n if (!status.isEnabled) {\n return null;\n }\n\n try {\n const preview = await vectorDatabaseService.getFilePreview(fileId);\n debugLogger.info('File preview retrieved', { fileId, hasContent: !!preview?.content });\n return preview;\n } catch (error) {\n debugLogger.error('Failed to get file preview', { fileId, error });\n return null;\n }\n }, [status.isEnabled]);\n\n /**\n * Get file blob for displaying full content in modal using MongoDB ObjectId\n */\n const getFileBlob = useCallback(async (\n fileId: string\n ): Promise<Blob> => {\n if (!status.isEnabled) {\n throw new Error('Vector database not enabled');\n }\n\n try {\n const blob = await vectorDatabaseService.getFileBlob(fileId);\n debugLogger.info('File blob retrieved', { fileId, size: blob.size });\n return blob;\n } catch (error) {\n debugLogger.error('Failed to get file blob', { fileId, error });\n throw error;\n }\n }, [status.isEnabled]);\n\n // Manual refresh function for debugging\n const refreshCompatibilityCheck = useCallback(() => {\n checkProviderCompatibility();\n }, [checkProviderCompatibility]);\n\n return {\n // Status\n status,\n isVectorEnabled: status.isEnabled && !status.migrationRequired,\n \n // Debug functions\n refreshCompatibilityCheck,\n \n // Migration\n performMigration,\n getMigrationEstimate,\n \n // Memory operations\n addMemory,\n batchCreateMemories,\n batchCreateMemoriesAdvanced,\n batchImportMemories,\n searchMemories,\n getUserMemories,\n deleteMemory,\n updateMemory,\n \n // Document operations\n uploadDocument,\n searchDocuments,\n getUserDocuments,\n deleteDocument,\n downloadVectorFile,\n getFilePreview,\n getFileBlob,\n \n // Combined operations\n searchAll,\n \n // Utilities\n initializeVectorService\n };\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-7AB7-C71573\nconst __banditFingerprint_vectorDatabase_vectorMigrationServicets = 'BL-FP-D7A8C3-8E82';\nconst __auditTrail_vectorDatabase_vectorMigrationServicets = 'BL-AU-MGOIKVW1-KUYC';\n// File: vectorMigrationService.ts | Path: src/services/vectorDatabase/vectorMigrationService.ts | Hash: 7ab78e82\n\nimport { debugLogger } from '../logging/debugLogger';\nimport { MemoryEntry } from '../../store/memoryStore';\nimport { KnowledgeDoc } from '../../store/knowledgeStore';\nimport { vectorDatabaseService } from './vectorDatabaseService';\nimport indexedDBService from '../indexedDB/indexedDBService';\n\nexport interface MigrationStatus {\n success: boolean;\n migratedMemories: number;\n migratedDocuments: number;\n errors: string[];\n warnings: string[];\n totalTime: number;\n}\n\nexport interface MigrationProgress {\n phase: 'memories' | 'documents' | 'cleanup' | 'complete';\n current: number;\n total: number;\n currentItem?: string;\n errors: string[];\n}\n\n/**\n * Vector Database Migration Service\n * \n * Handles migration of memories and documents from IndexedDB to vector database\n * when advanced semantic search is enabled for the first time.\n * \n * Features:\n * - Batch migration to avoid overwhelming the API\n * - Progress tracking with user feedback\n * - Error handling and retry logic\n * - Cleanup of migrated IndexedDB data (optional)\n * - Rollback capability in case of issues\n */\nexport class VectorMigrationService {\n private static readonly BATCH_SIZE = 5;\n private static readonly RETRY_DELAY = 1000; // 1 second\n private static readonly MAX_RETRIES = 3;\n\n private migrationKey = 'bandit_vector_migration_completed';\n private progressCallbacks: ((progress: MigrationProgress) => void)[] = [];\n\n /**\n * Check if migration has already been completed\n */\n isMigrationCompleted(): boolean {\n try {\n return localStorage.getItem(this.migrationKey) === 'true';\n } catch (error) {\n debugLogger.warn('Unable to check migration status from localStorage', { error });\n return false;\n }\n }\n\n /**\n * Mark migration as completed\n */\n markMigrationCompleted(): void {\n try {\n localStorage.setItem(this.migrationKey, 'true');\n debugLogger.info('Vector migration marked as completed');\n } catch (error) {\n debugLogger.error('Failed to mark migration as completed', { error });\n }\n }\n\n /**\n * Reset migration status (for testing or re-migration)\n */\n resetMigrationStatus(): void {\n try {\n localStorage.removeItem(this.migrationKey);\n debugLogger.info('Vector migration status reset');\n } catch (error) {\n debugLogger.error('Failed to reset migration status', { error });\n }\n }\n\n /**\n * Add progress callback for UI updates\n */\n onProgress(callback: (progress: MigrationProgress) => void): void {\n this.progressCallbacks.push(callback);\n }\n\n /**\n * Remove progress callback\n */\n removeProgressCallback(callback: (progress: MigrationProgress) => void): void {\n this.progressCallbacks = this.progressCallbacks.filter(cb => cb !== callback);\n }\n\n /**\n * Notify progress callbacks\n */\n private notifyProgress(progress: MigrationProgress): void {\n this.progressCallbacks.forEach(callback => {\n try {\n callback(progress);\n } catch (error) {\n debugLogger.error('Error in migration progress callback', { error });\n }\n });\n }\n\n /**\n * Sleep utility for rate limiting\n */\n private sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n /**\n * Get all memories directly from IndexedDB\n */\n private async getAllMemories(): Promise<MemoryEntry[]> {\n try {\n const DB_NAME = \"bandit-memory-db\";\n const STORE_NAME = \"bandit-memory\";\n const storeConfigs = [{ name: STORE_NAME, keyPath: \"id\" }];\n \n return await indexedDBService.getAll<MemoryEntry>(DB_NAME, 1, STORE_NAME, storeConfigs);\n } catch (error) {\n debugLogger.error('Failed to get memories from IndexedDB', { error });\n return [];\n }\n }\n\n /**\n * Get all knowledge documents directly from IndexedDB \n */\n private async getAllDocuments(): Promise<KnowledgeDoc[]> {\n try {\n const DB_NAME = \"bandit-knowledge-db\";\n const STORE_NAME = \"bandit-knowledge\";\n const storeConfigs = [{ name: STORE_NAME, keyPath: \"id\" }];\n \n return await indexedDBService.getAll<KnowledgeDoc>(DB_NAME, 1, STORE_NAME, storeConfigs);\n } catch (error) {\n debugLogger.error('Failed to get documents from IndexedDB', { error });\n return [];\n }\n }\n\n /**\n * Clear all memories from IndexedDB\n */\n private async clearAllMemories(): Promise<void> {\n try {\n const DB_NAME = \"bandit-memory-db\";\n const STORE_NAME = \"bandit-memory\";\n const storeConfigs = [{ name: STORE_NAME, keyPath: \"id\" }];\n \n await indexedDBService.clear(DB_NAME, 1, STORE_NAME, storeConfigs);\n } catch (error) {\n debugLogger.error('Failed to clear memories from IndexedDB', { error });\n throw error;\n }\n }\n\n /**\n * Clear all documents from IndexedDB\n */\n private async clearAllDocuments(): Promise<void> {\n try {\n const DB_NAME = \"bandit-knowledge-db\";\n const STORE_NAME = \"bandit-knowledge\";\n const storeConfigs = [{ name: STORE_NAME, keyPath: \"id\" }];\n \n await indexedDBService.clear(DB_NAME, 1, STORE_NAME, storeConfigs);\n } catch (error) {\n debugLogger.error('Failed to clear documents from IndexedDB', { error });\n throw error;\n }\n }\n\n /**\n * Migrate memories from IndexedDB to vector database\n */\n private async migrateMemories(): Promise<{ success: number; errors: string[] }> {\n debugLogger.info('Starting memory migration to vector database');\n \n const memories = await this.getAllMemories();\n const errors: string[] = [];\n let successCount = 0;\n\n if (memories.length === 0) {\n debugLogger.info('No memories to migrate');\n return { success: 0, errors: [] };\n }\n\n debugLogger.info(`Found ${memories.length} memories to migrate`);\n\n // Process in batches\n for (let i = 0; i < memories.length; i += VectorMigrationService.BATCH_SIZE) {\n const batch = memories.slice(i, i + VectorMigrationService.BATCH_SIZE);\n \n this.notifyProgress({\n phase: 'memories',\n current: i,\n total: memories.length,\n currentItem: `Migrating batch ${Math.floor(i / VectorMigrationService.BATCH_SIZE) + 1}`,\n errors\n });\n\n // Process batch items\n for (const memory of batch) {\n let attempts = 0;\n let migrated = false;\n\n while (attempts < VectorMigrationService.MAX_RETRIES && !migrated) {\n try {\n attempts++;\n \n debugLogger.debug('Migrating memory to vector database', { \n memoryId: memory.id,\n attempt: attempts,\n content: memory.content.slice(0, 100)\n });\n\n // Create memory in vector database\n const result = await vectorDatabaseService.createMemory(memory.content, {\n title: `Memory from ${new Date(memory.timestamp).toLocaleDateString()}`,\n tags: memory.tags || [],\n source: memory.source,\n pinned: memory.pinned,\n lastReferencedAt: new Date(memory.timestamp).toISOString(),\n });\n\n if (result.success) {\n successCount++;\n migrated = true;\n debugLogger.debug('Memory migrated successfully', { \n memoryId: memory.id,\n vectorId: result.memoryId \n });\n } else {\n throw new Error(result.message || 'Unknown error');\n }\n } catch (error) {\n debugLogger.error('Failed to migrate memory', { \n memoryId: memory.id,\n attempt: attempts,\n error: error instanceof Error ? error.message : String(error)\n });\n\n if (attempts >= VectorMigrationService.MAX_RETRIES) {\n const errorMsg = `Failed to migrate memory ${memory.id}: ${error instanceof Error ? error.message : String(error)}`;\n errors.push(errorMsg);\n } else {\n // Wait before retry\n await this.sleep(VectorMigrationService.RETRY_DELAY * attempts);\n }\n }\n }\n }\n\n // Rate limiting between batches\n if (i + VectorMigrationService.BATCH_SIZE < memories.length) {\n await this.sleep(500);\n }\n }\n\n debugLogger.info('Memory migration completed', { \n total: memories.length,\n success: successCount,\n errors: errors.length \n });\n\n return { success: successCount, errors };\n }\n\n /**\n * Migrate documents from IndexedDB to vector database\n */\n private async migrateDocuments(): Promise<{ success: number; errors: string[] }> {\n debugLogger.info('Starting document migration to vector database');\n \n const errors: string[] = [];\n let successCount = 0;\n\n try {\n // Get documents from knowledge store's IndexedDB storage\n const documents = await this.getAllDocuments();\n\n if (documents.length === 0) {\n debugLogger.info('No documents to migrate');\n return { success: 0, errors: [] };\n }\n\n debugLogger.info(`Found ${documents.length} documents to migrate`);\n\n // Process documents in batches\n for (let i = 0; i < documents.length; i += VectorMigrationService.BATCH_SIZE) {\n const batch = documents.slice(i, i + VectorMigrationService.BATCH_SIZE);\n \n this.notifyProgress({\n phase: 'documents',\n current: i,\n total: documents.length,\n currentItem: `Migrating batch ${Math.floor(i / VectorMigrationService.BATCH_SIZE) + 1}`,\n errors\n });\n\n // Process batch items\n for (const doc of batch) {\n let attempts = 0;\n let migrated = false;\n\n while (attempts < VectorMigrationService.MAX_RETRIES && !migrated) {\n try {\n attempts++;\n \n debugLogger.debug('Migrating document to vector database', { \n filename: doc.name,\n attempt: attempts\n });\n\n // For documents, we need to:\n // 1. Convert content to file format if needed\n // 2. Upload to S3\n // 3. Embed in vector database\n \n if (doc.content && doc.name) {\n // Create a virtual file from stored content\n const blob = new Blob([doc.content], { type: 'text/plain' });\n const file = new File([blob], doc.name, { type: 'text/plain' });\n\n // Upload to S3 with team sharing enabled by default for migration\n const uploadResult = await vectorDatabaseService.uploadFile(file, true);\n \n if (uploadResult.success && uploadResult.fileId) {\n // Embed in vector database\n const embedResult = await vectorDatabaseService.embedDocument(uploadResult.fileId, true);\n \n if (embedResult.success) {\n successCount++;\n migrated = true;\n debugLogger.debug('Document migrated successfully', { \n filename: doc.name,\n fileId: uploadResult.fileId \n });\n } else {\n throw new Error(embedResult.message || 'Embedding failed');\n }\n } else {\n throw new Error(uploadResult.message || 'Upload failed');\n }\n } else {\n throw new Error('Document missing required content or filename');\n }\n } catch (error) {\n debugLogger.error('Failed to migrate document', { \n filename: doc.name,\n attempt: attempts,\n error: error instanceof Error ? error.message : String(error)\n });\n\n if (attempts >= VectorMigrationService.MAX_RETRIES) {\n const errorMsg = `Failed to migrate document ${doc.name}: ${error instanceof Error ? error.message : String(error)}`;\n errors.push(errorMsg);\n } else {\n // Wait before retry\n await this.sleep(VectorMigrationService.RETRY_DELAY * attempts);\n }\n }\n }\n }\n\n // Rate limiting between batches\n if (i + VectorMigrationService.BATCH_SIZE < documents.length) {\n await this.sleep(500);\n }\n }\n } catch (error) {\n debugLogger.error('Failed to get documents for migration', { error });\n errors.push(`Failed to retrieve documents: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n debugLogger.info('Document migration completed', { \n success: successCount,\n errors: errors.length \n });\n\n return { success: successCount, errors };\n }\n\n /**\n * Perform full migration from IndexedDB to vector database\n */\n async performMigration(\n options: {\n cleanupAfterMigration?: boolean;\n skipIfCompleted?: boolean;\n } = {}\n ): Promise<MigrationStatus> {\n const startTime = Date.now();\n const { cleanupAfterMigration = false, skipIfCompleted = true } = options;\n\n debugLogger.info('Starting vector database migration', { \n cleanupAfterMigration,\n skipIfCompleted \n });\n\n // Check if already completed\n if (skipIfCompleted && this.isMigrationCompleted()) {\n debugLogger.info('Migration already completed, skipping');\n return {\n success: true,\n migratedMemories: 0,\n migratedDocuments: 0,\n errors: [],\n warnings: ['Migration was already completed'],\n totalTime: Date.now() - startTime\n };\n }\n\n const allErrors: string[] = [];\n const allWarnings: string[] = [];\n\n try {\n // Ensure vector database is available\n if (!vectorDatabaseService.isAvailable()) {\n throw new Error('Vector database service is not available - check configuration and authentication');\n }\n\n // Phase 1: Migrate memories\n debugLogger.info('Phase 1: Migrating memories');\n const memoryResult = await this.migrateMemories();\n allErrors.push(...memoryResult.errors);\n\n // Phase 2: Migrate documents\n debugLogger.info('Phase 2: Migrating documents');\n const documentResult = await this.migrateDocuments();\n allErrors.push(...documentResult.errors);\n\n // Phase 3: Cleanup (optional)\n if (cleanupAfterMigration && allErrors.length === 0) {\n this.notifyProgress({\n phase: 'cleanup',\n current: 0,\n total: 1,\n currentItem: 'Cleaning up local data',\n errors: allErrors\n });\n\n try {\n // Only cleanup if migration was successful\n await this.cleanupLocalData();\n debugLogger.info('Local data cleanup completed');\n } catch (error) {\n const warningMsg = `Cleanup failed but migration succeeded: ${error instanceof Error ? error.message : String(error)}`;\n allWarnings.push(warningMsg);\n debugLogger.warn('Cleanup failed', { error });\n }\n }\n\n // Mark as completed if no errors\n if (allErrors.length === 0) {\n this.markMigrationCompleted();\n }\n\n // Final progress update\n this.notifyProgress({\n phase: 'complete',\n current: 1,\n total: 1,\n currentItem: 'Migration complete',\n errors: allErrors\n });\n\n const totalTime = Date.now() - startTime;\n const status: MigrationStatus = {\n success: allErrors.length === 0,\n migratedMemories: memoryResult.success,\n migratedDocuments: documentResult.success,\n errors: allErrors,\n warnings: allWarnings,\n totalTime\n };\n\n debugLogger.info('Vector migration completed', status);\n return status;\n\n } catch (error) {\n const errorMsg = `Migration failed: ${error instanceof Error ? error.message : String(error)}`;\n allErrors.push(errorMsg);\n \n debugLogger.error('Vector migration failed', { error });\n\n return {\n success: false,\n migratedMemories: 0,\n migratedDocuments: 0,\n errors: allErrors,\n warnings: allWarnings,\n totalTime: Date.now() - startTime\n };\n }\n }\n\n /**\n * Clean up local IndexedDB data after successful migration\n */\n private async cleanupLocalData(): Promise<void> {\n debugLogger.info('Starting cleanup of local IndexedDB data');\n\n try {\n // Clear memories from memory store\n await this.clearAllMemories();\n debugLogger.info('Cleared all memories from local storage');\n\n // Clear documents from knowledge store\n await this.clearAllDocuments();\n debugLogger.info('Cleared all documents from local storage');\n\n } catch (error) {\n debugLogger.error('Failed to cleanup local data', { error });\n throw error;\n }\n }\n\n /**\n * Estimate migration time and data size\n */\n async estimateMigration(): Promise<{\n memoryCount: number;\n documentCount: number;\n estimatedTime: number; // in minutes\n estimatedDataSize: number; // in MB\n }> {\n try {\n const memories = await this.getAllMemories();\n const documents = await this.getAllDocuments();\n\n // Rough estimation based on content size and API call overhead\n const avgMemorySize = memories.reduce((sum: number, m: MemoryEntry) => sum + m.content.length, 0) / Math.max(memories.length, 1);\n const avgDocumentSize = documents.reduce((sum: number, d: KnowledgeDoc) => sum + (d.content?.length || 0), 0) / Math.max(documents.length, 1);\n\n const totalDataSize = (memories.length * avgMemorySize + documents.length * avgDocumentSize) / (1024 * 1024); // MB\n const totalItems = memories.length + documents.length;\n \n // Estimate 1-2 seconds per item including API calls and retries\n const estimatedTime = Math.ceil((totalItems * 1.5) / 60); // minutes\n\n return {\n memoryCount: memories.length,\n documentCount: documents.length,\n estimatedTime: Math.max(1, estimatedTime),\n estimatedDataSize: Math.round(totalDataSize * 100) / 100\n };\n } catch (error) {\n debugLogger.error('Failed to estimate migration', { error });\n return {\n memoryCount: 0,\n documentCount: 0,\n estimatedTime: 1,\n estimatedDataSize: 0\n };\n }\n }\n}\n\n// Export singleton instance\nexport const vectorMigrationService = new VectorMigrationService();\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-4B68-54D1A0\nconst __banditFingerprint_store_authenticationStorets = 'BL-FP-3C880F-DCB9';\nconst __auditTrail_store_authenticationStorets = 'BL-AU-MGOIKVW3-9GUS';\n// File: authenticationStore.ts | Path: src/store/authenticationStore.ts | Hash: 4b68dcb9\n\nimport { create } from \"zustand\";\nimport { JwtClaims } from \"../services/auth/authenticationService\";\n\nconst TOKEN_KEY = \"authToken\";\n\n// 🔥 Inline hydration of token + user (avoids circular import)\nlet validToken: string | null = null;\nlet user: JwtClaims | null = null;\n\nconst rawToken = localStorage.getItem(TOKEN_KEY);\nif (rawToken) {\n try {\n const base64Url = rawToken.split(\".\")[1];\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split(\"\")\n .map((c) => \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2))\n .join(\"\")\n );\n const decoded = JSON.parse(jsonPayload) as JwtClaims;\n\n if (decoded.exp * 1000 > Date.now()) {\n validToken = rawToken;\n user = decoded;\n }\n } catch {\n validToken = null;\n user = null;\n }\n}\n\ninterface AuthenticationState {\n token: string | null;\n user: JwtClaims | null;\n authError: string | null;\n setToken: (token: string | null) => void;\n clearToken: () => void;\n}\n\nexport const useAuthenticationStore = create<AuthenticationState>((set) => ({\n token: validToken,\n user,\n authError: null,\n setToken: (token) => {\n if (token) {\n try {\n const base64Url = token.split(\".\")[1];\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split(\"\")\n .map((c) => \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2))\n .join(\"\")\n );\n const user = JSON.parse(jsonPayload) as JwtClaims;\n\n localStorage.setItem(TOKEN_KEY, token);\n set({ token, authError: null, user });\n } catch {\n set({ token: null, authError: \"Invalid token\", user: null });\n }\n } else {\n set({ token: null, authError: null, user: null });\n }\n },\n clearToken: () => {\n localStorage.removeItem(TOKEN_KEY);\n set({ token: null, authError: null, user: null });\n },\n}));\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-B397-D72705\nconst __banditFingerprint_hooks_useFeaturests = 'BL-FP-4804C1-6785';\nconst __auditTrail_hooks_useFeaturests = 'BL-AU-MGOIKVVE-JH5X';\n// File: useFeatures.ts | Path: src/hooks/useFeatures.ts | Hash: b3976785\n\nimport { useContext } from 'react';\nimport { FeatureFlagContext } from '../contexts/FeatureFlagContext';\nimport { FeatureKey, SubscriptionTier } from '../types/featureFlags';\n\n/**\n * Convenience hook that provides an easier API for feature checking\n */\nexport const useFeatures = () => {\n const featureFlag = useContext(FeatureFlagContext);\n\n if (!featureFlag) {\n // Fallback: default to OSS features when feature flags are unavailable\n return {\n hasFeature: () => true,\n hasMemory: () => true,\n hasDocumentKnowledge: () => true,\n hasMoodAdaptation: () => true,\n hasChatSuggestions: () => true,\n hasTTS: () => true,\n hasSTT: () => true,\n hasAdminDashboard: () => true,\n hasLimitedAdminDashboard: () => true,\n hasSimpleSearch: () => true,\n hasPremiumSearch: () => true,\n hasAdvancedSearch: () => true,\n hasAdvancedMemories: () => true,\n isAdmin: () => false,\n getCurrentTier: () => 'oss' as const,\n isOSSMode: () => true,\n isSubscribed: () => true,\n isPremiumTier: () => false,\n isProTier: () => false,\n isTrialTier: () => false,\n isTeamTier: () => false,\n isExpiredTier: () => false,\n needsUpgrade: () => false,\n getTrialUsage: () => undefined,\n isTrialLimitReached: () => false,\n getTrialRemainingRequests: () => null,\n updateTier: () => undefined,\n refreshFeatures: () => undefined,\n getFullEvaluation: () => null,\n };\n }\n\n return {\n // Core feature checking\n hasFeature: (feature: FeatureKey) => featureFlag.hasFeature(feature),\n \n // Convenience methods for common features\n hasMemory: () => featureFlag.hasFeature('memory'),\n hasDocumentKnowledge: () => featureFlag.hasFeature('documentKnowledge'),\n hasMoodAdaptation: () => featureFlag.hasFeature('moodAdaptation'),\n hasChatSuggestions: () => featureFlag.hasFeature('chatSuggestions'),\n hasTTS: () => featureFlag.hasFeature('tts'),\n hasSTT: () => featureFlag.hasFeature('stt'),\n hasAdminDashboard: () => featureFlag.hasFeature('adminDashboardEnabled'),\n hasLimitedAdminDashboard: () => featureFlag.hasFeature('limitedAdminDashboard'),\n hasSimpleSearch: () => featureFlag.hasFeature('semanticSearchSimple'),\n hasPremiumSearch: () => featureFlag.hasFeature('semanticSearchPremium'),\n hasAdvancedSearch: () => featureFlag.hasFeature('advancedSearch'),\n hasAdvancedMemories: () => featureFlag.hasFeature('advancedMemories'),\n \n // Admin and tier checking\n isAdmin: () => featureFlag.isAdmin(),\n getCurrentTier: () => featureFlag.getCurrentTier(),\n isOSSMode: () => featureFlag.isOSSMode(),\n isSubscribed: () => featureFlag.getEvaluation()?.isSubscribed ?? true,\n \n // Tier comparison helpers\n isPremiumTier: () => {\n const tier = featureFlag.getCurrentTier();\n return tier === 'premium' || tier === 'pro' || tier === 'team' || tier === 'trial';\n },\n \n isProTier: () => {\n const tier = featureFlag.getCurrentTier();\n return tier === 'pro' || tier === 'team' || tier === 'trial';\n },\n \n isTrialTier: () => featureFlag.getCurrentTier() === 'trial',\n \n isTeamTier: () => featureFlag.getCurrentTier() === 'team',\n \n isExpiredTier: () => featureFlag.getCurrentTier() === 'expired',\n \n // Upgrade checking\n needsUpgrade: (feature: FeatureKey, requiredTier?: SubscriptionTier) => {\n if (featureFlag.isAdmin() || featureFlag.isOSSMode()) {\n return false;\n }\n \n if (!featureFlag.hasFeature(feature)) {\n return requiredTier || 'premium';\n }\n \n return false;\n },\n \n // Trial usage tracking\n getTrialUsage: () => featureFlag.getEvaluation()?.trialUsage,\n isTrialLimitReached: (type: 'chat' | 'generate') => {\n const usage = featureFlag.getEvaluation()?.trialUsage;\n if (!usage) return false;\n \n if (type === 'chat') {\n return usage.chatRequestsUsed >= usage.chatRequestsLimit;\n } else {\n return usage.generateRequestsUsed >= usage.generateRequestsLimit;\n }\n },\n getTrialRemainingRequests: (type: 'chat' | 'generate') => {\n const usage = featureFlag.getEvaluation()?.trialUsage;\n if (!usage) return null;\n \n if (type === 'chat') {\n return Math.max(0, usage.chatRequestsLimit - usage.chatRequestsUsed);\n } else {\n return Math.max(0, usage.generateRequestsLimit - usage.generateRequestsUsed);\n }\n },\n \n // Management\n updateTier: (tier: SubscriptionTier) => featureFlag.updateTier(tier),\n refreshFeatures: () => featureFlag.refreshEvaluation(),\n \n // Full evaluation access\n getFullEvaluation: () => featureFlag.getEvaluation(),\n };\n};\n\n/**\n * Hook specifically for checking if features should be shown in UI\n */\nexport const useFeatureVisibility = () => {\n const features = useFeatures();\n \n return {\n // UI visibility helpers\n showMemoryToggle: () => features.hasMemory() || features.isOSSMode(),\n showDocumentUpload: () => features.hasDocumentKnowledge() || features.isOSSMode(),\n showMoodSettings: () => features.hasMoodAdaptation() || features.isOSSMode(),\n showSuggestions: () => features.hasChatSuggestions() || features.isOSSMode(),\n showVoiceControls: () => (features.hasTTS() || features.hasSTT()) || features.isOSSMode(),\n showAdminPanel: () => features.hasAdminDashboard() || features.isAdmin(),\n showLimitedAdminPanel: () => features.hasLimitedAdminDashboard() || features.isOSSMode(),\n showAdvancedSearch: () => features.hasPremiumSearch() || features.isOSSMode(),\n \n // Upgrade prompts\n shouldShowUpgradePrompt: (feature: FeatureKey) => {\n return !features.isOSSMode() && !features.isAdmin() && !features.hasFeature(feature);\n },\n \n getUpgradeMessage: (feature: FeatureKey) => {\n const tier = features.needsUpgrade(feature);\n if (!tier) return null;\n \n const featureNames: Record<FeatureKey, string> = {\n memory: 'Conversation Memory',\n documentKnowledge: 'Document Knowledge',\n moodAdaptation: 'Mood Adaptation',\n chatSuggestions: 'Chat Suggestions',\n tts: 'Text-to-Speech',\n stt: 'Speech-to-Text',\n adminDashboardEnabled: 'Admin Dashboard',\n limitedAdminDashboard: 'Limited Admin Dashboard',\n semanticSearchSimple: 'Simple Search',\n semanticSearchPremium: 'Premium Search',\n advancedSearch: 'Advanced Vector Search',\n advancedMemories: 'Advanced Vector Memories'\n };\n \n return `${featureNames[feature]} requires ${tier} subscription`;\n }\n };\n};\n\nexport default useFeatures;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-717C-59E71E\nconst __banditFingerprint_contexts_FeatureFlagContexttsx = 'BL-FP-0AB63F-9820';\nconst __auditTrail_contexts_FeatureFlagContexttsx = 'BL-AU-MGOIKVVB-PUH9';\n// File: FeatureFlagContext.tsx | Path: src/contexts/FeatureFlagContext.tsx | Hash: 717c9820\n\nimport React, { createContext, useContext, useEffect, useState, useCallback } from 'react';\nimport {\n FeatureFlagConfig,\n FeatureKey,\n FeatureMatrix,\n FeatureEvaluation,\n SubscriptionTier,\n TrialUsage,\n DEFAULT_TIER_FEATURES,\n OSS_DEFAULT_FEATURES,\n JWTPayload\n} from '../types/featureFlags';\nimport { debugLogger } from '../services/logging/debugLogger';\n\n/**\n * Context value interface\n */\nexport interface FeatureFlagContextValue {\n /** Check if a specific feature is enabled */\n hasFeature: (feature: FeatureKey) => boolean;\n \n /** Get the current feature evaluation */\n getEvaluation: () => FeatureEvaluation | null;\n \n /** Refresh feature evaluation (useful after login/logout) */\n refreshEvaluation: () => void;\n \n /** Check if user is admin */\n isAdmin: () => boolean;\n \n /** Get current tier */\n getCurrentTier: () => SubscriptionTier | 'oss';\n \n /** Update subscription tier dynamically */\n updateTier: (tier: SubscriptionTier) => void;\n \n /** Check if we're in OSS mode */\n isOSSMode: () => boolean;\n}\n\nexport const FeatureFlagContext = createContext<FeatureFlagContextValue | undefined>(undefined);\n\n/**\n * Props for the FeatureFlagProvider\n */\nexport interface FeatureFlagProviderProps {\n config: FeatureFlagConfig;\n children: React.ReactNode;\n}\n\n/**\n * JWT decoding utility (simple base64 decode)\n */\nfunction decodeJWT(token: string): JWTPayload | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n \n const payload = parts[1];\n const decoded = atob(payload.replace(/-/g, '+').replace(/_/g, '/'));\n return JSON.parse(decoded);\n } catch (error) {\n debugLogger.error('Failed to decode JWT:', { error });\n return null;\n }\n}\n\n/**\n * Check if JWT is expired\n */\nfunction isJWTExpired(payload: JWTPayload): boolean {\n if (!payload.exp) return false;\n return Date.now() >= payload.exp * 1000;\n}\n\nconst coerceNumber = (value: unknown, fallback: number): number => {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return fallback;\n};\n\nconst coerceBoolean = (value: unknown, fallback: boolean): boolean => {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n return value.toLowerCase() === 'true';\n }\n if (typeof value === 'number') {\n return value !== 0;\n }\n return fallback;\n};\n\n/**\n * Feature Flag Provider Component\n */\nexport const FeatureFlagProvider: React.FC<FeatureFlagProviderProps> = ({ config, children }) => {\n const [evaluation, setEvaluation] = useState<FeatureEvaluation | null>(null);\n const [currentTier, setCurrentTier] = useState<SubscriptionTier | undefined>(config.subscriptionType);\n\n /**\n * Evaluate features based on JWT, tier, and config\n */\n const evaluateFeatures = useCallback((): FeatureEvaluation => {\n const {\n subscriptionType,\n rolesClaimKey = 'roles',\n subscriptionTypeClaimKey = 'subscriptionType',\n isSubscribedClaimKey = 'isSubscribed',\n jwtStorageKey = 'bandit-jwt',\n featureMatrix = {},\n adminRole = 'admin',\n debug = false\n } = config;\n\n let jwtFound = false;\n let jwtValid = false;\n let rolesExtracted: string[] = [];\n let isAdmin = false;\n let jwtSubscriptionType: SubscriptionTier | undefined;\n let jwtIsSubscribed: boolean = true; // Default to true for non-trial users\n let jwtTrialUsage: TrialUsage | undefined;\n let effectiveTier: SubscriptionTier | 'oss' = currentTier || subscriptionType || 'oss';\n\n // Try to get JWT from localStorage\n if (typeof window !== 'undefined') {\n try {\n const token = localStorage.getItem(jwtStorageKey);\n if (token) {\n jwtFound = true;\n const payload = decodeJWT(token);\n \n if (payload && !isJWTExpired(payload)) {\n jwtValid = true;\n \n // Extract roles\n const roles = payload[rolesClaimKey];\n if (Array.isArray(roles)) {\n rolesExtracted = roles.filter((role): role is string => typeof role === 'string');\n isAdmin = rolesExtracted.includes(adminRole);\n }\n \n // Extract subscription information from JWT\n const jwtSubType = payload[subscriptionTypeClaimKey];\n if (typeof jwtSubType === 'string' && ['basic', 'premium', 'pro', 'team', 'trial', 'expired'].includes(jwtSubType)) {\n jwtSubscriptionType = jwtSubType as SubscriptionTier;\n effectiveTier = jwtSubscriptionType; // JWT overrides config\n }\n \n // Extract subscription status (important for trial users)\n if (Object.prototype.hasOwnProperty.call(payload, isSubscribedClaimKey)) {\n jwtIsSubscribed = coerceBoolean(payload[isSubscribedClaimKey], jwtIsSubscribed);\n }\n \n // Extract trial usage information for trial users\n if (jwtSubscriptionType === 'trial') {\n const chatRequestsUsedRaw = (payload as Record<string, unknown>).chatRequestsUsed ?? (payload as Record<string, unknown>).ChatRequestsUsed;\n const chatRequestsLimitRaw = (payload as Record<string, unknown>).chatRequestsLimit ?? (payload as Record<string, unknown>).ChatRequestsLimit;\n const generateRequestsUsedRaw = (payload as Record<string, unknown>).generateRequestsUsed ?? (payload as Record<string, unknown>).GenerateRequestsUsed;\n const generateRequestsLimitRaw = (payload as Record<string, unknown>).generateRequestsLimit ?? (payload as Record<string, unknown>).GenerateRequestsLimit;\n\n jwtTrialUsage = {\n chatRequestsUsed: coerceNumber(chatRequestsUsedRaw, 0),\n chatRequestsLimit: coerceNumber(chatRequestsLimitRaw, 40),\n generateRequestsUsed: coerceNumber(generateRequestsUsedRaw, 0),\n generateRequestsLimit: coerceNumber(generateRequestsLimitRaw, 1000)\n };\n }\n }\n }\n } catch (error) {\n if (debug) {\n debugLogger.error('Error processing JWT for feature flags:', { error });\n }\n }\n }\n\n // Determine final feature matrix\n let finalFeatures: FeatureMatrix;\n\n if (!subscriptionType && !currentTier && !jwtSubscriptionType) {\n // OSS mode - use provided matrix or defaults\n finalFeatures = { ...OSS_DEFAULT_FEATURES, ...featureMatrix };\n effectiveTier = 'oss';\n } else if (isAdmin) {\n // Admin gets everything\n finalFeatures = { ...OSS_DEFAULT_FEATURES };\n } else {\n // Use tier-based features with manual overrides\n // Note: Trial users get pro-level features but have API-enforced request limits\n const tierFeatures = effectiveTier !== 'oss' \n ? DEFAULT_TIER_FEATURES[effectiveTier as SubscriptionTier] \n : OSS_DEFAULT_FEATURES;\n finalFeatures = { ...tierFeatures, ...featureMatrix };\n }\n\n const result: FeatureEvaluation = {\n tier: effectiveTier,\n isAdmin,\n isSubscribed: jwtIsSubscribed,\n trialUsage: jwtTrialUsage,\n features: finalFeatures,\n metadata: {\n jwtFound,\n jwtValid,\n rolesExtracted,\n subscriptionTypeFromJWT: jwtSubscriptionType,\n isSubscribedFromJWT: jwtIsSubscribed,\n trialUsageFromJWT: jwtTrialUsage,\n evaluatedAt: Date.now()\n }\n };\n\n if (debug) {\n debugLogger.info('Feature flag evaluation:', result);\n }\n\n return result;\n }, [config, currentTier]);\n\n /**\n * Refresh evaluation\n */\n const refreshEvaluation = useCallback(() => {\n const newEvaluation = evaluateFeatures();\n setEvaluation(newEvaluation);\n }, [evaluateFeatures]);\n\n /**\n * Initial evaluation and periodic refresh\n */\n useEffect(() => {\n refreshEvaluation();\n\n // Listen for storage changes (login/logout in other tabs)\n const handleStorageChange = (e: StorageEvent) => {\n if (e.key === config.jwtStorageKey || e.key === null) {\n refreshEvaluation();\n }\n };\n\n // Listen for external tier updates\n const handleTierUpdate = (e: CustomEvent) => {\n if (e.detail?.tier) {\n setCurrentTier(e.detail.tier);\n }\n };\n\n window.addEventListener('storage', handleStorageChange);\n window.addEventListener('bandit:tier-updated', handleTierUpdate as EventListener);\n \n return () => {\n window.removeEventListener('storage', handleStorageChange);\n window.removeEventListener('bandit:tier-updated', handleTierUpdate as EventListener);\n };\n }, [refreshEvaluation, config.jwtStorageKey]);\n\n /**\n * Context value\n */\n const contextValue: FeatureFlagContextValue = {\n hasFeature: (feature: FeatureKey) => {\n return evaluation?.features[feature] ?? false;\n },\n \n getEvaluation: () => evaluation,\n \n refreshEvaluation,\n \n isAdmin: () => evaluation?.isAdmin ?? false,\n \n getCurrentTier: () => evaluation?.tier ?? 'oss',\n \n updateTier: (tier: SubscriptionTier) => {\n setCurrentTier(tier);\n },\n \n isOSSMode: () => {\n if (!evaluation) {\n return true;\n }\n return evaluation.tier === 'oss';\n }\n };\n\n return (\n <FeatureFlagContext.Provider value={contextValue}>\n {children}\n </FeatureFlagContext.Provider>\n );\n};\n\n/**\n * Hook to use feature flags\n */\nexport const useFeatureFlag = (): FeatureFlagContextValue => {\n const context = useContext(FeatureFlagContext);\n if (context === undefined) {\n throw new Error('useFeatureFlag must be used within a FeatureFlagProvider');\n }\n return context;\n};\n\nexport default FeatureFlagProvider;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-D01A-03DF7F\nconst __banditFingerprint_types_featureFlagsts = 'BL-FP-1B5BAB-D379';\nconst __auditTrail_types_featureFlagsts = 'BL-AU-MGOIKVW9-TDZP';\n// File: featureFlags.ts | Path: src/types/featureFlags.ts | Hash: d01ad379\n\n/**\n * Subscription tiers available in the system\n */\nexport type SubscriptionTier = 'basic' | 'premium' | 'pro' | 'team' | 'trial' | 'expired';\n\n/**\n * Available feature keys that can be toggled\n */\nexport type FeatureKey = \n | 'memory'\n | 'documentKnowledge'\n | 'moodAdaptation'\n | 'chatSuggestions'\n | 'tts'\n | 'stt'\n | 'adminDashboardEnabled'\n | 'limitedAdminDashboard'\n | 'semanticSearchSimple'\n | 'semanticSearchPremium'\n | 'advancedSearch' // Vector DB-based search for pro/team\n | 'advancedMemories'; // Vector DB-based memories for pro/team\n\n/**\n * Feature matrix defining which features are enabled/disabled\n */\nexport type FeatureMatrix = Partial<Record<FeatureKey, boolean>>;\n\n/**\n * Feature flag configuration interface\n */\nexport interface FeatureFlagConfig {\n /** Current subscription tier - if not provided, assumes OSS mode */\n subscriptionType?: SubscriptionTier;\n \n /** JWT claim key to extract roles from (default: 'roles') */\n rolesClaimKey?: string;\n \n /** JWT claim key to extract subscription type from (default: 'subscriptionType') */\n subscriptionTypeClaimKey?: string;\n \n /** JWT claim key to check if subscription is active (default: 'isSubscribed') */\n isSubscribedClaimKey?: string;\n \n /** LocalStorage key where JWT is stored (default: 'bandit-jwt') */\n jwtStorageKey?: string;\n \n /** Manual feature overrides - takes precedence in OSS mode */\n featureMatrix?: FeatureMatrix;\n \n /** Admin role name that grants full access (default: 'admin') */\n adminRole?: string;\n \n /** Enable debug logging for feature evaluation */\n debug?: boolean;\n}\n\n/**\n * Default feature matrices for each subscription tier\n */\nexport const DEFAULT_TIER_FEATURES: Record<SubscriptionTier, FeatureMatrix> = {\n basic: {\n memory: true,\n documentKnowledge: false,\n moodAdaptation: false,\n chatSuggestions: true,\n tts: false,\n stt: false,\n adminDashboardEnabled: false,\n limitedAdminDashboard: false,\n semanticSearchSimple: true,\n semanticSearchPremium: false,\n advancedSearch: false, // No advanced features for basic\n advancedMemories: false, // No advanced features for basic\n },\n premium: {\n memory: true,\n documentKnowledge: true,\n moodAdaptation: true,\n chatSuggestions: true,\n tts: true,\n stt: true,\n adminDashboardEnabled: false,\n limitedAdminDashboard: true, // Premium gets limited admin access\n semanticSearchSimple: true,\n semanticSearchPremium: false, // No premium search for limited admin\n advancedSearch: false, // No vector DB search yet\n advancedMemories: false, // No vector DB memories yet\n },\n pro: {\n memory: true,\n documentKnowledge: true,\n moodAdaptation: true,\n chatSuggestions: true,\n tts: true,\n stt: true,\n adminDashboardEnabled: false,\n limitedAdminDashboard: true,\n semanticSearchSimple: true,\n semanticSearchPremium: true,\n advancedSearch: true, // Pro gets vector DB search\n advancedMemories: true, // Pro gets vector DB memories\n },\n team: {\n memory: true,\n documentKnowledge: true,\n moodAdaptation: true,\n chatSuggestions: true,\n tts: true,\n stt: true,\n adminDashboardEnabled: true, // Full admin access\n limitedAdminDashboard: true,\n semanticSearchSimple: true,\n semanticSearchPremium: true,\n advancedSearch: true, // Team gets vector DB search\n advancedMemories: true, // Team gets vector DB memories\n },\n trial: {\n memory: true,\n documentKnowledge: true,\n moodAdaptation: true,\n chatSuggestions: true,\n tts: true,\n stt: true,\n adminDashboardEnabled: false,\n limitedAdminDashboard: true, // Trial gets limited admin like pro\n semanticSearchSimple: true,\n semanticSearchPremium: true, // Trial gets pro-level search\n advancedSearch: true, // Trial gets pro-level features\n advancedMemories: true, // Trial gets pro-level features\n },\n expired: {\n memory: false,\n documentKnowledge: false,\n moodAdaptation: false,\n chatSuggestions: false,\n tts: false,\n stt: false,\n adminDashboardEnabled: false,\n limitedAdminDashboard: false,\n semanticSearchSimple: false,\n semanticSearchPremium: false, // Expired users get no features\n advancedSearch: false, // No advanced features\n advancedMemories: false, // No advanced features\n }\n};\n\n/**\n * Open source mode - all features available by default\n */\nexport const OSS_DEFAULT_FEATURES: FeatureMatrix = {\n memory: true,\n documentKnowledge: true,\n moodAdaptation: true,\n chatSuggestions: true,\n tts: true,\n stt: true,\n adminDashboardEnabled: true,\n limitedAdminDashboard: true,\n semanticSearchSimple: true,\n semanticSearchPremium: true,\n advancedSearch: true, // OSS gets all features\n advancedMemories: true, // OSS gets all features\n};\n\n/**\n * JWT payload interface for role extraction\n */\nexport interface JWTPayload extends Record<string, unknown> {\n exp?: number;\n iat?: number;\n}\n\n/**\n * Trial usage information from JWT\n */\nexport interface TrialUsage {\n chatRequestsUsed: number;\n chatRequestsLimit: number;\n generateRequestsUsed: number;\n generateRequestsLimit: number;\n}\n\n/**\n * Feature evaluation result\n */\nexport interface FeatureEvaluation {\n /** Current subscription tier (or 'oss' for open source mode) */\n tier: SubscriptionTier | 'oss';\n \n /** Whether the user has admin role */\n isAdmin: boolean;\n \n /** Whether the user's subscription is active (false for trial users) */\n isSubscribed: boolean;\n \n /** Trial usage limits (only present for trial users) */\n trialUsage?: TrialUsage;\n \n /** Final computed feature matrix */\n features: FeatureMatrix;\n \n /** Evaluation metadata */\n metadata: {\n jwtFound: boolean;\n jwtValid: boolean;\n rolesExtracted: string[];\n subscriptionTypeFromJWT?: SubscriptionTier;\n isSubscribedFromJWT?: boolean;\n trialUsageFromJWT?: TrialUsage;\n evaluatedAt: number;\n };\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-50BC-1F9568\nconst __banditFingerprint_store_conversationSyncStorets = 'BL-FP-E5217A-A962';\nconst __auditTrail_store_conversationSyncStorets = 'BL-AU-MGOIKVW4-TH1T';\n// File: conversationSyncStore.ts | Path: src/store/conversationSyncStore.ts | Hash: 50bca962\n\nimport { create } from \"zustand\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { useConversationStore, Conversation } from \"./conversationStore\";\nimport { useProjectStore, Project } from \"./projectStore\";\nimport { usePackageSettingsStore } from \"./packageSettingsStore\";\nimport { authenticationService } from \"../services/auth/authenticationService\";\nimport {\n CONVERSATION_DELETE_EVENT,\n CONVERSATION_UPSERT_EVENT,\n PROJECT_DELETE_EVENT,\n PROJECT_UPSERT_EVENT,\n} from \"./conversationSyncEvents\";\nimport {\n ConversationRecordDTO,\n ConversationSyncPreferenceDTO,\n ConversationSyncRequest,\n ConversationSyncResponse,\n ConversationTurnDTO,\n ProjectRecordDTO,\n fetchConversationSyncPreference,\n syncConversations,\n updateConversationSyncPreference,\n} from \"../services/conversationSync/conversationSyncService\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\n\nconst DEVICE_STORAGE_KEY = \"banditConversationDeviceId\";\nconst PAYLOAD_VERSION = 1;\nconst MAX_CONVERSATION_BYTES = 12 * 1024 * 1024; // ~12 MB cloud cap\nconst WARN_CONVERSATION_BYTES = 10 * 1024 * 1024; // warn at ~10 MB\n\nlet suppressTracking = false;\nlet conversationsMeta = new Map<string, ConversationMeta>();\nlet projectsMeta = new Map<string, ProjectMeta>();\nlet conversationUnsubscribe: (() => void) | null = null;\nlet projectUnsubscribe: (() => void) | null = null;\nlet autoSyncTimeout: ReturnType<typeof setTimeout> | null = null;\n\nconst AUTO_SYNC_DELAY_MS = 4_000;\n\ntype ConversationStoreState = ReturnType<typeof useConversationStore.getState>;\ntype ProjectStoreState = ReturnType<typeof useProjectStore.getState>;\n\ninterface ConversationMeta {\n updatedAtMs: number;\n version?: number;\n historyLength: number;\n}\n\ninterface ProjectMeta {\n updatedAtMs: number;\n version?: number;\n order: number;\n}\n\ninterface ConversationSizeNotice {\n id: string;\n name: string;\n sizeBytes: number;\n limitBytes: number;\n}\n\nexport type ConversationSyncStatus = \"disabled\" | \"idle\" | \"syncing\" | \"error\";\n\nexport interface ConversationSyncState {\n initialized: boolean;\n syncEnabled: boolean;\n status: ConversationSyncStatus;\n lastSyncAt?: string | null;\n cursor?: string | null;\n lastError?: string | null;\n keepLocalOnly?: boolean;\n isAdvancedVectorFeaturesEnabled: boolean;\n conflicts: ConversationSyncResponse[\"conflicts\"] | null;\n deviceId: string;\n pendingConversationUpserts: Set<string>;\n pendingConversationDeletes: Set<string>;\n pendingProjectUpserts: Set<string>;\n pendingProjectDeletes: Set<string>;\n totalConversationsOnServer?: number;\n totalProjectsOnServer?: number;\n hasCompletedInitialUpload: boolean;\n warningConversations: ConversationSizeNotice[];\n oversizedConversations: ConversationSizeNotice[];\n initialize: () => Promise<void>;\n setSyncEnabled: (enabled: boolean) => Promise<void>;\n setAdvancedVectorFeaturesEnabled: (enabled: boolean) => Promise<void>;\n runSync: (options?: { force?: boolean }) => Promise<void>;\n registerError: (error: string) => void;\n clearConflicts: () => void;\n}\n\nfunction ensureDeviceId(): string {\n if (typeof window === \"undefined\") {\n return \"bandit-web\";\n }\n try {\n const existing = window.localStorage.getItem(DEVICE_STORAGE_KEY);\n if (existing) {\n return existing;\n }\n const generated = uuidv4();\n window.localStorage.setItem(DEVICE_STORAGE_KEY, generated);\n return generated;\n } catch (error) {\n debugLogger.warn(\"conversationSyncStore: unable to access localStorage, generating volatile device id\", { error });\n return uuidv4();\n }\n}\n\nfunction mapConversationToDTO(conversation: Conversation): ConversationRecordDTO {\n const updatedAtIso = (conversation.updatedAt ?? new Date()).toISOString();\n const createdAtIso = conversation.createdAt ? conversation.createdAt.toISOString() : null;\n\n const history = conversation.history.map((entry, index) => {\n const turn: ConversationTurnDTO = {\n id: entry.id ?? `${conversation.id}-turn-${index}`,\n question: entry.question,\n answer: entry.answer,\n memoryUpdated: entry.memoryUpdated,\n cancelled: entry.cancelled,\n };\n\n if (entry.sourceFiles?.length) {\n turn.sourceFiles = entry.sourceFiles.map((doc) => ({\n id: doc.id,\n name: doc.name,\n }));\n }\n\n return turn;\n });\n\n return {\n id: conversation.id,\n name: conversation.name,\n model: conversation.model,\n projectId: conversation.projectId ?? null,\n history,\n summary: conversation.summary,\n tags: conversation.tags,\n metadata: conversation.metadata,\n createdAt: createdAtIso,\n updatedAt: updatedAtIso,\n version: conversation.version ?? 0,\n updatedBy: conversation.updatedBy,\n deletedAt: conversation.deletedAt ?? null,\n summaryStatus: conversation.summaryStatus,\n summaryGeneratedAt: conversation.summaryGeneratedAt ? conversation.summaryGeneratedAt.toISOString() : undefined,\n } as ConversationRecordDTO;\n}\n\nfunction mapProjectToDTO(project: Project): ProjectRecordDTO {\n const updatedAtIso = project.updatedAt?.toISOString() ?? new Date().toISOString();\n const createdAtIso = project.createdAt?.toISOString() ?? null;\n\n return {\n id: project.id,\n name: project.name,\n description: project.description,\n color: project.color,\n order: project.order,\n conversationCount: project.conversationCount,\n lastActivityAt: project.lastActivityAt ? project.lastActivityAt.toISOString() : undefined,\n summary: project.summary,\n metadata: project.metadata,\n createdAt: createdAtIso,\n updatedAt: updatedAtIso,\n version: project.version ?? 0,\n updatedBy: project.updatedBy,\n deletedAt: project.deletedAt ?? null,\n } as ProjectRecordDTO;\n}\n\nfunction mapConversationFromDTO(dto: ConversationRecordDTO): Conversation {\n return {\n id: dto.id,\n name: dto.name,\n model: dto.model,\n projectId: dto.projectId ?? undefined,\n history: dto.history.map((turn) => ({\n question: turn.question,\n answer: turn.answer,\n sourceFiles: turn.sourceFiles?.map((doc) => ({\n id: doc.id,\n name: doc.name ?? \"\",\n content: \"\",\n })),\n memoryUpdated: turn.memoryUpdated,\n cancelled: turn.cancelled,\n })),\n summary: dto.summary ?? undefined,\n tags: dto.tags ?? undefined,\n metadata: dto.metadata ?? undefined,\n createdAt: dto.createdAt ? new Date(dto.createdAt) : undefined,\n updatedAt: dto.updatedAt ? new Date(dto.updatedAt) : undefined,\n version: dto.version,\n updatedBy: dto.updatedBy,\n deletedAt: dto.deletedAt ?? undefined,\n summaryStatus: dto.summaryStatus,\n summaryGeneratedAt: dto.summaryGeneratedAt ? new Date(dto.summaryGeneratedAt) : undefined,\n } as Conversation;\n}\n\nfunction mapProjectFromDTO(dto: ProjectRecordDTO): Project {\n return {\n id: dto.id,\n name: dto.name,\n description: dto.description,\n color: dto.color,\n order: dto.order,\n createdAt: dto.createdAt ? new Date(dto.createdAt) : new Date(),\n updatedAt: dto.updatedAt ? new Date(dto.updatedAt) : new Date(),\n conversationCount: dto.conversationCount,\n lastActivityAt: dto.lastActivityAt ? new Date(dto.lastActivityAt) : undefined,\n summary: dto.summary ?? undefined,\n metadata: dto.metadata ?? undefined,\n version: dto.version,\n updatedBy: dto.updatedBy,\n deletedAt: dto.deletedAt ?? undefined,\n } as Project;\n}\n\nasync function waitForInitialHydration(): Promise<void> {\n const ready = () =>\n useConversationStore.getState()._hasHydrated &&\n useProjectStore.getState()._hasHydrated;\n\n if (ready()) {\n debugLogger.debug('conversationSyncStore: hydration already complete');\n return;\n }\n\n await new Promise<void>((resolve) => {\n const checkAndResolve = () => {\n if (ready()) {\n unsubscribeConversation();\n unsubscribeProject();\n debugLogger.debug('conversationSyncStore: hydration complete (async wait)');\n resolve();\n }\n };\n\n const unsubscribeConversation = useConversationStore.subscribe((state, prevState) => {\n if (state._hasHydrated !== prevState._hasHydrated) {\n checkAndResolve();\n }\n });\n\n const unsubscribeProject = useProjectStore.subscribe((state, prevState) => {\n if (state._hasHydrated !== prevState._hasHydrated) {\n checkAndResolve();\n }\n });\n\n debugLogger.debug('conversationSyncStore: waiting for stores hydration');\n checkAndResolve();\n });\n}\n\nfunction buildConversationMeta(conversation: Conversation): ConversationMeta {\n return {\n updatedAtMs: conversation.updatedAt ? conversation.updatedAt.getTime() : 0,\n version: conversation.version,\n historyLength: conversation.history.length,\n };\n}\n\nfunction buildProjectMeta(project: Project): ProjectMeta {\n return {\n updatedAtMs: project.updatedAt ? project.updatedAt.getTime() : 0,\n version: project.version,\n order: project.order,\n };\n}\n\nfunction snapshotConversationMetaMap(conversations: Conversation[]): Map<string, ConversationMeta> {\n return new Map(\n conversations.map((conversation): [string, ConversationMeta] => [\n conversation.id,\n buildConversationMeta(conversation),\n ])\n );\n}\n\nfunction snapshotProjectMetaMap(projects: Project[]): Map<string, ProjectMeta> {\n return new Map(\n projects.map((project): [string, ProjectMeta] => [\n project.id,\n buildProjectMeta(project),\n ])\n );\n}\n\nfunction ensureTrackersInitialized() {\n if (!conversationUnsubscribe) {\n const initialState = useConversationStore.getState();\n conversationsMeta = snapshotConversationMetaMap(initialState.conversations);\n\n const handleConversationChange = (\n state: ConversationStoreState,\n _prevState: ConversationStoreState\n ) => {\n const conversations = state.conversations;\n debugLogger.debug('conversationSyncStore: conversation store changed', { count: conversations.length });\n\n if (!state._hasHydrated) {\n conversationsMeta = snapshotConversationMetaMap(conversations);\n return;\n }\n\n if (suppressTracking) {\n conversationsMeta = snapshotConversationMetaMap(conversations);\n return;\n }\n\n const nextMeta = snapshotConversationMetaMap(conversations);\n for (const conversation of conversations) {\n const previous = conversationsMeta.get(conversation.id);\n const updatedAtMs = conversation.updatedAt ? conversation.updatedAt.getTime() : 0;\n\n if (!previous) {\n debugLogger.debug('conversationSyncStore: detected new conversation', { id: conversation.id });\n queueConversationUpsert(conversation.id);\n continue;\n }\n\n if (\n previous.updatedAtMs !== updatedAtMs ||\n previous.version !== conversation.version ||\n previous.historyLength !== conversation.history.length\n ) {\n debugLogger.debug('conversationSyncStore: detected conversation change', { id: conversation.id });\n queueConversationUpsert(conversation.id);\n }\n }\n\n for (const id of conversationsMeta.keys()) {\n if (!nextMeta.has(id)) {\n debugLogger.debug('conversationSyncStore: detected conversation removal', { id });\n queueConversationDelete(id);\n }\n }\n\n conversationsMeta = nextMeta;\n };\n\n conversationUnsubscribe = useConversationStore.subscribe(handleConversationChange);\n handleConversationChange(initialState, initialState);\n }\n\n if (!projectUnsubscribe) {\n const initialState = useProjectStore.getState();\n projectsMeta = snapshotProjectMetaMap(initialState.projects);\n\n const handleProjectChange = (state: ProjectStoreState, _prevState: ProjectStoreState) => {\n const projects = state.projects;\n debugLogger.debug('conversationSyncStore: project store changed', { count: projects.length });\n\n if (!state._hasHydrated) {\n projectsMeta = snapshotProjectMetaMap(projects);\n return;\n }\n\n if (suppressTracking) {\n projectsMeta = snapshotProjectMetaMap(projects);\n return;\n }\n\n const nextMeta = snapshotProjectMetaMap(projects);\n for (const project of projects) {\n const previous = projectsMeta.get(project.id);\n const updatedAtMs = project.updatedAt ? project.updatedAt.getTime() : 0;\n\n if (!previous) {\n debugLogger.debug('conversationSyncStore: detected new project', { id: project.id });\n queueProjectUpsert(project.id);\n continue;\n }\n\n if (\n previous.updatedAtMs !== updatedAtMs ||\n previous.version !== project.version ||\n previous.order !== project.order\n ) {\n debugLogger.debug('conversationSyncStore: detected project change', { id: project.id });\n queueProjectUpsert(project.id);\n }\n }\n\n for (const id of projectsMeta.keys()) {\n if (!nextMeta.has(id)) {\n debugLogger.debug('conversationSyncStore: detected project removal', { id });\n queueProjectDelete(id);\n }\n }\n\n projectsMeta = nextMeta;\n };\n\n projectUnsubscribe = useProjectStore.subscribe(handleProjectChange);\n handleProjectChange(initialState, initialState);\n }\n}\n\nif (typeof window !== 'undefined') {\n window.addEventListener(CONVERSATION_UPSERT_EVENT, (event) => {\n const id = (event as CustomEvent<string>).detail;\n if (id && !suppressTracking) {\n queueConversationUpsert(id);\n }\n });\n\n window.addEventListener(CONVERSATION_DELETE_EVENT, (event) => {\n const id = (event as CustomEvent<string>).detail;\n if (id && !suppressTracking) {\n queueConversationDelete(id);\n }\n });\n\n window.addEventListener(PROJECT_UPSERT_EVENT, (event) => {\n const id = (event as CustomEvent<string>).detail;\n if (id && !suppressTracking) {\n queueProjectUpsert(id);\n }\n });\n\n window.addEventListener(PROJECT_DELETE_EVENT, (event) => {\n const id = (event as CustomEvent<string>).detail;\n if (id && !suppressTracking) {\n queueProjectDelete(id);\n }\n });\n}\n\nexport function flagConversationUpsert(id: string) {\n queueConversationUpsert(id);\n}\n\nexport function flagConversationDelete(id: string) {\n queueConversationDelete(id);\n}\n\nexport function flagProjectUpsert(id: string) {\n queueProjectUpsert(id);\n}\n\nexport function flagProjectDelete(id: string) {\n queueProjectDelete(id);\n}\n\nfunction queueConversationUpsert(id: string) {\n useConversationSyncStore.setState((state) => {\n const upserts = new Set(state.pendingConversationUpserts);\n const deletes = new Set(state.pendingConversationDeletes);\n deletes.delete(id);\n upserts.add(id);\n debugLogger.info('conversationSyncStore: queued conversation upsert', { id });\n return { pendingConversationUpserts: upserts, pendingConversationDeletes: deletes };\n });\n scheduleAutoSync();\n}\n\nfunction queueConversationDelete(id: string) {\n useConversationSyncStore.setState((state) => {\n const upserts = new Set(state.pendingConversationUpserts);\n const deletes = new Set(state.pendingConversationDeletes);\n upserts.delete(id);\n deletes.add(id);\n debugLogger.info('conversationSyncStore: queued conversation delete', { id });\n return { pendingConversationUpserts: upserts, pendingConversationDeletes: deletes };\n });\n scheduleAutoSync(true);\n}\n\nfunction queueProjectUpsert(id: string) {\n useConversationSyncStore.setState((state) => {\n const upserts = new Set(state.pendingProjectUpserts);\n const deletes = new Set(state.pendingProjectDeletes);\n deletes.delete(id);\n upserts.add(id);\n debugLogger.info('conversationSyncStore: queued project upsert', { id });\n return { pendingProjectUpserts: upserts, pendingProjectDeletes: deletes };\n });\n scheduleAutoSync();\n}\n\nfunction queueProjectDelete(id: string) {\n useConversationSyncStore.setState((state) => {\n const upserts = new Set(state.pendingProjectUpserts);\n const deletes = new Set(state.pendingProjectDeletes);\n upserts.delete(id);\n deletes.add(id);\n debugLogger.info('conversationSyncStore: queued project delete', { id });\n return { pendingProjectUpserts: upserts, pendingProjectDeletes: deletes };\n });\n scheduleAutoSync(true);\n}\n\nfunction scheduleAutoSync(prioritize = false) {\n const { syncEnabled, status } = useConversationSyncStore.getState();\n if (!syncEnabled) {\n return;\n }\n\n const delay = prioritize ? Math.min(1_000, AUTO_SYNC_DELAY_MS) : AUTO_SYNC_DELAY_MS;\n\n if (autoSyncTimeout) {\n clearTimeout(autoSyncTimeout);\n }\n\n if (status === 'syncing') {\n // Wait until current sync finishes; we'll schedule a follow-up once status changes\n autoSyncTimeout = setTimeout(() => scheduleAutoSync(prioritize), delay);\n return;\n }\n\n autoSyncTimeout = setTimeout(() => {\n autoSyncTimeout = null;\n useConversationSyncStore\n .getState()\n .runSync()\n .catch((error) => {\n debugLogger.error('conversationSyncStore: auto sync failed', { error });\n });\n }, delay);\n}\n\nasync function applyServerResults(response: ConversationSyncResponse) {\n const conversationUpserts = response.conversations.upserts.map(mapConversationFromDTO);\n const projectUpserts = response.projects.upserts.map(mapProjectFromDTO);\n\n suppressTracking = true;\n try {\n if (projectUpserts.length > 0) {\n await useProjectStore.getState().applyRemoteProjects(projectUpserts);\n projectsMeta = new Map(\n useProjectStore.getState().projects.map((project) => [project.id, buildProjectMeta(project)])\n );\n }\n\n if (conversationUpserts.length > 0) {\n await useConversationStore.getState().applyRemoteConversations(conversationUpserts);\n conversationsMeta = new Map(\n useConversationStore.getState().conversations.map((conversation) => [conversation.id, buildConversationMeta(conversation)])\n );\n }\n\n if (response.projects.deletes.length > 0) {\n await useProjectStore.getState().removeProjectsByIds(response.projects.deletes);\n projectsMeta = new Map(\n useProjectStore.getState().projects.map((project) => [project.id, buildProjectMeta(project)])\n );\n }\n\n if (response.conversations.deletes.length > 0) {\n await useConversationStore.getState().removeConversationsByIds(response.conversations.deletes);\n conversationsMeta = new Map(\n useConversationStore.getState().conversations.map((conversation) => [conversation.id, buildConversationMeta(conversation)])\n );\n }\n } finally {\n suppressTracking = false;\n }\n}\n\nexport const useConversationSyncStore = create<ConversationSyncState>((set, get) => ({\n initialized: false,\n syncEnabled: false,\n status: \"disabled\",\n lastSyncAt: null,\n cursor: null,\n lastError: null,\n keepLocalOnly: false,\n isAdvancedVectorFeaturesEnabled: false,\n conflicts: null,\n deviceId: ensureDeviceId(),\n pendingConversationUpserts: new Set<string>(),\n pendingConversationDeletes: new Set<string>(),\n pendingProjectUpserts: new Set<string>(),\n pendingProjectDeletes: new Set<string>(),\n totalConversationsOnServer: undefined,\n totalProjectsOnServer: undefined,\n hasCompletedInitialUpload: false,\n warningConversations: [],\n oversizedConversations: [],\n\n async initialize() {\n if (get().initialized) {\n return;\n }\n\n ensureTrackersInitialized();\n\n const gatewayUrl = usePackageSettingsStore.getState().settings?.gatewayApiUrl;\n if (!gatewayUrl) {\n debugLogger.info(\"conversationSyncStore: gateway API URL not configured; sync disabled\");\n set({ initialized: true, status: \"disabled\", syncEnabled: false });\n return;\n }\n\n const token = authenticationService.getToken();\n if (!token) {\n debugLogger.info(\"conversationSyncStore: no authentication token; sync disabled until login\");\n set({ initialized: true, status: \"disabled\", syncEnabled: false });\n return;\n }\n\n try {\n await waitForInitialHydration();\n const preference = await fetchConversationSyncPreference();\n const { deviceId } = get();\n const isNewDevice = Boolean(\n preference.lastDeviceId && preference.lastDeviceId !== deviceId\n );\n\n if (isNewDevice) {\n debugLogger.info('conversationSyncStore: detected new device, resetting cursor for full hydration', {\n deviceId,\n lastDeviceId: preference.lastDeviceId,\n });\n }\n\n applyPreference(preference, set, get, {\n isNewDevice,\n override: {\n isAdvancedVectorFeaturesEnabled: get().isAdvancedVectorFeaturesEnabled,\n },\n });\n set({ initialized: true });\n if (preference.syncEnabled) {\n await get().runSync({ force: true });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to load conversation sync preference\";\n debugLogger.error(\"conversationSyncStore: initialization failed\", { error: message });\n set({ initialized: true, status: \"error\", lastError: message });\n }\n },\n\n async setSyncEnabled(enabled: boolean) {\n const state = get();\n const { deviceId, keepLocalOnly = false, isAdvancedVectorFeaturesEnabled } = state;\n try {\n const preference = await updateConversationSyncPreference({\n syncEnabled: enabled,\n deviceId,\n keepLocalOnly,\n isAdvancedVectorFeaturesEnabled,\n });\n const isNewDevice = Boolean(\n preference.lastDeviceId && preference.lastDeviceId !== deviceId\n );\n\n if (isNewDevice) {\n debugLogger.info('conversationSyncStore: preference updated from different device, forcing full hydration', {\n deviceId,\n lastDeviceId: preference.lastDeviceId,\n });\n }\n\n applyPreference(preference, set, get, {\n isNewDevice,\n override: {\n isAdvancedVectorFeaturesEnabled,\n },\n });\n if (enabled) {\n set({ hasCompletedInitialUpload: false });\n }\n if (preference.syncEnabled) {\n await get().runSync({ force: true });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to update sync preference\";\n debugLogger.error(\"conversationSyncStore: setSyncEnabled failed\", { error: message });\n set({ status: \"error\", lastError: message });\n }\n },\n\n async setAdvancedVectorFeaturesEnabled(enabled: boolean) {\n const state = get();\n const { deviceId, keepLocalOnly = false, syncEnabled } = state;\n try {\n const preference = await updateConversationSyncPreference({\n syncEnabled,\n deviceId,\n keepLocalOnly,\n isAdvancedVectorFeaturesEnabled: enabled,\n });\n\n const isNewDevice = Boolean(\n preference.lastDeviceId && preference.lastDeviceId !== deviceId\n );\n\n if (isNewDevice) {\n debugLogger.info('conversationSyncStore: preference updated from different device, forcing full hydration', {\n deviceId,\n lastDeviceId: preference.lastDeviceId,\n });\n }\n\n applyPreference(preference, set, get, {\n isNewDevice,\n override: {\n isAdvancedVectorFeaturesEnabled: enabled,\n },\n });\n if (preference.syncEnabled && preference.isAdvancedVectorFeaturesEnabled) {\n await get().runSync({ force: true });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to update advanced vector setting\";\n debugLogger.error(\"conversationSyncStore: setAdvancedVectorFeaturesEnabled failed\", { error: message });\n set({ status: \"error\", lastError: message });\n throw error;\n }\n },\n\n async runSync({ force = false } = {}) {\n await waitForInitialHydration();\n const stateBefore = get();\n debugLogger.info('conversationSyncStore: runSync invoked', {\n force,\n syncEnabled: stateBefore.syncEnabled,\n status: stateBefore.status,\n pendingConversationUpserts: stateBefore.pendingConversationUpserts.size,\n pendingConversationDeletes: stateBefore.pendingConversationDeletes.size,\n pendingProjectUpserts: stateBefore.pendingProjectUpserts.size,\n pendingProjectDeletes: stateBefore.pendingProjectDeletes.size,\n cursor: stateBefore.cursor,\n lastSyncAt: stateBefore.lastSyncAt,\n });\n const state = get();\n if (!state.syncEnabled && !force) {\n debugLogger.info('conversationSyncStore: runSync aborted - sync disabled and not forced');\n return;\n }\n if (state.status === \"syncing\") {\n debugLogger.debug('conversationSyncStore: runSync aborted - already syncing');\n return;\n }\n\n const gatewayUrl = usePackageSettingsStore.getState().settings?.gatewayApiUrl;\n if (!gatewayUrl) {\n set({ status: \"error\", lastError: \"Gateway API URL is not configured.\" });\n debugLogger.error('conversationSyncStore: runSync error - missing gateway URL');\n return;\n }\n\n const token = authenticationService.getToken();\n if (!token) {\n set({ status: \"error\", lastError: \"Authentication required to sync conversations.\" });\n debugLogger.error('conversationSyncStore: runSync error - missing auth token');\n return;\n }\n\n const pendingConversationIds = Array.from(state.pendingConversationUpserts);\n const pendingConversationDeleteIds = Array.from(state.pendingConversationDeletes);\n const pendingProjectIds = Array.from(state.pendingProjectUpserts);\n const pendingProjectDeleteIds = Array.from(state.pendingProjectDeletes);\n\n const conversationStore = useConversationStore.getState();\n const projectStore = useProjectStore.getState();\n\n const conversationCandidates = pendingConversationIds\n .map((id) => conversationStore.conversations.find((c) => c.id === id))\n .filter(Boolean) as Conversation[];\n\n let {\n allowed: conversationPayloads,\n warnings: warningConversations,\n oversized: oversizedConversations,\n } = analyzeConversations(conversationCandidates);\n\n let projectPayloads = pendingProjectIds\n .map((id) => projectStore.projects.find((p) => p.id === id))\n .filter(Boolean)\n .map((project) => mapProjectToDTO(project as Project));\n\n const isInitialSync = state.cursor == null;\n const shouldBootstrapSnapshot = !state.hasCompletedInitialUpload;\n\n const payloadDebug = {\n pendingConversationIds,\n pendingConversationDeleteIds,\n pendingProjectIds,\n pendingProjectDeleteIds,\n totalConversationsLocal: conversationStore.conversations.length,\n totalProjectsLocal: projectStore.projects.length,\n isInitialSync,\n shouldBootstrapSnapshot,\n };\n debugLogger.info('conversationSyncStore: preparing sync payload', payloadDebug);\n\n if (\n (isInitialSync || shouldBootstrapSnapshot) &&\n conversationPayloads.length === 0 &&\n pendingConversationDeleteIds.length === 0 &&\n projectPayloads.length === 0 &&\n pendingProjectDeleteIds.length === 0\n ) {\n const analysis = analyzeConversations(conversationStore.conversations);\n conversationPayloads = analysis.allowed;\n warningConversations = analysis.warnings;\n oversizedConversations = analysis.oversized;\n projectPayloads = projectStore.projects.map((project) => mapProjectToDTO(project));\n const bootInfo = {\n conversationCount: conversationPayloads.length,\n projectCount: projectPayloads.length,\n };\n debugLogger.info('conversationSyncStore: bootstrapping initial snapshot', bootInfo);\n }\n\n if (!force &&\n conversationPayloads.length === 0 &&\n pendingConversationDeleteIds.length === 0 &&\n projectPayloads.length === 0 &&\n pendingProjectDeleteIds.length === 0\n ) {\n // Nothing to push; still pull deltas if cursor exists\n if (!state.cursor) {\n debugLogger.debug('conversationSyncStore: runSync early exit - nothing to push and no cursor');\n set((current) => ({\n warningConversations,\n oversizedConversations,\n lastError: oversizedConversations.length ? buildOversizedMessage(oversizedConversations) : null,\n status: oversizedConversations.length ? 'error' : current.syncEnabled ? 'idle' : current.status,\n }));\n return;\n }\n }\n\n set({ status: \"syncing\", lastError: null });\n debugLogger.info('conversationSyncStore: issuing sync request', {\n conversationUpserts: conversationPayloads.length,\n conversationDeletes: pendingConversationDeleteIds.length,\n projectUpserts: projectPayloads.length,\n projectDeletes: pendingProjectDeleteIds.length,\n cursor: state.cursor,\n });\n\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const request: ConversationSyncRequest = {\n deviceId: state.deviceId,\n cursor: state.cursor ?? undefined,\n timezone,\n payloadVersion: PAYLOAD_VERSION,\n changes: {\n conversations: {\n upserts: conversationPayloads,\n deletes: pendingConversationDeleteIds,\n },\n projects: {\n upserts: projectPayloads,\n deletes: pendingProjectDeleteIds,\n },\n },\n };\n\n try {\n let response = await syncConversations(request);\n await applyServerResults(response);\n\n let nextCursor = response.nextCursor?.token ?? state.cursor ?? null;\n let totalConversations = response.conversations.totalCount;\n let totalProjects = response.projects.totalCount;\n let conflicts = response.conflicts;\n\n while (response.hasMore) {\n const followUpRequest: ConversationSyncRequest = {\n deviceId: state.deviceId,\n cursor: response.nextCursor?.token ?? nextCursor ?? undefined,\n timezone,\n payloadVersion: PAYLOAD_VERSION,\n changes: {\n conversations: { upserts: [], deletes: [] },\n projects: { upserts: [], deletes: [] },\n },\n };\n response = await syncConversations(followUpRequest);\n await applyServerResults(response);\n nextCursor = response.nextCursor?.token ?? nextCursor;\n totalConversations = response.conversations.totalCount;\n totalProjects = response.projects.totalCount;\n conflicts = {\n conversationConflicts: [\n ...conflicts.conversationConflicts,\n ...response.conflicts.conversationConflicts,\n ],\n projectConflicts: [\n ...conflicts.projectConflicts,\n ...response.conflicts.projectConflicts,\n ],\n };\n }\n\n const sentConversationIds = new Set(conversationPayloads.map((c) => c.id));\n const sentProjectIds = new Set(projectPayloads.map((p) => p.id));\n const sentConversationDeleteIds = new Set(pendingConversationDeleteIds);\n const sentProjectDeleteIds = new Set(pendingProjectDeleteIds);\n\n set((current) => {\n const nextConversationUpserts = new Set(current.pendingConversationUpserts);\n const nextConversationDeletes = new Set(current.pendingConversationDeletes);\n const nextProjectUpserts = new Set(current.pendingProjectUpserts);\n const nextProjectDeletes = new Set(current.pendingProjectDeletes);\n\n for (const id of sentConversationIds) {\n nextConversationUpserts.delete(id);\n }\n for (const id of sentConversationDeleteIds) {\n nextConversationDeletes.delete(id);\n }\n for (const id of sentProjectIds) {\n nextProjectUpserts.delete(id);\n }\n for (const id of sentProjectDeleteIds) {\n nextProjectDeletes.delete(id);\n }\n\n const hasOversized = oversizedConversations.length > 0;\n\n return {\n status: hasOversized ? \"error\" : current.syncEnabled ? \"idle\" : \"disabled\",\n cursor: nextCursor,\n lastSyncAt: new Date().toISOString(),\n conflicts,\n totalConversationsOnServer: totalConversations,\n totalProjectsOnServer: totalProjects,\n pendingConversationUpserts: nextConversationUpserts,\n pendingConversationDeletes: nextConversationDeletes,\n pendingProjectUpserts: nextProjectUpserts,\n pendingProjectDeletes: nextProjectDeletes,\n hasCompletedInitialUpload: true,\n warningConversations,\n oversizedConversations,\n lastError: hasOversized ? buildOversizedMessage(oversizedConversations) : null,\n };\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Conversation sync failed\";\n debugLogger.error(\"conversationSyncStore: runSync failed\", { error: message });\n set({ status: \"error\", lastError: message });\n }\n },\n\n registerError(error: string) {\n set({ status: \"error\", lastError: error });\n },\n\n clearConflicts() {\n set({ conflicts: null });\n },\n}));\n\nfunction applyPreference(\n preference: ConversationSyncPreferenceDTO,\n set: (partial: Partial<ConversationSyncState>) => void,\n getState: () => ConversationSyncState,\n options?: {\n isNewDevice?: boolean;\n override?: Partial<Pick<ConversationSyncState, 'isAdvancedVectorFeaturesEnabled'>>;\n }\n) {\n const isNewDevice = options?.isNewDevice ?? false;\n const current = getState();\n const override = options?.override ?? {};\n\n const preferenceVectorFlag = preference.isAdvancedVectorFeaturesEnabled;\n const overrideVectorFlag = override.isAdvancedVectorFeaturesEnabled;\n const resolvedVectorFlag =\n preferenceVectorFlag !== undefined\n ? preferenceVectorFlag\n : overrideVectorFlag !== undefined\n ? overrideVectorFlag\n : current.isAdvancedVectorFeaturesEnabled ?? false;\n\n set({\n syncEnabled: preference.syncEnabled,\n status: preference.syncEnabled ? \"idle\" : \"disabled\",\n lastSyncAt: isNewDevice ? null : preference.lastSyncAt ?? null,\n cursor: isNewDevice ? null : preference.cursor ?? null,\n keepLocalOnly: preference.keepLocalOnly,\n isAdvancedVectorFeaturesEnabled: resolvedVectorFlag,\n lastError: null,\n hasCompletedInitialUpload:\n preference.syncEnabled && preference.lastSyncAt != null && !isNewDevice,\n warningConversations: [],\n oversizedConversations: [],\n });\n}\n\nfunction analyzeConversations(conversations: Conversation[]): {\n allowed: ConversationRecordDTO[];\n warnings: ConversationSizeNotice[];\n oversized: ConversationSizeNotice[];\n} {\n const allowed: ConversationRecordDTO[] = [];\n const warnings: ConversationSizeNotice[] = [];\n const oversized: ConversationSizeNotice[] = [];\n const encoder = new TextEncoder();\n\n for (const conversation of conversations) {\n const dto = mapConversationToDTO(conversation);\n const sizeBytes = encoder.encode(JSON.stringify(dto)).length;\n const notice: ConversationSizeNotice = {\n id: conversation.id,\n name: conversation.name,\n sizeBytes,\n limitBytes: MAX_CONVERSATION_BYTES,\n };\n if (sizeBytes >= MAX_CONVERSATION_BYTES) {\n oversized.push(notice);\n continue;\n }\n if (sizeBytes >= WARN_CONVERSATION_BYTES) {\n warnings.push(notice);\n }\n allowed.push(dto);\n }\n\n return { allowed, warnings, oversized };\n}\n\nfunction buildOversizedMessage(notices: ConversationSizeNotice[]): string {\n if (!notices.length) {\n return '';\n }\n const names = notices.map((n) => `\"${n.name || 'Untitled'}\"`).join(', ');\n return `Some conversations (${names}) are too large for Bandit Cloud. Start a new conversation or archive older turns to continue syncing.`;\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-DBCC-69A917\nconst __banditFingerprint_store_conversationStorets = 'BL-FP-4510C8-8D68';\nconst __auditTrail_store_conversationStorets = 'BL-AU-MGOIKVW3-GEGF';\n// File: conversationStore.ts | Path: src/store/conversationStore.ts | Hash: dbcc8d68\n\nimport { create } from \"zustand\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { HistoryEntry, useAIQueryStore } from \"./aiQueryStore\";\nimport { useModelStore } from \"./modelStore\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport { KnowledgeDoc } from \"./knowledgeStore\";\nimport { runConversationMigrations } from \"../util/conversationMigration\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport { CONVERSATION_DELETE_EVENT, CONVERSATION_UPSERT_EVENT } from \"./conversationSyncEvents\";\n\nexport interface Conversation {\n id: string;\n name: string;\n model: string;\n history: HistoryEntry[];\n projectId?: string; // Optional for backward compatibility\n createdAt?: Date;\n updatedAt?: Date;\n version?: number;\n summary?: string;\n tags?: string[];\n metadata?: Record<string, unknown>;\n updatedBy?: string;\n deletedAt?: string | null;\n summaryStatus?: string;\n summaryGeneratedAt?: Date;\n}\n\ninterface ConversationStore {\n conversations: Conversation[];\n currentId: string | null;\n _hasHydrated: boolean;\n createConversation: (firstMessage: string, projectId?: string) => void;\n createNewConversation: (projectId?: string) => void;\n deleteConversation: (id: string) => void;\n switchConversation: (id: string) => void;\n addToCurrent: (entry: HistoryEntry) => void;\n replaceLastAnswer: (answer: string, images?: string[], memoryUpdated?: boolean, sourceFiles?: KnowledgeDoc[], cancelled?: boolean) => void;\n setCurrent: (id: string) => void;\n renameConversation: (id: string, newName: string) => void;\n clearAllConversations: () => Promise<void>;\n moveConversationToProject: (conversationId: string, projectId: string | null) => void;\n getConversationsByProject: (projectId: string | null) => Conversation[];\n hydrate: () => Promise<void>;\n applyRemoteConversations: (conversations: Conversation[]) => Promise<void>;\n removeConversationsByIds: (ids: string[]) => Promise<void>;\n}\n\nconst DB_NAME = \"bandit-conversations\";\nconst STORE_NAME = \"conversations\";\nconst DB_VERSION = 1;\nconst storeConfigs = [{ name: STORE_NAME, keyPath: \"id\" }];\n\nexport const EMOJI_REGEX = /\\p{Extended_Pictographic}/gu;\nexport const VARIATION_SELECTORS_REGEX = /[\\uFE0F\\uFE0E]/g;\nexport const ZERO_WIDTH_JOINER_REGEX = /\\u200D/g;\n\nexport function sanitizeConversationName(input: string | undefined | null, maxLength = 60): string {\n if (!input) return \"Untitled Conversation\";\n\n const withoutEmoji = input\n .replace(EMOJI_REGEX, \"\")\n .replace(VARIATION_SELECTORS_REGEX, \"\")\n .replace(ZERO_WIDTH_JOINER_REGEX, \"\");\n\n const normalized = withoutEmoji.normalize(\"NFC\").trim().replace(/\\s+/g, \" \");\n\n if (!normalized) {\n return \"Untitled Conversation\";\n }\n\n const limited = Array.from(normalized).slice(0, maxLength).join(\"\");\n return limited || \"Untitled Conversation\";\n}\n\nasync function loadConversations(): Promise<Conversation[]> {\n const raw = await indexedDBService.getAll<Conversation>(DB_NAME, DB_VERSION, STORE_NAME, storeConfigs);\n return (raw || []).map(normalizeConversation);\n}\n\nasync function saveConversation(conversation: Conversation) {\n await indexedDBService.put(DB_NAME, DB_VERSION, STORE_NAME, conversation, storeConfigs);\n}\n\nasync function deleteConversationFromDB(id: string) {\n await indexedDBService.delete(DB_NAME, DB_VERSION, STORE_NAME, id, storeConfigs);\n}\n\nexport const useConversationStore = create<ConversationStore>((set, get) => ({\n conversations: [],\n currentId: null,\n _hasHydrated: false,\n\n hydrate: async () => {\n try {\n // Run migrations first to ensure backward compatibility\n await runConversationMigrations();\n \n const conversations = await loadConversations();\n set({ conversations, _hasHydrated: true });\n } catch (error) {\n console.error(\"Failed to hydrate conversations:\", error);\n set({ conversations: [], _hasHydrated: true });\n }\n },\n\n createConversation: (firstMessage: string, projectId?: string) => {\n const id = uuidv4();\n const { selectedModel } = useModelStore.getState();\n const sanitizedFirstMessage = sanitizeConversationName(firstMessage, 60);\n const name = sanitizedFirstMessage;\n const now = new Date();\n const newConv = normalizeConversation({ \n id, \n name, \n history: [], \n model: selectedModel,\n projectId,\n createdAt: now,\n updatedAt: now,\n version: 0,\n });\n set((state) => {\n const updatedConversations = [...state.conversations, newConv];\n saveConversation(newConv);\n emitConversationUpsert(id);\n return {\n conversations: updatedConversations,\n currentId: id,\n };\n });\n },\n\n createNewConversation: (projectId?: string) => {\n const { selectedModel } = useModelStore.getState();\n const id = uuidv4();\n const now = new Date();\n const newConv = normalizeConversation({\n id,\n name: \"New Conversation\",\n history: [],\n model: selectedModel,\n projectId,\n createdAt: now,\n updatedAt: now,\n version: 0,\n });\n set((state) => {\n const updatedConversations = [...state.conversations, newConv];\n saveConversation(newConv);\n emitConversationUpsert(id);\n return {\n conversations: updatedConversations,\n currentId: id,\n };\n });\n },\n\n deleteConversation: (id: string) => {\n set((state) => {\n const filtered = state.conversations.filter((c) => c.id !== id);\n const isDeletingCurrent = state.currentId === id;\n\n if (isDeletingCurrent) {\n useAIQueryStore.getState().reset();\n }\n\n deleteConversationFromDB(id);\n emitConversationDelete(id);\n\n return {\n conversations: filtered,\n currentId: isDeletingCurrent ? null : state.currentId,\n };\n });\n },\n\n switchConversation: (id: string) => {\n const { conversations } = get();\n const { setSelectedModel } = useModelStore.getState();\n const selectedModel = conversations.find((c) => c.id === id)?.model;\n selectedModel && setSelectedModel(selectedModel);\n set({ currentId: id });\n },\n\n addToCurrent: (entry: HistoryEntry) => {\n const { currentId, conversations } = get();\n if (!currentId) return;\n set(() => {\n const updatedConversations = conversations.map((c) =>\n c.id === currentId ? normalizeConversation({ ...c, history: [...c.history, entry], updatedAt: new Date() }) : c\n );\n const updatedConv = updatedConversations.find((c) => c.id === currentId);\n if (updatedConv) {\n saveConversation(updatedConv);\n emitConversationUpsert(updatedConv.id);\n }\n return { conversations: updatedConversations };\n });\n },\n\n renameConversation: (id: string, newName: string) => {\n set((state) => {\n const sanitized = sanitizeConversationName(newName);\n const updatedConversations = state.conversations.map((c) =>\n c.id === id ? normalizeConversation({ ...c, name: sanitized, updatedAt: new Date() }) : c\n );\n const updatedConv = updatedConversations.find((c) => c.id === id);\n if (updatedConv) {\n saveConversation(updatedConv);\n emitConversationUpsert(updatedConv.id);\n }\n return { conversations: updatedConversations };\n });\n },\n\n replaceLastAnswer: (answer: string, images?: string[], memoryUpdated?: boolean, sourceFiles?: KnowledgeDoc[], cancelled?: boolean) => {\n const { currentId, conversations } = get();\n if (!currentId) return;\n set(() => {\n const updatedConversations = conversations.map((c) => {\n if (c.id === currentId && c.history.length > 0) {\n const updatedHistory = [...c.history];\n updatedHistory[updatedHistory.length - 1] = {\n ...updatedHistory[updatedHistory.length - 1],\n answer,\n memoryUpdated,\n images: images ?? updatedHistory[updatedHistory.length - 1].images,\n sourceFiles: sourceFiles ?? updatedHistory[updatedHistory.length - 1].sourceFiles,\n cancelled: cancelled ?? updatedHistory[updatedHistory.length - 1].cancelled,\n };\n return normalizeConversation({ ...c, history: updatedHistory, updatedAt: new Date() });\n }\n return c;\n });\n const updatedConv = updatedConversations.find((c) => c.id === currentId);\n if (updatedConv) {\n saveConversation(updatedConv);\n emitConversationUpsert(updatedConv.id);\n }\n return { conversations: updatedConversations };\n });\n },\n\n setCurrent: (id: string) => set({ currentId: id }),\n\n moveConversationToProject: (conversationId: string, projectId: string | null) => {\n set((state) => {\n const updatedConversations = state.conversations.map((c) =>\n c.id === conversationId \n ? normalizeConversation({ ...c, projectId: projectId || undefined, updatedAt: new Date() }) \n : c\n );\n const updatedConv = updatedConversations.find((c) => c.id === conversationId);\n if (updatedConv) {\n saveConversation(updatedConv);\n }\n return { conversations: updatedConversations };\n });\n },\n\n clearAllConversations: async () => {\n try {\n // Clear all conversations from IndexedDB\n await indexedDBService.clear(DB_NAME, DB_VERSION, STORE_NAME, storeConfigs);\n \n // Reset store state\n set({\n conversations: [],\n currentId: null,\n });\n \n debugLogger.info(\"All conversations cleared successfully\");\n } catch (error) {\n debugLogger.error(\"Failed to clear all conversations\", { error });\n throw error;\n }\n },\n\n getConversationsByProject: (projectId: string | null) => {\n const { conversations } = get();\n if (projectId === null) {\n // Return conversations without a project (ungrouped)\n return conversations.filter(c => !c.projectId);\n }\n return conversations.filter(c => c.projectId === projectId);\n },\n\n applyRemoteConversations: async (incoming) => {\n const normalized = incoming.map(normalizeConversation);\n const toPersist: Conversation[] = [];\n\n set((state) => {\n const next = new Map(state.conversations.map((c) => [c.id, c] as const));\n\n for (const conversation of normalized) {\n const existing = next.get(conversation.id);\n\n if (existing) {\n const existingUpdatedAt = existing.updatedAt ? existing.updatedAt.getTime() : 0;\n const incomingUpdatedAt = conversation.updatedAt ? conversation.updatedAt.getTime() : 0;\n const existingHistoryLength = existing.history?.length ?? 0;\n const incomingHistoryLength = conversation.history?.length ?? 0;\n\n const incomingHasMoreHistory = incomingHistoryLength > existingHistoryLength;\n const incomingIsNewer = incomingUpdatedAt > existingUpdatedAt;\n\n if (incomingIsNewer && incomingHistoryLength < existingHistoryLength) {\n debugLogger.info(\"applyRemoteConversations: preserving local history over shorter incoming\", {\n conversationId: conversation.id,\n existingHistoryLength,\n incomingHistoryLength,\n existingUpdatedAt,\n incomingUpdatedAt,\n });\n conversation.history = existing.history;\n }\n\n if (!incomingHasMoreHistory && !incomingIsNewer) {\n debugLogger.info(\"applyRemoteConversations: skipping stale conversation\", {\n conversationId: conversation.id,\n existingHistoryLength,\n incomingHistoryLength,\n existingUpdatedAt,\n incomingUpdatedAt,\n });\n continue;\n }\n }\n\n next.set(conversation.id, conversation);\n toPersist.push(conversation);\n }\n\n return { conversations: Array.from(next.values()) };\n });\n\n if (toPersist.length > 0) {\n try {\n await Promise.all(toPersist.map((conversation) => saveConversation(conversation)));\n } catch (error) {\n debugLogger.error(\"Failed to persist remote conversations\", { error, conversationIds: toPersist.map((c) => c.id) });\n }\n }\n },\n\n removeConversationsByIds: async (ids) => {\n if (!ids.length) {\n return;\n }\n\n try {\n await Promise.all(ids.map((id) => deleteConversationFromDB(id)));\n } catch (error) {\n debugLogger.error(\"Failed to remove conversations from IndexedDB\", { error, ids });\n }\n\n set((state) => {\n const filtered = state.conversations.filter((c) => !ids.includes(c.id));\n const isCurrentDeleted = state.currentId ? ids.includes(state.currentId) : false;\n ids.forEach((id) => emitConversationDelete(id));\n return {\n conversations: filtered,\n currentId: isCurrentDeleted ? null : state.currentId,\n };\n });\n },\n}));\n\nfunction normalizeConversation(conversation: Conversation): Conversation {\n const ensureDate = (value?: Date | string | null): Date | undefined => {\n if (!value) return undefined;\n if (value instanceof Date) return value;\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n };\n\n return {\n ...conversation,\n name: sanitizeConversationName(conversation.name),\n createdAt: ensureDate(conversation.createdAt) ?? new Date(),\n updatedAt: ensureDate(conversation.updatedAt) ?? new Date(),\n summaryGeneratedAt: ensureDate(conversation.summaryGeneratedAt),\n history: Array.isArray(conversation.history)\n ? conversation.history.map((turn) => ({\n ...turn,\n }))\n : [],\n };\n}\nfunction emitConversationUpsert(id: string) {\n if (typeof window === 'undefined') return;\n window.dispatchEvent(new CustomEvent(CONVERSATION_UPSERT_EVENT, { detail: id }));\n}\n\nfunction emitConversationDelete(id: string) {\n if (typeof window === 'undefined') return;\n window.dispatchEvent(new CustomEvent(CONVERSATION_DELETE_EVENT, { detail: id }));\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-39FF-3FCF58\nconst __banditFingerprint_util_conversationMigrationts = 'BL-FP-CA75E4-D550';\nconst __auditTrail_util_conversationMigrationts = 'BL-AU-MGOIKVW9-R32Z';\n// File: conversationMigration.ts | Path: src/util/conversationMigration.ts | Hash: 39ffd550\n\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport type { HistoryEntry } from \"../store/aiQueryStore\";\n\n/**\n * Migration utility to ensure backward compatibility for conversations\n * that were created before the projects feature was added.\n */\n\nexport interface ConversationV1 {\n id: string;\n name: string;\n model: string;\n history: HistoryEntry[];\n}\n\nexport interface ConversationV2 {\n id: string;\n name: string;\n model: string;\n history: HistoryEntry[];\n projectId?: string;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\nconst DB_NAME = \"bandit-conversations\";\nconst STORE_NAME = \"conversations\";\nconst DB_VERSION = 1;\nconst storeConfigs = [{ name: STORE_NAME, keyPath: \"id\" }];\n\n/**\n * Migrates conversations from V1 format (without projects) to V2 format (with projects)\n */\nexport async function migrateConversationsToV2(): Promise<boolean> {\n try {\n debugLogger.info(\"Starting conversation migration to V2 format\");\n \n const conversations = await indexedDBService.getAll<ConversationV1 | ConversationV2>(\n DB_NAME, \n DB_VERSION, \n STORE_NAME, \n storeConfigs\n );\n\n if (!conversations || conversations.length === 0) {\n debugLogger.info(\"No conversations found, migration not needed\");\n return true;\n }\n\n let migratedCount = 0;\n const now = new Date();\n\n for (const conversation of conversations) {\n // Check if conversation needs migration (missing V2 fields)\n const needsMigration = \n !conversation.hasOwnProperty('createdAt') || \n !conversation.hasOwnProperty('updatedAt');\n\n if (needsMigration) {\n const migratedConversation: ConversationV2 = {\n ...conversation,\n // projectId remains undefined (ungrouped)\n createdAt: now, // We can't know the real creation date\n updatedAt: now,\n };\n\n await indexedDBService.put(\n DB_NAME, \n DB_VERSION, \n STORE_NAME, \n migratedConversation, \n storeConfigs\n );\n\n migratedCount++;\n debugLogger.debug(\"Migrated conversation\", { \n id: conversation.id, \n name: conversation.name \n });\n } else if ('createdAt' in conversation && conversation.createdAt && typeof conversation.createdAt === 'string') {\n // Convert string dates back to Date objects if needed\n const fixedConversation: ConversationV2 = {\n ...(conversation as ConversationV2),\n createdAt: new Date(conversation.createdAt),\n updatedAt: new Date((conversation as ConversationV2).updatedAt || conversation.createdAt),\n };\n\n await indexedDBService.put(\n DB_NAME, \n DB_VERSION, \n STORE_NAME, \n fixedConversation, \n storeConfigs\n );\n\n migratedCount++;\n debugLogger.debug(\"Fixed date format for conversation\", { \n id: conversation.id, \n name: conversation.name \n });\n }\n }\n\n if (migratedCount > 0) {\n debugLogger.info(\"Conversation migration completed\", { \n totalConversations: conversations.length,\n migratedCount \n });\n } else {\n debugLogger.info(\"All conversations already up to date\");\n }\n\n return true;\n } catch (error) {\n debugLogger.error(\"Failed to migrate conversations\", { error });\n return false;\n }\n}\n\n/**\n * Validates that all conversations have the expected V2 structure\n */\nexport async function validateConversationStructure(): Promise<boolean> {\n try {\n const conversations = await indexedDBService.getAll<ConversationV2>(\n DB_NAME, \n DB_VERSION, \n STORE_NAME, \n storeConfigs\n );\n\n if (!conversations) {\n return true; // No conversations to validate\n }\n\n for (const conversation of conversations) {\n const isValid = \n typeof conversation.id === 'string' &&\n typeof conversation.name === 'string' &&\n typeof conversation.model === 'string' &&\n Array.isArray(conversation.history) &&\n (conversation.projectId === undefined || typeof conversation.projectId === 'string') &&\n (conversation.createdAt === undefined || conversation.createdAt instanceof Date) &&\n (conversation.updatedAt === undefined || conversation.updatedAt instanceof Date);\n\n if (!isValid) {\n debugLogger.warn(\"Invalid conversation structure detected\", { \n conversationId: conversation.id,\n structure: {\n hasId: typeof conversation.id === 'string',\n hasName: typeof conversation.name === 'string',\n hasModel: typeof conversation.model === 'string',\n hasHistory: Array.isArray(conversation.history),\n projectIdValid: conversation.projectId === undefined || typeof conversation.projectId === 'string',\n createdAtValid: conversation.createdAt === undefined || conversation.createdAt instanceof Date,\n updatedAtValid: conversation.updatedAt === undefined || conversation.updatedAt instanceof Date,\n }\n });\n return false;\n }\n }\n\n debugLogger.info(\"All conversations have valid structure\", { \n count: conversations.length \n });\n return true;\n } catch (error) {\n debugLogger.error(\"Failed to validate conversation structure\", { error });\n return false;\n }\n}\n\n/**\n * Runs all necessary migrations for conversations\n */\nexport async function runConversationMigrations(): Promise<boolean> {\n try {\n debugLogger.info(\"Running conversation migrations\");\n \n const migrationSuccess = await migrateConversationsToV2();\n if (!migrationSuccess) {\n debugLogger.error(\"Conversation migration failed\");\n return false;\n }\n\n const validationSuccess = await validateConversationStructure();\n if (!validationSuccess) {\n debugLogger.warn(\"Conversation validation failed, but continuing\");\n }\n\n debugLogger.info(\"Conversation migrations completed successfully\");\n return true;\n } catch (error) {\n debugLogger.error(\"Migration process failed\", { error });\n return false;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-9C11-60075A\nconst __banditFingerprint_store_conversationSyncEventsts = 'BL-FP-46A3ED-3255';\nconst __auditTrail_store_conversationSyncEventsts = 'BL-AU-MGOIKVW3-GXVJ';\n// File: conversationSyncEvents.ts | Path: src/store/conversationSyncEvents.ts | Hash: 9c113255\n\nexport const CONVERSATION_UPSERT_EVENT = 'bandit-conversation-upsert';\nexport const CONVERSATION_DELETE_EVENT = 'bandit-conversation-delete';\nexport const PROJECT_UPSERT_EVENT = 'bandit-project-upsert';\nexport const PROJECT_DELETE_EVENT = 'bandit-project-delete';\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-489B-13F873\nconst __banditFingerprint_store_projectStorets = 'BL-FP-4E45E3-8650';\nconst __auditTrail_store_projectStorets = 'BL-AU-MGOIKVW5-44EI';\n// File: projectStore.ts | Path: src/store/projectStore.ts | Hash: 489b8650\n\nimport { create } from \"zustand\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport {\n PROJECT_DELETE_EVENT,\n PROJECT_UPSERT_EVENT,\n} from \"./conversationSyncEvents\";\n\nexport interface Project {\n id: string;\n name: string;\n description?: string;\n color?: string;\n createdAt: Date;\n updatedAt: Date;\n order: number;\n version?: number;\n conversationCount?: number;\n lastActivityAt?: Date;\n summary?: string;\n metadata?: Record<string, unknown>;\n updatedBy?: string;\n deletedAt?: string | null;\n}\n\ninterface ProjectStore {\n projects: Project[];\n _hasHydrated: boolean;\n \n // Actions\n createProject: (name: string, description?: string, color?: string) => Promise<Project>;\n deleteProject: (id: string) => Promise<void>;\n renameProject: (id: string, newName: string, description?: string) => Promise<void>;\n updateProjectColor: (id: string, color: string) => Promise<void>;\n reorderProjects: (projectIds: string[]) => Promise<void>;\n hydrate: () => Promise<void>;\n applyRemoteProjects: (projects: Project[]) => Promise<void>;\n removeProjectsByIds: (ids: string[]) => Promise<void>;\n}\n\nconst DB_NAME = \"bandit-projects\";\nconst STORE_NAME = \"projects\";\nconst DB_VERSION = 1;\nconst storeConfigs = [{ name: STORE_NAME, keyPath: \"id\" }];\n\n// Default colors for projects\nconst DEFAULT_COLORS = [\n \"#2196F3\", // Blue\n \"#4CAF50\", // Green\n \"#FF9800\", // Orange\n \"#9C27B0\", // Purple\n \"#F44336\", // Red\n \"#00BCD4\", // Cyan\n \"#FFEB3B\", // Yellow\n \"#795548\", // Brown\n \"#607D8B\", // Blue Grey\n \"#E91E63\", // Pink\n];\n\nasync function loadProjects(): Promise<Project[]> {\n try {\n const projects = await indexedDBService.getAll<Project>(DB_NAME, DB_VERSION, STORE_NAME, storeConfigs);\n return (projects || []).map(normalizeProject).sort((a, b) => a.order - b.order);\n } catch (error) {\n debugLogger.error(\"Failed to load projects\", { error });\n return [];\n }\n}\n\nasync function saveProject(project: Project) {\n try {\n await indexedDBService.put(DB_NAME, DB_VERSION, STORE_NAME, project, storeConfigs);\n debugLogger.info(\"Project saved\", { projectId: project.id, projectName: project.name });\n } catch (error) {\n debugLogger.error(\"Failed to save project\", { projectId: project.id, error });\n throw error;\n }\n}\n\nasync function deleteProjectFromDB(id: string) {\n try {\n await indexedDBService.delete(DB_NAME, DB_VERSION, STORE_NAME, id, storeConfigs);\n debugLogger.info(\"Project deleted from DB\", { projectId: id });\n } catch (error) {\n debugLogger.error(\"Failed to delete project from DB\", { projectId: id, error });\n throw error;\n }\n}\n\nexport const useProjectStore = create<ProjectStore>((set, get) => ({\n projects: [],\n _hasHydrated: false,\n\n hydrate: async () => {\n try {\n const projects = await loadProjects();\n set({ projects, _hasHydrated: true });\n debugLogger.info(\"Project store hydrated\", { projectCount: projects.length });\n } catch (error) {\n debugLogger.error(\"Failed to hydrate project store\", { error });\n set({ projects: [], _hasHydrated: true });\n }\n },\n\n createProject: async (name: string, description?: string, color?: string) => {\n const { projects } = get();\n const id = uuidv4();\n const now = new Date();\n \n // Assign a default color if not provided\n const projectColor = color || DEFAULT_COLORS[projects.length % DEFAULT_COLORS.length];\n \n const newProject: Project = normalizeProject({\n id,\n name: name.trim(),\n description: description?.trim(),\n color: projectColor,\n createdAt: now,\n updatedAt: now,\n order: projects.length,\n version: 0,\n });\n\n await saveProject(newProject);\n\n set((state) => ({\n projects: [...state.projects, newProject],\n }));\n emitProjectUpsert(id);\n\n debugLogger.info(\"Project created\", { projectId: id, projectName: name });\n return newProject;\n },\n\n deleteProject: async (id: string) => {\n await deleteProjectFromDB(id);\n \n set((state) => ({\n projects: state.projects.filter((p) => p.id !== id),\n }));\n\n debugLogger.info(\"Project deleted\", { projectId: id });\n emitProjectDelete(id);\n },\n\n renameProject: async (id: string, newName: string, description?: string) => {\n const { projects } = get();\n const project = projects.find(p => p.id === id);\n \n if (!project) {\n throw new Error(`Project with id ${id} not found`);\n }\n\n const updatedProject = normalizeProject({\n ...project,\n name: newName.trim(),\n description: description?.trim(),\n updatedAt: new Date(),\n });\n\n await saveProject(updatedProject);\n \n set((state) => ({\n projects: state.projects.map((p) =>\n p.id === id ? updatedProject : p\n ),\n }));\n\n debugLogger.info(\"Project renamed\", { projectId: id, newName });\n emitProjectUpsert(id);\n },\n\n updateProjectColor: async (id: string, color: string) => {\n const { projects } = get();\n const project = projects.find(p => p.id === id);\n \n if (!project) {\n throw new Error(`Project with id ${id} not found`);\n }\n\n const updatedProject = normalizeProject({\n ...project,\n color,\n updatedAt: new Date(),\n });\n\n await saveProject(updatedProject);\n \n set((state) => ({\n projects: state.projects.map((p) =>\n p.id === id ? updatedProject : p\n ),\n }));\n\n debugLogger.info(\"Project color updated\", { projectId: id, color });\n emitProjectUpsert(id);\n },\n\n reorderProjects: async (projectIds: string[]) => {\n const { projects } = get();\n const reorderedProjects = projectIds.map((id, index) => {\n const project = projects.find(p => p.id === id);\n if (!project) return null;\n return normalizeProject({ ...project, order: index, updatedAt: new Date() });\n }).filter(Boolean) as Project[];\n\n // Save all reordered projects\n await Promise.all(reorderedProjects.map(saveProject));\n \n set({ projects: reorderedProjects });\n debugLogger.info(\"Projects reordered\", { projectCount: reorderedProjects.length });\n reorderedProjects.forEach((project) => emitProjectUpsert(project.id));\n },\n\n applyRemoteProjects: async (incoming) => {\n const normalized = incoming.map(normalizeProject);\n\n try {\n await Promise.all(normalized.map((project) => saveProject(project)));\n } catch (error) {\n debugLogger.error(\"Failed to persist remote projects\", { error });\n }\n\n set((state) => {\n const next = new Map(state.projects.map((p) => [p.id, p] as const));\n for (const project of normalized) {\n next.set(project.id, project);\n }\n return { projects: Array.from(next.values()).sort((a, b) => a.order - b.order) };\n });\n },\n\n removeProjectsByIds: async (ids) => {\n if (!ids.length) {\n return;\n }\n\n try {\n await Promise.all(ids.map((id) => deleteProjectFromDB(id)));\n } catch (error) {\n debugLogger.error(\"Failed to delete projects from IndexedDB\", { error, ids });\n }\n\n set((state) => ({\n projects: state.projects.filter((p) => !ids.includes(p.id)),\n }));\n ids.forEach((id) => emitProjectDelete(id));\n },\n}));\n\nfunction normalizeProject(project: Project): Project {\n const ensureDate = (value?: Date | string | null): Date => {\n if (!value) return new Date();\n if (value instanceof Date) return value;\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? new Date() : parsed;\n };\n\n return {\n ...project,\n createdAt: ensureDate(project.createdAt),\n updatedAt: ensureDate(project.updatedAt),\n lastActivityAt: project.lastActivityAt ? ensureDate(project.lastActivityAt) : undefined,\n };\n}\n\nfunction emitProjectUpsert(id: string) {\n if (typeof window === 'undefined') return;\n window.dispatchEvent(new CustomEvent(PROJECT_UPSERT_EVENT, { detail: id }));\n}\n\nfunction emitProjectDelete(id: string) {\n if (typeof window === 'undefined') return;\n window.dispatchEvent(new CustomEvent(PROJECT_DELETE_EVENT, { detail: id }));\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-4D16-84732D\nconst __banditFingerprint_auth_authenticationServicets = 'BL-FP-90E332-44A4';\nconst __auditTrail_auth_authenticationServicets = 'BL-AU-MGOIKVVR-AIBP';\n// File: authenticationService.ts | Path: src/services/auth/authenticationService.ts | Hash: 4d1644a4\n\nimport { useAuthenticationStore } from \"../../store/authenticationStore\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\n\nexport interface JwtClaims {\n /**\n * The unique identifier for the user.\n */\n sub: string;\n /**\n * The email address of the user.\n * This is typically used for authentication and user identification.\n */\n email: string;\n /**\n * Optional display name for the user if provided by the identity provider.\n */\n name?: string;\n /**\n * Optional preferred username provided by the identity provider.\n */\n preferred_username?: string;\n /**\n * Optional direct URL to a profile image for the user.\n */\n picture?: string;\n /**\n * Optional given name of the user when available.\n */\n given_name?: string;\n /**\n * Optional family name of the user when available.\n */\n family_name?: string;\n /**\n * The roles assigned to the user.\n * 'user' | 'admin' | 'super-admin'\n */\n roles: string[];\n /**\n * The time at which the token was issued.\n * This is represented as a Unix timestamp (seconds since the epoch).\n */\n iat: number;\n\n /**\n * The time at which the token will expire.\n * This is represented as a Unix timestamp (seconds since the epoch).\n */\n exp: number;\n /**\n * The issuer of the token.\n * This is typically the URL of the authentication server.\n * \n */\n iss: string;\n /**\n * Optional team session identifier for team features.\n * Present when user belongs to a team.\n */\n teamSid?: string;\n /**\n * Optional team identifier for team features.\n * Present when user belongs to a team.\n */\n teamId?: string;\n}\n\nexport const TOKEN_KEY = \"authToken\";\n\nclass AuthenticationService {\n getToken(): string | null {\n const token = localStorage.getItem(TOKEN_KEY);\n return token;\n }\n\n setToken(token: string) {\n localStorage.setItem(TOKEN_KEY, token);\n useAuthenticationStore.getState().setToken(token);\n }\n\n clearToken() {\n localStorage.removeItem(TOKEN_KEY);\n useAuthenticationStore.getState().clearToken();\n }\n\n isAuthenticated(): boolean {\n const token = useAuthenticationStore.getState().token;\n return !!token && !this.isTokenExpired(token);\n }\n\n isTokenExpired(token: string): boolean {\n try {\n if (!token) return true;\n const decoded = this.parseJwtClaims(token);\n if (!decoded) return true;\n return decoded.exp * 1000 < Date.now();\n } catch {\n return true;\n }\n }\n\n parseJwtClaims(token: string): JwtClaims | null {\n try {\n const base64Url = token.split(\".\")[1];\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split(\"\")\n .map((c) => {\n return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join(\"\")\n );\n return JSON.parse(jsonPayload) as JwtClaims;\n } catch (error) {\n debugLogger.error(\"Failed to parse JWT claims:\", { error });\n return null;\n }\n }\n}\n\nexport const authenticationService = new AuthenticationService();\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-ECF9-6DA236\nconst __banditFingerprint_conversationSync_conversationSyncServicets = 'BL-FP-63F1FF-931F';\nconst __auditTrail_conversationSync_conversationSyncServicets = 'BL-AU-MGOIKVVS-90K4';\n// File: conversationSyncService.ts | Path: src/services/conversationSync/conversationSyncService.ts | Hash: ecf9931f\n\nimport { authenticationService } from \"../auth/authenticationService\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null;\n\nconst getString = (record: Record<string, unknown>, key: string): string | undefined => {\n const value = record[key];\n return typeof value === 'string' ? value : undefined;\n};\n\nclass HttpResponseError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly payload: unknown,\n public readonly code?: string\n ) {\n super(message);\n this.name = 'HttpResponseError';\n }\n}\n\nexport interface SyncMetadataDTO {\n version: number;\n updatedAt: string;\n updatedBy?: string;\n deletedAt?: string | null;\n}\n\nexport interface KnowledgeDocRefDTO {\n id: string;\n name?: string;\n}\n\nexport interface ConversationTurnDTO {\n id: string;\n question: string;\n answer: string;\n images?: string[];\n sourceFiles?: KnowledgeDocRefDTO[];\n memoryUpdated?: boolean;\n cancelled?: boolean;\n}\n\nexport interface ConversationRecordDTO extends SyncMetadataDTO {\n id: string;\n name: string;\n model: string;\n projectId?: string | null;\n history: ConversationTurnDTO[];\n summary?: string;\n tags?: string[];\n metadata?: Record<string, unknown>;\n createdAt?: string | null;\n summaryStatus?: string;\n summaryGeneratedAt?: string;\n}\n\nexport interface ProjectRecordDTO extends SyncMetadataDTO {\n id: string;\n name: string;\n description?: string;\n color?: string;\n order: number;\n conversationCount?: number;\n lastActivityAt?: string;\n summary?: string;\n metadata?: Record<string, unknown>;\n createdAt?: string | null;\n}\n\nexport interface ConversationSyncPreferenceDTO {\n syncEnabled: boolean;\n lastSyncAt?: string | null;\n cursor?: string | null;\n lastDeviceId?: string | null;\n keepLocalOnly?: boolean;\n isAdvancedVectorFeaturesEnabled: boolean;\n}\n\nexport interface ConversationSyncRequest {\n deviceId: string;\n cursor?: string | null;\n timezone?: string;\n payloadVersion: number;\n changes: {\n conversations: {\n upserts: ConversationRecordDTO[];\n deletes: string[];\n };\n projects: {\n upserts: ProjectRecordDTO[];\n deletes: string[];\n };\n };\n}\n\nexport interface ConflictRecordDTO<T> {\n id: string;\n server: T;\n client?: T;\n reason: 'version_mismatch' | 'missing_dependency' | 'validation_error';\n message?: string;\n}\n\nexport interface ConversationSyncResponse {\n nextCursor?: {\n token: string;\n expiresAt?: string;\n } | null;\n conversations: {\n upserts: ConversationRecordDTO[];\n deletes: string[];\n totalCount: number;\n };\n projects: {\n upserts: ProjectRecordDTO[];\n deletes: string[];\n totalCount: number;\n };\n conflicts: {\n conversationConflicts: ConflictRecordDTO<ConversationRecordDTO>[];\n projectConflicts: ConflictRecordDTO<ProjectRecordDTO>[];\n };\n hasMore: boolean;\n}\n\nfunction buildUrl(path: string): string {\n const base = usePackageSettingsStore.getState().settings?.gatewayApiUrl?.replace(/\\/$/, \"\");\n if (base) {\n const normalized = path.startsWith('/') ? path : `/${path}`;\n return `${base}${normalized}`;\n }\n return path;\n}\n\nfunction buildHeaders(): HeadersInit {\n const headers: HeadersInit = { 'Content-Type': 'application/json' };\n const token = authenticationService.getToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n return headers;\n}\n\nasync function handleJsonResponse<T>(response: Response, fallbackMessage: string): Promise<T> {\n let data: unknown = null;\n try {\n data = await response.json();\n } catch (error) {\n debugLogger.warn('conversationSyncService: failed to parse JSON response', { error });\n }\n\n if (!response.ok) {\n const record = isRecord(data) ? data : {};\n const message =\n getString(record, 'error') ||\n getString(record, 'message') ||\n getString(record, 'detail') ||\n fallbackMessage;\n const code = getString(record, 'code') || getString(record, 'error_code');\n throw new HttpResponseError(message, response.status, data, code);\n }\n\n return data as T;\n}\n\nexport async function fetchConversationSyncPreference(): Promise<ConversationSyncPreferenceDTO> {\n const url = buildUrl('/v1/preferences/conversation-sync');\n const headers = buildHeaders();\n try {\n const response = await fetch(url, { method: 'GET', headers });\n return await handleJsonResponse<ConversationSyncPreferenceDTO>(response, 'Failed to load conversation sync preference');\n } catch (error) {\n debugLogger.error('conversationSyncService: failed to fetch sync preference', {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n}\n\nexport async function updateConversationSyncPreference(body: {\n syncEnabled: boolean;\n deviceId?: string;\n keepLocalOnly?: boolean;\n isAdvancedVectorFeaturesEnabled: boolean;\n}): Promise<ConversationSyncPreferenceDTO> {\n const url = buildUrl('/v1/preferences/conversation-sync');\n const headers = buildHeaders();\n try {\n const response = await fetch(url, {\n method: 'PUT',\n headers,\n body: JSON.stringify(body),\n });\n return await handleJsonResponse<ConversationSyncPreferenceDTO>(response, 'Failed to update conversation sync preference');\n } catch (error) {\n debugLogger.error('conversationSyncService: failed to update sync preference', {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n}\n\nexport async function syncConversations(request: ConversationSyncRequest): Promise<ConversationSyncResponse> {\n const url = buildUrl('/v1/conversations/sync');\n const headers = buildHeaders();\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n return await handleJsonResponse<ConversationSyncResponse>(response, 'Failed to sync conversations');\n } catch (error) {\n debugLogger.error('conversationSyncService: sync request failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-C410-8CA568\nconst __banditFingerprint_knowlege_knowledgefilemodaltsx = 'BL-FP-823E15-0B23';\nconst __auditTrail_knowlege_knowledgefilemodaltsx = 'BL-AU-MGOIKVVO-T646';\n// File: knowledge-file-modal.tsx | Path: src/modals/knowlege/knowledge-file-modal.tsx | Hash: c4100b23\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Dialog,\n AppBar,\n Toolbar,\n IconButton,\n Typography,\n Box,\n CircularProgress,\n Alert,\n Button,\n Paper,\n ToggleButton,\n ToggleButtonGroup,\n Tooltip,\n useTheme,\n useMediaQuery,\n} from \"@mui/material\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport ZoomInIcon from \"@mui/icons-material/ZoomIn\";\nimport ZoomOutIcon from \"@mui/icons-material/ZoomOut\";\nimport CodeIcon from \"@mui/icons-material/Code\";\nimport TextFieldsIcon from \"@mui/icons-material/TextFields\";\nimport DescriptionIcon from \"@mui/icons-material/Description\";\nimport PictureAsPdfIcon from \"@mui/icons-material/PictureAsPdf\";\nimport DataObjectIcon from \"@mui/icons-material/DataObject\";\nimport ArticleIcon from \"@mui/icons-material/Article\";\nimport { KnowledgeDoc } from \"../../store/knowledgeStore\";\nimport { useVectorStore } from \"../../hooks/useVectorStore\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport * as pdfjsLib from \"pdfjs-dist/legacy/build/pdf\";\nimport type { Root, Element, Text } from \"hast\";\nimport { getHighlightTree } from \"../../utils/lowlight\";\nimport { renderLowlightChildren } from \"../../utils/markdownRendering\";\nimport { debugLogger } from \"../../services/logging/debugLogger\";\nimport type { PDFDocumentProxy } from \"pdfjs-dist/types/src/display/api\";\n\ntype FileTypeInfo = {\n icon: React.ElementType;\n color: string;\n category: string;\n language?: string;\n};\n\nconst getFileTypeInfo = (filename: string): FileTypeInfo => {\n const ext = filename.split('.').pop()?.toLowerCase() || '';\n \n const languageMap: Record<string, FileTypeInfo> = {\n // Documents\n 'pdf': { icon: PictureAsPdfIcon, color: '#d32f2f', category: 'Document' },\n 'doc': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n 'docx': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n 'odt': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n 'rtf': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n \n // Text files\n 'txt': { icon: DescriptionIcon, color: '#388e3c', category: 'Text' },\n 'md': { icon: DescriptionIcon, color: '#388e3c', category: 'Text', language: 'Markdown' },\n 'markdown': { icon: DescriptionIcon, color: '#388e3c', category: 'Text', language: 'Markdown' },\n \n // Web languages\n 'js': { icon: CodeIcon, color: '#f7df1e', category: 'Code', language: 'JavaScript' },\n 'jsx': { icon: CodeIcon, color: '#61dafb', category: 'Code', language: 'JavaScript' },\n 'ts': { icon: CodeIcon, color: '#3178c6', category: 'Code', language: 'TypeScript' },\n 'tsx': { icon: CodeIcon, color: '#61dafb', category: 'Code', language: 'TypeScript' },\n 'html': { icon: CodeIcon, color: '#e34f26', category: 'Code', language: 'HTML' },\n 'css': { icon: CodeIcon, color: '#1572b6', category: 'Code', language: 'CSS' },\n 'scss': { icon: CodeIcon, color: '#cf649a', category: 'Code', language: 'SCSS' },\n 'sass': { icon: CodeIcon, color: '#cf649a', category: 'Code', language: 'Sass' },\n 'php': { icon: CodeIcon, color: '#777bb4', category: 'Code', language: 'PHP' },\n \n // Systems languages\n 'c': { icon: CodeIcon, color: '#a8b9cc', category: 'Code', language: 'C' },\n 'cpp': { icon: CodeIcon, color: '#f34b7d', category: 'Code', language: 'C++' },\n 'cs': { icon: CodeIcon, color: '#239120', category: 'Code', language: 'C#' },\n 'java': { icon: CodeIcon, color: '#ed8b00', category: 'Code', language: 'Java' },\n 'py': { icon: CodeIcon, color: '#3776ab', category: 'Code', language: 'Python' },\n 'go': { icon: CodeIcon, color: '#00add8', category: 'Code', language: 'Go' },\n 'rs': { icon: CodeIcon, color: '#ce422b', category: 'Code', language: 'Rust' },\n 'kt': { icon: CodeIcon, color: '#7f52ff', category: 'Code', language: 'Kotlin' },\n 'swift': { icon: CodeIcon, color: '#fa7343', category: 'Code', language: 'Swift' },\n 'scala': { icon: CodeIcon, color: '#dc322f', category: 'Code', language: 'Scala' },\n 'rb': { icon: CodeIcon, color: '#cc342d', category: 'Code', language: 'Ruby' },\n \n // Scripts\n 'sh': { icon: CodeIcon, color: '#4eaa25', category: 'Code', language: 'Shell' },\n 'bash': { icon: CodeIcon, color: '#4eaa25', category: 'Code', language: 'Bash' },\n 'bat': { icon: CodeIcon, color: '#c1f12e', category: 'Code', language: 'Batch' },\n 'ps1': { icon: CodeIcon, color: '#012456', category: 'Code', language: 'PowerShell' },\n \n // Data formats\n 'json': { icon: DataObjectIcon, color: '#f7df1e', category: 'Data', language: 'JSON' },\n 'xml': { icon: DataObjectIcon, color: '#ff6600', category: 'Data', language: 'XML' },\n 'yaml': { icon: DataObjectIcon, color: '#cb171e', category: 'Data', language: 'YAML' },\n 'yml': { icon: DataObjectIcon, color: '#cb171e', category: 'Data', language: 'YAML' },\n 'csv': { icon: DataObjectIcon, color: '#217346', category: 'Data', language: 'CSV' },\n };\n \n return languageMap[ext] || { icon: DescriptionIcon, color: '#666', category: 'Other' };\n};\n\nconst isPDF = (filename: string): boolean => filename.toLowerCase().endsWith('.pdf');\n\nconst LANGUAGE_MAP: Record<string, string> = {\n // Web technologies\n 'js': 'javascript',\n 'jsx': 'jsx',\n 'ts': 'typescript',\n 'tsx': 'tsx',\n 'html': 'html',\n 'htm': 'html',\n 'css': 'css',\n 'scss': 'scss',\n 'sass': 'sass',\n 'less': 'less',\n\n // Data formats\n 'json': 'json',\n 'xml': 'xml',\n 'yaml': 'yaml',\n 'yml': 'yaml',\n 'csv': 'csv',\n\n // Systems programming\n 'c': 'c',\n 'cpp': 'cpp',\n 'cxx': 'cpp',\n 'cc': 'cpp',\n 'h': 'c',\n 'hpp': 'cpp',\n 'cs': 'csharp',\n 'java': 'java',\n 'py': 'python',\n 'go': 'go',\n 'rs': 'rust',\n 'kt': 'kotlin',\n 'swift': 'swift',\n 'scala': 'scala',\n 'rb': 'ruby',\n 'php': 'php',\n\n // Scripting\n 'sh': 'bash',\n 'bash': 'bash',\n 'zsh': 'bash',\n 'fish': 'bash',\n 'bat': 'batch',\n 'cmd': 'batch',\n 'ps1': 'powershell',\n\n // Markup and documentation\n 'md': 'markdown',\n 'markdown': 'markdown',\n 'tex': 'latex',\n 'sql': 'sql',\n\n // Configuration\n 'ini': 'ini',\n 'conf': 'ini',\n 'config': 'ini',\n 'toml': 'toml',\n 'dockerfile': 'docker',\n\n // Other\n 'r': 'r',\n 'matlab': 'matlab',\n 'm': 'matlab',\n 'lua': 'lua',\n 'perl': 'perl',\n 'pl': 'perl',\n};\n\nconst getLanguageFromFilename = (filename: string): string => {\n const ext = filename.toLowerCase().split('.').pop() || '';\n return LANGUAGE_MAP[ext] || 'text';\n};\n\nconst isCodeFile = (filename: string): boolean => getLanguageFromFilename(filename) !== 'text';\n\nconst formatJsonContent = (content: string): string => {\n try {\n const parsed = JSON.parse(content);\n return JSON.stringify(parsed, null, 2);\n } catch {\n return content;\n }\n};\n\nconst getFormattedContent = (content: string, filename: string): string => {\n const ext = filename.toLowerCase().split('.').pop() || '';\n\n if (ext === 'json') {\n return formatJsonContent(content);\n }\n\n return content;\n};\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n doc: KnowledgeDoc | null;\n isVectorDocument?: boolean;\n}\n\nconst KnowledgeFileModal: React.FC<Props> = ({ open, onClose, doc, isVectorDocument = false }) => {\n const [fullContent, setFullContent] = useState<string>('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [pdfDocument, setPdfDocument] = useState<PDFDocumentProxy | null>(null);\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(0);\n const [pdfScale, setPdfScale] = useState(1.2);\n const [pdfCanvases, setPdfCanvases] = useState<HTMLCanvasElement[]>([]);\n const [viewMode, setViewMode] = useState<'formatted' | 'raw'>('formatted');\n const zoomTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const { downloadVectorFile, getFileBlob } = useVectorStore();\n const packageSettings = usePackageSettingsStore();\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('md'));\n\n\n const isDarkTheme = theme.palette.mode === 'dark';\n\n useEffect(() => {\n if (typeof window !== 'undefined') {\n \n pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdn.burtson.ai/scripts/pdf.worker.js';\n }\n }, [])\n useEffect(() => {\n return () => {\n if (zoomTimeoutRef.current) {\n clearTimeout(zoomTimeoutRef.current);\n }\n };\n }, []);\n\n const baseContent = fullContent || doc?.content || '';\n const filename = doc?.name || '';\n const formattedContent = useMemo(\n () => getFormattedContent(baseContent, filename),\n [baseContent, filename]\n );\n\n const highlightLanguage = useMemo(() => {\n if (!filename || !isCodeFile(filename)) {\n return \"\";\n }\n return getLanguageFromFilename(filename).toLowerCase();\n }, [filename]);\n\n const highlightTree = useMemo<Root | null>(() => {\n if (!highlightLanguage) {\n return null;\n }\n return getHighlightTree(formattedContent, highlightLanguage);\n }, [formattedContent, highlightLanguage]);\n\n const highlightedNodes = useMemo(() => {\n if (!highlightTree) {\n return [] as React.ReactNode[];\n }\n\n const highlightChildren = (highlightTree.children || []).filter((node): node is Element | Text => {\n return node.type === \"element\" || node.type === \"text\";\n });\n\n return renderLowlightChildren(\n highlightChildren,\n `hl-doc-${highlightLanguage || \"auto\"}`\n );\n }, [highlightTree, highlightLanguage]);\n\n const resolvedHighlightLanguage = useMemo(() => {\n const data = highlightTree?.data;\n if (data && typeof data === \"object\" && data !== null && \"language\" in data) {\n const languageValue = (data as { language?: unknown }).language;\n if (typeof languageValue === \"string\") {\n return languageValue.toLowerCase();\n }\n }\n return highlightLanguage;\n }, [highlightTree, highlightLanguage]);\n\n const renderPdfPage = async (pdf: PDFDocumentProxy, pageNumber: number, scale: number = 1.2): Promise<HTMLCanvasElement> => {\n const page = await pdf.getPage(pageNumber);\n const viewport = page.getViewport({ scale });\n \n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('Unable to obtain 2D context for PDF rendering');\n }\n canvas.height = viewport.height;\n canvas.width = viewport.width;\n\n const renderContext = {\n canvasContext: context,\n viewport: viewport\n };\n\n await page.render(renderContext).promise;\n return canvas;\n };\n\n const loadPdfDocument = useCallback(async (arrayBuffer: ArrayBuffer) => {\n try {\n const pdf = await pdfjsLib.getDocument({ data: arrayBuffer }).promise;\n setPdfDocument(pdf);\n setTotalPages(pdf.numPages);\n setCurrentPage(1);\n\n // Render all pages\n const canvases: HTMLCanvasElement[] = [];\n for (let i = 1; i <= pdf.numPages; i++) {\n const canvas = await renderPdfPage(pdf, i, pdfScale);\n canvases.push(canvas);\n }\n setPdfCanvases(canvases);\n } catch (err) {\n debugLogger.error(\"Failed to load PDF\", { error: err });\n throw err;\n }\n }, [pdfScale]);\n\n // Helper function to create blob from local file rawData\n const createLocalFileBlob = (doc: KnowledgeDoc): Blob => {\n if (!doc.rawData) {\n throw new Error('No raw data available for local file');\n }\n \n const binaryString = atob(doc.rawData);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n const mimeType = doc.type || doc.mimeType || 'application/octet-stream';\n return new Blob([bytes], { type: mimeType });\n };\n\n const loadPdfFromDataUrl = async (dataUrl: string) => {\n try {\n setLoading(true);\n setError(null);\n \n const response = await fetch(dataUrl);\n const arrayBuffer = await response.arrayBuffer();\n await loadPdfDocument(arrayBuffer);\n } catch (err) {\n debugLogger.error('Failed to load PDF from data URL', { error: err });\n setError('Failed to load PDF preview');\n } finally {\n setLoading(false);\n }\n };\n\n const loadFullContent = useCallback(async () => {\n if (!doc) return;\n \n setLoading(true);\n setError(null);\n \n try {\n if (isPDF(doc.name)) {\n // For PDF files, get the binary data and render it\n const fileBlob = await getFileBlob(doc.id);\n const arrayBuffer = await fileBlob.arrayBuffer();\n await loadPdfDocument(arrayBuffer);\n } else {\n // For text files, get the text content\n const fileBlob = await getFileBlob(doc.id);\n const content = await fileBlob.text();\n setFullContent(content);\n }\n } catch (err) {\n debugLogger.error('Failed to load full file content', { error: err });\n if (isPDF(doc.name)) {\n setError('Failed to load PDF. The file may be corrupted or too large.');\n } else {\n setError('Failed to load full file content. Showing preview instead.');\n setFullContent(doc.content || '');\n }\n } finally {\n setLoading(false);\n }\n }, [doc, getFileBlob, loadPdfDocument]);\n\n useEffect(() => {\n if (open && doc && isVectorDocument) {\n loadFullContent();\n } else if (open && doc) {\n if (isPDF(doc.name)) {\n if (doc.rawData) {\n try {\n const blob = createLocalFileBlob(doc);\n const arrayBuffer = blob.arrayBuffer();\n arrayBuffer.then(loadPdfDocument).catch(err => {\n debugLogger.error(\"Failed to load local PDF\", { error: err });\n setError('Failed to load PDF preview');\n });\n } catch (err) {\n debugLogger.error(\"Failed to create blob from local PDF data\", { error: err });\n setError('PDF preview not available for this document');\n }\n } else {\n setError('PDF preview not available for this document');\n }\n } else {\n setFullContent(doc.content || '');\n }\n }\n \n if (!open) {\n setPdfDocument(null);\n setPdfCanvases([]);\n setCurrentPage(1);\n setTotalPages(0);\n setPdfScale(1.2);\n setFullContent('');\n setError(null);\n setViewMode('formatted');\n }\n }, [open, doc, isVectorDocument, loadFullContent, loadPdfDocument]);\n\n const handleZoomIn = async () => {\n // Clear any existing timeout\n if (zoomTimeoutRef.current) {\n clearTimeout(zoomTimeoutRef.current);\n }\n \n const newScale = Math.min(pdfScale + 0.25, 3.0);\n setPdfScale(newScale);\n \n // Debounce the actual re-rendering to prevent rapid successive calls\n zoomTimeoutRef.current = setTimeout(async () => {\n if (pdfDocument) {\n setLoading(true);\n try {\n const canvases: HTMLCanvasElement[] = [];\n for (let i = 1; i <= pdfDocument.numPages; i++) {\n const canvas = await renderPdfPage(pdfDocument, i, newScale);\n canvases.push(canvas);\n }\n setPdfCanvases(canvases);\n } catch (error) {\n debugLogger.error('Zoom in failed', { error });\n // Revert to previous scale on error\n setPdfScale(pdfScale);\n } finally {\n setLoading(false);\n }\n }\n }, 300); // 300ms debounce\n };\n\n const handleZoomOut = async () => {\n if (zoomTimeoutRef.current) {\n clearTimeout(zoomTimeoutRef.current);\n }\n \n const newScale = Math.max(pdfScale - 0.25, 0.5);\n setPdfScale(newScale);\n \n zoomTimeoutRef.current = setTimeout(async () => {\n if (pdfDocument) {\n setLoading(true);\n try {\n const canvases: HTMLCanvasElement[] = [];\n for (let i = 1; i <= pdfDocument.numPages; i++) {\n const canvas = await renderPdfPage(pdfDocument, i, newScale);\n canvases.push(canvas);\n }\n setPdfCanvases(canvases);\n } catch (error) {\n debugLogger.error('Zoom out failed', { error });\n setPdfScale(pdfScale);\n } finally {\n setLoading(false);\n }\n }\n }, 300);\n };\n\n const handleDownload = async () => {\n if (!doc || !isVectorDocument) return;\n \n try {\n await downloadVectorFile(doc.id, doc.name);\n } catch (err) {\n debugLogger.error('Vector document download failed', { error: err, docId: doc.id });\n }\n };\n return (\n <Dialog fullScreen open={open} onClose={onClose}>\n <AppBar sx={{ position: \"relative\" }}>\n <Toolbar>\n {/* Document info section with badge and title */}\n <Box sx={{ display: 'flex', alignItems: 'center', flex: 1, minWidth: 0 }}>\n {/* Document type badge */}\n {doc && (\n <Box sx={{ mr: 1, flexShrink: 0 }}>\n {(() => {\n const fileInfo = getFileTypeInfo(doc.name);\n const IconComponent = fileInfo.icon;\n return (\n <Tooltip title={`${fileInfo.category} file`} placement=\"bottom\">\n <Box \n sx={{ \n display: 'flex', \n alignItems: 'center', \n bgcolor: fileInfo.color, \n color: 'white', \n borderRadius: 1, \n px: 1, \n py: 0.25,\n fontSize: '0.75rem',\n fontWeight: 'bold'\n }}\n >\n <IconComponent sx={{ fontSize: '1rem', mr: 0.5 }} />\n {fileInfo.language || fileInfo.category}\n </Box>\n </Tooltip>\n );\n })()}\n </Box>\n )}\n \n {/* Title with responsive truncation */}\n <Tooltip title={doc?.name || ''} placement=\"bottom-start\">\n <Typography \n sx={{ \n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n // Responsive max width for title truncation\n maxWidth: {\n xs: '120px', // Mobile: very short for small screens (reduced to account for badge)\n sm: '180px', // Small tablet: short (reduced)\n md: '280px', // Medium: medium length (reduced)\n lg: '380px', // Large: longer (reduced)\n xl: '480px' // Extra large: longest (reduced)\n },\n cursor: 'help' // Indicate tooltip is available\n }} \n variant=\"h6\"\n >\n {doc?.name}\n </Typography>\n </Tooltip>\n \n {/* Additional file info - only show page count for PDFs */}\n <Box sx={{ display: 'flex', alignItems: 'center', flexShrink: 0, ml: 1 }}>\n {isPDF(doc?.name || '') && totalPages > 0 && (\n <Typography component=\"span\" variant=\"body2\" sx={{ opacity: 0.8 }}>\n ({totalPages} page{totalPages > 1 ? 's' : ''})\n </Typography>\n )}\n </Box>\n </Box>\n \n {/* Toolbar actions section */}\n <Box sx={{ display: 'flex', alignItems: 'center', flexShrink: 0, gap: 1 }}>\n {/* Code View Toggle for non-PDF files */}\n {!isPDF(doc?.name || '') && isCodeFile(doc?.name || '') && (\n <ToggleButtonGroup\n value={viewMode}\n exclusive\n onChange={(e, newMode) => newMode && setViewMode(newMode)}\n size=\"small\"\n >\n <ToggleButton value=\"formatted\" sx={{ color: 'inherit' }}>\n <CodeIcon sx={{ mr: 1, fontSize: '1rem' }} />\n Formatted\n </ToggleButton>\n <ToggleButton value=\"raw\" sx={{ color: 'inherit' }}>\n <TextFieldsIcon sx={{ mr: 1, fontSize: '1rem' }} />\n Raw\n </ToggleButton>\n </ToggleButtonGroup>\n )}\n \n {/* PDF Navigation Controls - Hidden on mobile */}\n {isPDF(doc?.name || '') && pdfDocument && !isMobile && (\n <>\n <Button \n color=\"inherit\" \n startIcon={<ZoomOutIcon />}\n onClick={handleZoomOut}\n disabled={pdfScale <= 0.5}\n size=\"small\"\n >\n Zoom Out\n </Button>\n <Typography variant=\"body2\" sx={{ color: 'inherit', mx: 1 }}>\n {Math.round(pdfScale * 100)}%\n </Typography>\n <Button \n color=\"inherit\" \n startIcon={<ZoomInIcon />}\n onClick={handleZoomIn}\n disabled={pdfScale >= 3.0}\n size=\"small\"\n >\n Zoom In\n </Button>\n </>\n )}\n \n {/* Download and Close buttons */}\n {isVectorDocument && (\n <IconButton edge=\"end\" color=\"inherit\" onClick={handleDownload}>\n <DownloadIcon />\n </IconButton>\n )}\n <IconButton edge=\"end\" color=\"inherit\" onClick={onClose}>\n <CloseIcon />\n </IconButton>\n </Box>\n </Toolbar>\n </AppBar>\n <Box sx={{ p: 3, bgcolor: \"background.default\", height: \"100%\", overflowY: \"auto\" }}>\n {loading && (\n <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '50vh' }}>\n <CircularProgress />\n <Typography sx={{ ml: 2 }}>\n {isPDF(doc?.name || '') ? 'Loading PDF document...' : 'Loading full file content...'}\n </Typography>\n </Box>\n )}\n \n {error && (\n <Alert severity=\"warning\" sx={{ mb: 2 }}>\n {error}\n </Alert>\n )}\n \n {!loading && isPDF(doc?.name || '') && pdfCanvases.length > 0 && (\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 2 }}>\n {pdfCanvases.map((canvas, index) => (\n <Paper \n key={index} \n elevation={3} \n sx={{ \n p: 2, \n mb: 2,\n maxWidth: '100%',\n overflow: 'auto',\n // Custom scrollbar styling for PDF viewer\n '&::-webkit-scrollbar': {\n width: '8px',\n height: '8px',\n },\n '&::-webkit-scrollbar-track': {\n background: isDarkTheme ? '#2d2d2d' : '#f5f5f5',\n borderRadius: '4px',\n },\n '&::-webkit-scrollbar-thumb': {\n background: isDarkTheme ? '#555' : '#c1c1c1',\n borderRadius: '4px',\n '&:hover': {\n background: isDarkTheme ? '#666' : '#a1a1a1',\n },\n },\n '&::-webkit-scrollbar-corner': {\n background: isDarkTheme ? '#2d2d2d' : '#f5f5f5',\n },\n // Firefox scrollbar support\n scrollbarWidth: 'thin',\n scrollbarColor: isDarkTheme ? '#555 #2d2d2d' : '#c1c1c1 #f5f5f5',\n }}\n >\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mb: 1, display: 'block' }}>\n Page {index + 1} of {totalPages}\n </Typography>\n <Box\n ref={(el: HTMLDivElement | null) => {\n if (el && canvas) {\n el.innerHTML = '';\n el.appendChild(canvas);\n }\n }}\n sx={{\n '& canvas': {\n display: 'block',\n maxWidth: '100%',\n height: 'auto',\n border: '1px solid',\n borderColor: 'divider',\n }\n }}\n />\n </Paper>\n ))}\n </Box>\n )}\n \n {!loading && !isPDF(doc?.name || '') && (\n <Box>\n {isCodeFile(doc?.name || '') && viewMode === 'formatted' ? (\n <Box>\n {/* Language indicator */}\n <Box sx={{ mb: 2, display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Syntax highlighted as <strong>{getLanguageFromFilename(doc?.name || '').toUpperCase()}</strong>\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {(fullContent || doc?.content || '').split('\\n').length} lines\n </Typography>\n </Box>\n \n <Paper \n elevation={1} \n sx={{ \n overflow: 'auto',\n maxHeight: { xs: 'calc(100vh - 320px)', sm: 'calc(100vh - 280px)' },\n border: '1px solid',\n borderColor: 'divider',\n // Custom scrollbar styling to match theme\n '&::-webkit-scrollbar': {\n width: { xs: '8px', sm: '12px' },\n height: { xs: '8px', sm: '12px' },\n },\n '&::-webkit-scrollbar-track': {\n backgroundColor: isDarkTheme ? '#2d2d2d' : '#f5f5f5',\n borderRadius: '6px',\n },\n '&::-webkit-scrollbar-thumb': {\n backgroundColor: isDarkTheme ? '#555' : '#c1c1c1',\n borderRadius: '6px',\n border: isDarkTheme ? '2px solid #2d2d2d' : '2px solid #f5f5f5',\n '&:hover': {\n backgroundColor: isDarkTheme ? '#777' : '#a8a8a8',\n },\n },\n '&::-webkit-scrollbar-corner': {\n backgroundColor: isDarkTheme ? '#2d2d2d' : '#f5f5f5',\n },\n // Firefox scrollbar styling\n scrollbarWidth: 'thin',\n scrollbarColor: isDarkTheme ? '#555 #2d2d2d' : '#c1c1c1 #f5f5f5',\n '& pre': {\n margin: 0,\n padding: { xs: '12px !important', sm: '16px !important' },\n borderRadius: '8px',\n fontSize: { xs: '12px', sm: '14px' },\n lineHeight: 1.5,\n // Better mobile text handling\n wordBreak: 'break-word',\n overflowWrap: 'anywhere',\n }\n }}\n >\n <Box\n sx={{\n '& .hljs': {\n display: 'block',\n padding: { xs: '12px', sm: '16px' },\n margin: 0,\n fontSize: { xs: '12px', sm: '14px' },\n lineHeight: 1.55,\n backgroundColor: isDarkTheme ? '#0f172a' : '#f5f6ff',\n color: isDarkTheme ? '#e2e8f0' : '#1e293b',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowWrap: 'anywhere',\n },\n '& .hljs-comment, & .hljs-quote': {\n color: isDarkTheme ? '#64748b' : '#64748b',\n fontStyle: 'italic',\n },\n '& .hljs-keyword, & .hljs-selector-tag, & .hljs-literal, & .hljs-built_in': {\n color: isDarkTheme ? '#c792ea' : '#7c3aed',\n },\n '& .hljs-string, & .hljs-doctag, & .hljs-template-tag, & .hljs-attr': {\n color: isDarkTheme ? '#7fdbca' : '#0f766e',\n },\n '& .hljs-number, & .hljs-symbol, & .hljs-bullet, & .hljs-meta': {\n color: isDarkTheme ? '#f78c6c' : '#b45309',\n },\n '& .hljs-title, & .hljs-section, & .hljs-selector-id, & .hljs-function': {\n color: isDarkTheme ? '#82aaff' : '#2563eb',\n },\n '& .hljs-variable, & .hljs-params, & .hljs-property': {\n color: isDarkTheme ? '#f07178' : '#d97706',\n },\n }}\n >\n <pre className={`hljs language-${resolvedHighlightLanguage || 'text'}`}>\n <code className=\"hljs\">\n {highlightedNodes.length > 0 ? highlightedNodes : formattedContent}\n </code>\n </pre>\n </Box>\n </Paper>\n </Box>\n ) : (\n <Typography\n component=\"pre\"\n variant=\"body2\"\n sx={{\n whiteSpace: \"pre-wrap\",\n fontFamily: \"monospace\",\n color: \"text.primary\",\n lineHeight: 1.5,\n bgcolor: 'background.paper',\n p: 2,\n borderRadius: 1,\n border: '1px solid',\n borderColor: 'divider',\n overflow: 'auto',\n maxHeight: 'calc(100vh - 200px)',\n }}\n >\n {fullContent || doc?.content}\n </Typography>\n )}\n </Box>\n )}\n \n {!loading && isPDF(doc?.name || '') && pdfCanvases.length === 0 && !error && (\n <Box sx={{ textAlign: 'center', py: 4 }}>\n <Typography variant=\"h6\" color=\"text.secondary\" gutterBottom>\n PDF Preview Not Available\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n This PDF file cannot be previewed. You can download it to view the full content.\n </Typography>\n {isVectorDocument && (\n <Button \n variant=\"contained\" \n startIcon={<DownloadIcon />}\n onClick={handleDownload}\n sx={{ mt: 2 }}\n >\n Download PDF\n </Button>\n )}\n </Box>\n )}\n </Box>\n </Dialog>\n );\n};\n\nexport default KnowledgeFileModal;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-B487-385EFF\nconst __banditFingerprint_utils_lowlightts = 'BL-FP-1A7DC2-C4E1';\nconst __auditTrail_utils_lowlightts = 'BL-AU-MGOIKVWA-DTLK';\n// File: lowlight.ts | Path: src/utils/lowlight.ts | Hash: b487c4e1\n\nimport { createLowlight } from 'lowlight';\n\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport typescript from 'highlight.js/lib/languages/typescript';\nimport json from 'highlight.js/lib/languages/json';\nimport bash from 'highlight.js/lib/languages/bash';\nimport shell from 'highlight.js/lib/languages/shell';\nimport yaml from 'highlight.js/lib/languages/yaml';\nimport python from 'highlight.js/lib/languages/python';\nimport css from 'highlight.js/lib/languages/css';\nimport xml from 'highlight.js/lib/languages/xml';\nimport markdown from 'highlight.js/lib/languages/markdown';\nimport sql from 'highlight.js/lib/languages/sql';\nimport java from 'highlight.js/lib/languages/java';\nimport csharp from 'highlight.js/lib/languages/csharp';\nimport cpp from 'highlight.js/lib/languages/cpp';\nimport go from 'highlight.js/lib/languages/go';\nimport rust from 'highlight.js/lib/languages/rust';\nimport kotlin from 'highlight.js/lib/languages/kotlin';\nimport swift from 'highlight.js/lib/languages/swift';\nimport scala from 'highlight.js/lib/languages/scala';\nimport ruby from 'highlight.js/lib/languages/ruby';\nimport php from 'highlight.js/lib/languages/php';\nimport powershell from 'highlight.js/lib/languages/powershell';\n\nconst lowlight = createLowlight();\n\ntype LowlightInstance = ReturnType<typeof createLowlight>;\ntype LowlightLanguage = Parameters<LowlightInstance['register']>[1];\n\nconst asLanguage = (language: unknown): LowlightLanguage =>\n language as LowlightLanguage;\n\nconst registrations: Record<string, LowlightLanguage> = {\n javascript: asLanguage(javascript),\n js: asLanguage(javascript),\n jsx: asLanguage(javascript),\n typescript: asLanguage(typescript),\n ts: asLanguage(typescript),\n tsx: asLanguage(typescript),\n json: asLanguage(json),\n bash: asLanguage(bash),\n shell: asLanguage(shell),\n sh: asLanguage(shell),\n yaml: asLanguage(yaml),\n yml: asLanguage(yaml),\n python: asLanguage(python),\n py: asLanguage(python),\n css: asLanguage(css),\n html: asLanguage(xml),\n xml: asLanguage(xml),\n markdown: asLanguage(markdown),\n md: asLanguage(markdown),\n sql: asLanguage(sql),\n java: asLanguage(java),\n csharp: asLanguage(csharp),\n cs: asLanguage(csharp),\n cpp: asLanguage(cpp),\n c: asLanguage(cpp),\n h: asLanguage(cpp),\n go: asLanguage(go),\n rust: asLanguage(rust),\n rs: asLanguage(rust),\n kotlin: asLanguage(kotlin),\n kt: asLanguage(kotlin),\n swift: asLanguage(swift),\n scala: asLanguage(scala),\n ruby: asLanguage(ruby),\n rb: asLanguage(ruby),\n php: asLanguage(php),\n powershell: asLanguage(powershell),\n ps1: asLanguage(powershell),\n};\n\nObject.entries(registrations).forEach(([name, language]) => {\n if (!lowlight.listLanguages().includes(name)) {\n lowlight.register(name, language);\n }\n});\n\nexport function getHighlightTree(code: string, language?: string) {\n const lang = language?.toLowerCase();\n if (lang && lowlight.listLanguages().includes(lang)) {\n return lowlight.highlight(lang, code);\n }\n return lowlight.highlightAuto(code);\n}\n\nexport { lowlight };\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-27B9-B757B8\nconst __banditFingerprint_utils_markdownRenderingtsx = 'BL-FP-CD0811-8EE4';\nconst __auditTrail_utils_markdownRenderingtsx = 'BL-AU-MGOIKVWA-MS82';\n// File: markdownRendering.tsx | Path: src/utils/markdownRendering.tsx | Hash: 27b98ee4\n\nimport React from \"react\";\nimport type { Element, Text } from \"hast\";\nimport { defaultSchema } from \"rehype-sanitize\";\n\nexport const markdownSanitizeSchema = (() => {\n const schema = JSON.parse(JSON.stringify(defaultSchema));\n schema.tagNames = Array.from(\n new Set([...(schema.tagNames || []), \"span\", \"sup\", \"sub\"])\n );\n schema.attributes = {\n ...(schema.attributes || {}),\n \"*\": Array.from(\n new Set([...(schema.attributes?.[\"*\"] || []), \"className\", \"id\", \"data*\"])\n ),\n span: Array.from(\n new Set([\n ...(schema.attributes?.span || []),\n \"className\",\n \"data-bl-delay\",\n \"data*\",\n \"id\",\n ])\n ),\n code: Array.from(\n new Set([\n ...(schema.attributes?.code || []),\n \"className\",\n \"data-language\",\n \"data*\",\n \"id\",\n ])\n ),\n pre: Array.from(\n new Set([...(schema.attributes?.pre || []), \"className\", \"data*\", \"id\"])\n ),\n sup: Array.from(\n new Set([...(schema.attributes?.sup || []), \"className\", \"data*\", \"id\"])\n ),\n a: Array.from(\n new Set([...(schema.attributes?.a || []), \"className\", \"data*\", \"id\"])\n ),\n };\n schema.clobberPrefix = \"bl\";\n schema.allowComments = false;\n schema.strip = [\"script\", \"style\"];\n return schema;\n})();\n\nexport const renderLowlightChildren = (\n nodes: Array<Element | Text>,\n keyPrefix: string\n): React.ReactNode[] =>\n nodes.map((node, index) => {\n if (node.type === \"text\") {\n return node.value;\n }\n\n if (node.type === \"element\") {\n const key = `${keyPrefix}-${index}`;\n const { tagName, properties = {}, children = [] } = node;\n const reactProps: Record<string, unknown> = { key };\n\n Object.entries(properties).forEach(([propKey, value]) => {\n if (propKey === \"className\" && Array.isArray(value)) {\n reactProps.className = value.join(\" \");\n } else if (value !== null && value !== undefined) {\n reactProps[propKey] = value;\n }\n });\n\n return React.createElement(\n tagName,\n reactProps,\n renderLowlightChildren(children as Array<Element | Text>, key)\n );\n }\n\n return null;\n });\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-39FF-8FD178\nconst __banditFingerprint_chatmodal_airesponseactionbartsx = 'BL-FP-F5CD26-176D';\nconst __auditTrail_chatmodal_airesponseactionbartsx = 'BL-AU-MGOIKVVL-8RC1';\n// File: ai-response-action-bar.tsx | Path: src/modals/chat-modal/ai-response-action-bar.tsx | Hash: 39ff176d\n\nimport { useState, useEffect } from \"react\";\nimport { useVoiceStore } from \"../../store/voiceStore\";\nimport { usePreferencesStore } from \"../../store/preferencesStore\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { useTTS } from \"../../hooks/useTTS\";\nimport { Box, CircularProgress, IconButton, Tooltip } from \"@mui/material\";\nimport CheckIcon from \"@mui/icons-material/Check\";\nimport ThumbUpIcon from \"@mui/icons-material/ThumbUp\";\nimport ThumbDownIcon from \"@mui/icons-material/ThumbDown\";\nimport ContentCopyIcon from \"@mui/icons-material/ContentCopy\";\nimport { CampaignOutlined, CampaignRounded } from \"@mui/icons-material\";\nimport StopIcon from \"@mui/icons-material/Stop\";\nimport PauseIcon from \"@mui/icons-material/Pause\";\nimport PlayArrowIcon from \"@mui/icons-material/PlayArrow\";\nimport { debugLogger } from \"../../services/logging/debugLogger\";\nimport { authenticationService } from \"../../services/auth/authenticationService\";\n\nconst AiResponseActionsBar: React.FC<{ text: string }> = ({ text }) => {\n const [copied, setCopied] = useState(false);\n const [feedback, setFeedback] = useState<\"like\" | \"dislike\" | null>(null);\n \n const {\n isPlaying,\n isPaused,\n isLoading,\n error: ttsError,\n speak: ttsSpeak,\n stop: ttsStop,\n pause: ttsPause,\n resume: ttsResume,\n isAvailable: isTTSAvailable\n } = useTTS();\n\n const { availableVoices, loadVoicesFromAPI, initialized } = useVoiceStore();\n const { preferences } = usePreferencesStore();\n const { settings: packageSettings } = usePackageSettingsStore();\n\n // Load voices when component mounts if none are available\n useEffect(() => {\n const isAuthenticated = authenticationService.isAuthenticated();\n const token = authenticationService.getToken();\n \n if (!initialized || availableVoices.length === 0) {\n if (token && isAuthenticated) {\n debugLogger.debug('AI Action Bar: Voices not initialized or unavailable, attempting to load from API');\n loadVoicesFromAPI();\n } else {\n debugLogger.debug('AI Action Bar: No valid JWT token available - skipping voice loading');\n }\n }\n }, [initialized, availableVoices.length, loadVoicesFromAPI]);\n\n // Show TTS error if any\n useEffect(() => {\n if (ttsError) {\n debugLogger.error('TTS Error in action bar:', { error: ttsError });\n }\n }, [ttsError]);\n\n const handleCopy = () => {\n // Remove HTML tags\n let plainText = text.replace(/<\\/?[^>]+(>|$)/g, \"\");\n\n // Remove Markdown syntax\n plainText = plainText\n .replace(/`{1,3}[\\s\\S]*?`{1,3}/g, \"\") // inline and block code\n .replace(/!\\[.*?\\]\\(.*?\\)/g, \"\") // images\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\") // links\n .replace(/[*_~`>#-]/g, \"\") // emphasis, headings, etc.\n .replace(/^\\s*\\d+\\s*[:.]?\\s*$/gm, \"\") // numbered list items like \"1. :\" or \"2:\"\n .replace(/^\\s*[:.]+\\s*$/gm, \"\") // lines with just colons or periods\n .replace(/:+(?=\\s|$)/g, \"\") // trailing colons\n .replace(/\\n{3,}/g, \"\\n\\n\"); // limit excessive line breaks\n\n plainText = plainText.trim();\n\n navigator.clipboard.writeText(plainText);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const handleTTSClick = async () => {\n try {\n if (!isTTSAvailable) {\n return;\n }\n\n if (isPaused) {\n // If paused, resume\n ttsResume();\n } else if (!isPlaying) {\n // If idle or error, start playing with streaming\n // Clean the text first - remove HTML tags and Markdown syntax\n let cleanText = text.replace(/<\\/?[^>]+(>|$)/g, \"\");\n\n // Remove Markdown syntax\n cleanText = cleanText\n .replace(/`{1,3}[\\s\\S]*?`{1,3}/g, \"\") // inline and block code\n .replace(/!\\[.*?\\]\\(.*?\\)/g, \"\") // images\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\") // links\n .replace(/[*_~`>#-]/g, \"\") // emphasis, headings, etc.\n .replace(/^\\s*\\d+\\s*[:.]?\\s*$/gm, \"\") // numbered list items like \"1. :\" or \"2:\"\n .replace(/^\\s*[:.]+\\s*$/gm, \"\") // lines with just colons or periods\n .replace(/:+(?=\\s|$)/g, \"\") // trailing colons\n .replace(/\\n{3,}/g, \"\\n\\n\"); // limit excessive line breaks\n\n cleanText = cleanText.trim();\n\n if (!cleanText) {\n return;\n }\n\n await ttsSpeak(cleanText, { \n useStreaming: true, // Enable streaming for faster response\n useRealtime: true // Use real-time streaming for immediate playback\n });\n }\n // Note: If already playing, do nothing (pause and stop have their own buttons)\n } catch (error) {\n debugLogger.error('TTS playback failed:', { \n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n }\n };\n\n const handleFeedback = (type: \"like\" | \"dislike\") => {\n setFeedback(type);\n // Example: memoryEnhancer.addMemory(`User ${type === \"like\" ? \"liked\" : \"disliked\"} this response`);\n };\n\n return (\n <Box sx={{ mt: 2, display: \"flex\", gap: 2, alignItems: \"center\", flexWrap: \"wrap\" }}>\n <Tooltip title={copied ? \"Copied!\" : \"Copy entire response\"}>\n <IconButton\n onClick={handleCopy}\n size=\"small\"\n sx={{\n color: (theme) =>\n theme.palette.mode === \"dark\" ? \"#ccc\" : \"#555\",\n \"&:hover\": {\n color: (theme) =>\n theme.palette.mode === \"dark\" ? \"#fff\" : \"#000\",\n },\n }}\n >\n {copied ? <CheckIcon sx={{ fontSize: 18 }} /> : <ContentCopyIcon sx={{ fontSize: 18 }} />}\n </IconButton>\n </Tooltip>\n\n {isTTSAvailable && ( \n <>\n {/* Main TTS Button - Play/Resume */}\n <Tooltip\n title={\n !isTTSAvailable ? \"TTS not available - check configuration\" :\n isLoading ? \"Loading audio...\" :\n isPaused ? \"Resume playback\" :\n isPlaying ? \"Playing audio...\" :\n \"Play response with voice\"\n }\n >\n <IconButton\n onClick={handleTTSClick}\n size=\"small\"\n disabled={isLoading}\n sx={{\n color: (theme) =>\n theme.palette.mode === \"dark\" ? \"#ccc\" : \"#555\",\n \"&:hover\": {\n color: (theme) =>\n theme.palette.mode === \"dark\" ? \"#fff\" : \"#000\",\n },\n \"&:disabled\": {\n color: (theme) =>\n theme.palette.mode === \"dark\" ? \"#666\" : \"#aaa\",\n },\n }}\n >\n {isLoading ? (\n <CircularProgress size={18} />\n ) : isPaused ? (\n <PlayArrowIcon sx={{ fontSize: 18 }} />\n ) : !isPlaying ? (\n <CampaignOutlined sx={{ fontSize: 18 }} />\n ) : (\n <CampaignRounded sx={{ fontSize: 18, color: '#4caf50' }} />\n )}\n </IconButton>\n </Tooltip>\n\n {/* Pause Button - Only show when playing */}\n {isPlaying && (\n <Tooltip title=\"Pause playback\">\n <IconButton\n onClick={() => ttsPause()}\n size=\"small\"\n sx={{\n color: (theme) =>\n theme.palette.mode === \"dark\" ? \"#ccc\" : \"#555\",\n \"&:hover\": {\n color: (theme) =>\n theme.palette.mode === \"dark\" ? \"#fff\" : \"#000\",\n },\n }}\n >\n <PauseIcon sx={{ fontSize: 18 }} />\n </IconButton>\n </Tooltip>\n )}\n\n {/* Stop Button - Show when playing or paused */}\n {(isPlaying || isPaused) && (\n <Tooltip title=\"Stop playback\">\n <IconButton\n onClick={() => ttsStop()}\n size=\"small\"\n sx={{\n color: (theme) =>\n theme.palette.mode === \"dark\" ? \"#ccc\" : \"#555\",\n \"&:hover\": {\n color: (theme) =>\n theme.palette.mode === \"dark\" ? \"#fff\" : \"#000\",\n },\n }}\n >\n <StopIcon sx={{ fontSize: 18 }} />\n </IconButton>\n </Tooltip>\n )}\n </>\n )}\n\n <Tooltip title=\"Like this response\">\n <IconButton\n onClick={() => handleFeedback(\"like\")}\n size=\"small\"\n sx={{\n color: feedback === \"like\"\n ? \"#00e676\"\n : (theme) =>\n theme.palette.mode === \"dark\" ? \"#ccc\" : \"#555\",\n \"&:hover\": {\n color: feedback === \"like\"\n ? \"#00e676\"\n : (theme) =>\n theme.palette.mode === \"dark\" ? \"#fff\" : \"#000\",\n },\n }}\n >\n <ThumbUpIcon sx={{ fontSize: 18 }} />\n </IconButton>\n </Tooltip>\n\n <Tooltip title=\"Dislike this response\">\n <IconButton\n onClick={() => handleFeedback(\"dislike\")}\n sx={{\n color: feedback === \"dislike\"\n ? \"#ff1744\"\n : (theme) =>\n theme.palette.mode === \"dark\" ? \"#ccc\" : \"#555\",\n \"&:hover\": {\n color: feedback === \"dislike\"\n ? \"#ff1744\"\n : (theme) =>\n theme.palette.mode === \"dark\" ? \"#fff\" : \"#000\",\n },\n }}\n >\n <ThumbDownIcon sx={{ fontSize: 18 }} />\n </IconButton>\n </Tooltip>\n </Box>\n );\n};\n\nexport default AiResponseActionsBar;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-6EA5-62113F\nconst __banditFingerprint_store_voiceStorets = 'BL-FP-BD24FF-7D8B';\nconst __auditTrail_store_voiceStorets = 'BL-AU-MGOIKVW6-SCLC';\n// File: voiceStore.ts | Path: src/store/voiceStore.ts | Hash: 6ea57d8b\n\nimport { create } from \"zustand\";\nimport { voiceService, VoiceModelsResponse } from \"../services/tts/voiceService\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport { stopTTS } from \"../services/tts/streaming-tts\";\n\n// Auto-initialize voice loading when store is created\nlet autoInitialized = false;\n\nexport interface VoiceState {\n availableVoices: string[];\n selectedVoice: string;\n defaultVoice: string;\n fallbackVoice: string;\n isLoading: boolean;\n isServiceAvailable: boolean;\n initialized: boolean;\n setSelectedVoice: (voice: string) => void;\n loadVoicesFromAPI: () => Promise<void>;\n refreshVoices: () => Promise<void>;\n forceInitialize: () => Promise<void>;\n}\n\nexport const useVoiceStore = create<VoiceState>((set, get) => ({\n availableVoices: [],\n selectedVoice: \"\",\n defaultVoice: \"\", \n fallbackVoice: \"\",\n isLoading: false,\n isServiceAvailable: false,\n initialized: false,\n \n setSelectedVoice: (voice) => {\n const currentVoice = get().selectedVoice;\n debugLogger.debug('Setting selected voice', { \n previousVoice: currentVoice, \n newVoice: voice,\n isChange: currentVoice !== voice\n });\n \n // If voice is actually changing, immediately stop current TTS\n if (currentVoice && currentVoice !== voice) {\n debugLogger.debug('🔄 Voice changing in store - stopping TTS immediately', {\n from: currentVoice,\n to: voice\n });\n stopTTS();\n }\n \n set({ selectedVoice: voice });\n },\n \n loadVoicesFromAPI: async () => {\n const state = get();\n if (state.isLoading) return; // Prevent concurrent requests\n \n set({ isLoading: true, initialized: true });\n \n try {\n const voiceData: VoiceModelsResponse = await voiceService.fetchAvailableVoices();\n \n const hasVoices = voiceData.models.length > 0;\n let finalSelectedVoice = state.selectedVoice;\n \n if (hasVoices) {\n // Validate and set selected voice\n if (finalSelectedVoice && voiceData.models.includes(finalSelectedVoice)) {\n // Keep current selection if it's still available\n } else {\n finalSelectedVoice = voiceData.defaultModel;\n }\n \n set({\n isServiceAvailable: true,\n availableVoices: voiceData.models,\n defaultVoice: voiceData.defaultModel,\n fallbackVoice: voiceData.fallbackModel,\n selectedVoice: finalSelectedVoice,\n isLoading: false\n });\n } else {\n set({\n isServiceAvailable: false,\n isLoading: false\n });\n }\n } catch (error) {\n debugLogger.error('Failed to load voice models', { \n error: error instanceof Error ? error.message : String(error)\n });\n set({\n isServiceAvailable: false,\n isLoading: false\n });\n }\n },\n \n refreshVoices: async () => {\n const currentSelection = get().selectedVoice;\n voiceService.clearCache();\n await get().loadVoicesFromAPI();\n // Restore selection if it's still valid\n const { availableVoices } = get();\n if (currentSelection && availableVoices.includes(currentSelection)) {\n set({ selectedVoice: currentSelection });\n }\n },\n \n forceInitialize: async () => {\n const state = get();\n if (!state.initialized || state.availableVoices.length === 0) {\n debugLogger.debug('Force initializing voice store...');\n await state.loadVoicesFromAPI();\n }\n }\n}));\n\n// Trigger auto-initialization with a slight delay to ensure package settings are ready\nif (!autoInitialized) {\n autoInitialized = true;\n setTimeout(() => {\n debugLogger.debug('Auto-initializing voice store...');\n useVoiceStore.getState().forceInitialize().catch((error) => {\n debugLogger.warn('Auto-initialization failed:', error);\n });\n }, 1000); // 1 second delay to ensure gateway URL is available\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-4407-C60D14\nconst __banditFingerprint_tts_voiceServicets = 'BL-FP-A717E5-B818';\nconst __auditTrail_tts_voiceServicets = 'BL-AU-MGOIKVW0-637Y';\n// File: voiceService.ts | Path: src/services/tts/voiceService.ts | Hash: 4407b818\n\nimport { usePackageSettingsStore } from '../../store/packageSettingsStore';\nimport { authenticationService } from '../auth/authenticationService';\nimport { debugLogger } from '../logging/debugLogger';\n\nexport interface VoiceModelsResponse {\n models: string[];\n defaultModel: string;\n fallbackModel: string;\n}\n\nexport class VoiceService {\n private static instance: VoiceService;\n private cachedModels: VoiceModelsResponse | null = null;\n private cacheTimestamp: number = 0;\n private readonly CACHE_DURATION = 5 * 60 * 1000; // 5 minutes\n\n private constructor() {}\n\n public static getInstance(): VoiceService {\n if (!VoiceService.instance) {\n VoiceService.instance = new VoiceService();\n }\n return VoiceService.instance;\n }\n\n private getGatewayApiUrl(): string {\n return usePackageSettingsStore.getState().settings?.gatewayApiUrl || '';\n }\n\n private isValid(data: unknown): data is VoiceModelsResponse {\n if (typeof data !== 'object' || data === null) {\n return false;\n }\n\n const record = data as Record<string, unknown>;\n return Array.isArray(record.models) &&\n record.models.every((item) => typeof item === 'string') &&\n typeof record.defaultModel === 'string' &&\n typeof record.fallbackModel === 'string';\n }\n\n private isCacheValid(): boolean {\n return this.cachedModels !== null && \n (Date.now() - this.cacheTimestamp) < this.CACHE_DURATION;\n }\n\n public async fetchAvailableVoices(): Promise<VoiceModelsResponse> {\n // Return cached data if valid\n if (this.isCacheValid()) {\n debugLogger.debug('Returning cached voice models');\n return this.cachedModels!;\n }\n\n const gatewayUrl = this.getGatewayApiUrl();\n if (!gatewayUrl) {\n debugLogger.error('Gateway API URL not configured');\n throw new Error('Gateway API URL not configured');\n }\n\n // Check if we have a valid JWT token before making the request\n const token = authenticationService.getToken();\n if (!token) {\n debugLogger.warn('No JWT token available - skipping voice models fetch');\n const emptyModels: VoiceModelsResponse = {\n models: [],\n defaultModel: \"\",\n fallbackModel: \"\"\n };\n return emptyModels;\n }\n\n // Validate token is not expired\n if (authenticationService.isTokenExpired(token)) {\n debugLogger.warn('JWT token is expired - skipping voice models fetch');\n const emptyModels: VoiceModelsResponse = {\n models: [],\n defaultModel: \"\",\n fallbackModel: \"\"\n };\n return emptyModels;\n }\n\n try {\n debugLogger.debug('Fetching voice models from gateway API...');\n \n const response = await fetch(`${gatewayUrl}/tts/available-models`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json'\n }\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch voice models: ${response.status}`);\n }\n\n const data = await response.json();\n \n if (!this.isValid(data)) {\n throw new Error('Invalid voice models response format');\n }\n\n // Cache the response\n this.cachedModels = data;\n this.cacheTimestamp = Date.now();\n\n debugLogger.debug('Voice models fetched successfully', data);\n return data;\n\n } catch (error) {\n debugLogger.error('Error fetching voice models:', { error: error instanceof Error ? error.message : String(error) });\n \n const emptyModels: VoiceModelsResponse = {\n models: [],\n defaultModel: \"\",\n fallbackModel: \"\"\n };\n\n debugLogger.warn('Voice service unavailable - no models available');\n return emptyModels;\n }\n }\n\n public clearCache(): void {\n this.cachedModels = null;\n this.cacheTimestamp = 0;\n debugLogger.debug('Voice models cache cleared');\n }\n}\n\nexport const voiceService = VoiceService.getInstance();\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-95DD-07F17E\nconst __banditFingerprint_tts_streamingttsts = 'BL-FP-81BC0B-12CA';\nconst __auditTrail_tts_streamingttsts = 'BL-AU-MGOIKVW0-6I17';\n// File: streaming-tts.ts | Path: src/services/tts/streaming-tts.ts | Hash: 95dd12ca\n\nimport { Observable, BehaviorSubject, Subject } from 'rxjs';\nimport type { Subscriber } from 'rxjs';\nimport { debugLogger } from '../logging/debugLogger';\nimport { usePackageSettingsStore } from '../../store/packageSettingsStore';\nimport { getOrAppendAuthHeader } from './tts-client';\n\nexport enum TTSState {\n IDLE = 'IDLE',\n LOADING = 'LOADING',\n PLAYING = 'PLAYING',\n PAUSED = 'PAUSED',\n ERROR = 'ERROR'\n}\n\nexport interface TTSProgress {\n currentTime: number;\n duration: number;\n percentage: number;\n buffered: number;\n state: TTSState;\n}\n\nexport interface TTSOptions {\n useStreaming?: boolean;\n useRealtime?: boolean;\n onStateChange?: (state: TTSState) => void;\n onProgress?: (progress: TTSProgress) => void;\n}\n\n/**\n * Streaming TTS client with playback controls\n */\nexport class StreamingTTSClient {\n private static instance: StreamingTTSClient;\n \n private audio: HTMLAudioElement | null = null;\n private objectUrl: string | null = null;\n private controller: AbortController | null = null;\n \n // Store event handler references for proper cleanup\n private audioHandlers = new Map<string, EventListener>();\n \n // State management\n private stateSubject = new BehaviorSubject<TTSState>(TTSState.IDLE);\n private progressSubject = new Subject<TTSProgress>();\n \n private constructor() {}\n \n public static getInstance(): StreamingTTSClient {\n if (!StreamingTTSClient.instance) {\n StreamingTTSClient.instance = new StreamingTTSClient();\n }\n return StreamingTTSClient.instance;\n }\n \n /**\n * Get current state\n */\n public getCurrentState(): TTSState {\n return this.stateSubject.value;\n }\n \n /**\n * Get state changes as observable\n */\n public getStateChanges(): Observable<TTSState> {\n return this.stateSubject.asObservable();\n }\n \n /**\n * Get progress updates as observable\n */\n public getProgress(): Observable<TTSProgress> {\n return this.progressSubject.asObservable();\n }\n \n /**\n * Speak text with simple streaming\n */\n public speakStream(text: string, voice: string, options: TTSOptions = {}): Observable<void> {\n return new Observable<void>((subscriber) => {\n this.performSimpleStreaming(text, voice, options, subscriber);\n });\n }\n \n /**\n * Simple streaming implementation - no queues, just direct playback\n */\n private async performSimpleStreaming(\n text: string,\n voice: string,\n options: TTSOptions,\n subscriber: Subscriber<void>\n ): Promise<void> {\n try {\n // Clean up any previous audio completely\n this.cleanup();\n \n // Brief delay to ensure cleanup is complete\n await new Promise(resolve => setTimeout(resolve, 10));\n \n // Set loading state\n this.setState(TTSState.LOADING);\n \n const gatewayUrl = usePackageSettingsStore.getState().settings?.gatewayApiUrl;\n if (!gatewayUrl) {\n throw new Error('Gateway API URL not configured');\n }\n \n // Create abort controller for this request\n this.controller = new AbortController();\n \n // Make the TTS request\n const response = await fetch(`${gatewayUrl}/tts`, {\n method: 'POST',\n headers: {\n ...getOrAppendAuthHeader(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n Text: text,\n ModelName: voice\n }),\n signal: this.controller.signal\n });\n \n // Check if request was aborted\n if (this.controller.signal.aborted) {\n subscriber.complete();\n return;\n }\n \n if (!response.ok) {\n throw new Error(`TTS request failed: ${response.status} ${response.statusText}`);\n }\n \n // Get the audio blob\n const audioBlob = await response.blob();\n \n // Check if request was aborted after blob download\n if (this.controller.signal.aborted) {\n subscriber.complete();\n return;\n }\n \n if (!audioBlob || audioBlob.size === 0) {\n throw new Error('Received empty audio response');\n }\n \n // Create object URL and audio element\n this.objectUrl = URL.createObjectURL(audioBlob);\n this.audio = new Audio(this.objectUrl);\n \n // Set up audio element\n this.audio.autoplay = false;\n this.audio.preload = 'auto';\n \n // Set up event listeners\n this.setupAudioListeners(subscriber, options);\n \n // Check one more time if we were stopped before starting to load\n if (this.controller.signal.aborted) {\n this.cleanup();\n subscriber.complete();\n return;\n }\n \n // Start loading the audio\n this.audio.load();\n \n } catch (error) {\n // Handle abort errors gracefully\n if (error instanceof Error && error.name === 'AbortError') {\n this.setState(TTSState.IDLE);\n subscriber.complete();\n return;\n }\n \n debugLogger.error('TTS streaming failed:', { error: error instanceof Error ? error.message : String(error) });\n this.setState(TTSState.ERROR);\n subscriber.error(error);\n }\n }\n \n /**\n * Set up audio event listeners\n */\n private setupAudioListeners(subscriber: Subscriber<void>, options: TTSOptions): void {\n if (!this.audio) return;\n \n // Clear any existing handlers\n this.audioHandlers.clear();\n \n // When audio can start playing\n const canPlayThroughHandler = () => {\n // Check if we were stopped during loading\n if (!this.audio || this.getCurrentState() !== TTSState.LOADING || (this.controller && this.controller.signal.aborted)) {\n return;\n }\n \n this.setState(TTSState.PLAYING);\n this.audio.play().catch((error) => {\n debugLogger.error('Failed to start audio playback:', error);\n this.setState(TTSState.ERROR);\n subscriber.error(error);\n });\n };\n \n // When audio starts playing\n const playHandler = () => {\n this.setState(TTSState.PLAYING);\n subscriber.next();\n };\n \n // When audio is paused\n const pauseHandler = () => {\n if (this.getCurrentState() !== TTSState.IDLE) {\n this.setState(TTSState.PAUSED);\n }\n };\n \n // When audio ends\n const endedHandler = () => {\n this.setState(TTSState.IDLE);\n \n // Clear handlers to prevent memory leaks\n this.clearAudioHandlers();\n \n subscriber.complete();\n };\n \n // Progress updates\n const timeUpdateHandler = () => {\n if (this.audio && this.audio.duration) {\n const buffered = this.audio.buffered.length > 0 ? this.audio.buffered.end(0) : 0;\n const progress: TTSProgress = {\n currentTime: this.audio.currentTime,\n duration: this.audio.duration,\n percentage: (this.audio.currentTime / this.audio.duration) * 100,\n buffered,\n state: this.getCurrentState()\n };\n this.progressSubject.next(progress);\n if (options.onProgress) {\n options.onProgress(progress);\n }\n }\n };\n \n // Error handling\n const errorHandler = (event: Event) => {\n debugLogger.error('Audio playback error:', event);\n this.setState(TTSState.ERROR);\n subscriber.error(new Error('Audio playback failed'));\n };\n \n // Store handler references for cleanup\n this.audioHandlers.set('canplaythrough', canPlayThroughHandler);\n this.audioHandlers.set('play', playHandler);\n this.audioHandlers.set('pause', pauseHandler);\n this.audioHandlers.set('ended', endedHandler);\n this.audioHandlers.set('timeupdate', timeUpdateHandler);\n this.audioHandlers.set('error', errorHandler);\n \n // Add event listeners\n this.audio.addEventListener('canplaythrough', canPlayThroughHandler);\n this.audio.addEventListener('play', playHandler);\n this.audio.addEventListener('pause', pauseHandler);\n this.audio.addEventListener('ended', endedHandler);\n this.audio.addEventListener('timeupdate', timeUpdateHandler);\n this.audio.addEventListener('error', errorHandler);\n }\n \n /**\n * Stop playback\n */\n public stop(): void {\n // Abort any ongoing fetch request\n if (this.controller) {\n this.controller.abort();\n this.controller = null;\n }\n \n // Stop and reset audio\n if (this.audio) {\n this.audio.pause();\n this.audio.currentTime = 0;\n \n // Remove all event listeners to prevent any further callbacks\n this.audio.onloadstart = null;\n this.audio.oncanplaythrough = null;\n this.audio.onplay = null;\n this.audio.onpause = null;\n this.audio.onended = null;\n this.audio.ontimeupdate = null;\n this.audio.onerror = null;\n }\n \n // Set to IDLE state first, then cleanup\n this.setState(TTSState.IDLE);\n this.cleanup();\n }\n \n /**\n * Pause playback\n */\n public pause(): void {\n if (this.audio && this.getCurrentState() === TTSState.PLAYING) {\n this.audio.pause();\n this.setState(TTSState.PAUSED);\n }\n }\n \n /**\n * Resume playback\n */\n public resume(): void {\n if (this.audio && this.getCurrentState() === TTSState.PAUSED) {\n this.audio.play().catch((error) => {\n debugLogger.error('Failed to resume audio:', error);\n this.setState(TTSState.ERROR);\n });\n this.setState(TTSState.PLAYING);\n }\n }\n \n /**\n * Set state and notify observers\n */\n private setState(state: TTSState): void {\n this.stateSubject.next(state);\n }\n \n /**\n * Reset the TTS client completely - useful for model changes\n */\n public reset(): void {\n // Stop everything first\n this.stop();\n \n // Force reset all internal state\n this.audio = null;\n this.objectUrl = null;\n this.controller = null;\n \n // Reset state subjects\n this.stateSubject.next(TTSState.IDLE);\n }\n\n /**\n * Clear only the audio event handlers\n */\n private clearAudioHandlers(): void {\n if (this.audio) {\n // Remove all event listeners using stored handler references\n for (const [eventType, handler] of this.audioHandlers) {\n this.audio.removeEventListener(eventType, handler);\n }\n }\n this.audioHandlers.clear();\n }\n\n /**\n * Clean up resources\n */\n private cleanup(): void {\n if (this.audio) {\n // Remove all event listeners using stored handler references\n this.clearAudioHandlers();\n \n // Stop and reset audio\n try {\n this.audio.pause();\n this.audio.currentTime = 0;\n this.audio.src = '';\n this.audio.load();\n } catch (error) {\n // Ignore cleanup errors\n }\n \n this.audio = null;\n }\n \n if (this.objectUrl) {\n URL.revokeObjectURL(this.objectUrl);\n this.objectUrl = null;\n }\n \n if (this.controller) {\n this.controller.abort();\n this.controller = null;\n }\n }\n}\n\n// Export singleton instance\nexport const getStreamingTTSClient = (): StreamingTTSClient => {\n return StreamingTTSClient.getInstance();\n};\n\n// Convenience functions\nexport const speakStream = (text: string, voice: string, options?: TTSOptions): Observable<void> => {\n return getStreamingTTSClient().speakStream(text, voice, options);\n};\n\nexport const stopTTS = (): void => {\n getStreamingTTSClient().stop();\n};\n\nexport const resetTTS = (): void => {\n getStreamingTTSClient().reset();\n};\n\nexport const pauseTTS = (): void => {\n getStreamingTTSClient().pause();\n};\n\nexport const resumeTTS = (): void => {\n getStreamingTTSClient().resume();\n};\n\nexport const getTTSState = (): TTSState => {\n return getStreamingTTSClient().getCurrentState();\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-4A41-987E60\nconst __banditFingerprint_tts_ttsclientts = 'BL-FP-80ED0B-94B2';\nconst __auditTrail_tts_ttsclientts = 'BL-AU-MGOIKVW0-9HOM';\n// File: tts-client.ts | Path: src/services/tts/tts-client.ts | Hash: 4a4194b2\n\nimport { Observable, Subscription } from 'rxjs';\nimport { authenticationService } from \"../auth/authenticationService\";\nimport { useVoiceStore } from '../../store/voiceStore';\nimport { sanitizeForTTS } from './ttsSanitizer';\nimport { usePackageSettingsStore } from '../../store/packageSettingsStore';\nimport { debugLogger } from '../logging/debugLogger';\n\nconst getGatewayApiUrl = () => usePackageSettingsStore.getState().settings?.gatewayApiUrl || '';\n\n/**\n * An observable that emits when the generated audio has begun playing. \n * @param text The text to be spoken\n * @param voice The voice to be used (will fallback to default if not available)\n * @returns An observable that emits when the audio has started playing\n */\nexport const speak = (text: string, voice: string) => {\n if (!text) {\n debugLogger.warn(\"No text provided to TTS\");\n return new Observable<void>((subscriber) => {\n subscriber.complete();\n });\n }\n\n const voiceState = useVoiceStore.getState();\n const availableVoices = voiceState.availableVoices;\n \n // Check if voice service is available\n if (!voiceState.isServiceAvailable || availableVoices.length === 0) {\n debugLogger.warn(\"TTS service unavailable - no voices configured\");\n return new Observable<void>((subscriber) => {\n subscriber.error(new Error('TTS service unavailable'));\n });\n }\n \n // Validate voice selection\n if (availableVoices.indexOf(voice) === -1) {\n if (voiceState.fallbackVoice && availableVoices.indexOf(voiceState.fallbackVoice) !== -1) {\n debugLogger.warn(`Voice model ${voice} is not available. Defaulting to '${voiceState.fallbackVoice}'`);\n voice = voiceState.fallbackVoice;\n } else {\n debugLogger.warn(`Voice model ${voice} is not available and no fallback configured`);\n return new Observable<void>((subscriber) => {\n subscriber.error(new Error(`Voice ${voice} not available`));\n });\n }\n }\n return new Observable<void>((subscriber) => {\n const controller = new AbortController();\n const signal = controller.signal;\n\n let audio: HTMLAudioElement | null = null;\n let objectUrl: string | null = null;\n\n const handleAudio = async (response: Response) => {\n if (!response.ok) throw new Error('Failed to fetch TTS');\n const blob = await response.blob();\n objectUrl = URL.createObjectURL(blob);\n audio = new Audio(objectUrl);\n audio.play();\n audio.onended = () => subscriber.complete();\n audio.onerror = (e) => subscriber.error(e);\n subscriber.next();\n };\n\n const handleError = (err: Error) => {\n if (signal.aborted) {\n subscriber.complete();\n } else {\n subscriber.error(err);\n }\n };\n\n // Use gateway API for all TTS requests\n debugLogger.debug('Fetching TTS from gateway API...');\n \n const gatewayUrl = getGatewayApiUrl();\n if (!gatewayUrl) {\n debugLogger.error('Gateway API URL not configured');\n subscriber.error(new Error('TTS service not configured'));\n return;\n }\n\n const requestBody = {\n Text: sanitizeForTTS(text),\n ModelName: voice\n };\n\n const ttsRequest: RequestInit = {\n method: 'POST',\n headers: {\n ...getOrAppendAuthHeader(),\n 'Content-Type': 'application/json'\n },\n mode: 'cors',\n body: JSON.stringify(requestBody),\n signal,\n };\n\n fetch(`${gatewayUrl}/tts`, ttsRequest)\n .then(handleAudio)\n .catch(handleError);\n\n const teardown = () => {\n controller.abort();\n if (audio) {\n audio.pause();\n audio.src = '';\n audio = null;\n }\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n objectUrl = null;\n }\n };\n\n return new Subscription(() => teardown());\n });\n};\n\nexport const getOrAppendAuthHeader = (existing: Record<string, string> = {}) => {\n const token = authenticationService.getToken();\n if (token) {\n existing[\"Authorization\"] = `Bearer ${token}`;\n return existing;\n }\n debugLogger.warn(\"No token found, using empty string for Authorization header\");\n existing[\"Authorization\"] = \"\";\n\n return existing;\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-DB79-A74813\nconst __banditFingerprint_tts_ttsSanitizerts = 'BL-FP-EBEA84-E4AB';\nconst __auditTrail_tts_ttsSanitizerts = 'BL-AU-MGOIKVW0-B1P2';\n// File: ttsSanitizer.ts | Path: src/services/tts/ttsSanitizer.ts | Hash: db79e4ab\n\nexport const stripHtmlTags = (text: string): string =>\n text.replace(/<[^>]*>/g, '');\n\nexport const stripMarkdown = (text: string): string =>\n text.replace(/[*_~`]+/g, '');\n\nexport const stripEmojis = (text: string): string =>\n text.replace(/[\\p{Emoji_Presentation}\\p{Extended_Pictographic}]/gu, '');\n\nexport const simplifyLinks = (text: string): string =>\n text.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1');\n\nexport const stripListBullets = (text: string): string =>\n text.replace(/^\\s*[*\\-]\\s+/gm, '');\n\nexport const normalizeWhitespace = (text: string): string =>\n text.replace(/\\s{2,}/g, ' ').trim();\n\nexport const sanitizeForTTS = (text: string): string => {\n return normalizeWhitespace(\n stripListBullets(\n stripEmojis(\n stripMarkdown(\n simplifyLinks(\n stripHtmlTags(text)\n )\n )\n )\n )\n );\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-3660-755F00\nconst __banditFingerprint_hooks_useTTSts = 'BL-FP-2B6BB1-5F41';\nconst __auditTrail_hooks_useTTSts = 'BL-AU-MGOIKVVF-ZUAN';\n// File: useTTS.ts | Path: src/hooks/useTTS.ts | Hash: 36605f41\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport { Subscription } from 'rxjs';\nimport { \n getStreamingTTSClient, \n TTSState, \n TTSProgress, \n TTSOptions,\n stopTTS\n} from '../services/tts/streaming-tts';\n\n// Re-export types for convenience\nexport type { TTSState, TTSProgress, TTSOptions };\nimport { useVoiceStore } from '../store/voiceStore';\nimport { usePreferencesStore } from '../store/preferencesStore';\nimport { usePackageSettingsStore } from '../store/packageSettingsStore';\nimport { useModelStore } from '../store/modelStore';\nimport { debugLogger } from '../services/logging/debugLogger';\n\nexport interface UseTTSReturn {\n // State\n isPlaying: boolean;\n isPaused: boolean;\n isLoading: boolean;\n error: string | null;\n progress: TTSProgress | null;\n state: TTSState;\n \n // Actions\n speak: (text: string, options?: TTSOptions) => Promise<void>;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n forcePlay: () => Promise<void>;\n \n // Utilities\n isAvailable: boolean;\n currentVoice: string;\n}\n\n/**\n * React hook for TTS with streaming support and playback controls\n */\nexport const useTTS = (): UseTTSReturn => {\n const [state, setState] = useState<TTSState>(TTSState.IDLE);\n const [progress, setProgress] = useState<TTSProgress | null>(null);\n const [error, setError] = useState<string | null>(null);\n \n // Store references\n const progressSubscriptionRef = useRef<Subscription | null>(null);\n const stateSubscriptionRef = useRef<Subscription | null>(null);\n const speakSubscriptionRef = useRef<Subscription | null>(null);\n const previousVoiceRef = useRef<string | null>(null);\n const previousModelRef = useRef<string | null>(null);\n const requestIdRef = useRef<number>(0); // Track request IDs to prevent out-of-order audio\n \n // Store hooks\n const { selectedVoice, isServiceAvailable } = useVoiceStore();\n const { preferences } = usePreferencesStore();\n const { settings: packageSettings } = usePackageSettingsStore();\n const { selectedModel } = useModelStore();\n \n // Check if TTS is available\n const isAvailable = !!(packageSettings?.gatewayApiUrl && preferences.ttsEnabled && isServiceAvailable);\n \n // Get TTS client\n const ttsClient = useMemo(() => getStreamingTTSClient(), []);\n\n // Set up subscriptions for state and progress updates\n useEffect(() => {\n // Clean up existing subscriptions\n if (progressSubscriptionRef.current) {\n progressSubscriptionRef.current.unsubscribe();\n }\n if (stateSubscriptionRef.current) {\n stateSubscriptionRef.current.unsubscribe();\n }\n\n // Subscribe to progress updates\n progressSubscriptionRef.current = ttsClient.getProgress().subscribe({\n next: (newProgress: TTSProgress) => {\n setProgress(newProgress);\n },\n error: (err: unknown) => {\n debugLogger.error('TTS progress subscription error', { error: err });\n }\n });\n\n // Subscribe to state changes\n stateSubscriptionRef.current = ttsClient.getStateChanges().subscribe({\n next: (newState: TTSState) => {\n setState(newState);\n \n // Clear error when state changes away from error\n if (newState !== TTSState.ERROR && error) {\n setError(null);\n }\n },\n error: (err: unknown) => {\n debugLogger.error('TTS state subscription error', { error: err });\n }\n });\n\n // Cleanup on unmount\n return () => {\n if (progressSubscriptionRef.current) {\n progressSubscriptionRef.current.unsubscribe();\n }\n if (stateSubscriptionRef.current) {\n stateSubscriptionRef.current.unsubscribe();\n }\n };\n }, [error, ttsClient]);\n\n // Handle voice and model changes - stop current playback when they change\n useEffect(() => {\n // Check if this is an actual voice or model change (not initial mount)\n const isVoiceChange = previousVoiceRef.current !== null && \n previousVoiceRef.current !== selectedVoice;\n const isModelChange = previousModelRef.current !== null && \n previousModelRef.current !== selectedModel;\n \n // If voice or model changed, stop current playback\n if (isVoiceChange || isModelChange) {\n // Invalidate current request to prevent any delayed audio\n requestIdRef.current++;\n \n // Clear any active subscription immediately\n if (speakSubscriptionRef.current) {\n speakSubscriptionRef.current.unsubscribe();\n speakSubscriptionRef.current = null;\n }\n \n // For model changes, do a complete reset to clear any bad state\n if (isModelChange) {\n ttsClient.reset();\n } else {\n // For voice changes, just stop\n ttsClient.stop();\n }\n \n setState(TTSState.IDLE);\n setError(null);\n \n // Update references immediately to prevent re-triggering\n previousVoiceRef.current = selectedVoice;\n previousModelRef.current = selectedModel;\n \n return; // Exit early to prevent double update\n }\n \n // Update the references for non-change cases\n if (previousVoiceRef.current === null) {\n previousVoiceRef.current = selectedVoice;\n }\n if (previousModelRef.current === null) {\n previousModelRef.current = selectedModel;\n }\n }, [selectedVoice, selectedModel, ttsClient]);\n\n // Speak function\n const speak = useCallback(async (text: string, options: TTSOptions = {}): Promise<void> => {\n if (!isAvailable) {\n const errorMsg = 'TTS service is not available';\n setError(errorMsg);\n throw new Error(errorMsg);\n }\n\n if (!text?.trim()) {\n const errorMsg = 'No text provided';\n setError(errorMsg);\n throw new Error(errorMsg);\n }\n\n try {\n setError(null);\n \n // Stop any current playback\n ttsClient.stop();\n \n // Also update previous voice and model references immediately\n previousVoiceRef.current = selectedVoice;\n previousModelRef.current = selectedModel;\n \n // Get the most current voice from store to avoid timing issues\n const currentVoice = useVoiceStore.getState().selectedVoice;\n const voiceToUse = currentVoice || selectedVoice;\n if (!voiceToUse) {\n throw new Error('No voice selected');\n }\n \n if (speakSubscriptionRef.current) {\n speakSubscriptionRef.current.unsubscribe();\n speakSubscriptionRef.current = null;\n \n // Add a small delay to ensure the previous audio is completely stopped\n await new Promise(resolve => setTimeout(resolve, 50));\n }\n\n // Generate a unique request ID to ensure we only play the latest request\n const currentRequestId = ++requestIdRef.current;\n\n // Set loading state immediately\n setState(TTSState.LOADING);\n\n // Enable simple streaming\n const ttsOptions: TTSOptions = {\n useStreaming: true,\n useRealtime: true,\n ...options,\n onStateChange: (newState: TTSState) => {\n setState(newState);\n if (options.onStateChange) {\n options.onStateChange(newState);\n }\n },\n onProgress: (newProgress: TTSProgress) => {\n setProgress(newProgress);\n if (options.onProgress) {\n options.onProgress(newProgress);\n }\n }\n };\n\n debugLogger.debug('Starting TTS streaming');\n\n // Start speaking with simple streaming\n speakSubscriptionRef.current = ttsClient.speakStream(text, voiceToUse, ttsOptions).subscribe({\n next: () => {\n // Only process if this is still the latest request\n if (currentRequestId === requestIdRef.current) {\n // Audio started playing successfully\n }\n },\n error: (err: unknown) => {\n // Only process errors for the latest request\n if (currentRequestId === requestIdRef.current) {\n const errorMessage = err instanceof Error && err.message ? err.message : 'TTS playback failed';\n debugLogger.error('TTS playback failed', { error: err });\n setError(errorMessage);\n setState(TTSState.ERROR);\n }\n },\n complete: () => {\n // Only process completion for the latest request\n if (currentRequestId === requestIdRef.current) {\n setState(TTSState.IDLE);\n }\n }\n });\n\n } catch (err: unknown) {\n const errorMsg = err instanceof Error && err.message ? err.message : 'TTS failed to start';\n setError(errorMsg);\n setState(TTSState.ERROR);\n throw err instanceof Error ? err : new Error(errorMsg);\n }\n }, [isAvailable, selectedVoice, selectedModel, ttsClient]);\n\n // Stop function\n const stop = useCallback(() => {\n const currentRequestId = requestIdRef.current;\n \n // IMMEDIATELY update the hook state to IDLE for instant UI feedback\n setState(TTSState.IDLE);\n \n // Invalidate the current request to prevent any delayed audio\n requestIdRef.current++;\n \n // Unsubscribe and clear the subscription\n if (speakSubscriptionRef.current) {\n speakSubscriptionRef.current.unsubscribe();\n speakSubscriptionRef.current = null;\n }\n \n // Call the client stop method\n ttsClient.stop();\n \n // Clear any errors\n setError(null);\n }, [ttsClient]);\n\n // Pause function\n const pause = useCallback(() => {\n ttsClient.pause();\n }, [ttsClient]);\n\n // Resume function\n const resume = useCallback(() => {\n ttsClient.resume();\n }, [ttsClient]);\n\n // Force play function (simplified)\n const forcePlay = useCallback(async (): Promise<void> => {\n try {\n // For simple streaming, we don't need complex force play logic\n // The audio element should handle autoplay restrictions automatically\n if (ttsClient.getCurrentState() === TTSState.PAUSED) {\n ttsClient.resume();\n }\n } catch (err: unknown) {\n const errorMsg = err instanceof Error && err.message ? err.message : 'Failed to force play audio';\n setError(errorMsg);\n throw err instanceof Error ? err : new Error(errorMsg);\n }\n }, [ttsClient]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (speakSubscriptionRef.current) {\n speakSubscriptionRef.current.unsubscribe();\n }\n if (progressSubscriptionRef.current) {\n progressSubscriptionRef.current.unsubscribe();\n }\n if (stateSubscriptionRef.current) {\n stateSubscriptionRef.current.unsubscribe();\n }\n };\n }, []);\n\n // Stop any playback when TTS becomes unavailable\n useEffect(() => {\n if (!isAvailable && (state === TTSState.PLAYING || state === TTSState.LOADING)) {\n stop();\n }\n }, [isAvailable, state, stop]);\n\n return {\n // State\n isPlaying: state === TTSState.PLAYING,\n isPaused: state === TTSState.PAUSED,\n isLoading: state === TTSState.LOADING,\n error,\n progress,\n state,\n \n // Actions\n speak,\n stop,\n pause,\n resume,\n forcePlay,\n \n // Utilities\n isAvailable,\n currentVoice: selectedVoice\n };\n};\n\n/**\n * Global TTS controls hook - useful for global stop functionality\n */\nexport const useGlobalTTS = () => {\n const stopAll = useCallback(() => {\n stopTTS();\n }, []);\n\n return {\n stopAll\n };\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-4F0E-E71F75\nconst __banditFingerprint_components_StreamingMarkdowntsx = 'BL-FP-BB12E1-3387';\nconst __auditTrail_components_StreamingMarkdowntsx = 'BL-AU-MGOIKVV9-FMED';\n// File: StreamingMarkdown.tsx | Path: src/components/StreamingMarkdown.tsx | Hash: 4f0e3387\n\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Box, Tooltip, IconButton } from \"@mui/material\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeSanitize from \"rehype-sanitize\";\nimport { useTheme, alpha } from \"@mui/material/styles\";\nimport CheckIcon from \"@mui/icons-material/Check\";\nimport ContentCopyIcon from \"@mui/icons-material/ContentCopy\";\nimport type { Element, Text, Root } from \"hast\";\nimport type { Components } from \"react-markdown\";\nimport type { CodeProps } from \"react-markdown/lib/ast-to-react\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { getHighlightTree } from \"../utils/lowlight\";\nimport { markdownSanitizeSchema, renderLowlightChildren } from \"../utils/markdownRendering\";\n\ninterface SourceSummary {\n id: string;\n name: string;\n}\n\ninterface StreamingMarkdownProps {\n content: string;\n isStreaming?: boolean;\n sources?: SourceSummary[];\n}\n\nconst StreamingMarkdown: React.FC<StreamingMarkdownProps> = ({\n content,\n isStreaming = false,\n sources,\n}) => {\n const theme = useTheme();\n const showCursor = isStreaming && content.trim().length > 0;\n const showLoader = isStreaming && content.trim().length === 0; // Show loader when streaming but no content yet\n const prevSanitizedRef = useRef<string>(\"\");\n const containerRef = useRef<HTMLDivElement | null>(null);\n const stableSourcesRef = useRef<SourceSummary[]>([]);\n\n const effectiveSources = useMemo(() => {\n if (Array.isArray(sources) && sources.length > 0) {\n stableSourcesRef.current = sources;\n return sources;\n }\n\n if (sources === undefined) {\n return stableSourcesRef.current;\n }\n\n stableSourcesRef.current = [];\n return [];\n }, [sources]);\n\n const normalizeTables = (markdown: string): string => {\n const lines = markdown.split(\"\\n\");\n const output: string[] = [];\n let inTable = false;\n let tableRows: string[][] = [];\n\n const flushTable = () => {\n if (tableRows.length === 0) return;\n const maxCols = Math.max(...tableRows.map((r) => r.length));\n const padded = tableRows.map((row) => [...row, ...Array(maxCols - row.length).fill(\"\")]);\n const header = padded[0];\n const separator = Array(maxCols).fill(\"---\");\n output.push(\"| \" + header.join(\" | \") + \" |\");\n output.push(\"| \" + separator.join(\" | \") + \" |\");\n for (let i = 1; i < padded.length; i++) {\n const row = padded[i];\n if (row.every((cell) => /^-+$/.test(cell))) continue;\n output.push(\"| \" + row.join(\" | \") + \" |\");\n }\n tableRows = [];\n inTable = false;\n };\n\n for (const line of lines) {\n if (/^\\s*\\|.*\\|\\s*$/.test(line)) {\n inTable = true;\n const cells = line.trim().slice(1, -1).split(\"|\").map((c) => c.trim());\n tableRows.push(cells);\n } else {\n if (inTable) flushTable();\n output.push(line);\n }\n }\n if (inTable) flushTable();\n return output.join(\"\\n\");\n };\n\n const sanitizeMarkdown = (raw: string): string => {\n let sanitized = raw.replace(/<[/]?start_of_turn>|<[/]?end[_]?of[_]?turn>/gi, \"\");\n // Unwrap Box wrappers\n sanitized = sanitized\n .replace(/<div class=\"MuiBox-root[^\"]*\"[^>]*>([\\s\\S]*?)<\\/div>/g, (_, inner) => inner.trim())\n .replace(/<div[^>]*>\\s*<\\/div>/g, \"\");\n // Collapse newline before common punctuation\n sanitized = sanitized.replace(/\\r?\\n\\s*:\\s*/g, \": \");\n sanitized = sanitized.replace(/\\r?\\n\\s*,\\s*/g, \", \");\n // Normalize pipe tables\n sanitized = normalizeTables(sanitized);\n return sanitized;\n };\n\n const sanitizedContent = sanitizeMarkdown(content);\n\n const contentWithSources = useMemo(() => {\n if (!effectiveSources.length || isStreaming) {\n return sanitizedContent;\n }\n\n const existingSection = /\\*\\*Sources?\\*\\*/i.test(sanitizedContent);\n if (existingSection) {\n return sanitizedContent;\n }\n\n const listMarkdown = effectiveSources\n .map((doc, index) => `- ${index + 1}. ${doc.name}`)\n .join(\"\\n\");\n\n return `${sanitizedContent}\\n\\n**Sources**\\n${listMarkdown}`;\n }, [sanitizedContent, effectiveSources, isStreaming]);\n\n // Helpers for safe per-word fade wrapping\n const escapeHtml = (str: string) =>\n str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\\\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n\n const isPlainAppend = (s: string) => {\n // Avoid wrapping when the delta includes markdown/code/meta characters\n return !/[`*_\\[\\]<>|#~]/.test(s);\n };\n\n // Compute a render string where newly appended words fade in with a stagger\n let renderContent = contentWithSources;\n if (isStreaming) {\n const prev = prevSanitizedRef.current;\n // Find common prefix length to identify newly appended tail\n let i = 0;\n const max = Math.min(prev.length, sanitizedContent.length);\n while (i < max && prev.charCodeAt(i) === sanitizedContent.charCodeAt(i)) i++;\n const base = sanitizedContent.slice(0, i);\n const appended = sanitizedContent.slice(i);\n if (appended && isPlainAppend(appended)) {\n const parts = appended.split(/(\\s+)/); // keep whitespace tokens\n let delayMs = 0;\n const step = 42; // gentle stagger between words for smoother reveal\n const wrapped = parts\n .map((p) => {\n if (/^\\s+$/.test(p) || p === \"\") return p; // preserve whitespace\n const safe = escapeHtml(p);\n const out = `<span class=\\\"bl-fade-word\\\" data-bl-delay=\\\"${delayMs}\\\">${safe}</span>`;\n delayMs += step;\n return out;\n })\n .join(\"\");\n renderContent = base + wrapped;\n }\n }\n\n // After compute: update ref for next render\n useEffect(() => {\n prevSanitizedRef.current = contentWithSources;\n }, [contentWithSources]);\n\n useEffect(() => {\n if (!containerRef.current) return;\n const nodes = containerRef.current.querySelectorAll<HTMLElement>(\".bl-fade-word\");\n nodes.forEach((node) => {\n const delay = node.getAttribute(\"data-bl-delay\");\n if (delay) {\n node.style.setProperty(\"--bl-delay\", `${delay}ms`);\n node.style.animationDelay = `${delay}ms`;\n }\n });\n }, [renderContent, sanitizedContent, isStreaming]);\n\n type MarkProps = ComponentPropsWithoutRef<\"mark\">;\n type AnchorProps = ComponentPropsWithoutRef<\"a\">;\n type EmProps = ComponentPropsWithoutRef<\"em\">;\n type TableProps = ComponentPropsWithoutRef<\"table\">;\n type TableCellProps = ComponentPropsWithoutRef<\"td\">;\n type TableHeaderProps = ComponentPropsWithoutRef<\"th\">;\n type ParagraphProps = ComponentPropsWithoutRef<\"p\">;\n type BlockQuoteProps = ComponentPropsWithoutRef<\"blockquote\">;\n type OrderedListProps = ComponentPropsWithoutRef<\"ol\">;\n type UnorderedListProps = ComponentPropsWithoutRef<\"ul\">;\n\n const MarkRenderer: React.FC<MarkProps> = ({ children, ...props }) => {\n const inlineBg = theme.palette.mode === \"dark\"\n ? alpha(theme.palette.common.white, 0.06)\n : alpha(theme.palette.text.primary, 0.06);\n const inlineBorder = `1px solid ${alpha(theme.palette.text.primary, 0.15)}`;\n return (\n <Box\n component=\"span\"\n sx={{\n display: \"inline-block\",\n backgroundColor: inlineBg,\n border: inlineBorder,\n color: \"inherit\",\n padding: \"0.15em 0.35em\",\n borderRadius: \"4px\",\n fontWeight: 500,\n fontSize: \"0.92em\",\n lineHeight: 1.4,\n whiteSpace: \"normal\",\n width: \"fit-content\",\n maxWidth: \"100%\",\n fontFamily:\n \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\",\n }}\n {...props}\n >\n {children}\n </Box>\n );\n };\n\n const LinkRenderer: React.FC<AnchorProps> = ({ href, children, ...props }) => (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: theme.palette.primary.main, textDecoration: \"underline\" }}\n {...props}\n >\n {children}\n </a>\n );\n\n const CodeRenderer: React.FC<CodeProps> = ({ inline, className, children, ...props }) => {\n const match = /language-([\\w-]+)/.exec(className || \"\");\n const requestedLanguage = match?.[1]?.toLowerCase() ?? \"\";\n const codeText = String(children).replace(/\\n$/, \"\");\n const isProbablyBlock = codeText.includes(\"\\n\") || Boolean(requestedLanguage);\n\n const [copied, setCopied] = useState(false);\n const handleCopy = () => {\n void navigator.clipboard.writeText(codeText);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n\n const highlightTree = useMemo<Root | null>(\n () => (isProbablyBlock ? getHighlightTree(codeText, requestedLanguage) : null),\n [isProbablyBlock, codeText, requestedLanguage]\n );\n\n const highlightedNodes = useMemo<ReactNode[]>(\n () =>\n highlightTree\n ? renderLowlightChildren(\n (highlightTree.children || []).filter(\n (node): node is Element | Text => node.type === \"element\" || node.type === \"text\"\n ),\n `hl-${requestedLanguage || \"auto\"}`\n )\n : [],\n [highlightTree, requestedLanguage]\n );\n\n const dataLanguage =\n highlightTree &&\n highlightTree.data &&\n typeof highlightTree.data === \"object\" &&\n \"language\" in highlightTree.data\n ? String((highlightTree.data as { language?: unknown }).language ?? \"\")\n : \"\";\n\n if (!highlightTree) {\n const inlineBg = theme.palette.mode === \"dark\"\n ? alpha(theme.palette.common.white, 0.06)\n : alpha(theme.palette.text.primary, 0.06);\n const inlineBorder = `1px solid ${alpha(theme.palette.text.primary, 0.15)}`;\n return (\n <code\n style={{\n borderRadius: 4,\n fontSize: \"0.92em\",\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\",\n backgroundColor: inlineBg,\n border: inlineBorder,\n padding: \"0.15em 0.35em\",\n }}\n {...props}\n >\n {children}\n </code>\n );\n }\n\n const resolvedLanguage = (requestedLanguage || dataLanguage || \"code\").toString();\n const languageLabel = resolvedLanguage.toUpperCase();\n const languageClass = resolvedLanguage.toLowerCase();\n\n const highlightColors = theme.palette.mode === \"dark\"\n ? {\n background: \"#0f172a\",\n text: \"#e2e8f0\",\n keyword: \"#c792ea\",\n string: \"#7fdbca\",\n number: \"#f78c6c\",\n comment: \"#64748b\",\n function: \"#82aaff\",\n variable: \"#f07178\",\n }\n : {\n background: \"#f4f6ff\",\n text: \"#1e293b\",\n keyword: \"#7c3aed\",\n string: \"#0f766e\",\n number: \"#b45309\",\n comment: \"#6b7280\",\n function: \"#2563eb\",\n variable: \"#d97706\",\n };\n\n return (\n <Box\n sx={{\n borderRadius: \"4px\",\n overflow: \"auto\",\n my: \"0.5rem\",\n px: 0,\n py: 0,\n mt: 1,\n mb: 0.5,\n fontSize: \"0.9rem\",\n position: \"relative\",\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\",\n width: \"100%\",\n maxWidth: \"100%\",\n }}\n >\n <Box\n sx={{\n px: 2,\n py: 1,\n bgcolor: theme.palette.mode === \"dark\"\n ? alpha(theme.palette.common.white, 0.04)\n : alpha(theme.palette.text.primary, 0.04),\n color: theme.palette.text.secondary,\n fontSize: \"0.75rem\",\n borderBottom: `1px solid ${alpha(theme.palette.text.primary, 0.1)}`,\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n fontFamily: \"inherit\",\n }}\n >\n <span>{languageLabel}</span>\n <Tooltip title={copied ? \"Copied!\" : \"Copy\"} arrow>\n <IconButton\n size=\"small\"\n onClick={handleCopy}\n sx={{\n color: copied ? theme.palette.success.main : theme.palette.text.secondary,\n \"&:hover\": { color: theme.palette.text.primary },\n padding: \"4px\",\n }}\n >\n {copied ? <CheckIcon fontSize=\"small\" /> : <ContentCopyIcon fontSize=\"small\" />}\n </IconButton>\n </Tooltip>\n </Box>\n <Box\n sx={{\n overflowX: \"auto\",\n maxWidth: \"100%\",\n '& .hljs': {\n display: 'block',\n overflowX: 'auto',\n padding: '16px',\n margin: 0,\n backgroundColor: highlightColors.background,\n color: highlightColors.text,\n fontSize: '0.9rem',\n },\n '& .hljs-comment, & .hljs-quote': {\n color: highlightColors.comment,\n fontStyle: 'italic',\n },\n '& .hljs-keyword, & .hljs-selector-tag, & .hljs-literal, & .hljs-built_in': {\n color: highlightColors.keyword,\n },\n '& .hljs-string, & .hljs-doctag, & .hljs-template-tag, & .hljs-attr': {\n color: highlightColors.string,\n },\n '& .hljs-number, & .hljs-symbol, & .hljs-bullet, & .hljs-meta': {\n color: highlightColors.number,\n },\n '& .hljs-title, & .hljs-section, & .hljs-selector-id, & .hljs-function': {\n color: highlightColors.function,\n },\n '& .hljs-variable, & .hljs-params, & .hljs-property': {\n color: highlightColors.variable,\n },\n }}\n >\n <pre className={`hljs language-${languageClass}`} {...props}>\n <code className=\"hljs\">{highlightedNodes}</code>\n </pre>\n </Box>\n </Box>\n );\n };\n\n const EmRenderer: React.FC<EmProps> = ({ children, ...props }) => {\n const onlyChild = Array.isArray(children) && children.length === 1 ? children[0] : null;\n if (\n onlyChild &&\n React.isValidElement(onlyChild) &&\n typeof onlyChild.props?.className === \"string\" &&\n onlyChild.props.className.includes(\"MuiBox-root\")\n ) {\n const inner = onlyChild.props.children as ReactNode;\n if (typeof inner === \"string\" && inner.trim().toUpperCase() === \"CODE\") {\n return null;\n }\n return (\n <Box\n sx={{\n fontFamily: \"monospace\",\n fontSize: \"0.9rem\",\n backgroundColor: theme.palette.background.default,\n color: theme.palette.text.primary,\n padding: \"12px 16px\",\n borderRadius: \"4px\",\n border: `1px solid ${theme.palette.divider}`,\n my: 1,\n display: \"inline-block\",\n }}\n >\n {inner}\n </Box>\n );\n }\n return <em {...props}>{children}</em>;\n };\n\n const TableRenderer: React.FC<TableProps> = ({ children, ...props }) => (\n <Box sx={{ overflowX: \"auto\", my: 1 }}>\n <table style={{ borderCollapse: \"collapse\", width: \"100%\" }} {...props}>\n {children}\n </table>\n </Box>\n );\n\n const OrderedListRenderer: React.FC<OrderedListProps> = ({ children, ...props }) => (\n <ol style={{ paddingLeft: 24, marginLeft: 16, listStyleType: \"decimal\" }} {...props}>\n {children}\n </ol>\n );\n\n const UnorderedListRenderer: React.FC<UnorderedListProps> = ({ children, ...props }) => (\n <ul\n style={{\n paddingLeft: \"1.5rem\",\n marginTop: \"0.5rem\",\n marginBottom: \"0.25rem\",\n listStyle: \"disc\",\n }}\n {...props}\n >\n {children}\n </ul>\n );\n\n const BlockQuoteRenderer: React.FC<BlockQuoteProps> = ({ children, ...props }) => (\n <Box\n component=\"blockquote\"\n sx={{\n borderLeft: `4px solid ${theme.palette.divider}`,\n pl: 2,\n ml: 0,\n color: theme.palette.text.secondary,\n }}\n {...props}\n >\n {children}\n </Box>\n );\n\n const TableHeaderRenderer: React.FC<TableHeaderProps> = ({ children, ...props }) => (\n <th\n style={{\n border: \"1px solid #ddd\",\n padding: \"8px\",\n backgroundColor: theme.palette.mode === \"dark\" ? \"#333\" : \"#f2f2f2\",\n textAlign: \"left\",\n }}\n {...props}\n >\n {children}\n </th>\n );\n\n const TableCellRenderer: React.FC<TableCellProps> = ({ children, ...props }) => (\n <td\n style={{\n border: \"1px solid #ddd\",\n padding: \"8px\",\n }}\n {...props}\n >\n {children}\n </td>\n );\n\n const ParagraphRenderer: React.FC<ParagraphProps> = ({ children, ...props }) => (\n <p style={{ marginTop: \"0.5rem\", marginBottom: \"0.5rem\" }} {...props}>\n {children}\n </p>\n );\n\n const components: Components = {\n mark: MarkRenderer,\n code: CodeRenderer,\n a: LinkRenderer,\n em: EmRenderer,\n table: TableRenderer,\n ol: OrderedListRenderer,\n ul: UnorderedListRenderer,\n blockquote: BlockQuoteRenderer,\n th: TableHeaderRenderer,\n td: TableCellRenderer,\n p: ParagraphRenderer,\n };\n\n return (\n <Box\n ref={containerRef}\n sx={{\n // Base transition for minor layout changes\n transition: \"opacity 120ms ease-out, transform 120ms ease-out\",\n \"& .cursor\": {\n display: showCursor ? \"inline\" : \"none\",\n animation: \"blink 1s step-start infinite\",\n },\n \"@keyframes blink\": {\n \"50%\": { opacity: 0 },\n },\n \"& .bl-fade-word\": {\n opacity: 0,\n animation: \"bl-fade-in 420ms ease-out forwards\",\n },\n \"@keyframes bl-fade-in\": {\n from: { opacity: 0, transform: \"translateY(1.5px)\" },\n to: { opacity: 1, transform: \"translateY(0)\" },\n },\n // Subtle fade-in for each render while streaming to reduce choppiness perception\n opacity: isStreaming ? 0.985 : 1,\n transform: isStreaming ? \"translateY(0.25px)\" : \"none\",\n // Reduce layout jumpiness between updates\n \"& p:last-child\": { marginBottom: 0 },\n // Add min height when showing loader to prevent layout shift\n minHeight: showLoader ? \"40px\" : \"auto\",\n }}\n >\n {showLoader ? (\n // Show loading indicator when streaming but no content yet\n <Box sx={{ display: \"flex\", alignItems: \"center\", minHeight: \"40px\", pl: 2 }}>\n <div className=\"typing-only\">\n <span className=\"dot\" />\n <span className=\"dot\" />\n <span className=\"dot\" />\n </div>\n </Box>\n ) : (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw, [rehypeSanitize, markdownSanitizeSchema]]}\n components={components}\n >\n {(renderContent || sanitizedContent) + (showCursor ? \" ▊\" : \"\")}\n </ReactMarkdown>\n )}\n </Box>\n );\n};\n\nexport default StreamingMarkdown;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-E95F-A26839\nconst __banditFingerprint_chat_chatinputtsx = 'BL-FP-E7A13E-4AF0';\nconst __auditTrail_chat_chatinputtsx = 'BL-AU-MGOIKVUX-SXD7';\n// File: chat-input.tsx | Path: src/chat/chat-input.tsx | Hash: e95f4af0\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { Box, TextField, IconButton, Tooltip, Avatar, Typography, CircularProgress, Collapse } from \"@mui/material\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport ArrowUpwardIcon from \"@mui/icons-material/ArrowUpward\";\nimport PsychologyIcon from \"@mui/icons-material/Psychology\";\nimport FeedbackIcon from \"@mui/icons-material/Feedback\";\nimport HearingDisabledIcon from \"@mui/icons-material/HearingDisabled\";\nimport GraphicEqIcon from \"@mui/icons-material/GraphicEq\";\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\nimport { BanditPersonality } from \"../store/modelStore\";\nimport { usePreferencesStore } from \"../store/preferencesStore\";\nimport { usePackageSettingsStore } from \"../store/packageSettingsStore\";\nimport Transcriber from \"../services/stt/transcriber\";\nimport MemoryModal from \"./memory-modal\";\nimport { useTheme, alpha } from \"@mui/material/styles\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport brandingService from \"../services/branding/brandingService\";\nimport { FeedbackModal } from \"../components/feedback/FeedbackModal\";\nimport { useFeatures, useFeatureVisibility } from \"../hooks/useFeatures\";\nimport { useVoiceStore } from \"../store/voiceStore\";\nimport { useVoiceModeStore } from \"../store/voiceModeStore\";\nimport { shallow } from \"zustand/shallow\";\n\ninterface ChatInputProps {\n inputValue: string;\n setInputValue: (val: string) => void;\n pastedImages: string[];\n setPastedImages: React.Dispatch<React.SetStateAction<string[]>>;\n inputRef: React.RefObject<HTMLInputElement>;\n inputContainerRef: React.RefObject<HTMLDivElement>;\n isMobile: boolean;\n inputHeight: number;\n setInputHeight: (val: number) => void;\n isSubmitting: boolean;\n selectedVoice: string;\n availableVoices: string[];\n handleVoiceChange: (voiceId: string) => void;\n selectedModel: string;\n availableModels: BanditPersonality[];\n handleModelChange: (modelId: string) => void;\n onSend: (question: string, images: string[], displayQuestion: string) => void;\n onStop?: () => void;\n isStreaming?: boolean;\n}\n\nconst ChatInput: React.FC<ChatInputProps> = (props) => {\n const {\n inputValue,\n setInputValue,\n pastedImages,\n inputRef,\n isMobile,\n setPastedImages,\n inputContainerRef,\n isSubmitting,\n onSend,\n onStop,\n isStreaming,\n } = props;\n\n // Theme and color variables\n const theme = useTheme();\n const inputBackground = theme.palette.chat.input;\n const shellBackground = theme.palette.chat.shell;\n const badgeBackground = theme.palette.chat.badge;\n const hoverBadgeBackground = theme.palette.chat.badgeHover;\n const fileBg = theme.palette.chat.file;\n const fileIconBg = theme.palette.chat.fileIcon;\n const fileText = theme.palette.chat.fileText;\n const captionColor = theme.palette.chat.caption;\n\n const { preferences } = usePreferencesStore();\n const { settings: packageSettings } = usePackageSettingsStore();\n const isVoiceServiceAvailable = useVoiceStore((state) => state.isServiceAvailable);\n const {\n isVoiceModeEnabled,\n voiceStatus,\n voiceError,\n toggleVoiceMode,\n voiceLastTranscript,\n } = useVoiceModeStore(\n (state) => ({\n isVoiceModeEnabled: state.enabled,\n voiceStatus: state.status,\n voiceError: state.error,\n toggleVoiceMode: state.toggle,\n voiceLastTranscript: state.lastTranscript,\n }),\n shallow\n );\n const [memoryOpen, setMemoryOpen] = useState(false);\n const [fileInputs, setFileInputs] = useState<File[]>([]);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [brandingText, setBrandingText] = useState<string>(\"\");\n const [feedbackModalOpen, setFeedbackModalOpen] = useState(false);\n const [isKeyboardOpen, setKeyboardOpen] = useState(false);\n const [moreActionsOpen, setMoreActionsOpen] = useState(false);\n\n const compactMobile = isMobile;\n const primaryIconSize = isMobile ? 32 : 40;\n const sendIconSize = isMobile ? 36 : 44;\n const attachmentsGap = isMobile ? 0.6 : 1;\n const attachmentChipPaddingX = isMobile ? 1 : 1.5;\n const attachmentChipPaddingY = isMobile ? 0.55 : 0.75;\n const mobileShellPadding = `calc(var(--input-offset, 1.5rem) - 0.4rem)`;\n const streamingActive = Boolean(isStreaming);\n const sendButtonBackground = streamingActive\n ? alpha(theme.palette.error.main, theme.palette.mode === \"dark\" ? 0.75 : 0.65)\n : fileText;\n const sendButtonColor = streamingActive\n ? theme.palette.common.white\n : fileIconBg;\n const sendButtonHover = streamingActive\n ? alpha(theme.palette.error.main, theme.palette.mode === \"dark\" ? 0.9 : 0.82)\n : hoverBadgeBackground;\n const sendButtonShadow = streamingActive\n ? `0 0 0 3px ${alpha(theme.palette.error.main, 0.18)}`\n : \"none\";\n\n // Feature flag checks\n const { hasSTT, hasMemory, hasDocumentKnowledge } = useFeatures();\n const { showMemoryToggle, showDocumentUpload } = useFeatureVisibility();\n\n // Check if STT is available (URL is configured in package settings) AND enabled in preferences AND user has STT feature\n const isSTTAvailable = !!packageSettings?.gatewayApiUrl && preferences.sttEnabled && hasSTT();\n const isTTSAvailable = !!(\n packageSettings?.gatewayApiUrl &&\n preferences.ttsEnabled &&\n isVoiceServiceAvailable\n );\n const isVoiceModeEligible = isSTTAvailable && isTTSAvailable;\n \n // Check if memory modal should be shown\n const isMemoryEnabled = preferences.memoryEnabled && showMemoryToggle();\n\n // Check if document upload should be shown\n const isDocumentUploadEnabled = showDocumentUpload();\n\n // Check if feedback button should be shown\n const isFeedbackEnabled = preferences.feedbackEnabled;\n\n useEffect(() => {\n const lockViewportHeight = () => {\n if (isMobile) {\n document.documentElement.style.setProperty(\"--vh\", `${window.innerHeight * 0.01}px`);\n document.documentElement.style.setProperty(\n \"--input-offset\",\n `max(env(safe-area-inset-bottom, 0px), 1.5rem)`\n );\n }\n };\n lockViewportHeight();\n window.addEventListener(\"resize\", lockViewportHeight);\n return () => window.removeEventListener(\"resize\", lockViewportHeight);\n }, [isMobile]);\n\n useEffect(() => {\n if (!isMobile) {\n setKeyboardOpen(false);\n return;\n }\n\n const viewport = window.visualViewport;\n let baseline = viewport?.height ?? window.innerHeight;\n const THRESHOLD = 120;\n\n const detectKeyboard = () => {\n const current = viewport?.height ?? window.innerHeight;\n if (current > baseline) {\n baseline = current;\n }\n setKeyboardOpen(baseline - current > THRESHOLD);\n };\n\n detectKeyboard();\n viewport?.addEventListener(\"resize\", detectKeyboard);\n window.addEventListener(\"resize\", detectKeyboard);\n\n return () => {\n viewport?.removeEventListener(\"resize\", detectKeyboard);\n window.removeEventListener(\"resize\", detectKeyboard);\n };\n }, [isMobile]);\n\n // Load branding text for disclaimer\n useEffect(() => {\n const loadBrandingText = async () => {\n try {\n const branding = await brandingService.getBranding();\n setBrandingText(branding?.brandingText || \"\");\n } catch (error) {\n debugLogger.error(\"Failed to load branding text\", { error });\n setBrandingText(\"\");\n }\n };\n loadBrandingText();\n }, []);\n\n useEffect(() => {\n const handlePaste = (e: ClipboardEvent) => {\n const items = e.clipboardData?.items;\n if (items) {\n for (const item of items) {\n if (item.type.startsWith(\"image/\")) {\n const file = item.getAsFile();\n if (file) {\n const reader = new FileReader();\n reader.onload = (event) => {\n const result = event.target?.result;\n if (result) {\n setPastedImages((prev) => [...prev, result as string]);\n }\n };\n reader.readAsDataURL(file);\n }\n }\n }\n }\n };\n document.addEventListener(\"paste\", handlePaste);\n return () => document.removeEventListener(\"paste\", handlePaste);\n }, [setPastedImages]);\n\n const getFileIcon = (filename: string) => {\n const ext = filename.split(\".\").pop()?.toLowerCase();\n switch (ext) {\n case \"js\":\n return \"JS\";\n case \"ts\":\n return \"TS\";\n case \"tsx\":\n return \"TX\";\n case \"py\":\n return \"🐍\";\n case \"json\":\n return \"{}\";\n case \"md\":\n return \"MD\";\n case \"pdf\":\n return \"📄\";\n case \"docx\":\n return \"📄\";\n case \"c\":\n return \"C\";\n case \"cpp\":\n return \"C++\";\n case \"cs\":\n return \"C#\";\n case \"java\":\n return \"J\";\n case \"txt\":\n return \"TXT\";\n default:\n return \"📁\";\n }\n };\n\n const removeImage = (index: number) => {\n setPastedImages((prev) => prev.filter((_, i) => i !== index));\n };\n\n const handleSubmit = async () => {\n if (inputValue.trim() === \"\" && pastedImages.length === 0 && fileInputs.length === 0)\n return;\n const tempImages = [...pastedImages];\n\n // Utility to escape prompt injection in user-uploaded content\n const escapePromptInjection = (text: string) => {\n return text\n .replace(/<\\s*\\/?script.*?>/gi, \"\")\n .replace(/```.*?```/gs, \"\")\n .replace(/(?<=\\n|^)\\/?(system|assistant|user):/gi, \"[removed-role]\");\n };\n\n const getFileText = async (file: File): Promise<string> => {\n const isCodeFile = (name: string) =>\n name.endsWith(\".js\") ||\n name.endsWith(\".ts\") ||\n name.endsWith(\".tsx\") ||\n name.endsWith(\".json\") ||\n name.endsWith(\".py\") ||\n name.endsWith(\".java\") ||\n name.endsWith(\".c\") ||\n name.endsWith(\".cpp\") ||\n name.endsWith(\".cs\");\n\n const sanitize = (text: string, name: string) =>\n isCodeFile(name) ? text.trim() : text.replace(/[^\\x20-\\x7E\\r\\n\\t]/g, \"\").trim();\n\n const name = file.name.toLowerCase();\n\n try {\n if (\n file.type.startsWith(\"text/\") ||\n name.endsWith(\".md\") ||\n name.endsWith(\".txt\") ||\n name.endsWith(\".js\") ||\n name.endsWith(\".ts\") ||\n name.endsWith(\".tsx\") ||\n name.endsWith(\".json\") ||\n name.endsWith(\".py\") ||\n name.endsWith(\".java\") ||\n name.endsWith(\".c\") ||\n name.endsWith(\".cpp\") ||\n name.endsWith(\".cs\")\n ) {\n const text = await file.text();\n // Sanitize prompt injection for non-code files\n if (\n name.endsWith(\".txt\") ||\n name.endsWith(\".md\") ||\n name.endsWith(\".docx\") ||\n name.endsWith(\".pdf\")\n ) {\n return `📄 ${file.name}\\n${sanitize(escapePromptInjection(text), file.name)}`;\n } else {\n return `📄 ${file.name}\\n${sanitize(text, file.name)}`;\n }\n }\n\n if (name.endsWith(\".docx\")) {\n const mammoth = await import(\"mammoth\");\n const arrayBuffer = await file.arrayBuffer();\n const { value } = await mammoth.extractRawText({ arrayBuffer });\n return `📄 ${file.name}\\n${sanitize(escapePromptInjection(value), file.name)}`;\n }\n\n if (name.endsWith(\".pdf\")) {\n const pdfjsLib = await import(\"pdfjs-dist/legacy/build/pdf\");\n pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdn.burtson.ai/scripts/pdf.worker.js';\n\n const buffer = await file.arrayBuffer();\n const loadingTask = pdfjsLib.getDocument({ data: buffer });\n\n try {\n const pdf = await loadingTask.promise;\n debugLogger.info(\"PDF loaded\", { numPages: pdf.numPages });\n\n const maxPages = Math.min(pdf.numPages, 10);\n const pages = await Promise.all(\n Array.from({ length: maxPages }, async (_, i) => {\n try {\n const page = await pdf.getPage(i + 1);\n const content = await page.getTextContent();\n return content.items\n .map((item) => {\n if (typeof (item as { str?: unknown }).str === \"string\") {\n return (item as { str: string }).str;\n }\n return \"\";\n })\n .join(\" \");\n } catch (err) {\n debugLogger.error(`Failed to read page ${i + 1}`, { error: err });\n return \"\";\n }\n })\n );\n\n const joined = pages.join(\"\\n\\n\");\n debugLogger.info(\"Extracted PDF content\", { contentPreview: joined.slice(0, 500) });\n return `📄 ${file.name}\\n${sanitize(\n escapePromptInjection(joined),\n file.name\n )}`;\n } catch (error) {\n debugLogger.error(\"PDF load failed\", {\n error: error instanceof Error ? error.message : String(error),\n fileName: file.name,\n });\n return \"\";\n }\n }\n\n return \"\";\n } catch {\n return \"\";\n }\n };\n\n const fileTexts = await Promise.all(fileInputs.map(getFileText));\n // Logging all extracted file texts\n debugLogger.debug(\"All extracted file texts\", { fileTexts });\n const fileContent = fileTexts.filter(Boolean).join(\"\\n\\n\");\n\n const tempQuestionBase =\n inputValue.trim() ||\n (tempImages.length === 1\n ? \"[📷 You attached an image]\"\n : tempImages.length > 1\n ? `[📷 You attached ${tempImages.length} images]`\n : \"\");\n\n const fileDisplaySummary =\n fileInputs.length > 0\n ? `[📎 Attached ${fileInputs.length} file${fileInputs.length > 1 ? \"s\" : \"\"\n }: ${fileInputs.map((f) => f.name).join(\", \")}]`\n : \"\";\n\n //TODO:displayQuestion is what shows in chat history, excludes file content\n const displayQuestion = [\n tempQuestionBase ||\n (fileDisplaySummary ? \"[📤 You submitted content without text]\" : \"\"),\n fileDisplaySummary,\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n // fullPrompt is what is sent to the LLM (inputValue + fileContent)\n const fullPrompt = [inputValue, fileContent].filter(Boolean).join(\"\\n\\n\");\n\n setInputValue(\"\");\n setPastedImages([]);\n setFileInputs([]);\n onSend(fullPrompt, tempImages, displayQuestion);\n inputRef.current?.blur();\n fileInputRef.current!.value = \"\"; // clear input field manually\n };\n\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n const handleTranscriptionCompleted = (transcribed: string) => {\n const value = (inputValue + transcribed).trim();\n setInputValue(value);\n inputRef.current?.focus();\n };\n\n const memory = localStorage.getItem(\"bandit-memory\");\n\n const hasAttachmentAction = fileInputs.length < 3 && isDocumentUploadEnabled;\n const hasMemoryAction = isMemoryEnabled;\n const hasFeedbackAction = isFeedbackEnabled && isMobile;\n const hasSttAction = isSTTAvailable && !isVoiceModeEnabled;\n const hasSecondaryActions = isMobile && (hasAttachmentAction || hasMemoryAction || hasFeedbackAction || hasSttAction);\n\n useEffect(() => {\n if (!isMobile || !hasSecondaryActions) {\n setMoreActionsOpen(false);\n }\n }, [isMobile, hasSecondaryActions]);\n\n const renderAttachmentButton = (key?: string) => {\n if (!hasAttachmentAction) return null;\n return (\n <Tooltip key={key ?? \"attach\"} title=\"Attach files or images\">\n <IconButton\n onClick={() => fileInputRef.current?.click()}\n sx={{\n bgcolor: badgeBackground,\n color: fileText,\n width: primaryIconSize,\n height: primaryIconSize,\n borderRadius: \"50%\",\n \"&:hover\": { bgcolor: hoverBadgeBackground },\n }}\n >\n +\n </IconButton>\n </Tooltip>\n );\n };\n\n const renderMemoryButton = (key?: string) => {\n if (!hasMemoryAction) return null;\n return (\n <Tooltip key={key ?? \"memory\"} title=\"Memory\">\n <IconButton\n onClick={() => setMemoryOpen(true)}\n sx={{\n bgcolor: badgeBackground,\n color: fileText,\n width: primaryIconSize,\n height: primaryIconSize,\n borderRadius: \"50%\",\n \"&:hover\": { bgcolor: hoverBadgeBackground },\n }}\n >\n <PsychologyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n );\n };\n\n const renderFeedbackButton = (key?: string) => {\n if (!hasFeedbackAction) return null;\n return (\n <Tooltip key={key ?? \"feedback\"} title=\"Send Feedback\">\n <IconButton\n onClick={() => setFeedbackModalOpen(true)}\n sx={{\n bgcolor: badgeBackground,\n color: fileText,\n width: primaryIconSize,\n height: primaryIconSize,\n borderRadius: \"50%\",\n \"&:hover\": { bgcolor: hoverBadgeBackground },\n }}\n >\n <FeedbackIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n );\n };\n\n const renderSttButton = (key?: string) => {\n if (!hasSttAction) return null;\n return (\n <Box key={key ?? \"stt\"} sx={{ display: \"flex\", alignItems: \"center\" }}>\n <Transcriber onTranscriptionCompleted={handleTranscriptionCompleted} />\n </Box>\n );\n };\n\n return (\n <>\n <Box\n sx={{\n width: \"100%\",\n bgcolor: shellBackground,\n zIndex: isMobile ? 1300 : 1000,\n display: \"flex\",\n flexDirection: \"column\",\n flex: \"1 1 auto\",\n alignItems: \"center\",\n justifyContent: \"end\",\n marginTop: isMobile ? (compactMobile ? 0.5 : 1) : 2,\n px: isMobile ? (compactMobile ? 1.5 : 2) : 0,\n pb: isMobile ? mobileShellPadding : 3,\n pointerEvents: \"none\",\n \"& > *\": { pointerEvents: \"auto\" },\n }}\n ref={inputContainerRef}\n >\n <Box\n sx={{\n width: \"100%\",\n bgcolor: inputBackground,\n borderRadius: \"24px\",\n boxShadow: isMobile\n ? `0 0 0 1px ${theme.palette.mode === \"dark\" ? \"#444\" : \"#eee\"}`\n : \"0 4px 20px rgba(0, 0, 0, 0.4)\",\n px: isMobile ? (compactMobile ? 1 : 1.5) : 3,\n pt: isMobile ? (compactMobile ? 0.6 : 1) : 1,\n pb: isMobile ? (compactMobile ? 0.9 : 1.5) : 1.5,\n display: \"flex\",\n flexDirection: \"column\",\n gap: isMobile ? (compactMobile ? 0.75 : 1) : 1,\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: attachmentsGap,\n alignItems: \"center\",\n flexDirection: \"row\",\n }}\n >\n {fileInputs.map((file, idx) => (\n <Box\n key={idx}\n sx={{\n position: \"relative\",\n bgcolor: fileBg,\n px: attachmentChipPaddingX,\n py: attachmentChipPaddingY,\n borderRadius: 999,\n display: \"flex\",\n alignItems: \"center\",\n gap: isMobile ? (compactMobile ? 0.6 : 0.9) : 1,\n }}\n >\n <Avatar\n sx={{\n width: isMobile ? (compactMobile ? 16 : 18) : 18,\n height: isMobile ? (compactMobile ? 16 : 18) : 18,\n fontSize: \"0.7rem\",\n bgcolor: fileIconBg,\n color: fileText,\n }}\n variant=\"rounded\"\n >\n {getFileIcon(file.name)}\n </Avatar>\n <Typography variant=\"caption\" sx={{ color: fileText }}>\n {file.name}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={() =>\n setFileInputs((prev) => prev.filter((_, i) => i !== idx))\n }\n sx={{ ml: 0.5, color: theme.palette.mode === \"dark\" ? \"#aaa\" : \"#444\" }}\n >\n <CloseIcon sx={{ fontSize: 14 }} />\n </IconButton>\n </Box>\n ))}\n {pastedImages.map((img, idx) => (\n <Box key={`img-${idx}`} sx={{ position: \"relative\" }}>\n <Avatar\n src={img}\n variant=\"rounded\"\n sx={{\n width: isMobile ? (compactMobile ? 30 : 32) : 32,\n height: isMobile ? (compactMobile ? 30 : 32) : 32,\n border: `1px solid ${fileIconBg}`,\n }}\n />\n <IconButton\n size=\"small\"\n onClick={() => removeImage(idx)}\n sx={{\n position: \"absolute\",\n top: -6,\n right: -6,\n bgcolor: fileText,\n p: 0.3,\n zIndex: 2,\n transition: \"background-color 0.2s ease\",\n \"&:hover\": {\n bgcolor: \"rgba(255, 5, 5, 0.85)\",\n },\n }}\n >\n <CloseIcon\n sx={{\n fontSize: 14,\n color: badgeBackground,\n }}\n />\n </IconButton>\n </Box>\n ))}\n <input\n type=\"file\"\n accept=\".txt,.docx,.pdf,.md,.json,.js,.ts,.tsx,.py,.java,.c,.cpp,.cs,image/*\"\n multiple\n hidden\n ref={fileInputRef}\n onChange={(e) => {\n const selected = Array.from(e.target.files || []);\n const nonImages = selected.filter(\n (file) => !file.type.startsWith(\"image/\")\n );\n const images = selected.filter((file) => file.type.startsWith(\"image/\"));\n\n if (nonImages.length + fileInputs.length > 3) {\n fileInputRef.current!.value = \"\"; // allow re-upload of same file\n return;\n }\n\n const safeNonImages = nonImages.filter((file) => file.size <= 1_000_000); // Optional: size cap\n setFileInputs((prev) => [...prev, ...safeNonImages]);\n\n images.forEach((image) => {\n const reader = new FileReader();\n reader.onload = (event) => {\n const result = event.target?.result;\n if (result) {\n setPastedImages((prev) => [...prev, result as string]);\n }\n };\n reader.readAsDataURL(image);\n });\n\n fileInputRef.current!.value = \"\"; // allow re-upload of same file\n }}\n />\n </Box>\n\n <Box\n sx={{\n display: \"flex\",\n maxHeight: \"200px\",\n overflowY: \"auto\",\n }}\n >\n <TextField\n fullWidth\n multiline\n maxRows={isMobile ? (compactMobile ? 6 : 12) : 6}\n placeholder={\"What's on your mind?\"}\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyPress}\n inputRef={inputRef}\n variant=\"standard\"\n InputProps={{\n disableUnderline: true,\n sx: {\n flex: \"1 1 auto\",\n maxHeight: isMobile ? (compactMobile ? \"120px\" : \"150px\") : \"none\",\n overflowY: \"auto\",\n color: fileText,\n \"& .MuiInputBase-inputMultiline\": {\n fontSize: isMobile ? (compactMobile ? \"0.95rem\" : \"1rem\") : \"1rem\",\n },\n },\n }}\n sx={{\n flex: 1,\n \"& .MuiInputBase-root\": {},\n }}\n />\n </Box>\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: isMobile ? 0.6 : 1,\n mt: isMobile ? 0.5 : 1,\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: isMobile ? 0.6 : 1,\n minHeight: primaryIconSize,\n }}\n >\n {isVoiceModeEligible && (\n <>\n <Tooltip\n title={\n !isVoiceModeEnabled\n ? \"Enable voice mode\"\n : voiceStatus === \"error\"\n ? voiceError || \"Voice mode error\"\n : voiceStatus === \"processing\"\n ? \"Transcribing your speech\"\n : voiceStatus === \"recording\"\n ? \"Recording - click to stop\"\n : voiceStatus === \"initializing\"\n ? \"Preparing microphone\"\n : \"Listening - click to turn off\"\n }\n >\n <IconButton\n onClick={toggleVoiceMode}\n sx={{\n width: primaryIconSize,\n height: primaryIconSize,\n borderRadius: \"50%\",\n bgcolor: isVoiceModeEnabled\n ? alpha(theme.palette.error.main, theme.palette.mode === \"dark\" ? 0.45 : 0.3)\n : badgeBackground,\n color: isVoiceModeEnabled\n ? theme.palette.common.white\n : fileText,\n boxShadow:\n isVoiceModeEnabled && voiceStatus === \"recording\"\n ? `0 0 0 2px ${alpha(theme.palette.error.main, 0.25)}`\n : \"none\",\n transform:\n isVoiceModeEnabled && voiceStatus === \"recording\" ? \"scale(1.05)\" : \"none\",\n transition: \"transform 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease\",\n \"&:hover\": {\n bgcolor: isVoiceModeEnabled\n ? alpha(theme.palette.error.main, theme.palette.mode === \"dark\" ? 0.55 : 0.38)\n : hoverBadgeBackground,\n },\n }}\n >\n {!isVoiceModeEnabled ? (\n <GraphicEqIcon fontSize=\"small\" sx={{ color: theme.palette.mode === \"dark\" ? fileText : theme.palette.text.secondary }} />\n ) : voiceStatus === \"processing\" || voiceStatus === \"initializing\" ? (\n <CircularProgress size={18} sx={{ color: fileText }} />\n ) : voiceStatus === \"error\" ? (\n <HearingDisabledIcon fontSize=\"small\" sx={{ color: theme.palette.error.light }} />\n ) : voiceStatus === \"recording\" ? (\n <GraphicEqIcon fontSize=\"small\" sx={{ color: theme.palette.error.light }} />\n ) : (\n <GraphicEqIcon fontSize=\"small\" sx={{ color: theme.palette.common.white }} />\n )}\n </IconButton>\n </Tooltip>\n {!isMobile && isVoiceModeEnabled && (\n <Typography\n variant=\"caption\"\n sx={{\n color:\n voiceStatus === \"error\"\n ? theme.palette.error.main\n : voiceStatus === \"processing\"\n ? theme.palette.warning.main\n : fileText,\n maxWidth: 240,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {voiceStatus === \"error\"\n ? voiceError || \"Voice mode unavailable\"\n : voiceStatus === \"initializing\"\n ? \"Starting voice mode...\"\n : voiceStatus === \"recording\"\n ? \"Recording...\"\n : voiceStatus === \"processing\"\n ? \"Transcribing...\"\n : voiceLastTranscript\n ? `Heard: \"${\n voiceLastTranscript.length > 60\n ? `${voiceLastTranscript.slice(0, 57)}...`\n : voiceLastTranscript\n }\"`\n : \"Listening...\"}\n </Typography>\n )}\n </>\n )}\n {!isMobile && renderAttachmentButton(\"attach-inline\")}\n {!isMobile && renderMemoryButton(\"memory-inline\")}\n {!isMobile && renderSttButton(\"stt-inline\")}\n {!isMobile && isFeedbackEnabled && (\n <Tooltip title=\"Send Feedback\">\n <IconButton\n onClick={() => setFeedbackModalOpen(true)}\n sx={{\n bgcolor: badgeBackground,\n color: fileText,\n width: primaryIconSize,\n height: primaryIconSize,\n borderRadius: \"50%\",\n \"&:hover\": { bgcolor: hoverBadgeBackground },\n }}\n >\n <FeedbackIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n {isMobile && hasSecondaryActions && (\n <IconButton\n onClick={() => setMoreActionsOpen((prev) => !prev)}\n sx={{\n bgcolor: badgeBackground,\n color: fileText,\n width: primaryIconSize,\n height: primaryIconSize,\n borderRadius: \"50%\",\n transition: \"background-color 0.2s ease\",\n \"&:hover\": { bgcolor: hoverBadgeBackground },\n }}\n >\n <ExpandMoreIcon\n fontSize=\"small\"\n sx={{\n transition: \"transform 0.2s ease\",\n transform: moreActionsOpen ? \"rotate(180deg)\" : \"rotate(0deg)\",\n }}\n />\n </IconButton>\n )}\n </Box>\n\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: isMobile ? 0.6 : 1 }}>\n <Tooltip title={isStreaming ? \"Stop response\" : \"Send message\"}>\n <span>\n <IconButton\n onClick={isStreaming ? (onStop || (() => {})) : handleSubmit}\n disabled={\n (isStreaming ? false : isSubmitting) ||\n (!isStreaming &&\n !inputValue.trim() &&\n pastedImages.length === 0 &&\n fileInputs.length === 0)\n }\n sx={{\n bgcolor: sendButtonBackground,\n color: sendButtonColor,\n borderRadius: \"50%\",\n width: sendIconSize,\n height: sendIconSize,\n boxShadow: sendButtonShadow,\n transition: \"background-color 0.2s ease, box-shadow 0.2s ease\",\n \"&:hover\": { bgcolor: sendButtonHover },\n \"&.Mui-disabled\": { opacity: 0.5 },\n }}\n >\n {isStreaming ? <CloseIcon fontSize=\"small\" /> : <ArrowUpwardIcon fontSize=\"small\" />}\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n </Box>\n {isMobile && hasSecondaryActions && (\n <Collapse in={moreActionsOpen} unmountOnExit>\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 0.7,\n mt: 0.6,\n flexWrap: \"wrap\",\n justifyContent: \"flex-end\",\n }}\n >\n {renderAttachmentButton(\"attach-tray\")}\n {renderMemoryButton(\"memory-tray\")}\n {renderSttButton(\"stt-tray\")}\n {renderFeedbackButton(\"feedback-tray\")}\n </Box>\n </Collapse>\n )}\n </Box>\n\n <Typography\n variant=\"caption\"\n sx={{\n mt: isMobile ? (compactMobile ? 0.25 : 0.75) : 1,\n color: captionColor,\n fontStyle: \"italic\",\n fontSize: \"0.75rem\",\n textAlign: \"center\",\n opacity: isKeyboardOpen ? 0 : 1,\n maxHeight: isKeyboardOpen ? 0 : \"2.4rem\",\n overflow: \"hidden\",\n transition: \"opacity 120ms ease, max-height 120ms ease, transform 120ms ease\",\n transform: `translateY(${isKeyboardOpen ? '6px' : '0'})`,\n pointerEvents: \"none\",\n }}\n >\n {brandingText || \"BanditAI\"} may be wrong - double-check important info.\n </Typography>\n </Box>\n\n {isMemoryEnabled && (\n <MemoryModal open={memoryOpen} onClose={() => setMemoryOpen(false)} />\n )}\n \n {isFeedbackEnabled && (\n <FeedbackModal \n open={feedbackModalOpen} \n onClose={() => setFeedbackModalOpen(false)}\n feedbackEmail={packageSettings?.feedbackEmail}\n />\n )}\n </>\n );\n};\n\nexport default ChatInput;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-F291-151AAD\nconst __banditFingerprint_stt_transcribertsx = 'BL-FP-CF71B4-71EF';\nconst __auditTrail_stt_transcribertsx = 'BL-AU-MGOIKVVZ-JTMQ';\n// File: transcriber.tsx | Path: src/services/stt/transcriber.tsx | Hash: f29171ef\n\nimport { useState, useRef } from \"react\";\nimport MicIcon from \"@mui/icons-material/Mic\";\nimport CheckIcon from \"@mui/icons-material/Check\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport { SoundRecorderService } from \"./sound-recorder.service\";\nimport { STTClient } from \"./stt-client\";\nimport { CircularProgress, IconButton, useTheme } from \"@mui/material\";\nimport { from, Subscription, switchMap } from \"rxjs\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\ninterface TranscriberProps {\n onTranscriptionCompleted: (text: string) => void;\n}\n\ntype RecorderStatus = \"IDLE\" | \"RECORDING\" | \"LOADING\";\n\nconst initialButtonStyles = (badgeBackground: string, fileText: string, hoverBadgeBackground: string) => ({\n bgcolor: badgeBackground,\n color: fileText,\n width: 36,\n height: 36,\n borderRadius: \"50%\",\n \"&:hover\": { bgcolor: hoverBadgeBackground },\n});\n\nconst Transcriber: React.FC<TranscriberProps> = ({ onTranscriptionCompleted }) => {\n const theme = useTheme();\n const badgeBackground = theme.palette.chat.badge;\n const fileText = theme.palette.chat.fileText;\n const hoverBadgeBackground = theme.palette.chat.badgeHover;\n const [status, setStatus] = useState<RecorderStatus>(\"IDLE\");\n const recorderRef = useRef(new SoundRecorderService());\n const [iconButtonStyles] = useState(() => initialButtonStyles(badgeBackground, fileText, hoverBadgeBackground));\n const [recordingSub, setRecordingSub] = useState<Subscription>(() => new Subscription());\n const start = () => {\n recordingSub.unsubscribe();\n const recording = recorderRef.current.start();\n const text = recording.pipe(\n switchMap((blob: Blob) => {\n debugLogger.debug('Processing audio blob for transcription');\n return from(STTClient.transcribe(blob));\n })\n );\n const sub = text.subscribe({\n next: (value) => onTranscriptionCompleted(value),\n error: (error) => setStatus(\"IDLE\"),\n complete: () => setStatus(\"IDLE\"),\n });\n\n setRecordingSub(sub);\n };\n\n const stop = () => {\n recorderRef.current.stop();\n };\n const handleRecordClick = () => {\n setStatus(\"RECORDING\");\n start();\n };\n const handleCancelClick = () => {\n setStatus(\"IDLE\");\n };\n const handleSubmitClick = () => {\n setStatus(\"LOADING\");\n stop();\n };\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n transition: \"all 0.2s ease\",\n backgroundColor: status === \"RECORDING\" ? \"rgba(0,0,0,.3)\" : \"rgba(0,0,0,0)\",\n borderRadius: \"50px\",\n }}\n >\n {status === \"IDLE\" ? (\n <IconButton sx={{ ...iconButtonStyles }} onClick={handleRecordClick}>\n <MicIcon sx={{ color: \"#aaa\", cursor: \"pointer\" }} />\n </IconButton>\n ) : status === \"RECORDING\" ? (\n <>\n <IconButton\n onClick={handleCancelClick}\n sx={{ ...iconButtonStyles, marginRight: 1 }}\n >\n <CloseIcon></CloseIcon>\n </IconButton>\n <IconButton\n sx={{\n ...iconButtonStyles,\n filter: \"invert(110%)\",\n }}\n onClick={handleSubmitClick}\n >\n <CheckIcon></CheckIcon>\n </IconButton>\n </>\n ) : status === \"LOADING\" ? (\n <IconButton sx={{ ...iconButtonStyles }}>\n <CircularProgress size={20} />\n </IconButton>\n ) : null}\n </div>\n );\n};\n\nexport default Transcriber;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-17BC-5CBAB9\nconst __banditFingerprint_stt_soundrecorderservicets = 'BL-FP-A3A6BF-2B75';\nconst __auditTrail_stt_soundrecorderservicets = 'BL-AU-MGOIKVVZ-9DDJ';\n// File: sound-recorder.service.ts | Path: src/services/stt/sound-recorder.service.ts | Hash: 17bc2b75\n\nimport { first, from, fromEvent, map, Observable, shareReplay, switchMap } from \"rxjs\";\nimport { createAudioBlob } from \"./create-audio-blob\";\n\nexport class SoundRecorderService {\n private _mediaRecorder?: Observable<MediaRecorder>;\n\n\n start(): Observable<Blob> {\n\n const mediaStream = from(navigator.mediaDevices.getUserMedia({ audio: true }));\n\n this._mediaRecorder = mediaStream.pipe(map(stream => {\n const rec = new MediaRecorder(stream)\n rec.start();\n return rec;\n }), shareReplay(1));\n\n const dataAvailableEvent = this._mediaRecorder.pipe(\n switchMap(recorder => fromEvent<BlobEvent>(recorder, 'dataavailable'))\n );\n\n const blob = dataAvailableEvent.pipe(\n first(),\n map((event) => createAudioBlob(event.data)),\n shareReplay(1)\n );\n\n return blob;\n }\n\n\n stop() {\n if (!this._mediaRecorder) {\n return;\n }\n\n this._mediaRecorder.pipe(first()).subscribe(recorder => {\n recorder.stop();\n });\n }\n\n\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-36B0-9C1E70\nconst __banditFingerprint_stt_createaudioblobts = 'BL-FP-14329D-148B';\nconst __auditTrail_stt_createaudioblobts = 'BL-AU-MGOIKVVY-G0SR';\n// File: create-audio-blob.ts | Path: src/services/stt/create-audio-blob.ts | Hash: 36b0148b\n\nexport const createAudioBlob = (data: BlobPart | BlobPart[]): Blob => {\n const parts = Array.isArray(data) ? data : [data];\n return new Blob(parts, { type: 'audio/ogg' }); // Simplified MIME type without codec specification\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-C8A1-40B795\nconst __banditFingerprint_stt_sttclientts = 'BL-FP-B71992-8B55';\nconst __auditTrail_stt_sttclientts = 'BL-AU-MGOIKVVZ-KV58';\n// File: stt-client.ts | Path: src/services/stt/stt-client.ts | Hash: c8a18b55\n\nimport { authenticationService } from \"../auth/authenticationService\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\";\n\n/**\n * Abstract STT response parser to handle different API response formats\n */\nexport interface STTResponse {\n text: string;\n}\n\nexport class STTResponseParser {\n /**\n * Parse STT response to extract transcribed text\n * Supports multiple API response formats for maximum compatibility\n */\n static parseResponse(data: unknown): string {\n const root = isRecord(data) ? data : {};\n\n // Strategy 1: Nested JSON in transcription field (current C# API)\n const transcriptionValue = root[\"transcription\"];\n if (typeof transcriptionValue === \"string\") {\n try {\n const transcriptionData = JSON.parse(transcriptionValue) as Record<string, unknown>;\n const nestedText = transcriptionData?.text;\n if (typeof nestedText === \"string\") {\n return nestedText;\n }\n } catch (e) {\n debugLogger.warn('Failed to parse nested transcription JSON, trying direct access');\n }\n }\n\n // Strategy 2: Direct text field (common in Node.js/Python APIs)\n const directText = root[\"text\"];\n if (typeof directText === \"string\") {\n return directText;\n }\n\n // Strategy 3: Transcription as direct string (simple APIs)\n if (typeof transcriptionValue === \"string\" && !transcriptionValue.startsWith(\"{\")) {\n return transcriptionValue;\n }\n\n // Strategy 4: Result field (some ML APIs)\n const result = root[\"result\"];\n if (isRecord(result)) {\n const resultText = result[\"text\"];\n if (typeof resultText === \"string\") {\n return resultText;\n }\n }\n\n // Strategy 5: Response wrapper (enterprise APIs)\n const responseWrapper = root[\"response\"];\n if (isRecord(responseWrapper)) {\n const responseText = responseWrapper[\"transcription\"];\n if (typeof responseText === \"string\") {\n return responseText;\n }\n }\n\n // Strategy 6: Alternatives array (Google/AWS style)\n const alternatives = root[\"alternatives\"];\n if (Array.isArray(alternatives)) {\n const firstAlternative = alternatives[0];\n if (isRecord(firstAlternative) && typeof firstAlternative[\"transcript\"] === \"string\") {\n return firstAlternative[\"transcript\"] as string;\n }\n }\n\n debugLogger.error('Unable to parse STT response format:', data);\n throw new Error('Unsupported STT response format');\n }\n}\n\n/**\n * Universal STT client that works with any backend API\n */\nexport class STTClient {\n /**\n * Transcribe audio blob to text\n * @param blob Audio blob to transcribe\n * @returns Promise<string> Transcribed text\n */\n static async transcribe(blob: Blob): Promise<string> {\n const gatewayUrl = usePackageSettingsStore.getState().settings?.gatewayApiUrl || \"\";\n \n if (!gatewayUrl) {\n throw new Error('Gateway API URL not configured');\n }\n \n let normalizedBlob: Blob = blob;\n\n if (blob.type.includes('webm') && blob.type.includes('codecs=')) {\n debugLogger.debug('STT Request: normalizing webm blob without codec suffix', {\n originalType: blob.type,\n });\n normalizedBlob = new Blob([blob], { type: 'audio/webm' });\n }\n\n const body = new FormData();\n const filename = normalizedBlob.type.includes('ogg') ? 'audio.ogg' : \n normalizedBlob.type.includes('wav') ? 'audio.wav' :\n normalizedBlob.type.includes('mp3') ? 'audio.mp3' : 'audio.webm';\n \n // Try common parameter names for maximum API compatibility\n body.append(\"audio\", normalizedBlob, filename); // Most common\n body.append(\"file\", normalizedBlob, filename); // Alternative\n body.append(\"audioFile\", normalizedBlob, filename); // Some APIs prefer this\n \n debugLogger.debug('STT Request:', {\n blobSize: normalizedBlob.size,\n blobType: normalizedBlob.type,\n filename: filename,\n url: `${gatewayUrl}/stt/transcribe`\n });\n \n const token = authenticationService.getToken();\n const response = await fetch(`${gatewayUrl}/stt/transcribe`, {\n method: \"POST\",\n headers: { \n Authorization: `Bearer ${token}`,\n // Let browser set Content-Type with boundary for FormData\n },\n body: body,\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n debugLogger.error('STT API Error:', { status: response.status, error: errorText });\n throw new Error(`STT API Error: ${response.status} - ${errorText}`);\n }\n \n const data = await response.json();\n debugLogger.debug('STT Response:', data);\n \n return STTResponseParser.parseResponse(data);\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-E2F1-C79818\nconst __banditFingerprint_chat_memorymodaltsx = 'BL-FP-F532AD-BDE7';\nconst __auditTrail_chat_memorymodaltsx = 'BL-AU-MGOIKVV3-DWCK';\n// File: memory-modal.tsx | Path: src/chat/memory-modal.tsx | Hash: e2f1bde7\n\nimport React, { useState, useEffect } from \"react\";\nimport { useTheme, alpha, keyframes } from \"@mui/material/styles\";\nimport {\n Box,\n Typography,\n Modal,\n SwipeableDrawer,\n IconButton,\n TextField,\n Button,\n List,\n ListItem,\n Divider,\n Tabs,\n Tab,\n Tooltip,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Avatar,\n Radio,\n RadioGroup,\n FormControlLabel,\n FormControl,\n useMediaQuery,\n} from \"@mui/material\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport DeleteIcon from \"@mui/icons-material/Delete\";\nimport PushPinIcon from \"@mui/icons-material/PushPin\";\nimport PushPinOutlinedIcon from \"@mui/icons-material/PushPinOutlined\";\nimport CloudSyncIcon from \"@mui/icons-material/CloudSync\";\nimport { useMemoryStore } from \"../store/memoryStore\";\nimport { useVectorStore } from \"../hooks/useVectorStore\";\nimport { useConversationSyncStore } from \"../store/conversationSyncStore\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\n\ninterface MemoryModalProps {\n open: boolean;\n onClose: () => void;\n}\n\ntype VectorMemory = {\n id: string;\n content: string;\n source?: \"user\" | \"auto\" | string;\n pinned?: boolean;\n uploadedAt?: string | number | Date;\n tags?: string[];\n [key: string]: unknown;\n};\n\ntype ImportResultDetails = {\n totalMemories: number;\n successCount: number;\n failureCount: number;\n duration?: string;\n warnings?: string[];\n};\n\ntype ImportResult = {\n success: boolean;\n message?: string;\n details?: ImportResultDetails;\n};\n\ntype ImportProgress = {\n isImporting: boolean;\n progress: string;\n result?: ImportResult;\n};\n\n/**\n * Bandit Memory Modal\n *\n * - Displays user and auto memories.\n * - Supports editing, pinning, deleting, and adding new memories.\n * - Memory-aware layout adapts to mobile virtual keyboards.\n * - Shows pinned memory token budget in real-time.\n */\nconst MemoryModal: React.FC<MemoryModalProps> = ({ open, onClose }) => {\n const { entries, addMemory, togglePinMemory, removeMemory, clearMemories, hydrate, _hasHydrated } = useMemoryStore();\n const isAdvancedVectorFeaturesEnabled = useConversationSyncStore(\n (state) => state.isAdvancedVectorFeaturesEnabled\n );\n const { \n isVectorEnabled, \n addMemory: addVectorMemory, \n batchCreateMemories,\n batchCreateMemoriesAdvanced,\n batchImportMemories,\n getUserMemories: getVectorMemories,\n deleteMemory: deleteVectorMemory,\n updateMemory: updateVectorMemory\n } = useVectorStore();\n \n // Check if vector should be used for memories\n const shouldUseVectorForMemories = isVectorEnabled && isAdvancedVectorFeaturesEnabled;\n \n // Debug preferences on modal open\n useEffect(() => {\n if (open) {\n debugLogger.memoryDebug(\"Memory modal opened\", {\n isVectorEnabled,\n isAdvancedVectorFeaturesEnabled,\n shouldUseVectorForMemories,\n });\n }\n }, [open, isVectorEnabled, isAdvancedVectorFeaturesEnabled, shouldUseVectorForMemories]);\n \n const [newMemory, setNewMemory] = useState(\"\");\n const [selectedTab, setSelectedTab] = useState<\"auto\" | \"user\">(\"user\"); // Always default to user\n const [editingId, setEditingId] = useState<string | null>(null);\n const [editedContent, setEditedContent] = useState(\"\");\n const [multiSelectMode, setMultiSelectMode] = useState(false);\n const [selectedIds, setSelectedIds] = useState<string[]>([]);\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [clearAllOpen, setClearAllOpen] = useState(false);\n const [clearOption, setClearOption] = useState<\"user\" | \"auto\" | \"both\">(\"both\");\n const [vectorMemories, setVectorMemories] = useState<VectorMemory[]>([]);\n const [bulkImportOpen, setBulkImportOpen] = useState(false);\n const [importProgress, setImportProgress] = useState<ImportProgress>({\n isImporting: false,\n progress: \"\",\n });\n\n const theme = useTheme();\n const isMobileView = useMediaQuery(theme.breakpoints.down(\"sm\"));\n \n // Define pulse animation\n const pulse = keyframes`\n 0% {\n opacity: 1;\n transform: scale(1);\n }\n 50% {\n opacity: 0.7;\n transform: scale(1.1);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n `;\n\n // Define shimmer animation\n const shimmer = keyframes`\n 0% {\n left: -100%;\n }\n 100% {\n left: 100%;\n }\n `;\n\n const {\n shell,\n input,\n fileText,\n appBar,\n badge,\n badgeHover,\n } = theme.palette.chat;\n\n const handleAdd = async () => {\n if (newMemory.trim()) {\n if (shouldUseVectorForMemories) {\n try {\n await addVectorMemory(newMemory.trim());\n // Refresh vector memories list\n const memories = await getVectorMemories();\n setVectorMemories((memories ?? []) as VectorMemory[]);\n } catch (error) {\n debugLogger.error(\"Failed to add vector memory\", { error });\n // Fallback to local store\n await addMemory(newMemory.trim(), [], \"user\");\n }\n } else {\n await addMemory(newMemory.trim(), [], \"user\");\n }\n setNewMemory(\"\");\n }\n };\n\n // Load vector memories when modal opens and vector is enabled\n useEffect(() => {\n if (open && shouldUseVectorForMemories) {\n const loadVectorMemories = async () => {\n try {\n const memories = await getVectorMemories();\n debugLogger.memoryDebug(\"Vector memories loaded\", {\n count: memories?.length || 0,\n isArray: Array.isArray(memories),\n });\n setVectorMemories((memories ?? []) as VectorMemory[]);\n } catch (error) {\n debugLogger.error(\"Failed to load vector memories\", { error });\n setVectorMemories([]);\n }\n };\n loadVectorMemories();\n }\n }, [open, shouldUseVectorForMemories, getVectorMemories]);\n\n // Load local memories when modal opens and vector is disabled\n useEffect(() => {\n if (open && !shouldUseVectorForMemories) {\n const loadLocalMemories = async () => {\n try {\n await hydrate();\n } catch (error) {\n debugLogger.error(\"Failed to load local memories\", { error });\n }\n };\n loadLocalMemories();\n }\n }, [open, shouldUseVectorForMemories, hydrate]);\n\n // Also hydrate on initial mount to ensure memories are always loaded\n useEffect(() => {\n if (!shouldUseVectorForMemories && !_hasHydrated) {\n const initialHydrate = async () => {\n try {\n await hydrate();\n } catch (error) {\n debugLogger.error(\"Failed to perform initial hydration\", { error });\n }\n };\n initialHydrate();\n }\n }, [shouldUseVectorForMemories, _hasHydrated, hydrate]);\n\n const handleMultiDelete = async () => {\n if (selectedIds.length === 0) return;\n \n // Use the working single delete function in a loop\n let successCount = 0;\n let errorCount = 0;\n \n for (const id of selectedIds) {\n try {\n await handleDeleteMemory(id);\n successCount++;\n \n // Add a small delay to avoid overwhelming the API\n await new Promise(resolve => setTimeout(resolve, 100));\n } catch (error) {\n debugLogger.error(\"Failed to delete memory during bulk delete\", { id, error });\n errorCount++;\n }\n }\n \n setSelectedIds([]);\n setMultiSelectMode(false);\n setConfirmOpen(false);\n };\n\n const handleMultiPin = async (pinned: boolean) => {\n debugLogger.memoryDebug(\"Multi-pin requested\", {\n count: selectedIds.length,\n pinned,\n });\n\n if (selectedIds.length === 0) {\n debugLogger.warn(\"No memories selected for pinning\");\n return;\n }\n \n if (shouldUseVectorForMemories) {\n // For vector memories, loop through each ID and update pin status\n let successCount = 0;\n let errorCount = 0;\n \n for (const id of selectedIds) {\n try {\n const result = await updateVectorMemory(id, { pinned });\n if (result && result.success) {\n successCount++;\n } else {\n debugLogger.error(\"Failed to update vector memory pin status\", {\n id,\n error: result?.error || \"Unknown error\",\n });\n errorCount++;\n }\n } catch (error) {\n debugLogger.error(\"Exception updating vector memory pin status\", { id, error });\n errorCount++;\n }\n }\n \n debugLogger.memoryDebug(\"Vector pin update summary\", {\n successCount,\n errorCount,\n });\n \n // Refresh vector memories list\n try {\n const memories = await getVectorMemories();\n setVectorMemories((memories ?? []) as VectorMemory[]);\n } catch (error) {\n debugLogger.error(\"Failed to refresh vector memories after pin update\", { error });\n }\n } else {\n // Local store pin toggle\n try {\n let successCount = 0;\n \n for (const id of selectedIds) {\n const currentEntries = useMemoryStore.getState().entries;\n const memory = currentEntries.find(entry => entry.id === id);\n \n if (memory) {\n if (memory.pinned !== pinned) {\n togglePinMemory(id);\n successCount++;\n } else {\n debugLogger.memoryDebug(\"Memory already at desired pin status\", { id, pinned });\n }\n } else {\n debugLogger.warn(\"Memory not found in local store during pin update\", { id });\n }\n }\n \n debugLogger.memoryDebug(\"Local pin update summary\", { successCount });\n } catch (error) {\n debugLogger.error(\"Failed to update local pin status\", { error });\n }\n }\n \n setSelectedIds([]);\n setMultiSelectMode(false);\n };\n\n const handleDeleteMemory = async (memoryId: string) => {\n if (shouldUseVectorForMemories) {\n try {\n const result = await deleteVectorMemory(memoryId);\n \n if (result && result.success) {\n // Refresh vector memories list\n const memories = await getVectorMemories();\n setVectorMemories((memories ?? []) as VectorMemory[]);\n } else {\n throw new Error(result?.error || 'Delete operation failed');\n }\n } catch (error) {\n debugLogger.error(\"Failed to delete vector memory\", { error });\n // Don't fallback to local store for vector memories, just throw the error\n throw error;\n }\n } else {\n removeMemory(memoryId);\n }\n };\n\n const toggleSelection = (id: string) => {\n setSelectedIds((prev) =>\n prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]\n );\n };\n\n const handleBulkImport = async () => {\n if (!batchCreateMemoriesAdvanced) {\n debugLogger.error(\"Advanced batch import not available\");\n return;\n }\n\n setImportProgress({ isImporting: true, progress: 'Preparing import...' });\n \n try {\n // Get all memories from IndexedDB\n await hydrate();\n const indexedDBMemories = entries;\n\n if (indexedDBMemories.length === 0) {\n setImportProgress({ \n isImporting: false, \n progress: 'No memories found to import',\n result: { success: false, message: 'No memories found in local storage' }\n });\n return;\n }\n\n // Convert IndexedDB format to vector format\n const memoriesToImport = indexedDBMemories.map(entry => ({\n content: entry.content,\n title: `Imported Memory - ${new Date(entry.timestamp).toLocaleDateString()}`,\n tags: entry.tags || []\n }));\n\n // Use advanced batch import with progress reporting\n const result = await batchCreateMemoriesAdvanced(memoriesToImport, {\n mode: 'append',\n clearExisting: false,\n chunkSize: 25, // Smaller chunks for better progress reporting\n validateContent: true,\n onProgress: (current: number, total: number, message: string) => {\n setImportProgress({ \n isImporting: true, \n progress: `${message} (${current}/${total})`\n });\n }\n });\n \n setImportProgress({ \n isImporting: false, \n progress: 'Import completed!',\n result: {\n success: result.success,\n message: result.message,\n details: {\n totalMemories: result.totalMemories,\n successCount: result.successCount,\n failureCount: result.failureCount,\n warnings: result.warnings,\n duration: `${(result.duration / 1000).toFixed(1)}s`\n }\n }\n });\n\n if (result.success) {\n // Refresh vector memories list\n const memories = await getVectorMemories();\n setVectorMemories((memories ?? []) as VectorMemory[]);\n \n // Auto-close dialog after success\n setTimeout(() => {\n setBulkImportOpen(false);\n setImportProgress({ isImporting: false, progress: '' });\n }, 3000);\n }\n } catch (error) {\n debugLogger.error(\"Bulk import failed\", { error });\n setImportProgress({ \n isImporting: false, \n progress: `Import failed: ${error instanceof Error ? error.message : String(error)}` \n });\n }\n };\n\n const getMemoriesForDisplay = () => {\n if (shouldUseVectorForMemories) {\n // Transform vector memories to match local memory structure, preserving the source field from API\n const transformedMemories = vectorMemories.map(vectorMemory => ({\n ...vectorMemory,\n // Preserve the source field from API response, but default to 'auto' for backwards compatibility\n // Most vector memories are automatically created by the system\n source: vectorMemory.source || \"auto\", // Default to 'auto' since most vector memories are system-generated\n pinned: vectorMemory.pinned || false, // Use API pinned or default to false\n timestamp: vectorMemory.uploadedAt ? new Date(vectorMemory.uploadedAt).getTime() : Date.now(),\n tags: vectorMemory.tags || []\n }));\n \n // Filter by selected tab (user or auto)\n const result = transformedMemories.filter(memory => memory.source === selectedTab);\n debugLogger.memoryDebug(\"Vector memories filtered for display\", {\n selectedTab,\n vectorMemoriesCount: vectorMemories.length,\n resultCount: result.length,\n });\n return result;\n } else {\n // Local store memories\n const result = entries.filter((entry) => entry.source === selectedTab);\n return result;\n }\n };\n\n const getUserMemoryCount = () => {\n if (shouldUseVectorForMemories) {\n return vectorMemories.filter(memory => (memory.source || \"auto\") === \"user\").length;\n } else {\n return entries.filter(e => e.source === \"user\").length;\n }\n };\n\n const getAutoMemoryCount = () => {\n if (shouldUseVectorForMemories) {\n return vectorMemories.filter(memory => (memory.source || \"auto\") === \"auto\").length;\n } else {\n return entries.filter(e => e.source === \"auto\").length;\n }\n };\n\n const handleClearAll = async () => {\n if (shouldUseVectorForMemories) {\n // For vector memories, we need to clear based on the selected option\n try {\n let memoriesToDelete = [];\n \n if (clearOption === \"user\") {\n memoriesToDelete = vectorMemories.filter(memory => (memory.source || \"auto\") === \"user\");\n } else if (clearOption === \"auto\") {\n memoriesToDelete = vectorMemories.filter(memory => (memory.source || \"auto\") === \"auto\");\n } else { // both\n memoriesToDelete = vectorMemories;\n }\n \n let successCount = 0;\n let errorCount = 0;\n \n for (const memory of memoriesToDelete) {\n try {\n const result = await deleteVectorMemory(memory.id);\n \n if (result && result.success) {\n successCount++;\n } else {\n errorCount++;\n debugLogger.error(\"Vector memory deletion failed\", {\n id: memory.id,\n error: result?.error || \"No result returned\",\n });\n }\n } catch (error) {\n errorCount++;\n debugLogger.error(\"Exception deleting vector memory\", { id: memory.id, error });\n }\n \n // Add a small delay to avoid overwhelming the API\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n \n // Refresh vector memories list\n const memories = await getVectorMemories();\n setVectorMemories((memories ?? []) as VectorMemory[]);\n } catch (error) {\n debugLogger.error(\"Exception during vector clear-all operation\", { error });\n }\n } else {\n // Local store clearing\n try {\n if (clearOption === \"both\") {\n await clearMemories();\n } else {\n // Clear specific type\n const entriesToKeep = entries.filter(entry => entry.source !== clearOption);\n useMemoryStore.setState({ entries: entriesToKeep });\n }\n } catch (error) {\n debugLogger.error(\"Failed to clear local memories\", { error });\n }\n }\n setClearAllOpen(false);\n };\n\n const filteredMemories = getMemoriesForDisplay();\n\n const sheet = (\n <Box\n sx={{\n width: \"100%\",\n maxWidth: isMobileView ? \"100%\" : 800,\n maxHeight: isMobileView ? \"min(720px, 82vh)\" : \"90vh\",\n height: isMobileView ? \"100%\" : \"auto\",\n bgcolor: isMobileView ? theme.palette.background.paper : shell,\n color: theme.palette.text.primary,\n display: \"flex\",\n flexDirection: \"column\",\n borderRadius: isMobileView ? \"22px 22px 0 0\" : 3,\n overflow: \"hidden\",\n boxShadow: isMobileView ? \"none\" : `0 20px 60px ${alpha(theme.palette.common.black, 0.3)}`,\n border: isMobileView ? \"none\" : `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n zIndex: 2000, // Ensure it's on top\n }}\n >\n {isMobileView && (\n <Box\n sx={{\n height: 6,\n width: 56,\n borderRadius: 999,\n bgcolor: alpha(theme.palette.text.primary, 0.18),\n alignSelf: \"center\",\n mt: 1.25,\n mb: 0.75,\n }}\n />\n )}\n\n {/* Header */}\n <Box\n sx={{\n flexShrink: 0,\n px: isMobileView ? 1.5 : 2,\n py: isMobileView ? 1.25 : 2,\n borderBottom: `1px solid ${appBar.border}`,\n display: \"flex\",\n flexDirection: \"column\",\n gap: isMobileView ? 0.9 : 1.25,\n }}\n >\n <Box\n sx={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: isMobileView ? 0.75 : 1.25,\n flexWrap: \"wrap\",\n }}\n >\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.75 }}>\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n Memory\n </Typography>\n {shouldUseVectorForMemories && (\n <Tooltip title=\"Memories are stored in an AI vector database with semantic search capabilities\">\n <Typography\n variant=\"caption\"\n sx={{\n color: theme.palette.primary.main,\n bgcolor: alpha(theme.palette.primary.main, 0.1),\n px: 1,\n py: 0.25,\n borderRadius: 1,\n fontSize: \"0.7rem\",\n fontWeight: 600,\n textTransform: \"uppercase\",\n cursor: \"help\",\n }}\n >\n Vector\n </Typography>\n </Tooltip>\n )}\n </Box>\n\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n gap: isMobileView ? 0.5 : 1,\n flexWrap: \"wrap\",\n }}\n >\n {multiSelectMode ? (\n <>\n <Typography variant=\"caption\" sx={{ color: theme.palette.text.secondary, mr: 0.5 }}>\n {selectedIds.length} selected\n </Typography>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={() => {\n setMultiSelectMode(false);\n setSelectedIds([]);\n }}\n sx={{ textTransform: \"none\", borderRadius: 2, fontSize: \"0.75rem\" }}\n >\n Cancel\n </Button>\n {selectedIds.length > 0 && (\n <>\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"secondary\"\n onClick={() => handleMultiPin(true)}\n sx={{ textTransform: \"none\", borderRadius: 2, fontSize: \"0.75rem\" }}\n >\n Pin ({selectedIds.length})\n </Button>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={() => handleMultiPin(false)}\n sx={{ textTransform: \"none\", borderRadius: 2, fontSize: \"0.75rem\" }}\n >\n Unpin ({selectedIds.length})\n </Button>\n <Button\n variant=\"contained\"\n size=\"small\"\n color=\"error\"\n onClick={() => setConfirmOpen(true)}\n sx={{ textTransform: \"none\", borderRadius: 2, fontSize: \"0.75rem\" }}\n >\n Delete ({selectedIds.length})\n </Button>\n </>\n )}\n </>\n ) : (\n filteredMemories.length > 0 && (\n <>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={() => setClearAllOpen(true)}\n sx={{ textTransform: \"none\", borderRadius: 2, fontSize: \"0.75rem\" }}\n >\n Clear All\n </Button>\n {isVectorEnabled && entries.length > 0 && (\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"primary\"\n onClick={() => setBulkImportOpen(true)}\n startIcon={<CloudSyncIcon />}\n sx={{ textTransform: \"none\", borderRadius: 2, fontSize: \"0.75rem\" }}\n >\n Import to Vector\n </Button>\n )}\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"error\"\n onClick={() => {\n setMultiSelectMode(true);\n setSelectedIds([]);\n }}\n sx={{ textTransform: \"none\", borderRadius: 2, fontSize: \"0.75rem\" }}\n >\n Select\n </Button>\n </>\n )\n )}\n\n {!multiSelectMode && isMobileView && (\n <Button\n variant=\"contained\"\n size=\"small\"\n onClick={handleAdd}\n disabled={!newMemory.trim()}\n sx={{\n textTransform: \"none\",\n borderRadius: 2,\n fontWeight: 600,\n minWidth: 88,\n }}\n >\n Save\n </Button>\n )}\n\n <IconButton\n onClick={onClose}\n sx={{\n color: appBar.icon,\n '&:hover': { bgcolor: alpha(theme.palette.text.primary, 0.08) },\n borderRadius: 2,\n }}\n size=\"small\"\n >\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n </Box>\n\n <Box\n sx={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: 0.5,\n color: theme.palette.text.secondary,\n }}\n >\n <Typography\n variant=\"caption\"\n sx={{\n color: theme.palette.text.secondary,\n borderRadius: 1,\n px: 0.75,\n py: 0.25,\n bgcolor: alpha(theme.palette.text.secondary, 0.1),\n textTransform: \"uppercase\",\n letterSpacing: 0.6,\n }}\n >\n {shouldUseVectorForMemories ? \"Cloud memory\" : \"Local memory\"}\n </Typography>\n {filteredMemories.length > 0 && (\n <Typography\n variant=\"caption\"\n sx={{\n color: theme.palette.text.secondary,\n borderRadius: 1,\n px: 0.75,\n py: 0.25,\n bgcolor: alpha(theme.palette.text.secondary, 0.1),\n textTransform: \"uppercase\",\n letterSpacing: 0.6,\n }}\n >\n {filteredMemories.length} {selectedTab}\n </Typography>\n )}\n </Box>\n </Box>\n {/* Vector Mode Indicator */}\n {shouldUseVectorForMemories && (\n <Box sx={{\n flexShrink: 0,\n mx: isMobileView ? 1.5 : 2,\n mt: 1,\n p: 1.5,\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.08)}, ${alpha(theme.palette.secondary.main, 0.05)})`,\n border: `1px solid ${alpha(theme.palette.primary.main, 0.2)}`,\n borderRadius: 2,\n display: \"flex\",\n alignItems: \"center\",\n gap: 1.5,\n position: \"relative\",\n overflow: \"hidden\"\n }}>\n {/* Animated background shimmer */}\n <Box sx={{\n position: \"absolute\",\n top: 0,\n left: \"-100%\",\n width: \"100%\",\n height: \"100%\",\n background: `linear-gradient(90deg, transparent, ${alpha(theme.palette.primary.main, 0.1)}, transparent)`,\n animation: `${shimmer} 3s infinite`\n }} />\n <Box sx={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n bgcolor: theme.palette.primary.main,\n animation: `${pulse} 2s infinite`,\n zIndex: 1\n }} />\n <Typography variant=\"body2\" sx={{ \n color: theme.palette.primary.main,\n fontSize: \"0.8rem\",\n fontWeight: 500,\n zIndex: 1\n }}>\n Advanced Vector Memory Active • Memories synced to AI database for enhanced semantic search\n </Typography>\n </Box>\n )}\n\n {/* Info + Tabs */}\n <Box sx={{ flexShrink: 0 }}>\n <Box sx={{ px: isMobileView ? 1.5 : 2, py: isMobileView ? 1.25 : 1.5 }}>\n <Typography\n variant=\"body2\"\n sx={{ color: theme.palette.text.secondary, fontSize: \"0.85rem\", textAlign: isMobileView ? \"left\" : \"center\" }}\n >\n {shouldUseVectorForMemories ? (\n \"🚀 AI-Powered Vector Memory. Semantic search across your conversations.\"\n ) : (\n \"🧠 Private. Local. Yours. You control your memories.\"\n )}\n </Typography>\n </Box>\n <Tabs\n value={selectedTab}\n onChange={(_, val) => setSelectedTab(val)}\n textColor=\"inherit\"\n indicatorColor=\"secondary\"\n centered={!isMobileView}\n variant={isMobileView ? \"fullWidth\" : \"standard\"}\n sx={{ \n bgcolor: alpha(input, isMobileView ? 0.65 : 0.5),\n borderTop: isMobileView ? `1px solid ${alpha(theme.palette.divider, 0.15)}` : undefined,\n borderBottom: `1px solid ${alpha(theme.palette.divider, 0.15)}`,\n \"& .MuiTab-root\": {\n textTransform: \"none\",\n fontWeight: 500,\n minHeight: isMobileView ? 44 : 48,\n paddingInline: isMobileView ? 1 : 1.5,\n }\n }}\n >\n <Tab \n label={\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n User\n {getUserMemoryCount() > 0 && (\n <Typography variant=\"caption\" sx={{\n bgcolor: alpha(theme.palette.primary.main, 0.2),\n color: theme.palette.primary.main,\n px: 0.75,\n py: 0.25,\n borderRadius: 1,\n fontSize: \"0.65rem\",\n fontWeight: 600,\n }}>\n {getUserMemoryCount()}\n </Typography>\n )}\n </Box>\n } \n value=\"user\" \n />\n <Tab \n label={\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n Auto\n {getAutoMemoryCount() > 0 && (\n <Typography variant=\"caption\" sx={{\n bgcolor: alpha(theme.palette.secondary.main, 0.2),\n color: theme.palette.secondary.main,\n px: 0.75,\n py: 0.25,\n borderRadius: 1,\n fontSize: \"0.65rem\",\n fontWeight: 600,\n }}>\n {getAutoMemoryCount()}\n </Typography>\n )}\n </Box>\n } \n value=\"auto\" \n />\n </Tabs>\n </Box>\n\n {/* Scrollable Memory List */}\n <Box\n sx={{\n flexGrow: 1,\n overflowY: \"auto\",\n px: isMobileView ? 1.5 : 2,\n py: isMobileView ? 1 : 1,\n }}\n >\n {filteredMemories.length === 0 ? (\n <Box sx={{ \n display: \"flex\", \n flexDirection: \"column\", \n alignItems: \"center\", \n justifyContent: \"center\",\n height: \"200px\",\n textAlign: \"center\"\n }}>\n <Typography variant=\"h6\" sx={{ \n color: theme.palette.text.secondary, \n mb: 1,\n fontSize: \"1.1rem\"\n }}>\n No {selectedTab} memories yet\n </Typography>\n <Typography variant=\"body2\" sx={{ \n color: alpha(theme.palette.text.secondary, 0.7),\n maxWidth: 280\n }}>\n {selectedTab === \"user\" \n ? shouldUseVectorForMemories \n ? \"Start by adding something you'd like me to remember. Your memories will be stored in the AI vector database for intelligent retrieval.\"\n : \"Start by adding something you'd like me to remember about you or your preferences.\"\n : shouldUseVectorForMemories\n ? \"Auto memories are created automatically based on our conversations and stored in the vector database for semantic search.\"\n : \"Auto memories are created automatically based on our conversations.\"\n }\n </Typography>\n </Box>\n ) : (\n filteredMemories.map((memory) => {\n const isSelected = selectedIds.includes(memory.id);\n return (\n <React.Fragment key={memory.id}>\n <List sx={{ listStyle: \"none\", pl: 0, m: 0 }}>\n <ListItem\n onClick={() => multiSelectMode && toggleSelection(memory.id)}\n sx={{\n px: 0,\n py: 1.5,\n display: \"flex\",\n justifyContent: \"space-between\",\n gap: 1.5,\n alignItems: \"flex-start\",\n bgcolor: isSelected ? alpha(theme.palette.error.main, 0.1) : undefined,\n borderRadius: isSelected ? 2 : 0,\n cursor: multiSelectMode ? \"pointer\" : undefined,\n border: isSelected ? `2px solid ${alpha(theme.palette.error.main, 0.3)}` : \"2px solid transparent\",\n transition: \"all 0.2s ease\",\n \"&:hover\": {\n bgcolor: multiSelectMode ? alpha(theme.palette.error.main, 0.05) : alpha(theme.palette.text.primary, 0.02),\n }\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"flex-start\",\n flexGrow: 1,\n gap: 1.5,\n }}\n >\n <Avatar\n src=\"https://cdn.burtson.ai/images/brain-icon.png\"\n alt=\"Memory\"\n sx={{\n width: 36,\n height: 36,\n mt: 0.2,\n bgcolor: theme.palette.mode === \"light\" ? \"#f5f5f5\" : theme.palette.background.paper,\n border: isVectorEnabled \n ? `2px solid ${alpha(theme.palette.primary.main, 0.4)}` \n : `1px solid ${theme.palette.divider}`,\n position: \"relative\"\n }}\n >\n {isVectorEnabled && (\n <Box sx={{\n position: \"absolute\",\n top: -2,\n right: -2,\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n bgcolor: theme.palette.primary.main,\n border: `2px solid ${theme.palette.background.paper}`,\n fontSize: \"6px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"white\"\n }}>\n ⚡\n </Box>\n )}\n </Avatar>\n {editingId === memory.id ? (\n <TextField\n fullWidth\n multiline\n autoFocus\n value={editedContent}\n onChange={(e) => setEditedContent(e.target.value)}\n onBlur={() => {\n if (\n editedContent.trim() &&\n editedContent !== memory.content\n ) {\n useMemoryStore.setState((state) => ({\n entries: state.entries.map((entry) =>\n entry.id === memory.id\n ? { ...entry, content: editedContent }\n : entry\n ),\n }));\n }\n setEditingId(null);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n setEditingId(null);\n setEditedContent('');\n } else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.currentTarget.blur();\n }\n }}\n sx={{\n \"& .MuiInputBase-root\": { \n color: theme.palette.text.primary,\n bgcolor: input,\n borderRadius: 3,\n },\n \"& .MuiOutlinedInput-root\": {\n borderRadius: 3,\n \"& fieldset\": {\n borderRadius: 3,\n },\n \"&:hover fieldset\": {\n borderRadius: 3,\n },\n \"&.Mui-focused fieldset\": {\n borderRadius: 3,\n },\n },\n }}\n helperText=\"Press Cmd/Ctrl+Enter to save, Escape to cancel\"\n />\n ) : (\n <Box sx={{ flex: 1 }}>\n <Typography\n sx={{\n cursor: (!multiSelectMode && !shouldUseVectorForMemories) ? \"pointer\" : \"default\",\n wordBreak: \"break-word\",\n color: memory.pinned ? \"secondary.main\" : theme.palette.text.primary,\n fontWeight: memory.pinned ? 500 : 400,\n lineHeight: 1.4,\n \"&:hover\": (!multiSelectMode && !shouldUseVectorForMemories) ? {\n color: memory.pinned ? \"secondary.dark\" : \"primary.main\"\n } : undefined\n }}\n onClick={() => {\n if (!multiSelectMode && !shouldUseVectorForMemories) {\n setEditingId(memory.id);\n setEditedContent(memory.content);\n }\n }}\n >\n {memory.content}\n </Typography>\n {memory.pinned && (\n <Typography variant=\"caption\" sx={{\n color: alpha(theme.palette.secondary.main, 0.7),\n fontStyle: \"italic\",\n mt: 0.5,\n display: \"block\"\n }}>\n 📌 Pinned\n </Typography>\n )}\n </Box>\n )}\n </Box>\n {!multiSelectMode && (\n <Box sx={{ display: \"flex\", gap: 0.5, mt: 0.5 }}>\n <Tooltip title={memory.pinned ? \"Unpin memory\" : \"Pin memory\"}>\n <IconButton\n onClick={async () => {\n if (shouldUseVectorForMemories) {\n try {\n // Toggle pin status using vector update API\n const result = await updateVectorMemory(memory.id, { pinned: !memory.pinned });\n if (result.success) {\n // Refresh vector memories list to show updated pin status\n const memories = await getVectorMemories();\n setVectorMemories((memories ?? []) as VectorMemory[]);\n } else {\n debugLogger.error(\"Failed to update vector memory pin status\", {\n id: memory.id,\n error: result.error,\n });\n }\n } catch (error) {\n debugLogger.error(\"Error updating vector memory pin status\", {\n id: memory.id,\n error,\n });\n }\n } else {\n togglePinMemory(memory.id);\n }\n }}\n sx={{ \n color: memory.pinned ? \"secondary.main\" : alpha(theme.palette.text.secondary, 0.7),\n \"&:hover\": { \n bgcolor: alpha(memory.pinned ? theme.palette.secondary.main : theme.palette.text.secondary, 0.1)\n }\n }}\n size=\"small\"\n >\n {memory.pinned ? (\n <PushPinIcon fontSize=\"small\" />\n ) : (\n <PushPinOutlinedIcon fontSize=\"small\" />\n )}\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Delete memory\">\n <IconButton\n onClick={async () => await handleDeleteMemory(memory.id)}\n sx={{ \n color: alpha(theme.palette.text.secondary, 0.7),\n \"&:hover\": { \n bgcolor: alpha(theme.palette.error.main, 0.1),\n color: theme.palette.error.main\n }\n }}\n size=\"small\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n </Box>\n )}\n </ListItem>\n </List>\n {filteredMemories.indexOf(memory) < filteredMemories.length - 1 && (\n <Divider sx={{ bgcolor: alpha(appBar.border, 0.5), my: 0.5 }} />\n )}\n </React.Fragment>\n );\n })\n )}\n </Box>\n\n {/* Multi Delete Confirm Bar */}\n {multiSelectMode && (\n <Box\n sx={{\n p: isMobileView ? 1.5 : 2,\n borderTop: `1px solid ${appBar.border}`,\n bgcolor: alpha(theme.palette.error.main, 0.05),\n borderBottom: selectedIds.length > 0 ? `2px solid ${alpha(theme.palette.error.main, 0.2)}` : undefined,\n }}\n >\n {selectedIds.length === 0 ? (\n <Typography variant=\"body2\" sx={{ \n textAlign: \"center\", \n color: theme.palette.text.secondary,\n fontStyle: \"italic\"\n }}>\n Tap memories to select them for deletion\n </Typography>\n ) : (\n <Box sx={{ display: \"flex\", gap: 1, alignItems: \"center\" }}>\n <Button\n variant=\"outlined\"\n onClick={() => {\n setSelectedIds(filteredMemories.map(m => m.id));\n }}\n sx={{ \n textTransform: \"none\",\n borderRadius: 2,\n fontSize: \"0.8rem\",\n minWidth: \"auto\",\n }}\n >\n Select All\n </Button>\n <Button\n fullWidth\n variant=\"contained\"\n color=\"error\"\n onClick={() => setConfirmOpen(true)}\n sx={{ borderRadius: 2 }}\n >\n Delete Selected ({selectedIds.length})\n </Button>\n </Box>\n )}\n </Box>\n )}\n\n {/* Footer */}\n <Box\n sx={{\n flexShrink: 0,\n p: isMobileView ? 1.5 : 2,\n borderTop: `1px solid ${appBar.border}`,\n bgcolor: isMobileView ? theme.palette.background.paper : shell,\n pb: `calc(env(safe-area-inset-bottom, 0px) + 8px)`,\n }}\n >\n <TextField\n fullWidth\n size=\"small\"\n value={newMemory}\n onChange={(e) => setNewMemory(e.target.value)}\n placeholder={shouldUseVectorForMemories \n ? `Add a new ${selectedTab} memory to vector database...` \n : `Add a new ${selectedTab} memory...`\n }\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey && newMemory.trim()) {\n e.preventDefault();\n handleAdd();\n }\n }}\n sx={{\n \"& .MuiInputBase-root\": { \n color: theme.palette.text.primary,\n bgcolor: alpha(input, 0.3), // Use semi-transparent background\n borderRadius: 3, // More rounded for modern look\n },\n \"& .MuiOutlinedInput-root\": {\n borderRadius: 3, // Ensure outline variant is also rounded\n bgcolor: \"transparent\", // Remove background from outline variant\n \"& fieldset\": {\n borderRadius: 3, // Ensure fieldset border is rounded\n borderColor: alpha(theme.palette.divider, 0.3),\n },\n \"&:hover fieldset\": {\n borderRadius: 3, // Maintain rounded corners on hover\n borderColor: alpha(theme.palette.primary.main, 0.5),\n },\n \"&.Mui-focused fieldset\": {\n borderRadius: 3, // Maintain rounded corners when focused\n borderColor: theme.palette.primary.main,\n },\n },\n mb: 1.5,\n }}\n InputProps={{\n endAdornment: newMemory.trim() && (\n <Typography variant=\"caption\" sx={{ \n color: alpha(theme.palette.text.secondary, 0.7),\n fontSize: \"0.7rem\",\n whiteSpace: \"nowrap\"\n }}>\n Press Enter\n </Typography>\n )\n }}\n />\n {!isMobileView && (\n <Button\n fullWidth\n variant=\"contained\"\n onClick={handleAdd}\n disabled={!newMemory.trim()}\n sx={{ \n borderRadius: 2, \n py: 1.25,\n textTransform: \"none\",\n fontWeight: 600,\n }}\n >\n Save\n </Button>\n )}\n </Box>\n\n {/* Confirm Delete Modal */}\n <Dialog \n open={confirmOpen} \n onClose={() => setConfirmOpen(false)}\n sx={{\n zIndex: 2100, // Higher than main modal (2000)\n }}\n PaperProps={{\n sx: { borderRadius: 3, minWidth: 320 }\n }}\n >\n <DialogTitle sx={{ pb: 1 }}>\n Delete {selectedIds.length} {selectedIds.length === 1 ? 'Memory' : 'Memories'}?\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body2\" sx={{ color: theme.palette.text.secondary }}>\n This will permanently remove the selected memory entries. This action cannot be undone.\n </Typography>\n </DialogContent>\n <DialogActions sx={{ p: 3, pt: 1 }}>\n <Button \n onClick={() => setConfirmOpen(false)}\n sx={{ textTransform: \"none\", borderRadius: 3 }}\n >\n Cancel\n </Button>\n <Button \n onClick={handleMultiDelete} \n color=\"error\"\n variant=\"contained\"\n sx={{ textTransform: \"none\", borderRadius: 3 }}\n >\n Delete ({selectedIds.length})\n </Button>\n </DialogActions>\n </Dialog>\n {/* Clear All Dialog */}\n <Dialog \n open={clearAllOpen} \n onClose={() => setClearAllOpen(false)}\n sx={{\n zIndex: 2100, // Higher than main modal (2000)\n }}\n PaperProps={{\n sx: { borderRadius: 3, minWidth: 320 }\n }}\n >\n <DialogTitle sx={{ pb: 1, fontWeight: 600 }}>\n Clear Memories\n </DialogTitle>\n <DialogContent sx={{ pb: 2 }}>\n <Typography variant=\"body2\" sx={{ mb: 3, color: theme.palette.text.secondary }}>\n This will permanently remove selected memory types. Choose which ones to clear:\n </Typography>\n <FormControl component=\"fieldset\">\n <RadioGroup\n value={clearOption}\n onChange={(e) => setClearOption(e.target.value as \"user\" | \"auto\" | \"both\")}\n >\n <FormControlLabel \n value=\"user\" \n control={<Radio />} \n label={\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n <Typography>User Memories</Typography>\n <Typography variant=\"caption\" sx={{\n bgcolor: alpha(theme.palette.primary.main, 0.1),\n color: theme.palette.primary.main,\n px: 1,\n py: 0.25,\n borderRadius: 1,\n fontWeight: 600,\n }}>\n {getUserMemoryCount()}\n </Typography>\n </Box>\n }\n />\n <FormControlLabel \n value=\"auto\" \n control={<Radio />} \n label={\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n <Typography>Auto Memories</Typography>\n <Typography variant=\"caption\" sx={{\n bgcolor: alpha(theme.palette.secondary.main, 0.1),\n color: theme.palette.secondary.main,\n px: 1,\n py: 0.25,\n borderRadius: 1,\n fontWeight: 600,\n }}>\n {getAutoMemoryCount()}\n </Typography>\n </Box>\n }\n />\n <FormControlLabel \n value=\"both\" \n control={<Radio />} \n label={\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n <Typography>Both Types</Typography>\n <Typography variant=\"caption\" sx={{\n bgcolor: alpha(theme.palette.error.main, 0.1),\n color: theme.palette.error.main,\n px: 1,\n py: 0.25,\n borderRadius: 1,\n fontWeight: 600,\n }}>\n {entries.length}\n </Typography>\n </Box>\n }\n />\n </RadioGroup>\n </FormControl>\n </DialogContent>\n <DialogActions sx={{ p: 3, pt: 1 }}>\n <Button \n onClick={() => setClearAllOpen(false)}\n sx={{ textTransform: \"none\", borderRadius: 3 }}\n >\n Cancel\n </Button>\n <Button\n color=\"error\"\n variant=\"contained\"\n onClick={handleClearAll}\n sx={{ textTransform: \"none\", borderRadius: 3 }}\n >\n Clear {clearOption === \"both\" ? \"All\" : clearOption} Memories\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Bulk Import Dialog */}\n <Dialog \n open={bulkImportOpen} \n onClose={() => setBulkImportOpen(false)}\n maxWidth=\"sm\"\n fullWidth\n PaperProps={{\n sx: { borderRadius: 3 }\n }}\n >\n <DialogTitle sx={{ \n fontWeight: 600, \n pb: 1,\n display: 'flex',\n alignItems: 'center',\n gap: 1\n }}>\n <CloudSyncIcon color=\"primary\" />\n Import Memories to Vector Database\n </DialogTitle>\n <DialogContent sx={{ py: 2 }}>\n {!importProgress.isImporting ? (\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n This will import all your local memories ({entries.length} memories) to the vector database for enhanced semantic search capabilities.\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n • Memories will be added to your vector storage\n • Local memories will remain unchanged\n • You can switch between local and vector storage anytime\n </Typography>\n <Typography variant=\"body2\" color=\"primary\" sx={{ fontWeight: 500 }}>\n Ready to import {entries.length} memories?\n </Typography>\n </Box>\n ) : (\n <Box sx={{ textAlign: 'center', py: 2 }}>\n <CloudSyncIcon \n sx={{ \n fontSize: 48, \n color: 'primary.main',\n mb: 2,\n animation: `${pulse} 2s ease-in-out infinite`\n }} \n />\n <Typography variant=\"body1\" sx={{ mb: 1 }}>\n {importProgress.progress}\n </Typography>\n {importProgress.result && (\n <>\n <Typography \n variant=\"body2\" \n color={importProgress.result.success ? 'success.main' : 'error.main'}\n sx={{ mt: 1, mb: 2 }}\n >\n {importProgress.result.message}\n </Typography>\n {importProgress.result.details && (\n <Box sx={{ \n textAlign: 'left', \n backgroundColor: 'background.paper',\n border: 1,\n borderColor: 'divider',\n borderRadius: 1,\n p: 2,\n mt: 2\n }}>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mb: 1 }}>\n Import Details:\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 0.5 }}>\n • Total: {importProgress.result.details.totalMemories} memories\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 0.5 }}>\n • Success: {importProgress.result.details.successCount}\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 0.5 }}>\n • Failed: {importProgress.result.details.failureCount}\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 0.5 }}>\n • Duration: {importProgress.result.details.duration}\n </Typography>\n {importProgress.result.details.warnings && importProgress.result.details.warnings.length > 0 && (\n <Typography variant=\"body2\" color=\"warning.main\" sx={{ mt: 1 }}>\n ⚠️ {importProgress.result.details.warnings.join(', ')}\n </Typography>\n )}\n </Box>\n )}\n </>\n )}\n </Box>\n )}\n </DialogContent>\n <DialogActions sx={{ p: 3, pt: 1 }}>\n <Button \n onClick={() => {\n setBulkImportOpen(false);\n setImportProgress({ isImporting: false, progress: '' });\n }}\n disabled={importProgress.isImporting}\n sx={{ textTransform: \"none\", borderRadius: 3 }}\n >\n {importProgress.isImporting ? 'Importing...' : 'Cancel'}\n </Button>\n {!importProgress.isImporting && !importProgress.result && (\n <Button\n color=\"primary\"\n variant=\"contained\"\n onClick={handleBulkImport}\n startIcon={<CloudSyncIcon />}\n sx={{ textTransform: \"none\", borderRadius: 3 }}\n >\n Import {entries.length} Memories\n </Button>\n )}\n </DialogActions>\n </Dialog>\n </Box>\n );\n\n if (isMobileView) {\n return (\n <SwipeableDrawer\n anchor=\"bottom\"\n open={open}\n onClose={onClose}\n onOpen={() => {}}\n disableSwipeToOpen\n ModalProps={{ keepMounted: true }}\n PaperProps={{\n sx: {\n height: 'min(720px, 82vh)',\n borderRadius: '22px 22px 0 0',\n overflow: 'hidden',\n bgcolor: theme.palette.background.paper,\n display: 'flex',\n justifyContent: 'center',\n },\n }}\n >\n {sheet}\n </SwipeableDrawer>\n );\n }\n\n return (\n <Modal \n open={open} \n onClose={onClose}\n sx={{\n zIndex: 2000, // Higher than drawer (1400) and other modals (1500)\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n p: 2,\n }}\n >\n {sheet}\n </Modal>\n );\n};\n\nexport default MemoryModal;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-4406-DFAD47\nconst __banditFingerprint_feedback_FeedbackModaltsx = 'BL-FP-226BC1-E25A';\nconst __auditTrail_feedback_FeedbackModaltsx = 'BL-AU-MGOIKVVA-WQG3';\n// File: FeedbackModal.tsx | Path: src/components/feedback/FeedbackModal.tsx | Hash: 4406e25a\n\nimport React, { useState, useCallback, useRef } from 'react';\nimport { GlobalStyles } from '@mui/material';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n FormControl,\n InputLabel,\n Select,\n MenuItem,\n Box,\n Typography,\n IconButton,\n Chip,\n Alert,\n Paper,\n Avatar,\n CircularProgress,\n Fade,\n Slider,\n Stack,\n useMediaQuery,\n Snackbar,\n} from '@mui/material';\nimport {\n Close as CloseIcon,\n BugReport as BugReportIcon,\n Lightbulb as LightbulbIcon,\n TrendingUp as TrendingUpIcon,\n Help as HelpIcon,\n Message as MessageIcon,\n PhotoCamera as PhotoCameraIcon,\n AttachFile as AttachFileIcon,\n Delete as DeleteIcon,\n Mail as MailIcon,\n PsychologyAltRounded,\n AttachFileRounded,\n} from '@mui/icons-material';\nimport { \n FeedbackRequest, \n FeedbackResponse,\n FeedbackCategories, \n FeedbackPriorities \n} from '../../services/gateway/feedback.interfaces';\nimport { useModelStore } from '../../store/modelStore';\nimport { useConversationStore } from '../../store/conversationStore';\nimport { usePackageSettingsStore } from '../../store/packageSettingsStore';\nimport { GatewayService } from '../../services/gateway/gateway.service';\nimport { authenticationService } from '../../services/auth/authenticationService';\nimport { useTheme, alpha } from '@mui/material/styles';\n\nexport interface FeedbackModalProps {\n open: boolean;\n onClose: () => void;\n feedbackEmail?: string;\n}\n\nconst feedbackCategories: FeedbackCategories = {\n bug: {\n label: 'Bug Report',\n description: \"Something isn't working as expected\",\n icon: 'BugReport',\n color: '#f44336',\n },\n feature: {\n label: 'Feature Request',\n description: 'Suggest a new feature or enhancement',\n icon: 'Lightbulb',\n color: '#2196f3',\n },\n improvement: {\n label: 'Improvement',\n description: 'Suggest improvements to existing features',\n icon: 'TrendingUp',\n color: '#ff9800',\n },\n question: {\n label: 'Question',\n description: 'Ask a question about usage or functionality',\n icon: 'Help',\n color: '#9c27b0',\n },\n other: {\n label: 'Other',\n description: 'General feedback or other topics',\n icon: 'Message',\n color: '#607d8b',\n },\n};\n\nconst feedbackPriorities: FeedbackPriorities = {\n low: {\n label: 'Low',\n description: 'Minor issue, can wait',\n color: '#4caf50',\n },\n medium: {\n label: 'Medium',\n description: 'Normal priority',\n color: '#ff9800',\n },\n high: {\n label: 'High',\n description: 'Important, needs attention soon',\n color: '#f44336',\n },\n critical: {\n label: 'Critical',\n description: 'Urgent, blocks usage',\n color: '#d32f2f',\n },\n};\n\nconst iconMap = {\n BugReport: BugReportIcon,\n Lightbulb: LightbulbIcon,\n TrendingUp: TrendingUpIcon,\n Help: HelpIcon,\n Message: MessageIcon,\n};\n\nexport const FeedbackModal: React.FC<FeedbackModalProps> = ({\n open,\n onClose,\n feedbackEmail,\n}) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n const fileInputRef = useRef<HTMLInputElement>(null);\n \n // Store state\n const { selectedModel } = useModelStore();\n const { conversations } = useConversationStore();\n const { settings } = usePackageSettingsStore();\n \n // Form state\n const [formData, setFormData] = useState<Partial<FeedbackRequest>>({\n title: '',\n description: '',\n category: 'bug',\n priority: 'medium',\n contactEmail: '',\n images: [],\n attachments: [],\n annoyanceLevel: 3, // 1-5 scale, 3 = neutral\n });\n \n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitStatus, setSubmitStatus] = useState<'idle' | 'success' | 'error'>('idle');\n const [errorMessage, setErrorMessage] = useState('');\n const [snackbarOpen, setSnackbarOpen] = useState(false);\n const [snackbarMessage, setSnackbarMessage] = useState('');\n const [confirmDialogOpen, setConfirmDialogOpen] = useState(false);\n const touchStartYRef = useRef<number | null>(null);\n const touchLatestYRef = useRef<number | null>(null);\n\n // Get browser info\n const getBrowserInfo = useCallback(() => {\n const ua = navigator.userAgent;\n let browserName = 'Unknown';\n let browserVersion = 'Unknown';\n \n if (ua.includes('Chrome')) {\n browserName = 'Chrome';\n browserVersion = ua.match(/Chrome\\/([0-9.]+)/)?.[1] || 'Unknown';\n } else if (ua.includes('Firefox')) {\n browserName = 'Firefox';\n browserVersion = ua.match(/Firefox\\/([0-9.]+)/)?.[1] || 'Unknown';\n } else if (ua.includes('Safari')) {\n browserName = 'Safari';\n browserVersion = ua.match(/Version\\/([0-9.]+)/)?.[1] || 'Unknown';\n }\n \n return {\n name: browserName,\n version: browserVersion,\n platform: navigator.platform,\n };\n }, []);\n\n // Handle form changes\n const handleInputChange = (field: keyof FeedbackRequest) => (\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement> | { target: { value: unknown } }\n ) => {\n setFormData(prev => ({\n ...prev,\n [field]: event.target.value,\n }));\n };\n\n // Handle file uploads\n const handleFileUpload = (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files;\n if (!files || files.length === 0) return;\n\n const file = files[0]; // Only take the first file\n if (file.type.startsWith('image/')) {\n // Handle single image only - replace existing if present\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64 = e.target?.result as string;\n setFormData(prev => ({\n ...prev,\n images: [base64], // Only keep one image\n }));\n };\n reader.readAsDataURL(file);\n } else {\n // Show error for non-image files\n setSnackbarMessage('❌ Please select an image file only (JPG, PNG, GIF)');\n setSnackbarOpen(true);\n }\n \n // Reset file input\n if (event.target) {\n event.target.value = '';\n }\n };\n\n // Remove image (single image)\n const removeImage = () => {\n setFormData(prev => ({\n ...prev,\n images: [],\n }));\n };\n\n // Copy image to clipboard\n const copyImageToClipboard = async () => {\n if (!formData.images?.[0]) return;\n \n try {\n // Convert base64 to blob\n const base64Data = formData.images[0].split(',')[1];\n const byteCharacters = atob(base64Data);\n const byteNumbers = new Array(byteCharacters.length);\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n const byteArray = new Uint8Array(byteNumbers);\n const blob = new Blob([byteArray], { type: 'image/png' });\n \n // Copy to clipboard\n await navigator.clipboard.write([\n new ClipboardItem({\n 'image/png': blob,\n }),\n ]);\n \n setSnackbarMessage('📎 Image copied to clipboard! Paste it in your email.');\n setSnackbarOpen(true);\n } catch (error) {\n console.error('Failed to copy image to clipboard:', error);\n setSnackbarMessage('❌ Failed to copy image. Please attach manually.');\n setSnackbarOpen(true);\n }\n };\n\n const handleHeaderTouchStart = (event: React.TouchEvent<HTMLDivElement>) => {\n if (!isMobile) return;\n const touch = event.touches[0];\n touchStartYRef.current = touch.clientY;\n touchLatestYRef.current = touch.clientY;\n };\n\n const handleHeaderTouchMove = (event: React.TouchEvent<HTMLDivElement>) => {\n if (!isMobile) return;\n if (touchStartYRef.current === null) return;\n touchLatestYRef.current = event.touches[0].clientY;\n };\n\n const handleHeaderTouchEnd = () => {\n if (!isMobile) return;\n if (touchStartYRef.current === null || touchLatestYRef.current === null) {\n touchStartYRef.current = null;\n touchLatestYRef.current = null;\n return;\n }\n\n const delta = touchLatestYRef.current - touchStartYRef.current;\n touchStartYRef.current = null;\n touchLatestYRef.current = null;\n\n if (delta > 80) {\n handleClose();\n }\n };\n\n // Remove attachment\n const removeAttachment = (index: number) => {\n setFormData(prev => ({\n ...prev,\n attachments: prev.attachments?.filter((_, i) => i !== index) || [],\n }));\n };\n\n // Generate session info\n const getSessionInfo = useCallback(() => {\n const currentConversation = conversations[0]; // Get current conversation\n return {\n currentModel: selectedModel,\n currentProvider: 'Bandit AI',\n conversationId: currentConversation?.id || 'N/A',\n timestamp: new Date().toISOString(),\n };\n }, [selectedModel, conversations]);\n\n // Handle submit\n const handleSubmit = async () => {\n if (!formData.title?.trim() || !formData.description?.trim()) {\n setErrorMessage('Please fill in both title and description');\n return;\n }\n\n // Show confirmation dialog if there's an image\n if (formData.images && formData.images.length > 0) {\n setConfirmDialogOpen(true);\n return;\n }\n\n // If no image, proceed directly\n await performSubmit();\n };\n\n // Perform the actual submission\n const performSubmit = async () => {\n setIsSubmitting(true);\n setErrorMessage('');\n setConfirmDialogOpen(false);\n\n try {\n // Create gateway service instance\n const gatewayUrl = settings?.gatewayApiUrl;\n if (!gatewayUrl) {\n throw new Error('Gateway API URL not configured');\n }\n\n const gatewayService = new GatewayService(\n gatewayUrl,\n () => authenticationService.getToken(),\n feedbackEmail || settings?.feedbackEmail\n );\n\n // Prepare complete feedback request\n const feedbackRequest: FeedbackRequest = {\n title: formData.title!,\n description: formData.description!,\n category: formData.category ?? 'bug',\n priority: formData.priority ?? 'medium',\n annoyanceLevel: formData.annoyanceLevel,\n images: formData.images,\n attachments: formData.attachments,\n contactEmail: formData.contactEmail,\n userAgent: navigator.userAgent,\n browserInfo: getBrowserInfo(),\n sessionInfo: getSessionInfo(),\n };\n\n // Submit feedback using gateway service\n gatewayService.submitFeedback(feedbackRequest).subscribe({\n next: async (response: FeedbackResponse) => {\n // Copy image to clipboard if present\n if (formData.images && formData.images.length > 0) {\n await copyImageToClipboard();\n }\n \n if (response?.mailtoUrl) {\n // Open mailto URL if provided (fallback case)\n window.location.href = response.mailtoUrl;\n }\n \n setSubmitStatus('success');\n \n // Close modal after a short delay\n setTimeout(() => {\n handleClose();\n }, 2000);\n },\n error: (subscribeError: unknown) => {\n console.error('Failed to submit feedback:', subscribeError);\n setErrorMessage('Failed to submit feedback. Please try again.');\n setSubmitStatus('error');\n setIsSubmitting(false);\n },\n complete: () => {\n setIsSubmitting(false);\n }\n });\n \n } catch (error) {\n console.error('Failed to initialize feedback:', error);\n setErrorMessage('Failed to initialize feedback system. Please try again.');\n setSubmitStatus('error');\n setIsSubmitting(false);\n }\n };\n\n // Handle close with reset\n const handleClose = () => {\n setFormData({\n title: '',\n description: '',\n category: 'bug',\n priority: 'medium',\n contactEmail: '',\n images: [],\n attachments: [],\n annoyanceLevel: 3,\n });\n setSubmitStatus('idle');\n setErrorMessage('');\n setSnackbarOpen(false);\n setSnackbarMessage('');\n setConfirmDialogOpen(false);\n onClose();\n };\n\n const selectedCategory = feedbackCategories[formData.category as keyof FeedbackCategories];\n const selectedPriority = feedbackPriorities[formData.priority as keyof FeedbackPriorities];\n const IconComponent = iconMap[selectedCategory?.icon as keyof typeof iconMap] || MessageIcon;\n\n const isValid = !!formData.title?.trim() && !!formData.description?.trim();\n\n return (\n <>\n {/* Global or component-scoped scrollbar styles */}\n <GlobalStyles styles={{\n '::-webkit-scrollbar': {\n width: '8px',\n },\n '::-webkit-scrollbar-track': {\n background: 'transparent',\n },\n '::-webkit-scrollbar-thumb': {\n backgroundColor: '#444',\n borderRadius: '4px',\n border: '1px solid #222',\n },\n }} />\n <Dialog\n open={open}\n onClose={handleClose}\n maxWidth=\"md\"\n fullWidth\n fullScreen={isMobile}\n TransitionComponent={Fade}\n scroll=\"paper\"\n PaperProps={{\n sx: {\n borderRadius: isMobile ? 0 : 3,\n bgcolor: theme.palette.background.paper,\n backgroundImage: theme.palette.mode === 'dark'\n ? 'linear-gradient(145deg, rgba(255,255,255,0.02) 0%, rgba(255,255,255,0.01) 100%)'\n : 'linear-gradient(145deg, rgba(255,255,255,0.8) 0%, rgba(255,255,255,0.4) 100%)',\n backdropFilter: 'blur(20px)',\n border: `1px solid ${theme.palette.mode === 'dark' ? 'rgba(255,255,255,0.1)' : 'rgba(0,0,0,0.05)'}`,\n boxShadow: theme.palette.mode === 'dark'\n ? '0 32px 120px rgba(0,0,0,0.8), 0 0 0 1px rgba(255,255,255,0.05)'\n : '0 32px 120px rgba(0,0,0,0.15), 0 0 0 1px rgba(0,0,0,0.02)',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n height: '100dvh',\n maxHeight: '100dvh',\n margin: isMobile ? 0 : 'auto',\n position: 'relative',\n },\n }}\n BackdropProps={{\n sx: {\n bgcolor: theme.palette.mode === 'dark'\n ? 'rgba(0, 0, 0, 0.7)'\n : 'rgba(0, 0, 0, 0.4)',\n backdropFilter: 'blur(8px)',\n },\n }}\n sx={{\n '& .MuiDialog-container': {\n alignItems: 'center',\n justifyContent: 'center',\n },\n }}\n >\n {/* Custom DialogTitle for header */}\n <DialogTitle\n onTouchStart={handleHeaderTouchStart}\n onTouchMove={handleHeaderTouchMove}\n onTouchEnd={handleHeaderTouchEnd}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: isMobile ? 1.25 : 1.5,\n pr: { xs: 2, sm: 3 },\n pl: { xs: 2, sm: 3 },\n pt: { xs: isMobile ? 1.5 : 3, sm: 3 },\n pb: { xs: 1.5, sm: 2 },\n touchAction: 'pan-y',\n }}\n >\n {isMobile && (\n <Box\n sx={{\n width: 56,\n height: 6,\n borderRadius: 999,\n bgcolor: alpha(theme.palette.text.primary, 0.18),\n alignSelf: 'center',\n mb: 1,\n }}\n />\n )}\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 1.5,\n width: '100%',\n }}\n >\n <Stack spacing={0.5} sx={{ minWidth: 0 }}>\n <Typography variant=\"h6\" fontWeight=\"bold\" noWrap>Send Feedback</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" noWrap>Help us improve Bandit AI</Typography>\n </Stack>\n <IconButton onClick={handleClose} size=\"small\"><CloseIcon /></IconButton>\n </Box>\n </DialogTitle>\n <DialogContent\n sx={{\n p: { xs: 1.5, sm: 3 },\n maxHeight: 'calc(100dvh - 80px)',\n overflowY: 'auto',\n backgroundColor: 'background.default',\n scrollbarGutter: 'stable',\n }}\n >\n\n {/* Modal Content Below */}\n {submitStatus === 'success' && (\n <Alert \n severity=\"success\" \n sx={{ \n mb: 2,\n '& .MuiAlert-icon': {\n color: theme.palette.success.main,\n },\n background: theme.palette.mode === 'dark' \n ? 'linear-gradient(135deg, rgba(76,175,80,0.1) 0%, rgba(46,125,50,0.1) 100%)'\n : 'linear-gradient(135deg, rgba(76,175,80,0.05) 0%, rgba(46,125,50,0.05) 100%)',\n border: `1px solid ${theme.palette.success.main}30`,\n borderRadius: 2,\n }}\n >\n <Typography variant=\"body2\" sx={{ fontWeight: 600 }}>\n Feedback submitted successfully!\n </Typography>\n <Typography variant=\"caption\" display=\"block\" sx={{ mt: 0.5, opacity: 0.9 }}>\n {formData.images && formData.images.length > 0\n ? \"Your email client should open with the feedback details. The image has been copied to your clipboard - paste it in the email!\"\n : (formData.attachments && formData.attachments.length > 0)\n ? \"Your email client should open with the feedback details. Please manually attach your files to the email.\"\n : \"Your email client should open with the feedback details.\"\n }\n </Typography>\n </Alert>\n )}\n\n {errorMessage && (\n <Alert \n severity=\"error\" \n sx={{ \n mb: 2,\n '& .MuiAlert-icon': {\n color: theme.palette.error.main,\n },\n background: theme.palette.mode === 'dark' \n ? 'linear-gradient(135deg, rgba(244,67,54,0.1) 0%, rgba(211,47,47,0.1) 100%)'\n : 'linear-gradient(135deg, rgba(244,67,54,0.05) 0%, rgba(211,47,47,0.05) 100%)',\n border: `1px solid ${theme.palette.error.main}30`,\n borderRadius: 2,\n }}\n >\n {errorMessage}\n </Alert>\n )}\n\n <Box\n sx={{\n display: 'grid',\n gridTemplateRows: 'auto auto auto auto',\n rowGap: '24px',\n columnGap: '0px',\n width: '100%',\n }}\n >\n {/* Feedback Details */}\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: { xs: '1fr', sm: '1fr 1fr' },\n gridTemplateRows: 'auto auto auto',\n gap: '16px',\n mb: 0,\n }}\n >\n <Box\n sx={{\n gridColumn: '1 / -1',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n mb: 0,\n mt: 2,\n alignSelf: 'end',\n }}\n >\n <MessageIcon sx={{ color: theme.palette.text.primary }} />\n <Typography\n variant=\"h6\"\n sx={{\n fontWeight: 600,\n color: theme.palette.text.primary,\n mb: 0,\n }}\n >\n Feedback Details\n </Typography>\n </Box>\n {/* Title - full width */}\n <TextField\n fullWidth\n label=\"Title\"\n value={formData.title}\n onChange={handleInputChange('title')}\n placeholder=\"Brief summary of your feedback\"\n required\n size=\"medium\"\n InputLabelProps={{ shrink: true }}\n sx={{\n minHeight: 48,\n gridColumn: '1 / -1',\n '& .MuiInputBase-root': {\n minHeight: 48,\n },\n '& .MuiOutlinedInput-root': {\n borderRadius: 2,\n transition: 'all 0.2s ease',\n '&:hover': {\n transform: 'translateY(-1px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 4px 12px rgba(0,0,0,0.3)'\n : '0 4px 12px rgba(0,0,0,0.1)',\n },\n '&.Mui-focused': {\n transform: 'translateY(-1px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 6px 16px rgba(0,0,0,0.4)'\n : '0 6px 16px rgba(0,0,0,0.15)',\n },\n },\n }}\n />\n {/* Category */}\n <FormControl\n fullWidth\n size=\"medium\"\n sx={{\n minHeight: 48,\n '& .MuiInputBase-root': {\n minHeight: 48,\n },\n '& .MuiOutlinedInput-root': {\n borderRadius: 2,\n transition: 'all 0.2s ease',\n '&:hover': {\n transform: 'translateY(-1px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 4px 12px rgba(0,0,0,0.3)'\n : '0 4px 12px rgba(0,0,0,0.1)',\n },\n '&.Mui-focused': {\n transform: 'translateY(-1px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 6px 16px rgba(0,0,0,0.4)'\n : '0 6px 16px rgba(0,0,0,0.15)',\n },\n },\n }}\n >\n <InputLabel shrink id=\"category-label\">Category</InputLabel>\n <Select\n labelId=\"category-label\"\n id=\"category\"\n value={formData.category}\n label=\"Category\"\n onChange={handleInputChange('category')}\n >\n {Object.entries(feedbackCategories).map(([key, category]) => {\n const Icon = iconMap[category.icon as keyof typeof iconMap];\n return (\n <MenuItem key={key} value={key}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>\n <Icon sx={{ color: category.color, fontSize: 20 }} />\n <Box>\n <Typography variant=\"body2\" sx={{ fontWeight: 500 }}>{category.label}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {category.description}\n </Typography>\n </Box>\n </Box>\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n {/* Priority */}\n <FormControl\n fullWidth\n size=\"medium\"\n sx={{\n minHeight: 48,\n '& .MuiInputBase-root': {\n minHeight: 48,\n },\n '& .MuiOutlinedInput-root': {\n borderRadius: 2,\n transition: 'all 0.2s ease',\n '&:hover': {\n transform: 'translateY(-1px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 4px 12px rgba(0,0,0,0.3)'\n : '0 4px 12px rgba(0,0,0,0.1)',\n },\n '&.Mui-focused': {\n transform: 'translateY(-1px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 6px 16px rgba(0,0,0,0.4)'\n : '0 6px 16px rgba(0,0,0,0.15)',\n },\n },\n }}\n >\n <InputLabel shrink id=\"priority-label\">Priority</InputLabel>\n <Select\n labelId=\"priority-label\"\n id=\"priority\"\n value={formData.priority}\n label=\"Priority\"\n onChange={handleInputChange('priority')}\n >\n {Object.entries(feedbackPriorities).map(([key, priority]) => (\n <MenuItem key={key} value={key}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>\n <Box\n sx={{\n width: 12,\n height: 12,\n borderRadius: '50%',\n bgcolor: priority.color,\n boxShadow: `0 0 0 2px ${priority.color}20`,\n }}\n />\n <Box>\n <Typography variant=\"body2\" sx={{ fontWeight: 500 }}>{priority.label}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {priority.description}\n </Typography>\n </Box>\n </Box>\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n {/* Description - full width, tall */}\n <TextField\n fullWidth\n multiline\n rows={5}\n label=\"Description\"\n value={formData.description}\n onChange={handleInputChange('description')}\n placeholder=\"Please provide detailed information about your feedback...\"\n required\n size=\"medium\"\n InputLabelProps={{ shrink: true }}\n sx={{\n minHeight: 48,\n gridColumn: '1 / -1',\n '& .MuiInputBase-root': {\n minHeight: 48,\n alignItems: 'flex-start',\n py: 1.5,\n },\n '& .MuiOutlinedInput-root': {\n borderRadius: 2,\n transition: 'all 0.2s ease',\n '&:hover': {\n transform: 'translateY(-1px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 4px 12px rgba(0,0,0,0.3)'\n : '0 4px 12px rgba(0,0,0,0.1)',\n },\n '&.Mui-focused': {\n transform: 'translateY(-1px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 6px 16px rgba(0,0,0,0.4)'\n : '0 6px 16px rgba(0,0,0,0.15)',\n },\n },\n }}\n />\n </Box>\n {/* Impact Assessment & Attachments - side by side, visually aligned */}\n <Box\n className=\"feedback-section-row\"\n sx={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: '24px',\n alignItems: 'stretch',\n width: '100%',\n // Responsive stacking for mobile\n flexDirection: { xs: 'column', md: 'row' },\n }}\n >\n {/* Impact Assessment */}\n <Box\n className=\"impact-assessment-card impact-section\"\n sx={{\n flex: 1,\n minWidth: 300,\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n p: 0,\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: '8px', mb: 3 }}>\n <PsychologyAltRounded sx={{ color: theme.palette.warning.main }} />\n <Typography variant=\"h6\" sx={{ fontWeight: 600, color: theme.palette.text.primary }}>\n Impact Assessment\n </Typography>\n </Box>\n <div style={{ height: '100%', display: 'flex', flexDirection: 'column', justifyContent: 'space-between' }}>\n <Paper\n variant=\"outlined\"\n sx={{\n p: 4,\n borderRadius: 3,\n minHeight: 180,\n background: theme.palette.mode === 'dark'\n ? 'linear-gradient(135deg, rgba(255,255,255,0.03) 0%, rgba(255,255,255,0.01) 100%)'\n : 'linear-gradient(135deg, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.03) 100%)',\n border: `1px solid ${theme.palette.divider}`,\n transition: 'all 0.2s ease',\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n justifyContent: 'center',\n height: '100%',\n '&:hover': {\n transform: 'translateY(-2px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 8px 24px rgba(0,0,0,0.4)'\n : '0 8px 24px rgba(0,0,0,0.12)',\n },\n }}\n >\n <Stack spacing={3}>\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 600, display: 'flex', alignItems: 'center', gap: 2 }}>\n <Box\n sx={{\n width: 28,\n height: 28,\n borderRadius: '50%',\n bgcolor: theme.palette.warning.main + '20',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '14px',\n }}\n >\n <PsychologyAltRounded sx={{ color: theme.palette.warning.main, fontSize: 22 }} />\n </Box>\n How annoying is this issue? ({formData.annoyanceLevel}/5)\n </Typography>\n <Box sx={{ px: 2, py: 1 }}>\n <Slider\n value={formData.annoyanceLevel}\n onChange={(_, value) => setFormData(prev => ({ ...prev, annoyanceLevel: value as number }))}\n min={1}\n max={5}\n step={1}\n marks={[\n { value: 1, label: '😊 Not at all' },\n { value: 2, label: '😐 Slightly' },\n { value: 3, label: '🙄 Moderately' },\n { value: 4, label: '😠 Very' },\n { value: 5, label: '🤬 Extremely' },\n ]}\n sx={{\n height: 8,\n '& .MuiSlider-mark': {\n backgroundColor: theme.palette.divider,\n width: 3,\n height: 3,\n },\n '& .MuiSlider-markLabel': {\n fontSize: '0.8rem',\n color: theme.palette.text.secondary,\n transform: 'translateX(-50%)',\n whiteSpace: 'nowrap',\n top: 32,\n fontWeight: 500,\n },\n '& .MuiSlider-thumb': {\n width: 24,\n height: 24,\n background: `linear-gradient(135deg, ${theme.palette.warning.main}, ${theme.palette.warning.dark})`,\n boxShadow: `0 4px 12px ${theme.palette.warning.main}40`,\n '&:hover, &.Mui-focusVisible': {\n boxShadow: `0 0 0 12px ${theme.palette.warning.main}20, 0 4px 12px ${theme.palette.warning.main}40`,\n },\n },\n '& .MuiSlider-track': {\n background: `linear-gradient(90deg, ${theme.palette.success.main}, ${theme.palette.warning.main}, ${theme.palette.error.main})`,\n height: 6,\n border: 'none',\n },\n '& .MuiSlider-rail': {\n height: 6,\n backgroundColor: theme.palette.divider,\n opacity: 0.3,\n },\n mb: 5, // Space for labels\n }}\n />\n </Box>\n </Stack>\n </Paper>\n </div>\n </Box>\n {/* Attachments */}\n <Box\n className=\"attachments-upload-card attachments-section\"\n sx={{\n flex: 1,\n minWidth: 300,\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n p: 0,\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: '8px', mb: 3 }}>\n <AttachFileRounded sx={{ color: theme.palette.primary.main }} />\n <Typography variant=\"h6\" sx={{ fontWeight: 600, color: theme.palette.text.primary }}>\n Attachments\n </Typography>\n </Box>\n <div style={{ height: '100%', display: 'flex', flexDirection: 'column', justifyContent: 'space-between' }}>\n <Box\n sx={{\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n p: 0,\n mb: 0,\n backgroundColor: 'transparent',\n boxShadow: 'none',\n border: 'none',\n }}\n onClick={() => fileInputRef.current?.click()}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: 'none' }}\n onChange={handleFileUpload}\n />\n <Box\n sx={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n p: 2,\n border: '2px dashed',\n borderColor: (theme) => theme.palette.divider,\n borderRadius: 2,\n height: '100%',\n mb: 0,\n backgroundColor: 'transparent',\n boxShadow: 'none',\n }}\n >\n <Avatar\n sx={{\n width: 56,\n height: 56,\n bgcolor: theme.palette.primary.main + '15',\n color: theme.palette.primary.main,\n boxShadow: `0 4px 16px ${theme.palette.primary.main}20`,\n transition: 'all 0.3s ease',\n }}\n >\n <AttachFileIcon sx={{ fontSize: 28 }} />\n </Avatar>\n <Box sx={{ textAlign: 'center' }}>\n <Typography variant=\"h6\" sx={{ fontWeight: 600, mb: 1, fontSize: '1.1rem' }}>\n Attach One Image\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1, fontSize: '0.95rem' }}>\n Click here to upload a single image\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{\n opacity: 0.8,\n fontSize: '0.85rem',\n background: theme.palette.mode === 'dark'\n ? 'rgba(255,255,255,0.05)'\n : 'rgba(0,0,0,0.05)',\n px: 2,\n py: 0.5,\n borderRadius: 1,\n }}>\n Support: Images only (JPG, PNG, GIF) - Max 10MB\n </Typography>\n </Box>\n </Box>\n {/* Attachment Reminder - positioned at bottom */}\n {((formData.images && formData.images.length > 0) || (formData.attachments && formData.attachments.length > 0)) && (\n <Alert\n severity=\"info\"\n sx={{\n mt: 'auto',\n textAlign: 'left',\n fontSize: '0.75rem',\n py: 0.5,\n background: theme.palette.mode === 'dark'\n ? 'linear-gradient(135deg, rgba(33,150,243,0.1) 0%, rgba(25,118,210,0.1) 100%)'\n : 'linear-gradient(135deg, rgba(33,150,243,0.05) 0%, rgba(25,118,210,0.05) 100%)',\n border: `1px solid ${theme.palette.info.main}30`,\n '& .MuiAlert-icon': {\n color: theme.palette.info.main,\n fontSize: '0.875rem',\n },\n '& .MuiAlert-message': {\n fontSize: '0.75rem',\n },\n }}\n >\n <Typography variant=\"caption\" sx={{ fontWeight: 600, display: 'block' }}>\n {formData.images && formData.images.length > 0 \n ? '📎 Image will be copied to clipboard - paste in email!'\n : '📎 Files ready for email attachment'\n }\n </Typography>\n </Alert>\n )}\n </Box>\n </div>\n {/* Display uploaded image (single) */}\n {formData.images && formData.images.length > 0 && (\n <Box sx={{ mt: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1.5 }}>\n <PhotoCameraIcon color=\"primary\" fontSize=\"small\" />\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 600 }}>\n Attached Image\n </Typography>\n </Box>\n <Box sx={{ display: 'flex', gap: 1.5 }}>\n <Box\n sx={{\n position: 'relative',\n borderRadius: 1.5,\n overflow: 'hidden',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 2px 8px rgba(0,0,0,0.3)'\n : '0 2px 8px rgba(0,0,0,0.1)',\n transition: 'all 0.2s ease',\n '&:hover': {\n transform: 'scale(1.05)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 4px 16px rgba(0,0,0,0.4)'\n : '0 4px 16px rgba(0,0,0,0.15)',\n },\n }}\n >\n <img\n src={formData.images[0]}\n alt=\"Attachment\"\n style={{\n width: 120,\n height: 120,\n objectFit: 'cover',\n display: 'block',\n }}\n />\n <IconButton\n size=\"small\"\n onClick={removeImage}\n sx={{\n position: 'absolute',\n top: 4,\n right: 4,\n bgcolor: 'rgba(244,67,54,0.9)',\n color: 'white',\n width: 24,\n height: 24,\n '&:hover': {\n bgcolor: 'rgba(244,67,54,1)',\n transform: 'scale(1.1)',\n },\n }}\n >\n <DeleteIcon sx={{ fontSize: 14 }} />\n </IconButton>\n </Box>\n <Box sx={{ flex: 1, display: 'flex', flexDirection: 'column', justifyContent: 'center' }}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={copyImageToClipboard}\n startIcon={<AttachFileIcon />}\n sx={{\n mb: 1,\n borderColor: theme.palette.primary.main + '50',\n color: theme.palette.primary.main,\n '&:hover': {\n borderColor: theme.palette.primary.main,\n bgcolor: theme.palette.primary.main + '10',\n },\n }}\n >\n Copy to Clipboard\n </Button>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ textAlign: 'center' }}>\n Image will be copied when you submit\n </Typography>\n </Box>\n </Box>\n </Box>\n )}\n {/* Display other attachments */}\n {formData.attachments && formData.attachments.length > 0 && (\n <Box sx={{ mt: 2 }}>\n <Typography variant=\"subtitle2\" gutterBottom>\n Attached Files ({formData.attachments.length})\n </Typography>\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1 }}>\n {formData.attachments.map((attachment, index) => (\n <Chip\n key={index}\n label={attachment.name}\n onDelete={() => removeAttachment(index)}\n deleteIcon={<DeleteIcon />}\n variant=\"outlined\"\n sx={{ maxWidth: 200 }}\n />\n ))}\n </Box>\n </Box>\n )}\n </Box>\n </Box>\n </Box>\n </DialogContent>\n\n {/* DialogActions sticky footer with single full-width Send Feedback button */}\n <DialogActions\n sx={{\n position: 'sticky',\n bottom: 0,\n zIndex: 10,\n px: { xs: 2, sm: 3 },\n py: 1.5,\n backgroundColor: 'background.paper',\n borderTop: '1px solid',\n borderColor: 'divider',\n justifyContent: 'center',\n }}\n >\n <Button\n fullWidth\n startIcon={<MailIcon />}\n disabled={!isValid}\n onClick={handleSubmit}\n variant=\"contained\"\n >\n Send Feedback\n </Button>\n </DialogActions>\n </Dialog>\n \n {/* Snackbar for clipboard feedback */}\n <Snackbar\n open={snackbarOpen}\n autoHideDuration={4000}\n onClose={() => setSnackbarOpen(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n sx={{\n '& .MuiSnackbarContent-root': {\n background: theme.palette.mode === 'dark'\n ? 'linear-gradient(135deg, rgba(76,175,80,0.15) 0%, rgba(46,125,50,0.15) 100%)'\n : 'linear-gradient(135deg, rgba(76,175,80,0.1) 0%, rgba(46,125,50,0.1) 100%)',\n color: theme.palette.text.primary,\n fontSize: '0.9rem',\n fontWeight: 500,\n borderRadius: 2,\n border: `1px solid ${theme.palette.success.main}30`,\n backdropFilter: 'blur(10px)',\n },\n }}\n message={snackbarMessage}\n />\n \n {/* Confirmation Dialog for Image Submission */}\n <Dialog\n open={confirmDialogOpen}\n onClose={() => setConfirmDialogOpen(false)}\n maxWidth=\"sm\"\n fullWidth\n PaperProps={{\n sx: {\n borderRadius: 3,\n bgcolor: theme.palette.background.paper,\n backgroundImage: theme.palette.mode === 'dark' \n ? 'linear-gradient(145deg, rgba(255,255,255,0.02) 0%, rgba(255,255,255,0.01) 100%)'\n : 'linear-gradient(145deg, rgba(255,255,255,0.8) 0%, rgba(255,255,255,0.4) 100%)',\n backdropFilter: 'blur(20px)',\n border: `1px solid ${theme.palette.mode === 'dark' ? 'rgba(255,255,255,0.1)' : 'rgba(0,0,0,0.05)'}`,\n boxShadow: theme.palette.mode === 'dark' \n ? '0 16px 60px rgba(0,0,0,0.6)' \n : '0 16px 60px rgba(0,0,0,0.15)',\n },\n }}\n >\n <DialogTitle sx={{ \n pb: 1,\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n }}>\n <Avatar\n sx={{\n bgcolor: theme.palette.info.main + '20',\n color: theme.palette.info.main,\n width: 40,\n height: 40,\n }}\n >\n <PhotoCameraIcon />\n </Avatar>\n <Box>\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n Ready to Submit with Image\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n Here's what will happen when you submit\n </Typography>\n </Box>\n </DialogTitle>\n \n <DialogContent sx={{ pt: 1 }}>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n <Paper\n variant=\"outlined\"\n sx={{\n p: 3,\n borderRadius: 2,\n background: theme.palette.mode === 'dark'\n ? 'linear-gradient(135deg, rgba(33,150,243,0.05) 0%, rgba(25,118,210,0.05) 100%)'\n : 'linear-gradient(135deg, rgba(33,150,243,0.03) 0%, rgba(25,118,210,0.03) 100%)',\n border: `1px solid ${theme.palette.info.main}20`,\n }}\n >\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 600, mb: 2, display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box sx={{ \n bgcolor: theme.palette.info.main + '20', \n color: theme.palette.info.main,\n borderRadius: '50%',\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '12px',\n fontWeight: 'bold'\n }}>\n 1\n </Box>\n Your image will be copied to clipboard\n </Typography>\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 600, mb: 2, display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box sx={{ \n bgcolor: theme.palette.info.main + '20', \n color: theme.palette.info.main,\n borderRadius: '50%',\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '12px',\n fontWeight: 'bold'\n }}>\n 2\n </Box>\n Your email client will open\n </Typography>\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 600, mb: 1, display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box sx={{ \n bgcolor: theme.palette.info.main + '20', \n color: theme.palette.info.main,\n borderRadius: '50%',\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '12px',\n fontWeight: 'bold'\n }}>\n 3\n </Box>\n Paste the image with Ctrl+V (or Cmd+V)\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ ml: 4, fontStyle: 'italic' }}>\n The email will have a clear spot where you should paste\n </Typography>\n </Paper>\n \n <Alert severity=\"info\" sx={{ \n background: 'transparent',\n border: `1px solid ${theme.palette.info.main}30`,\n }}>\n <Typography variant=\"body2\">\n <strong>💡 Tip:</strong> Make sure to paste the image before sending your email!\n </Typography>\n </Alert>\n </Box>\n </DialogContent>\n \n <DialogActions sx={{ p: 2.5, pt: 1 }}>\n <Button \n onClick={() => setConfirmDialogOpen(false)}\n sx={{ color: theme.palette.text.secondary }}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n onClick={performSubmit}\n disabled={isSubmitting}\n startIcon={isSubmitting ? <CircularProgress size={16} /> : <MailIcon />}\n sx={{\n background: `linear-gradient(135deg, ${theme.palette.primary.main} 0%, ${theme.palette.primary.dark} 100%)`,\n '&:hover': {\n background: `linear-gradient(135deg, ${theme.palette.primary.dark} 0%, ${theme.palette.primary.main} 100%)`,\n },\n }}\n >\n {isSubmitting ? 'Submitting...' : 'Got it, Submit Now'}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-06D6-4EC241\nconst __banditFingerprint_store_voiceModeStorets = 'BL-FP-590448-C812';\nconst __auditTrail_store_voiceModeStorets = 'BL-AU-MGOIKVW6-VU6Q';\n// File: voiceModeStore.ts | Path: src/store/voiceModeStore.ts | Hash: 06d6c812\n\nimport { create } from \"zustand\";\n\nexport type VoiceModeStatus =\n | \"idle\"\n | \"initializing\"\n | \"listening\"\n | \"recording\"\n | \"processing\"\n | \"error\";\n\ninterface VoiceModeState {\n enabled: boolean;\n status: VoiceModeStatus;\n lastTranscript: string | null;\n error: string | null;\n toggle: () => void;\n setEnabled: (enabled: boolean) => void;\n setStatus: (status: VoiceModeStatus) => void;\n setError: (error: string | null) => void;\n setLastTranscript: (transcript: string | null) => void;\n resetTransientState: () => void;\n}\n\nexport const useVoiceModeStore = create<VoiceModeState>((set) => ({\n enabled: false,\n status: \"idle\",\n lastTranscript: null,\n error: null,\n\n toggle: () =>\n set((state) => {\n const enabled = !state.enabled;\n return {\n enabled,\n status: enabled ? \"initializing\" : \"idle\",\n error: null,\n lastTranscript: enabled ? state.lastTranscript : null,\n };\n }),\n\n setEnabled: (enabled) =>\n set(() => ({\n enabled,\n status: enabled ? \"initializing\" : \"idle\",\n error: null,\n })),\n\n setStatus: (status) =>\n set((state) => ({\n status: state.error && status !== \"error\" ? state.status : status,\n })),\n\n setError: (error) =>\n set((state) => ({\n error,\n status: error ? \"error\" : state.enabled ? \"listening\" : \"idle\",\n })),\n\n setLastTranscript: (transcript) => set({ lastTranscript: transcript }),\n\n resetTransientState: () =>\n set((state) => ({\n status: state.enabled ? \"listening\" : \"idle\",\n error: null,\n })),\n}));\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-4003-44028A\nconst __banditFingerprint_hooks_useAIProvidertsx = 'BL-FP-53B7AF-EC0F';\nconst __auditTrail_hooks_useAIProvidertsx = 'BL-AU-MGOIKVV1-E28V';\n// File: useAIProvider.tsx | Path: src/chat/hooks/useAIProvider.tsx | Hash: 4003ec0f\n\nimport { debugLogger } from \"../../services/logging/debugLogger\";\nimport { useCallback, useRef } from \"react\";\nimport type { Subscription } from \"rxjs\";\nimport type { KnowledgeDoc } from \"../../store/knowledgeStore\";\nimport { useKnowledgeStore } from \"../../store/knowledgeStore\";\nimport { useAIProviderStore } from \"../../store/aiProviderStore\";\nimport { useConversationStore } from \"../../store/conversationStore\";\nimport { useMemoryEnhancer } from \"./useMemoryEnhancer\";\nimport { useVectorStore } from \"../../hooks/useVectorStore\";\nimport { embeddingService } from \"../../services/embedding/embeddingService\";\nimport { useMoodEngine, moodPromptMap } from \"./useMoodEngine\";\nimport { ComponentStatus, HistoryEntry } from \"../../store/aiQueryStore\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { determineRelevantDocuments, getCurrentDateTimeContext } from \"../../services/prompts\";\nimport { AIChatRequest, AIMessage } from \"../../services/ai-provider/types/common.types\";\nimport { usePreferencesStore } from \"../../store/preferencesStore\";\nimport { getEnabledMCPToolsForAI, isMCPAvailable, executeMCPTool } from \"../../services/mcp\";\nimport type { VectorMemory, VectorMemoryMetadata } from \"../../services/vectorDatabase/vectorDatabaseService\";\n\n// Model budget configuration - provider agnostic\nexport interface ModelBudget {\n maxTokens: number;\n memoryTokenBudget: number;\n historyMessages: number;\n moodInjection: boolean;\n}\n\nexport type ModelConfigIdentifier =\n | \"bandit-core:4b-it-qat\"\n | \"bandit-core:12b-it-qat\"\n | \"bandit-core:27b-it-qat\"\n | \"gemma3:4b-it-qat\"\n | \"gemma3:12b-it-qat\"\n | \"gemma3:27b-it-qat\"\n | \"gpt-3.5-turbo\"\n | \"gpt-4\"\n | \"gpt-4-turbo\"\n | string;\n\nconst lightBudget: ModelBudget = {\n maxTokens: 2048,\n memoryTokenBudget: 750,\n historyMessages: 2,\n moodInjection: true,\n};\n\nconst medBudget: ModelBudget = {\n maxTokens: 4096,\n memoryTokenBudget: 1250,\n historyMessages: 6,\n moodInjection: true,\n};\n\nconst heavyBudget: ModelBudget = {\n maxTokens: 8192,\n memoryTokenBudget: 2000,\n historyMessages: 10,\n moodInjection: true,\n};\n\nconst modelConfigs: { [key: ModelConfigIdentifier]: ModelBudget } = {\n // Ollama models\n \"bandit-core:4b-it-qat\": lightBudget,\n \"bandit-core:12b-it-qat\": medBudget,\n \"bandit-core:27b-it-qat\": medBudget,\n \"gemma3:4b-it-qat\": lightBudget,\n \"gemma3:12b-it-qat\": medBudget,\n \"gemma3:27b-it-qat\": medBudget,\n // OpenAI models\n \"gpt-3.5-turbo\": medBudget,\n \"gpt-4\": heavyBudget,\n \"gpt-4-turbo\": heavyBudget,\n};\n\ntype NormalizedVectorMemory = {\n id: string;\n content: string;\n title?: string;\n pinned: boolean;\n source: \"auto\" | \"user\";\n score: number;\n tags: string[];\n uploadedAt?: number;\n lastReferencedAt?: number;\n metadata?: VectorMemoryMetadata;\n personalConfidence?: number;\n engagement?: number;\n topic?: string;\n};\n\ntype RawVectorDocument = {\n id?: string;\n documentId?: string;\n fileId?: string;\n _id?: string;\n metadata?: {\n id?: string;\n _id?: string;\n fileId?: string;\n [key: string]: unknown;\n };\n key?: string;\n filename?: string;\n name?: string;\n content?: string;\n mimeType?: string;\n type?: string;\n uploadedAt?: string | number | Date;\n size?: number;\n uploadedBy?: string;\n userEmail?: string;\n bucket?: string;\n isUserContent?: boolean;\n isTeamContent?: boolean;\n contentSource?: string;\n originalFileName?: string;\n [key: string]: unknown;\n};\n\ntype KnowledgeSourceDoc = KnowledgeDoc & { _vectorResult?: RawVectorDocument; chunks?: string[] };\n\ntype MCPFunctionTool = ReturnType<typeof getEnabledMCPToolsForAI>[number];\n\ntype MCPToolParameters = Record<string, unknown>;\n\ntype ToolAwareChatRequest = AIChatRequest & { tools?: MCPFunctionTool[] };\n\ninterface SportsGameResult {\n status?: string;\n homeTeam?: string;\n homeScore?: number | string;\n awayTeam?: string;\n awayScore?: number | string;\n}\n\ninterface NewsArticleResult {\n title?: string;\n description?: string;\n summary?: string;\n source?: string;\n publishedAt?: string;\n published?: string;\n url?: string;\n link?: string;\n}\n\ninterface DocSearchResult {\n title?: string;\n url?: string;\n link?: string;\n summary?: string;\n description?: string;\n}\n\ninterface WeatherResult {\n location?: string;\n description?: string;\n temperature?: string | number;\n message?: string;\n details?: string;\n error?: string;\n}\n\ninterface ImageGenerationResult {\n imageUrl?: string;\n revisedPrompt?: string;\n}\n\ninterface MemorySection {\n title: string;\n lines: string[];\n}\n\ninterface PreparedMemoryContext {\n sections: MemorySection[];\n stats: {\n totalAvailable: number;\n selectedCount: number;\n pinnedSelected: number;\n personalSelected: number;\n otherSelected: number;\n tokensUsed: number;\n tokensRemaining: number;\n averageScore: number;\n averageConfidence: number;\n };\n}\n\nconst PERSONAL_TAG_HINTS = [\n \"personal\",\n \"profile\",\n \"bio\",\n \"favorite\",\n \"favourite\",\n \"likes\",\n \"dislikes\",\n \"hobby\",\n \"habit\",\n \"goal\",\n \"interest\",\n \"family\",\n \"relationship\",\n \"background\",\n \"origin\",\n \"birthday\",\n \"anniversary\",\n \"pet\",\n \"values\",\n \"preferences\",\n \"schedule\",\n \"team\",\n \"project\",\n];\n\nconst PERSONAL_TOPIC_HINTS = new Set([\n \"personal\",\n \"preferences\",\n \"preference\",\n \"relationship\",\n \"family\",\n \"friends\",\n \"hobby\",\n \"travel\",\n \"learning\",\n \"education\",\n \"goal\",\n \"goals\",\n \"health\",\n \"wellness\",\n \"project\",\n \"work\",\n \"career\",\n]);\n\nconst clamp = (value: number, min = 0, max = 1) => Math.min(max, Math.max(min, value));\n\nconst parseDateToEpoch = (value?: string | number): number | undefined => {\n if (!value && value !== 0) {\n return undefined;\n }\n\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n\n return undefined;\n};\n\nconst normalizeVectorMemory = (memory: VectorMemory): NormalizedVectorMemory | null => {\n const content = memory?.content?.trim();\n if (!content) {\n return null;\n }\n\n const metadata = memory.metadata;\n\n const tagSet = new Set<string>();\n (memory.tags || []).forEach((tag) => {\n if (typeof tag === \"string\") {\n tagSet.add(tag.toLowerCase().trim());\n }\n });\n (metadata?.tags || []).forEach((tag) => {\n if (typeof tag === \"string\") {\n tagSet.add(tag.toLowerCase().trim());\n }\n });\n\n const personalConfidence = metadata?.personalConfidence;\n const engagement = metadata?.engagement;\n const topic = metadata?.topic?.toLowerCase().trim();\n\n return {\n id: memory.id,\n content,\n title: memory.title,\n pinned: Boolean(memory.pinned),\n source: memory.source === \"user\" ? \"user\" : \"auto\",\n score: typeof memory.score === \"number\" ? memory.score : personalConfidence ?? 0,\n tags: Array.from(tagSet),\n uploadedAt: parseDateToEpoch(memory.uploadedAt),\n lastReferencedAt: parseDateToEpoch(memory.lastReferencedAt),\n metadata,\n personalConfidence: typeof personalConfidence === \"number\" ? clamp(personalConfidence) : undefined,\n engagement: typeof engagement === \"number\" ? clamp(engagement) : undefined,\n topic: topic,\n };\n};\n\nconst isPersonalMemory = (memory: NormalizedVectorMemory): boolean => {\n if (memory.pinned || memory.source === \"user\") {\n return true;\n }\n\n if ((memory.personalConfidence ?? 0) >= 0.55) {\n return true;\n }\n\n if (memory.topic && PERSONAL_TOPIC_HINTS.has(memory.topic)) {\n return true;\n }\n\n const title = memory.title?.toLowerCase() || \"\";\n if (PERSONAL_TAG_HINTS.some((hint) => title.includes(hint))) {\n return true;\n }\n\n if (memory.tags.some((tag) => PERSONAL_TAG_HINTS.some((hint) => tag.includes(hint)))) {\n return true;\n }\n\n const metadataTags = (memory.metadata?.tags || []).map((tag) => tag.toLowerCase());\n if (metadataTags.some((tag) => PERSONAL_TAG_HINTS.some((hint) => tag.includes(hint)))) {\n return true;\n }\n\n const additionalValues = memory.metadata?.additionalProperties\n ? Object.values(memory.metadata.additionalProperties)\n : [];\n if (\n additionalValues.some(\n (value) =>\n typeof value === \"string\" &&\n PERSONAL_TAG_HINTS.some((hint) => value.toLowerCase().includes(hint))\n )\n ) {\n return true;\n }\n\n return false;\n};\n\nconst computeRecencyBoost = (memory: NormalizedVectorMemory): number => {\n const reference = memory.lastReferencedAt ?? memory.uploadedAt;\n if (!reference) {\n return 0;\n }\n\n const ageDays = (Date.now() - reference) / (1000 * 60 * 60 * 24);\n if (ageDays <= 1) return 0.2;\n if (ageDays <= 7) return 0.15;\n if (ageDays <= 30) return 0.1;\n if (ageDays <= 90) return 0.05;\n return 0;\n};\n\nconst computeBoostedScore = (memory: NormalizedVectorMemory): number => {\n const baseScore =\n typeof memory.score === \"number\" && memory.score > 0\n ? memory.score\n : memory.pinned\n ? 0.75\n : 0.2;\n const recencyBoost = computeRecencyBoost(memory);\n const personalBoost = memory.personalConfidence ? memory.personalConfidence * 0.25 : 0;\n const engagementBoost = memory.engagement ? memory.engagement * 0.15 : 0;\n const topicBoost = memory.topic && PERSONAL_TOPIC_HINTS.has(memory.topic) ? 0.08 : 0;\n const pinnedBoost = memory.pinned ? 0.25 : 0;\n return baseScore + recencyBoost + personalBoost + engagementBoost + topicBoost + pinnedBoost;\n};\n\nconst formatMemoryLine = (memory: NormalizedVectorMemory): string => {\n const topicDescriptor = !memory.pinned && memory.topic ? `[${memory.topic}] ` : \"\";\n return memory.title ? `${topicDescriptor}${memory.title}: ${memory.content}` : `${topicDescriptor}${memory.content}`;\n};\n\nconst prepareAdvancedMemoryContext = (\n memories: VectorMemory[],\n tokenBudget: number,\n estimateTokens: (text: string) => number\n): PreparedMemoryContext => {\n const normalized = memories\n .map((memory) => normalizeVectorMemory(memory))\n .filter((memory): memory is NormalizedVectorMemory => Boolean(memory));\n\n if (normalized.length === 0) {\n return {\n sections: [],\n stats: {\n totalAvailable: 0,\n selectedCount: 0,\n pinnedSelected: 0,\n personalSelected: 0,\n otherSelected: 0,\n tokensUsed: 0,\n tokensRemaining: tokenBudget,\n averageScore: 0,\n averageConfidence: 0,\n },\n };\n }\n\n const deduped = new Map<string, NormalizedVectorMemory>();\n for (const memory of normalized) {\n const key = memory.id || memory.content.toLowerCase();\n if (!deduped.has(key)) {\n deduped.set(key, memory);\n continue;\n }\n\n const existing = deduped.get(key)!;\n if (computeBoostedScore(memory) > computeBoostedScore(existing)) {\n deduped.set(key, memory);\n }\n }\n\n const memoriesToConsider = Array.from(deduped.values());\n const sortByPriority = (a: NormalizedVectorMemory, b: NormalizedVectorMemory) =>\n computeBoostedScore(b) - computeBoostedScore(a);\n\n const pinned = memoriesToConsider.filter((memory) => memory.pinned).sort(sortByPriority);\n const personal = memoriesToConsider\n .filter((memory) => !memory.pinned && isPersonalMemory(memory))\n .sort(sortByPriority);\n const other = memoriesToConsider\n .filter((memory) => !memory.pinned && !isPersonalMemory(memory))\n .sort(sortByPriority);\n\n const selected: NormalizedVectorMemory[] = [];\n let tokensUsed = 0;\n\n const tryAddMemory = (memory: NormalizedVectorMemory) => {\n if (selected.some((existing) => existing.id === memory.id)) {\n return;\n }\n\n const tokensNeeded = estimateTokens(memory.content);\n if (tokensNeeded <= 0 || tokensUsed + tokensNeeded > tokenBudget) {\n return;\n }\n\n selected.push(memory);\n tokensUsed += tokensNeeded;\n };\n\n pinned.forEach(tryAddMemory);\n personal.forEach(tryAddMemory);\n\n if (selected.length === 0 && personal.length > 0) {\n tryAddMemory(personal[0]);\n }\n\n other.forEach(tryAddMemory);\n\n if (selected.length === 0 && other.length > 0) {\n tryAddMemory(other[0]);\n }\n\n const pinnedSelected = selected.filter((memory) => memory.pinned);\n const personalSelected = selected.filter((memory) => !memory.pinned && isPersonalMemory(memory));\n const otherSelected = selected.filter((memory) => !memory.pinned && !isPersonalMemory(memory));\n\n const sections: MemorySection[] = [];\n if (pinnedSelected.length) {\n sections.push({ title: \"Pinned reminders\", lines: pinnedSelected.map(formatMemoryLine) });\n }\n if (personalSelected.length) {\n sections.push({ title: \"Personal details\", lines: personalSelected.map(formatMemoryLine) });\n }\n if (otherSelected.length) {\n sections.push({ title: \"Helpful context\", lines: otherSelected.map(formatMemoryLine) });\n }\n\n const averageScore = selected.length\n ? Number((selected.reduce((acc, memory) => acc + (memory.score || 0), 0) / selected.length).toFixed(3))\n : 0;\n\n const averageConfidence = selected.length\n ? Number(\n (\n selected.reduce((acc, memory) => acc + (memory.personalConfidence ?? 0), 0) /\n selected.length\n ).toFixed(3)\n )\n : 0;\n\n return {\n sections,\n stats: {\n totalAvailable: memoriesToConsider.length,\n selectedCount: selected.length,\n pinnedSelected: pinnedSelected.length,\n personalSelected: personalSelected.length,\n otherSelected: otherSelected.length,\n tokensUsed,\n tokensRemaining: Math.max(tokenBudget - tokensUsed, 0),\n averageScore,\n averageConfidence,\n },\n };\n};\n\nexport interface UseAIProviderProps {\n isMobile: boolean;\n setStreamBuffer: React.Dispatch<React.SetStateAction<string>>;\n setIsSubmitting: (val: boolean) => void;\n setResponseStarted: (val: boolean) => void;\n setIsStreaming: (val: boolean) => void;\n setResponse: (response: string) => void;\n setPastedImages: React.Dispatch<React.SetStateAction<string[]>>;\n setPendingMessage: React.Dispatch<\n React.SetStateAction<{ question: string; images?: string[] } | null>\n >;\n setLogoVisible: (val: boolean) => void;\n overrideComponentStatus: (status: ComponentStatus) => void;\n setPreviousQuestion: (val: string) => void;\n setInputValue: (value: string) => void;\n history: HistoryEntry[];\n addHistory: (entry: {\n question: string;\n answer: string;\n images?: string[];\n memoryUpdated?: boolean;\n }) => void;\n inputRef: React.RefObject<HTMLInputElement>;\n onError?: (error: unknown) => void;\n}\n\nexport type AIProviderExecutor = ((\n systemPrompt: string,\n question: string,\n images: string[]\n) => Promise<void>) & {\n cancel: () => void;\n};\n\nexport const useAIProvider = ({\n isMobile,\n setStreamBuffer,\n setIsSubmitting,\n setResponseStarted,\n setIsStreaming,\n setResponse,\n setPastedImages,\n setPendingMessage,\n setLogoVisible,\n overrideComponentStatus,\n setPreviousQuestion,\n setInputValue,\n history,\n addHistory,\n inputRef,\n onError,\n}: UseAIProviderProps): AIProviderExecutor => {\n // Stable references for stream and partial content\n const currentSubRef = useRef<Subscription | null>(null);\n const lastPartialRef = useRef<{ text: string; images: string[]; usedDocs: KnowledgeSourceDoc[]; question: string }>({\n text: \"\",\n images: [],\n usedDocs: [],\n question: \"\",\n });\n const flushTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n // Pull current provider and settings from stores\n const { provider } = useAIProviderStore.getState();\n const { preferences } = usePreferencesStore.getState();\n const { docs } = useKnowledgeStore.getState();\n\n // Feature helpers\n const { analyzeMood, moodTokenBoost } = useMoodEngine();\n const { runMemoryScan } = useMemoryEnhancer();\n const { isVectorEnabled, searchMemories, searchDocuments, getUserMemories } = useVectorStore();\n\n const pinnedVectorCacheRef = useRef<{ fetchedAt: number; memories: VectorMemory[] }>({\n fetchedAt: 0,\n memories: [],\n });\n\n const getPinnedVectorMemories = useCallback(async (): Promise<VectorMemory[]> => {\n if (!isVectorEnabled) {\n return [];\n }\n\n const now = Date.now();\n const cache = pinnedVectorCacheRef.current;\n if (cache.memories.length && now - cache.fetchedAt < 60_000) {\n return cache.memories;\n }\n\n try {\n const userMemories = (await getUserMemories(0, 200)) as VectorMemory[];\n const pinned = userMemories.filter((memory) => memory.pinned);\n pinnedVectorCacheRef.current = { fetchedAt: now, memories: pinned };\n return pinned;\n } catch (error) {\n debugLogger.warn(\"Pinned memory refresh failed\", { error });\n return cache.memories;\n }\n }, [getUserMemories, isVectorEnabled]);\n\n const clearFlushTimer = () => {\n if (flushTimerRef.current) {\n clearTimeout(flushTimerRef.current);\n flushTimerRef.current = null;\n }\n };\n\n const runAIProvider = useCallback(\n async (systemPrompt: string, question: string, images: string[]) => {\n if (!provider) {\n debugLogger.error(\"No AI provider configured\");\n overrideComponentStatus(\"Error\");\n if (onError) onError(new Error(\"No AI provider configured\"));\n return;\n }\n // Get user preferences from the store\n const userPreferences = preferences;\n\n const isLowIntent = question.trim().toLowerCase().match(/^(hi|hello|hey|yo|what'?s up|how are you)\\??$/i);\n\n overrideComponentStatus(\"Loading\");\n setIsSubmitting(true);\n setResponseStarted(true);\n setIsStreaming(true);\n setResponse(\"\");\n setStreamBuffer(\"\");\n clearFlushTimer();\n // Show loading indicator (bouncing ellipsis) until we can stream or finalize\n setPendingMessage({ question, images });\n\n // Get current model and config\n const modelName = usePackageSettingsStore.getState().settings?.defaultModel || \"bandit-core:4b-it-qat\";\n const CONFIG = modelConfigs[modelName] ?? modelConfigs[\"bandit-core:4b-it-qat\"];\n\n const base64Images = images.map((img) => img.split(\",\")[1]);\n\n const latestEntries = history.slice(-CONFIG.historyMessages);\n const contextMessages: AIMessage[] = latestEntries.flatMap((entry) => [\n { role: \"user\", content: entry.question },\n { role: \"assistant\", content: entry.answer },\n ]);\n\n let tokenLimit = CONFIG.memoryTokenBudget;\n let moodText = \"\";\n\n // Only process mood if enabled in preferences and model supports it\n if (userPreferences.moodEnabled && CONFIG.moodInjection) {\n try {\n const currentMood = await analyzeMood(question);\n tokenLimit += moodTokenBoost; // moodTokenBoost is a number\n moodText = moodPromptMap[currentMood] || \"\";\n } catch (error) {\n debugLogger.warn(\"Failed to analyze mood:\", { error: error instanceof Error ? error.message : String(error) });\n }\n } else if (!userPreferences.moodEnabled) {\n debugLogger.info(\"Mood processing skipped - disabled in preferences\");\n }\n\n let memoryText = \"\";\n let usedDocs: KnowledgeSourceDoc[] = [];\n\n // Only process memory and knowledge documents if enabled in preferences\n if (!isLowIntent && (userPreferences.memoryEnabled || userPreferences.knowledgeDocsEnabled)) {\n try {\n let memoryContent = \"\";\n let docContent = \"\";\n\n // Process memory if enabled\n if (userPreferences.memoryEnabled) {\n if (isVectorEnabled) {\n debugLogger.info('Searching vector memories (advanced search enabled)', {\n memoryLimit: 18,\n scoreThreshold: 0.45,\n });\n\n try {\n const mergedResults = (await searchMemories(question, {\n memoryLimit: 18,\n scoreThreshold: 0.45,\n // Ask backend to append pinned memories so we don't overfetch separately\n filters: { includePinned: true },\n })) as VectorMemory[];\n\n const prepared = prepareAdvancedMemoryContext(\n mergedResults,\n tokenLimit,\n (text) => embeddingService.estimateTokens(text)\n );\n\n if (prepared.sections.length > 0) {\n const sectionText = prepared.sections\n .map((section) => `${section.title}\\n- ${section.lines.join(\"\\n- \")}`)\n .join(\"\\n\\n\");\n\n memoryContent = `Use the following long-term context when it helps personalize your response:\\n\\n${sectionText}\\n\\nReference these details only when they genuinely support the user's latest request.`;\n } else {\n memoryContent = \"\";\n }\n\n debugLogger.memoryDebug(\"Vector memory selection\", {\n tokenLimit,\n totalReturned: mergedResults.length,\n sections: prepared.sections.map((section) => ({\n title: section.title,\n itemCount: section.lines.length,\n })),\n stats: prepared.stats,\n });\n } catch (error) {\n debugLogger.error(\"Vector memory search failed\", { error });\n memoryContent = \"\";\n }\n } else {\n debugLogger.info('Searching local memories (advanced search disabled)');\n\n const memoryList = await embeddingService.selectRelevantMemories(question, tokenLimit);\n debugLogger.memoryDebug(\"Local memory selection\", {\n tokenLimit,\n memoryCount: memoryList.length,\n searchMode: 'local'\n });\n\n memoryContent =\n memoryList.length > 0\n ? `The user has shared the following background information:\\n\\n- ${memoryList.join(\n \"\\n- \"\n )}\\n\\nUse this information to personalize your responses whenever relevant.`\n : \"\";\n }\n } else {\n debugLogger.info(\"Memory processing skipped - disabled in preferences\");\n }\n\n // Process knowledge documents if enabled\n if (userPreferences.knowledgeDocsEnabled) {\n if (isVectorEnabled) {\n // VECTOR MODE: Use vector database exclusively for document search\n debugLogger.info('Searching vector knowledge documents (advanced search enabled)', { \n query: question.slice(0, 100), \n limit: 5, \n scoreThreshold: 0.50 \n });\n \n try {\n const vectorDocs = (await searchDocuments(question, { \n documentLimit: 5, \n scoreThreshold: 0.50 \n })) as RawVectorDocument[];\n \n debugLogger.info('Vector document search completed', { \n resultsCount: vectorDocs.length,\n docNames: vectorDocs.map((doc) => doc.filename || doc.name || 'Unknown')\n });\n\n // Convert vector search results to expected format\n const candidateDocs: KnowledgeSourceDoc[] = vectorDocs.map((result, index) => {\n const docId =\n result?.id ||\n result?.documentId ||\n result?.fileId ||\n result?._id ||\n result?.metadata?.id ||\n result?.metadata?._id ||\n result?.metadata?.fileId;\n const fallbackId = result?.key || result?.filename || result?.name;\n const resolvedId = docId || (fallbackId ? String(fallbackId) : `vector-doc-${index}`);\n\n if (!docId && !fallbackId) {\n debugLogger.warn(\"Vector document result missing identifier\", {\n availableKeys: result ? Object.keys(result) : [],\n sample: (result?.filename || result?.name || \"unknown\").toString(),\n });\n }\n\n return {\n id: resolvedId,\n name: result.filename || result.name || 'Unknown Document',\n content: result.content || 'No content available',\n mimeType: result.mimeType || result.type,\n addedDate: result.uploadedAt ? new Date(result.uploadedAt) : undefined,\n size: result.size,\n uploadedBy: result.uploadedBy,\n userEmail: result.userEmail,\n bucket: result.bucket,\n key: result.key || resolvedId,\n s3Url: resolvedId,\n isUserContent: result.isUserContent,\n isTeamContent: result.isTeamContent,\n contentSource: result.contentSource,\n originalFileName: result.originalFileName || result.filename || result.name,\n // Preserve original data for downstream checks (e.g. vector modal detection)\n _vectorResult: result\n };\n });\n\n // Debug log the actual content received from vector DB\n debugLogger.ragDebug(\"Vector DB content received\", {\n docsCount: candidateDocs.length,\n docs: candidateDocs.map(doc => ({\n name: doc.name,\n hasContent: !!doc.content,\n contentLength: doc.content?.length || 0,\n contentPreview: doc.content?.substring(0, 100) + \"...\" || \"NO CONTENT\"\n }))\n });\n\n let approvedIndexes: number[] = [];\n if (!isLowIntent && candidateDocs.length > 0) {\n debugLogger.ragDebug(\"Starting LLM vetting process for vector docs\", {\n candidateCount: candidateDocs.length,\n candidateNames: candidateDocs.map(d => d.name),\n question: question.substring(0, 150) + \"...\"\n });\n \n // Transform docs to expected format for relevance determination\n const docsForRelevance = candidateDocs.map(doc => ({\n name: doc.name,\n chunks: [doc.content] // Convert single content to chunks array\n }));\n approvedIndexes = await determineRelevantDocuments(question, docsForRelevance);\n \n debugLogger.ragDebug(\"LLM vetting completed for vector docs\", {\n approvedCount: approvedIndexes.length,\n approvedNames: approvedIndexes.map(i => candidateDocs[i]?.name).filter(Boolean),\n rejectedNames: candidateDocs.filter((_, i) => !approvedIndexes.includes(i)).map(d => d.name)\n });\n } else if (isLowIntent) {\n debugLogger.info(\"Skipping knowledge/doc scan for low-intent input\");\n } else {\n debugLogger.info(\"No candidate vector docs available for vetting\");\n }\n \n usedDocs = approvedIndexes\n .map((i) => candidateDocs[i])\n .filter((doc): doc is KnowledgeSourceDoc => Boolean(doc));\n\n debugLogger.ragDebug(\"Final vector document usage\", {\n usedDocsCount: usedDocs.length,\n docNames: usedDocs.map(d => d.name),\n searchMode: 'vector'\n });\n\n } catch (error) {\n debugLogger.error(\"Vector document search failed\", { error });\n // NO FALLBACK - fail cleanly in vector mode\n usedDocs = [];\n }\n } else {\n // LOCAL MODE: Use local IndexedDB documents exclusively \n debugLogger.info('Searching local knowledge documents (advanced search disabled)', { \n totalDocs: docs.length\n });\n\n const queryEmbedding = await embeddingService.generate(question);\n const validDocs = docs.filter(doc => doc.embedding && doc.embedding.length > 0);\n \n debugLogger.ragDebug(\"Local document search initialization\", {\n totalDocs: docs.length,\n validDocsCount: validDocs.length,\n question: question.substring(0, 100) + \"...\",\n docNames: docs.map(d => d.name),\n validDocNames: validDocs.map(d => d.name),\n searchMode: 'local'\n });\n\n if (docs.length === 0) {\n debugLogger.warn(\"No documents available in local knowledge store\");\n } else if (validDocs.length === 0) {\n debugLogger.warn(\"No documents have embeddings - they may need to be reprocessed\", {\n docsWithoutEmbeddings: docs.filter(d => !d.embedding || d.embedding.length === 0).map(d => d.name)\n });\n }\n\n const scoredDocs = validDocs\n .map((doc) => {\n const score = doc.embedding ? embeddingService.cosineSimilarity(queryEmbedding, doc.embedding) : 0;\n \n // Log detailed scoring info for each document\n debugLogger.ragDebug(\"Local document scoring details\", { \n docName: doc.name, \n hasEmbedding: !!doc.embedding,\n score: score.toFixed(4),\n hasContent: !!doc.content,\n contentLength: doc.content?.length || 0,\n strategy: 'low-threshold-llm-vetting'\n });\n \n return { doc, score };\n });\n\n const candidateDocs: KnowledgeSourceDoc[] = scoredDocs\n .filter(entry => entry.score >= 0.50) // Lower threshold, let LLM decide relevance\n .sort((a, b) => b.score - a.score)\n .slice(0, 5)\n .map(entry => entry.doc);\n\n if (candidateDocs.length === 0) {\n debugLogger.warn(\"No documents passed cosine threshold - skipping vetting\", {\n allScores: scoredDocs.map(d => ({ name: d.doc.name, score: d.score.toFixed(3) })),\n threshold: \"0.50\"\n });\n }\n\n let approvedIndexes: number[] = [];\n if (!isLowIntent && candidateDocs.length > 0) {\n debugLogger.ragDebug(\"Starting LLM vetting process for local docs\", {\n candidateCount: candidateDocs.length,\n candidateNames: candidateDocs.map(d => d.name),\n question: question.substring(0, 150) + \"...\"\n });\n \n // Transform docs to expected format for relevance determination\n const docsForRelevance = candidateDocs.map(doc => ({\n name: doc.name,\n chunks: [doc.content] // Convert single content to chunks array\n }));\n approvedIndexes = await determineRelevantDocuments(question, docsForRelevance);\n \n debugLogger.ragDebug(\"LLM vetting completed for local docs\", {\n approvedCount: approvedIndexes.length,\n approvedNames: approvedIndexes.map(i => candidateDocs[i]?.name).filter(Boolean),\n rejectedNames: candidateDocs.filter((_, i) => !approvedIndexes.includes(i)).map(d => d.name)\n });\n } else if (isLowIntent) {\n debugLogger.info(\"Skipping knowledge/doc scan for low-intent input\");\n } else {\n debugLogger.info(\"No candidate local docs available for vetting\");\n }\n \n usedDocs = approvedIndexes\n .map((i) => candidateDocs[i])\n .filter((doc): doc is KnowledgeSourceDoc => Boolean(doc));\n\n debugLogger.ragDebug(\"Final local document selection (trusting LLM vetting)\", {\n selectedDocsCount: usedDocs.length,\n finalSelectedDocs: usedDocs.map(d => d.name),\n searchMode: 'local'\n });\n }\n\n // Generate document content for the prompt\n docContent =\n usedDocs.length > 0\n ? `IMPORTANT CONTEXT - The user has uploaded the following documents that directly relate to their question. You MUST use this information to provide a comprehensive answer. Do NOT say you cannot help or that you need more information when relevant content is provided below.\\n\\n${usedDocs\n .map((doc) => {\n const content = doc.chunks ? doc.chunks.join(\"\\n\\n\") : doc.content || 'No content available';\n debugLogger.ragDebug(\"Document content usage\", {\n docName: doc.name,\n usingChunks: !!doc.chunks,\n contentLength: content.length,\n preview: content.substring(0, 100) + \"...\",\n searchMode: isVectorEnabled ? 'vector' : 'local',\n actualContent: content // Log full content for debugging\n });\n return `📄 **${doc.name}**\\n${content}`;\n })\n .join(\"\\n\\n\")}\\n\\nUSE THE ABOVE CONTENT to answer the user's question. Reference specific information from these documents.`\n : \"\";\n\n debugLogger.ragDebug(\"Final document usage\", {\n usedDocsCount: usedDocs.length,\n docNames: usedDocs.map(d => d.name),\n docContentLength: docContent.length,\n searchMode: isVectorEnabled ? 'vector' : 'local',\n docContent: docContent.substring(0, 500) + \"...\", // Log more content\n hasDocContent: docContent.length > 0,\n actualDocContents: usedDocs.map(d => ({\n name: d.name,\n contentLength: d.content?.length || 0,\n contentPreview: d.content?.substring(0, 200) || \"EMPTY\"\n }))\n });\n } else {\n debugLogger.info(\"Knowledge document processing skipped - disabled in preferences\");\n }\n\n // Combine memory and document content\n memoryText = `${memoryContent ? memoryContent : \"\"}${docContent ? \"\\n\\n\" + docContent : \"\"}`;\n\n } catch (error) {\n debugLogger.warn(\"Failed to process knowledge documents:\", { error: error instanceof Error ? error.message : String(error) });\n }\n } else if (!userPreferences.memoryEnabled && !userPreferences.knowledgeDocsEnabled) {\n debugLogger.info(\"Memory and knowledge document processing skipped - both disabled in preferences\");\n }\n\n // Build the complete system prompt with current date/time context\n const dateTimeContext = getCurrentDateTimeContext();\n let enhancedSystemPrompt = `${systemPrompt}${moodText}${memoryText}${dateTimeContext}`;\n\n // RAG-first guidance so the model confidently uses provided context\n const ragGuidance = `\\n\\n🎯 CONTEXT USAGE DIRECTIVE:\\n- The documents and background information above contain VERIFIED, RELEVANT content for this request\\n- Answer confidently using this provided context - do NOT apologize or claim insufficient information\\n- When documents are provided, they contain the information needed to answer the question\\n- Quote specific details from the documents and cite them as [Doc: NAME]\\n- Combine the provided context with your knowledge to give comprehensive answers\\n- Only use tools for live data (news, weather, sports scores) when specifically requested\\n- Trust and utilize the provided context without hesitation`;\n enhancedSystemPrompt += ragGuidance;\n\n // Add MCP tools information to system prompt if available\n const mcpToolsAvailable = isMCPAvailable();\n if (mcpToolsAvailable) {\n const enabledTools = getEnabledMCPToolsForAI();\n if (enabledTools.length > 0) {\n const toolList = enabledTools\n .map((tool) => {\n const parameterProps = tool.function?.parameters?.properties ?? {};\n const params = Object.keys(parameterProps);\n const paramSuffix = params.length ? ` (parameters: ${params.join(\", \")})` : \"\";\n return `- ${tool.function.name}: ${tool.function.description}${paramSuffix}`;\n })\n .join(\"\\n\");\n const protocol = `\\n\\nTOOL USAGE PROTOCOL (conservative approach)\\n- PRIORITIZE your built-in knowledge and the provided context ABOVE to answer questions first.\\n- Use your training data and general knowledge confidently for common topics, concepts, and questions.\\n- Only call tools for SPECIFIC, CURRENT information that requires real-time data:\\n * news() - ONLY when explicitly asked about recent/breaking news, current events, or \"what's happening now\"\\n * sports() - ONLY when asked about live scores, current games, recent sports results, or league standings\\n * search/documentation tools - ONLY when asked about very specific technical documentation or when you need to supplement your knowledge with current docs\\n- For general questions about concepts, definitions, explanations, or how-to topics, use your built-in knowledge WITHOUT calling tools.\\n- Examples of what NOT to use tools for: \"who are you?\", \"what is React?\", \"explain machine learning\", \"how does X work?\", general programming questions.\\n- When a tool is truly needed, call exactly ONE tool that best matches the request.\\n- Begin tool usage with a fenced code block: \\`\\`\\`tool_code\\nfunctionName({\"param\": \"value\"})\\n\\`\\`\\`\\n- If you cannot answer with your knowledge and context, and no suitable tool exists, ask a clarifying question.\\n\\nExamples of appropriate tool usage:\\n\\n\\`\\`\\`tool_code\\nnews({\"topic\": \"latest AI developments\", \"count\": 5})\\n\\`\\`\\`\\n\\n\\`\\`\\`tool_code\\nsports({\"league\": \"nfl\", \"type\": \"scores\"})\\n\\`\\`\\`\\n`;\n enhancedSystemPrompt += `\\n\\nYou have access to the following tools that can help you provide better responses. Use them when appropriate:\\n\\n${toolList}\\n${protocol}`;\n \n debugLogger.info(\"MCP tools added to system prompt\", { \n toolCount: enabledTools.length,\n toolNames: enabledTools.map(t => t.function.name)\n });\n }\n }\n\n // Prepare messages for AI provider\n const messages: AIMessage[] = [\n { role: \"system\", content: enhancedSystemPrompt },\n ...contextMessages,\n { role: \"user\", content: question }\n ];\n\n // Prepare request\n const request: ToolAwareChatRequest = {\n model: modelName,\n messages,\n stream: true,\n images: base64Images.length > 0 ? base64Images : undefined,\n options: { num_predict: tokenLimit + 250 }\n };\n\n // Add MCP tools to request if available\n if (mcpToolsAvailable) {\n const enabledTools = getEnabledMCPToolsForAI();\n if (enabledTools.length > 0) {\n request.tools = enabledTools;\n debugLogger.info(\"MCP tools added to AI request\", { toolCount: enabledTools.length });\n }\n }\n\n let fullMessage = \"\";\n let latestDisplayMessage = \"\";\n let sawToolBlock = false;\n\n const flushNow = () => {\n clearFlushTimer();\n if (!sawToolBlock) {\n lastPartialRef.current.text = latestDisplayMessage;\n setStreamBuffer(latestDisplayMessage);\n }\n };\n\n const scheduleFlush = (delay = 150) => {\n if (flushTimerRef.current || sawToolBlock) return;\n flushTimerRef.current = setTimeout(() => {\n flushTimerRef.current = null;\n lastPartialRef.current.text = latestDisplayMessage;\n setStreamBuffer(latestDisplayMessage);\n }, delay);\n };\n\n const stream = provider.chat(request);\n\n const { addToCurrent, conversations, currentId, replaceLastAnswer } =\n useConversationStore.getState();\n const currentConv = conversations.find((c) => c.id === currentId);\n const lastEntry = currentConv?.history.at(-1);\n const isPlaceholder =\n lastEntry?.question === question && lastEntry?.answer === \"...\";\n\n // Initialize last-partial tracking for graceful cancel\n lastPartialRef.current = { text: \"\", images, usedDocs, question };\n\n // If a previous stream is still active, cancel it first\n if (currentSubRef.current) {\n try { currentSubRef.current.unsubscribe(); } catch {}\n currentSubRef.current = null;\n }\n\n const sub = stream.subscribe({\n next: (data) => {\n if (!data?.message?.content) return;\n fullMessage += data.message.content;\n // Throttled UI update, apply on all devices (no extra status injection)\n // Detect tool call block and suppress streaming if present\n if (/```(?:tool_code|TOOL_CODE)/.test(fullMessage)) {\n sawToolBlock = true;\n clearFlushTimer();\n }\n latestDisplayMessage = fullMessage;\n if (!sawToolBlock) {\n scheduleFlush();\n }\n },\n error: (err: Error) => {\n debugLogger.error(\"Stream error:\", err);\n overrideComponentStatus(\"Idle\");\n setIsSubmitting(false);\n setIsStreaming(false);\n\n // Finalize with the partial content on error/abort\n flushNow();\n let partial = lastPartialRef.current.text || latestDisplayMessage || fullMessage;\n if (partial && !partial.trim().endsWith(\"…\") && !partial.trim().endsWith(\"...\")) {\n partial = partial.trimEnd() + \" …\"; // append ellipsis to indicate truncation\n }\n if (partial) {\n const { replaceLastAnswer } = useConversationStore.getState();\n replaceLastAnswer(partial, lastPartialRef.current.images, false, lastPartialRef.current.usedDocs, true);\n setResponse(partial);\n }\n setStreamBuffer(\"\");\n setPendingMessage(null);\n setLogoVisible(false);\n\n // Call the error handler if provided\n if (onError) {\n onError(err);\n }\n },\n complete: async () => {\n try {\n latestDisplayMessage = fullMessage;\n if (!sawToolBlock) {\n flushNow();\n }\n\n // Check for tool calls in the response and execute them\n const toolCallMatches = fullMessage.match(/```(?:tool_code|TOOL_CODE)\\s*\\n([^`]+)\\n```/gi);\n let enhancedMessage = fullMessage;\n\n if (toolCallMatches && toolCallMatches.length > 0 && mcpToolsAvailable) {\n debugLogger.info(\"Detected tool calls in AI response\", {\n toolCallCount: toolCallMatches.length,\n toolCalls: toolCallMatches,\n });\n\n for (const match of toolCallMatches) {\n const toolCallCode = match.replace(/```(?:tool_code|TOOL_CODE)\\s*\\n|\\n```/gi, \"\").trim();\n const functionCallMatch = toolCallCode.match(/^(\\w+)\\(\\s*(.*?)\\s*\\)$/);\n if (!functionCallMatch) continue;\n const [, functionName, params] = functionCallMatch;\n\n try {\n // Parse parameters if any\n let parsedParams: MCPToolParameters = {};\n const raw = params.trim();\n if (raw.length > 0) {\n if (raw.startsWith(\"{\")) {\n parsedParams = JSON.parse(raw);\n } else {\n try {\n parsedParams = JSON.parse(`{${raw}}`);\n } catch (innerErr) {\n debugLogger.warn(\"Failed to parse tool parameters, defaulting to empty object\", {\n raw,\n error: innerErr instanceof Error ? innerErr.message : String(innerErr),\n });\n parsedParams = {};\n }\n }\n }\n\n debugLogger.info(\"Executing MCP tool from AI response\", {\n functionName,\n parameters: parsedParams,\n });\n\n // Insert a neutral loading placeholder while executing\n const placeholderToken = `<<TOOL_LOADING_${functionName}_${Math.random()\n .toString(36)\n .slice(2)}>>`;\n // Replace the fenced block with an invisible placeholder token. Do not update UI yet.\n enhancedMessage = enhancedMessage.replace(match, placeholderToken);\n\n // Execute the tool\n const result = await executeMCPTool({\n toolName: functionName,\n parameters: parsedParams,\n });\n\n // Summarize result (no raw JSON, no tool names)\n let resultText = \"\";\n if (result.success) {\n if (functionName === \"sports\" && Array.isArray(result.data)) {\n const games = (result.data as SportsGameResult[]).filter(Boolean);\n const q = (question || \"\").toLowerCase();\n const normalize = (value: unknown) =>\n typeof value === \"string\" ? value.toLowerCase().replace(/[^a-z0-9 ]/g, \"\") : \"\";\n const tokens = (value: unknown) =>\n normalize(value)\n .split(\" \")\n .filter((w) => w.length > 3);\n const formatTeamScore = (team: unknown, score: unknown) => {\n const teamName = typeof team === \"string\" && team.trim().length > 0 ? team : \"Team\";\n const teamScore =\n typeof score === \"number\" || typeof score === \"string\" ? String(score) : \"—\";\n return `${teamName} ${teamScore}`;\n };\n const scoreLine = (game: SportsGameResult) => {\n const status = typeof game.status === \"string\" ? game.status : \"\";\n const final = status.toLowerCase().includes(\"final\");\n const score = `${formatTeamScore(game.homeTeam, game.homeScore)} — ${formatTeamScore(\n game.awayTeam,\n game.awayScore\n )}`;\n return final ? `Final: ${score}` : `${status || \"In progress\"} — ${score}`;\n };\n let best: SportsGameResult | null = null;\n let bestScore = -1;\n for (const game of games) {\n const homeTokens = tokens(game.homeTeam);\n const awayTokens = tokens(game.awayTeam);\n const hits = [...homeTokens, ...awayTokens].reduce(\n (acc, token) => acc + (q.includes(token) ? 1 : 0),\n 0\n );\n if (hits > bestScore) {\n bestScore = hits;\n best = game;\n }\n }\n if (best && bestScore > 0) {\n resultText = scoreLine(best);\n } else if (games.length > 0) {\n const topGames = games.slice(0, Math.min(5, games.length));\n resultText = `Here are some current scores:\\n- ${topGames.map(scoreLine).join(\"\\n- \")}`;\n } else {\n resultText = \"No games available right now.\";\n }\n } else if (\n functionName === \"image_generation\" ||\n functionName === \"image-generation\"\n ) {\n const imageData = (result.data ?? {}) as ImageGenerationResult;\n const { imageUrl, revisedPrompt } = imageData;\n resultText = imageUrl\n ? `Here you go!\\n\\n![Generated image](${imageUrl})\\n\\n${\n revisedPrompt ? `Prompt refinement: “${revisedPrompt}”\\n` : \"\"\n }Note: the image link may expire in ~2 hours.`\n : \"Image generated successfully.\";\n } else if (functionName === \"news\" && Array.isArray(result.data)) {\n const items = (result.data as NewsArticleResult[]).slice(0, 3);\n resultText = items.length\n ? `## Top News Results\\n\\n${items\n .map((item, index) => {\n const title = item.title ?? \"Untitled\";\n const source = item.source ?? \"Unknown\";\n const url = item.url ?? item.link;\n const description = item.description ?? item.summary;\n const publishedAt = item.publishedAt ?? item.published;\n\n let newsItem = `### ${index + 1}. ${title}\\n`;\n\n if (typeof description === \"string\" && description.length > 0) {\n const truncated =\n description.length > 150 ? `${description.slice(0, 150)}...` : description;\n newsItem += `${truncated}\\n\\n`;\n }\n\n newsItem += `**Source:** ${source}\\n`;\n\n if (publishedAt) {\n const date = new Date(publishedAt);\n if (!Number.isNaN(date.getTime())) {\n newsItem += `**Published:** ${date.toLocaleDateString()} at ${date.toLocaleTimeString(\n [],\n { hour: \"2-digit\", minute: \"2-digit\" }\n )}\\n`;\n }\n }\n\n if (typeof url === \"string\" && url.length > 0) {\n newsItem += `\\n**[📰 Read Full Article](${url})**\\n`;\n }\n\n return newsItem;\n })\n .join(\"\\n---\\n\\n\")}`\n : \"No news results found.\";\n } else if (functionName === \"docs\" && Array.isArray(result.data)) {\n const items = (result.data as DocSearchResult[]).slice(0, 3);\n resultText = items.length\n ? `Relevant docs:\\n- ${items\n .map((item) => {\n const title = item.title ?? \"Untitled doc\";\n const url = item.url ?? item.link;\n return url ? `${title} — ${url}` : title;\n })\n .join(\"\\n- \")}`\n : \"No documentation results found.\";\n } else if (functionName === \"weather\") {\n const weatherData = (result.data ?? {}) as Partial<WeatherResult>;\n const informative = [weatherData.message, weatherData.details, weatherData.error]\n .map((value) => (typeof value === \"string\" ? value.trim() : undefined))\n .filter((value): value is string => Boolean(value) && value.toLowerCase() !== \"n/a\");\n if (informative.length > 0) {\n const locationLabel =\n typeof weatherData.location === \"string\" && weatherData.location.length > 0\n ? ` for ${weatherData.location}`\n : \"\";\n resultText = `Weather service notice${locationLabel}: ${informative.join(\" — \")}`;\n } else {\n const parts = [weatherData.location, weatherData.description, weatherData.temperature]\n .map((value) =>\n typeof value === \"number\" || typeof value === \"string\"\n ? String(value).trim()\n : undefined\n )\n .filter((value): value is string => Boolean(value));\n resultText = parts.length ? parts.join(\" — \") : \"No weather data found.\";\n }\n } else if (typeof result.data === \"string\") {\n resultText = result.data;\n } else if (result.data) {\n resultText = JSON.stringify(result.data, null, 2).slice(0, 1000);\n } else {\n resultText = \"Here are the latest results.\";\n }\n } else {\n const data = (result.data ?? {}) as Partial<WeatherResult> & Record<string, unknown>;\n const informative = [data.message, data.details, data.error, result.error]\n .map((value) => (typeof value === \"string\" ? value.trim() : undefined))\n .filter((value): value is string => Boolean(value) && value.toLowerCase() !== \"n/a\");\n if (functionName === \"weather\" && informative.length) {\n const locationLabel =\n typeof data.location === \"string\" && data.location.length > 0 ? ` for ${data.location}` : \"\";\n resultText = `Weather service issue${locationLabel}: ${informative.join(\" — \")}`;\n } else if (informative.length) {\n resultText = informative.join(\" — \");\n } else {\n resultText = `I couldn't complete that request: ${result.error || \"Unknown error\"}.`;\n }\n }\n\n enhancedMessage = enhancedMessage.replace(placeholderToken, resultText);\n\n debugLogger.info(\"Tool execution completed\", {\n functionName,\n success: result.success,\n resultPreview:\n JSON.stringify(result).substring(0, 100) + \"...\",\n });\n } catch (error) {\n debugLogger.error(\"Failed to execute tool call\", {\n functionName,\n error:\n error instanceof Error ? error.message : String(error),\n });\n\n const friendly = error instanceof Error ? error.message : String(error);\n const errorText = `I ran into an issue completing that step: ${friendly}.`;\n if (enhancedMessage.includes(\"<<TOOL_LOADING_\")) {\n enhancedMessage = enhancedMessage.replace(\n /<<TOOL_LOADING_[^>]+>>/,\n errorText\n );\n } else {\n enhancedMessage = enhancedMessage.replace(match, errorText);\n }\n }\n }\n }\n\n // Wrap up and update UI/history\n overrideComponentStatus(\"Idle\");\n setIsSubmitting(false);\n setPreviousQuestion(question);\n\n if (!enhancedMessage.trim()) {\n enhancedMessage =\n \"Sorry, I got a bit tongue-tied there. Mind asking that again? 😅\";\n }\n\n clearFlushTimer();\n latestDisplayMessage = enhancedMessage;\n lastPartialRef.current.text = enhancedMessage;\n setResponse(enhancedMessage);\n setStreamBuffer(enhancedMessage);\n\n // Only run memory scan if memory is enabled in preferences\n let memoryUpdated = false;\n if (userPreferences.memoryEnabled) {\n memoryUpdated = await runMemoryScan(question, enhancedMessage);\n } else {\n debugLogger.info(\"Memory scan skipped - disabled in preferences\");\n }\n // Update history, then smoothly transition UI state\n const { addToCurrent, replaceLastAnswer } = useConversationStore.getState();\n const current = useConversationStore.getState();\n const conv = current.conversations.find(c => c.id === current.currentId);\n const last = conv?.history.at(-1);\n if (!last || last.answer !== \"...\" || last.question !== question) {\n // Add a single entry now that we have the final text\n addToCurrent({ question, answer: enhancedMessage, images, memoryUpdated, sourceFiles: usedDocs });\n } else {\n // Replace the temporary entry (if any)\n replaceLastAnswer(enhancedMessage, images, memoryUpdated, usedDocs);\n }\n\n setInputValue(\"\");\n setPastedImages([]);\n // Keep buffer visible briefly so the last frame matches final markdown\n setTimeout(() => {\n clearFlushTimer();\n setPendingMessage(null);\n setStreamBuffer(\"\");\n setIsStreaming(false);\n setLogoVisible(false);\n inputRef.current?.focus();\n }, 320);\n } catch (e) {\n debugLogger.error(\"Completion handler failed\", {\n error: e instanceof Error ? e.message : String(e),\n });\n overrideComponentStatus(\"Idle\");\n setIsSubmitting(false);\n setIsStreaming(false);\n }\n },\n });\n currentSubRef.current = sub;\n },\n [\n provider,\n history,\n setResponse,\n overrideComponentStatus,\n setPreviousQuestion,\n setInputValue,\n setPastedImages,\n setPendingMessage,\n setStreamBuffer,\n setIsSubmitting,\n setResponseStarted,\n setLogoVisible,\n inputRef,\n moodTokenBoost,\n analyzeMood,\n runMemoryScan,\n docs,\n setIsStreaming,\n preferences,\n isVectorEnabled,\n searchMemories,\n searchDocuments,\n onError,\n ]\n );\n\n const cancel = () => {\n if (currentSubRef.current) {\n try { currentSubRef.current.unsubscribe(); } catch {}\n currentSubRef.current = null;\n // Finalize with the latest partial so user sees what was generated up to stop point\n let partial = lastPartialRef.current.text;\n if (partial && !partial.trim().endsWith(\"…\") && !partial.trim().endsWith(\"...\")) {\n partial = partial.trimEnd() + \" …\";\n }\n overrideComponentStatus(\"Idle\");\n setIsSubmitting(false);\n setIsStreaming(false);\n if (partial) {\n const { replaceLastAnswer } = useConversationStore.getState();\n replaceLastAnswer(partial, lastPartialRef.current.images, false, lastPartialRef.current.usedDocs, true);\n setResponse(partial);\n }\n clearFlushTimer();\n setStreamBuffer(\"\");\n setPendingMessage(null);\n setLogoVisible(false);\n }\n };\n\n return Object.assign(runAIProvider, { cancel }) as AIProviderExecutor;\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-96A8-211AAB\nconst __banditFingerprint_hooks_useMemoryEnhancertsx = 'BL-FP-050810-A500';\nconst __auditTrail_hooks_useMemoryEnhancertsx = 'BL-AU-MGOIKVV2-Y7LR';\n// File: useMemoryEnhancer.tsx | Path: src/chat/hooks/useMemoryEnhancer.tsx | Hash: 96a8a500\n\n/**\n * 🧠 Bandit Interest-Focused Memory System (Phase 4)\n *\n * Mission:\n * - Capture meaningful user interests, excitement, and engagement signals\n * - Focus on information that enhances future user experiences\n * - Eliminate noise, creepy data collection, and irrelevant personal details\n * - Build memory that helps provide better, more personalized assistance\n *\n * New Approach - User Interest & Excitement Detection:\n * - Detects when users express passion, enthusiasm, or deep interest\n * - Captures user goals, aspirations, and active projects\n * - Records preferences that affect how AI should respond (format, tone, methods)\n * - Remembers tools, technologies, and workflows users prefer\n * - Tracks learning goals and skill development interests\n * - Ignores casual mentions and demographic trivia\n *\n * Key Improvements:\n * - Interest-based filtering instead of broad \"personal information\" scanning\n * - Enhanced LLM prompts focused on user engagement and excitement\n * - Stricter validation against generic or meaningless content\n * - Emphasis on actionable memory that improves future interactions\n *\n * Privacy-First Design:\n * - Only captures what users are genuinely excited to share\n * - Avoids invasive collection of routine personal details\n * - Focuses on enhancement, not surveillance\n * - User maintains full control (view, edit, pin, delete)\n *\n * Technical Enhancements:\n * - Improved semantic filtering for meaningful content detection\n * - Enhanced personal text recognition for engagement signals\n * - Stricter memory validation against generic statements\n * - Context-aware memory generation focused on user value\n *\n * - 100% local-first, fully user-controllable memory (view, edit, pin, delete).\n *\n * Technical Enhancements:\n * - Cosine similarity thresholds for echo rejection, divergence detection, and merging.\n * - Combined lightweight semantic filters with micro-LLM calls for max precision.\n * - Early foundations laid for memory token budgeting and relevance-based surfacing.\n * - Private semantic memory embeddings managed entirely client-side.\n *\n * Companionware Vision:\n * - Bandit's memory is no longer just reactive — it is **becoming an active companion**.\n * - Every captured memory moves Bandit closer to true contextual alignment with the user.\n * - Bandit is designed to serve as **Private AI Companionware**: evolving with you, not ahead of you.\n *\n * Future Phases:\n * - Phase 4: Auto-pinning highly important memories based on semantic scoring.\n * - Phase 5: Local RAG memory search — using your memories to enhance real-time chats.\n * - Phase 6: Visual memory timeline and relevance controls.\n *\n * Phase 3 Conclusion:\n * > Bandit is no longer just remembering facts.\n * > Bandit is **growing with you** — as a private, local, true AI Companion.\n */\n\nimport { lastValueFrom, map } from \"rxjs\";\nimport { useMemoryStore } from \"../../store/memoryStore\";\nimport { useAIProviderStore } from \"../../store/aiProviderStore\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport type { AIGenerateResponse } from \"../../services/ai-provider/types/common.types\";\nimport { useVectorStore } from \"../../hooks/useVectorStore\";\nimport { embeddingService } from \"../../services/embedding/embeddingService\";\nimport { detectUserInterestAndExcitement } from \"../../services/prompts\";\nimport { debugLogger } from \"../../services/logging/debugLogger\";\nimport { useConversationSyncStore } from \"../../store/conversationSyncStore\";\n\nconst MEMORY_LIMIT = 100;\nconst MIN_MEMORY_WORDS = 3;\nconst MERGE_THRESHOLD = 0.9;\nconst REJECT_ECHO_THRESHOLD = 0.98;\nconst REJECT_DUPLICATE_THRESHOLD = 0.985;\nconst DIVERGENCE_REJECTION_THRESHOLD = 0.65;\nconst CONTEXTUAL_DIVERGENCE_THRESHOLD = 0.75;\n\nconst normalizeText = (text: string) =>\n text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n\nconst isStructurallyDuplicate = (a: string, b: string) => {\n const tokensA = new Set(normalizeText(a).split(\" \"));\n const tokensB = new Set(normalizeText(b).split(\" \"));\n const shared = [...tokensA].filter((t) => tokensB.has(t));\n const ratio = shared.length / Math.min(tokensA.size, tokensB.size);\n return ratio > 0.8;\n};\n\nconst isAboutBandit = (text: string) => {\n const lc = text.toLowerCase();\n \n // Allow business/usage context even if it mentions Bandit AI\n const hasBusinessContext = lc.includes(\"business\") || lc.includes(\"help my\") || \n lc.includes(\"use for\") || lc.includes(\"using for\") || lc.includes(\"work with\") ||\n lc.includes(\"building with\") || lc.includes(\"vector db\") || lc.includes(\"setup\");\n \n if (hasBusinessContext) {\n return false; // Don't reject business context memories\n }\n \n // Only reject purely self-referential content about Bandit itself\n return (lc.includes(\"bandit ai\") && (lc.includes(\"you are\") || lc.includes(\"what are you\") || \n lc.includes(\"who are you\") || lc.includes(\"describe yourself\"))) || \n lc.includes(\"you are bandit\");\n};\n\nconst hasEngagementValue = (text: string) => {\n const lc = text.toLowerCase();\n \n // Strong signals for AI/building enthusiasm - always valuable\n const aiEnthusiasm = [\n \"enjoys building with ai\", \"loves building with\", \"building with ai\",\n \"so much fun\", \"really fun\", \"fun to\", \"exciting to\",\n \"passionate about building\", \"excited about\", \"love working with ai\",\n \"ai is fun\", \"found it fun\", \"having fun with\"\n ];\n \n if (aiEnthusiasm.some(signal => lc.includes(signal))) {\n return true; // Always accept AI building enthusiasm\n }\n \n // Look for signals that this memory could enhance future interactions\n const valuableSignals = [\n \"enjoys\", \"loves\", \"passionate about\", \"excited about\",\n \"interested in\", \"working on\", \"focusing on\", \"struggling with\",\n \"needs help with\", \"wants to learn\", \"trying to\", \"hoping to\",\n \"prefers\", \"works best with\", \"uses\", \"specializes in\",\n \"is passionate about\", \"is excited about\", \"is working on\",\n \"wants to learn\", \"goals include\", \"aspires to\", \"dreams of\",\n \"finds helpful\", \"effective approach\", \"preferred method\",\n \"learning\", \"developing\", \"building\", \"creating\", \"studying\",\n // Add business and enthusiasm signals\n \"pumped to use\", \"excited to use\", \"love how\", \"business\",\n \"help my business\", \"for my business\", \"using for work\",\n \"plans to use\", \"wants to use for\",\n // Add AI/building enthusiasm patterns\n \"love building\", \"building with\", \"so much fun\", \"really fun\",\n \"enjoy working\", \"love working\", \"passionate about building\",\n \"excited about\", \"fun to\", \"love using\", \"love how\",\n \"thanks for helping\", \"appreciate help\", \"helpful for\",\n \"setup\", \"vector db\", \"database setup\", \"ai setup\"\n ];\n \n return valuableSignals.some(signal => lc.includes(signal));\n};\n\nconst isMemoryTooShortOrGeneric = (text: string) => {\n const words = text.trim().split(/\\s+/);\n return words.length < MIN_MEMORY_WORDS;\n};\n\nconst isPersonalText = (text: string) => {\n const lc = text.toLowerCase();\n \n // Look for expressions of interest, excitement, or engagement\n const interestSignals = [\n \"i love\", \"i'm excited\", \"i'm passionate about\", \"i'm interested in\",\n \"i really enjoy\", \"i'm working on\", \"i'm learning\", \"i want to\",\n \"my goal\", \"i dream\", \"i hope to\", \"i plan to\", \"i aspire\",\n \"i'm trying to\", \"i need help with\", \"i prefer\", \"i use\",\n \"my favorite approach\", \"i find it helpful\", \"works best for me\",\n // Add business enthusiasm signals\n \"i'm so pumped\", \"pumped to use\", \"excited to use\", \"love how easy\",\n // Add AI/building enthusiasm patterns\n \"love building\", \"building with ai\", \"so much fun\", \"really fun\",\n \"thanks for helping\", \"appreciate the help\", \"helpful with\",\n \"with my\", \"for my\", \"help me with\"\n ];\n \n // Look for project/work engagement\n const engagementSignals = [\n \"i'm building\", \"i'm developing\", \"working on a project\",\n \"i'm studying\", \"i'm focusing on\", \"i specialize in\",\n // Add business context signals\n \"help my business\", \"for my business\", \"business needs\",\n // Add setup/technical enthusiasm\n \"vector db setup\", \"database setup\", \"ai setup\", \"setup process\"\n ];\n \n // Look for preference expressions that could improve responses\n const preferenceSignals = [\n \"i like when\", \"i prefer\", \"it helps when\", \"i find it easier\",\n \"i work better with\", \"i understand better when\"\n ];\n \n return [...interestSignals, ...engagementSignals, ...preferenceSignals]\n .some(signal => lc.includes(signal));\n};\n\nconst mergeMemory = (existing: string, incoming: string) => {\n const sanitizedIncoming = sanitizeMemoryText(incoming);\n const sanitizedExisting = sanitizeMemoryText(existing);\n if (\n sanitizedIncoming === \"NO_UPDATE\" ||\n sanitizedExisting.includes(sanitizedIncoming)\n ) {\n return existing;\n }\n return sanitizedExisting.endsWith(\".\")\n ? `${sanitizedExisting} ${sanitizedIncoming}`\n : `${sanitizedExisting}. ${sanitizedIncoming}`;\n};\n\nconst isVoiceShifted = (text: string) => {\n const lower = text.toLowerCase();\n return (\n lower.includes(\"for me\") || lower.includes(\"they are\") || lower.includes(\"he/she\")\n );\n};\n\nconst sanitizeMemory = (text: string) =>\n text\n .replace(/^_(.*?)_$/g, \"$1\")\n .replace(/_(.*?)_/g, \"$1\")\n .replace(/<\\/?endofturn>/gi, \"\") // Remove any remaining end of turn tokens\n .replace(/\\n+/g, \" \") // Convert newlines to spaces\n .replace(/\\s+/g, \" \") // Normalize whitespace\n .trim();\n\nconst sanitizeMemoryText = (text: string) =>\n text\n .replace(/[_*~`]+/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n\nconst shouldAcceptMemory = async (\n newMemory: string,\n userInput: string,\n shouldUseVectorForMemories: boolean = false,\n forceAccept: boolean = false\n): Promise<boolean> => {\n const { entries } = useMemoryStore.getState();\n\n debugLogger.memoryDebug(\"Memory acceptance validation start\", {\n newMemory: newMemory.slice(0, 150),\n userInput: userInput.slice(0, 100),\n entriesCount: entries.length,\n storageMode: shouldUseVectorForMemories ? 'vector' : 'indexeddb'\n });\n\n if (!newMemory.trim()) {\n debugLogger.memoryDebug(\"Memory rejected - empty or whitespace\", {});\n return false;\n }\n\n if (isAboutBandit(newMemory)) {\n debugLogger.memoryDebug(\"Memory rejected - about Bandit\", { \n memory: newMemory.slice(0, 100) \n });\n return false;\n }\n\n if (forceAccept) {\n debugLogger.memoryDebug(\"Memory force-accepted due to user request\", {\n memory: newMemory.slice(0, 150),\n });\n return true;\n }\n\n if (isMemoryTooShortOrGeneric(newMemory)) {\n debugLogger.memoryDebug(\"Memory rejected - too short or generic\", { \n memory: newMemory.slice(0, 100),\n wordCount: newMemory.trim().split(/\\s+/).length\n });\n return false;\n }\n\n if (!hasEngagementValue(newMemory)) {\n debugLogger.memoryDebug(\"Memory lacks engagement value but accepted\", {\n memory: newMemory.slice(0, 100),\n });\n }\n\n debugLogger.memoryDebug(\"Memory passed basic validation checks\", {\n memory: newMemory.slice(0, 100)\n });\n\n const newEmbedding = await embeddingService.generate(newMemory);\n const inputEmbedding = await embeddingService.generate(userInput);\n\n const echoSim = embeddingService.cosineSimilarity(newEmbedding, inputEmbedding);\n if (\n echoSim >= REJECT_ECHO_THRESHOLD &&\n normalizeText(newMemory) === normalizeText(userInput)\n ) {\n debugLogger.memoryDebug(\"Memory rejected - exact input duplication\", { \n echoSim, \n newMemory: newMemory.slice(0, 100) \n });\n return false;\n }\n\n const divergenceSim = embeddingService.cosineSimilarity(newEmbedding, inputEmbedding);\n // Accept memories that are related but not identical\n // Reject if too similar (echo) or completely unrelated\n if (divergenceSim >= REJECT_ECHO_THRESHOLD) {\n debugLogger.memoryDebug(\"Memory rejected - too similar to input (echo)\", {\n divergenceSim: divergenceSim.toFixed(2),\n threshold: REJECT_ECHO_THRESHOLD\n });\n return false;\n }\n \n // Allow memories that are somewhat related - don't require high similarity\n // This was previously rejecting good memories for being \"divergent\"\n if (divergenceSim < 0.3) {\n debugLogger.memoryDebug(\"Memory loosely related but accepted\", {\n divergenceSim: divergenceSim.toFixed(2),\n threshold: 0.3,\n });\n }\n\n // Only check for duplicates within the same storage system\n if (shouldUseVectorForMemories) {\n // For vector storage, we rely on the vector database's semantic deduplication\n // We don't check against local IndexedDB memories since they're in a different system\n debugLogger.memoryDebug(\"Skipping local duplicate check for vector storage\", {\n memory: newMemory.slice(0, 100)\n });\n } else {\n // For IndexedDB storage, check against existing local memories\n for (const entry of entries) {\n if (!entry.embedding) continue;\n const sim = embeddingService.cosineSimilarity(newEmbedding, entry.embedding);\n if (sim >= REJECT_DUPLICATE_THRESHOLD) {\n debugLogger.memoryDebug(\"Memory rejected - duplicate detected\", {\n similarity: sim.toFixed(2),\n existingContent: entry.content.slice(0, 100)\n });\n return false;\n }\n if (isStructurallyDuplicate(entry.content, newMemory)) {\n debugLogger.memoryDebug(\"Memory rejected - structurally duplicate\", { \n existingContent: entry.content.slice(0, 100) \n });\n return false;\n }\n }\n }\n\n return true;\n};\n\nconst isContextuallyDivergent = async (\n existing: string,\n incoming: string\n): Promise<boolean> => {\n const existingEmbedding = await embeddingService.generate(existing);\n const incomingEmbedding = await embeddingService.generate(incoming);\n const sim = embeddingService.cosineSimilarity(existingEmbedding, incomingEmbedding);\n return sim < CONTEXTUAL_DIVERGENCE_THRESHOLD;\n};\n\nexport const useMemoryEnhancer = () => {\n const { isVectorEnabled, addMemory: addVectorMemory } = useVectorStore();\n const isAdvancedVectorFeaturesEnabled = useConversationSyncStore(\n (state) => state.isAdvancedVectorFeaturesEnabled\n );\n \n const runMemoryScan = async (question: string, response: string) => {\n if (!question.trim() || !response.trim()) return false;\n if (response.length < 20) return false;\n\n const rememberPatterns = [\n /\\bplease\\s+remember\\b/i,\n /\\bcan\\s+you\\s+remember\\b/i,\n /\\bcould\\s+you\\s+remember\\b/i,\n /\\bremember\\s+(?:this|that|it|these|my|for\\s+me)\\b/i,\n /\\bsave\\s+(?:this|that|it|these)\\s+for\\s+later\\b/i,\n /\\bremember\\s+to\\s+call\\b/i,\n /\\badd\\s+(?:this|that|it|these)\\s+to\\s+memories?\\b/i,\n /\\bwill\\s+you\\s+remember\\s+(?:this|that|it|these|for\\s+me)?\\b/i,\n /\\bplease\\s+save\\s+(?:this|that|it|these)\\s+as\\s+(?:a\\s+)?memory\\b/i,\n /\\bremember\\s+this\\s+later\\b/i,\n /\\bdon't\\s+forget\\s+(?:this|that|it|these)\\b/i,\n /\\bkeep\\s+(?:this|that|it|these)\\s+in\\s+mind\\b/i,\n ];\n\n const userRequestedMemory =\n rememberPatterns.some((pattern) => pattern.test(question)) ||\n rememberPatterns.some((pattern) => pattern.test(response));\n\n const personalQuestion = isPersonalText(question);\n const personalResponse = isPersonalText(response);\n const engagementQuestion = hasEngagementValue(question);\n const engagementResponse = hasEngagementValue(response);\n const heuristicPersonalSignals =\n personalQuestion || personalResponse || engagementQuestion || engagementResponse;\n\n // Get the provider fresh each time the function is called\n const provider = useAIProviderStore.getState().provider;\n const settings = usePackageSettingsStore.getState().settings;\n const model = settings?.defaultModel || \"bandit-core\";\n\n if (!provider) {\n debugLogger.error(\"No AI provider available for memory scanning\");\n return false;\n }\n\n // Check if advanced memories are specifically enabled for memory storage\n const shouldUseVectorForMemories = isVectorEnabled && isAdvancedVectorFeaturesEnabled;\n\n debugLogger.memoryDebug(\"Memory storage mode check\", {\n isVectorEnabled,\n isAdvancedVectorFeaturesEnabled,\n shouldUseVectorForMemories,\n questionPreview: question.slice(0, 100)\n });\n\n debugLogger.memoryDebug(\"Memory enhancer start\", {\n questionLength: question.length,\n responseLength: response.length,\n questionPreview: question.slice(0, 150),\n responsePreview: response.slice(0, 150),\n });\n\n debugLogger.memoryDebug(\"Interest and engagement check\", {\n personalQuestion,\n personalResponse,\n engagementQuestion,\n engagementResponse,\n heuristicPersonalSignals,\n question: question.slice(0, 100),\n response: response.slice(0, 100),\n });\n\n let looksPersonal = false;\n let detectionSource: \"user_request\" | \"heuristics\" | \"llm\" = \"llm\";\n\n if (userRequestedMemory) {\n looksPersonal = true;\n detectionSource = \"user_request\";\n debugLogger.memoryDebug(\"Memory scan proceeding due to explicit user request\", {\n questionPreview: question.slice(0, 120),\n });\n } else if (heuristicPersonalSignals) {\n looksPersonal = true;\n detectionSource = \"heuristics\";\n debugLogger.memoryDebug(\"Memory scan proceeding due to heuristic signals\", {\n personalQuestion,\n personalResponse,\n engagementQuestion,\n engagementResponse,\n });\n } else {\n looksPersonal = await detectUserInterestAndExcitement(question, response);\n debugLogger.memoryDebug(\"Personal interest detection result\", {\n looksPersonal,\n questionPreview: question.slice(0, 100),\n });\n }\n\n if (!looksPersonal) {\n debugLogger.info(\"No user interest or excitement detected - skipping memory scan\", {\n questionPreview: question.slice(0, 100),\n detectionSource,\n userRequestedMemory,\n heuristicPersonalSignals,\n });\n return false;\n }\n\n const requestMemorySuggestion = async (\n promptText: string,\n attempt: \"primary\" | \"forced\"\n ): Promise<string | null> => {\n try {\n const result$ = provider.generate({\n model,\n prompt: promptText,\n stream: false,\n options: { temperature: 0.1, num_predict: 150 },\n });\n\n const suggestion = await lastValueFrom(\n result$.pipe(map((chunk: AIGenerateResponse) => chunk.response))\n );\n\n debugLogger.memoryDebug(`LLM memory suggestion received (${attempt})`, {\n suggestion: typeof suggestion === \"string\" ? suggestion.slice(0, 200) : suggestion,\n suggestionType: typeof suggestion,\n });\n\n if (!suggestion || typeof suggestion !== \"string\") {\n debugLogger.warn(`Invalid memory suggestion from LLM (${attempt})`, { suggestion });\n return null;\n }\n\n const cleaned = suggestion\n .replace(/```json|```/g, \"\")\n .replace(/<\\/?endofturn>/gi, \"\")\n .replace(/\\n+/g, \" \")\n .trim();\n const finalMemory = sanitizeMemory(\n cleaned.replace(/^(Bandit AI:|Note:|Suggestion:|Summary:|Memory:)\\s*/i, \"\").trim()\n );\n\n debugLogger.memoryDebug(`Memory cleaned and sanitized (${attempt})`, {\n originalSuggestion: suggestion.slice(0, 200),\n cleaned: cleaned.slice(0, 200),\n finalMemory: finalMemory.slice(0, 200),\n });\n\n return finalMemory;\n } catch (error) {\n debugLogger.error(`Memory suggestion generation failed (${attempt})`, { error });\n return null;\n }\n };\n\n const prompt = `Extract a short personal memory strictly based on what the user explicitly shared.\n- Summarize clearly and naturally using \"the user\" phrasing.\n- Do not invent, infer, or guess additional details.\n- Only state what the user explicitly said, reworded naturally.\n- Speak in the third person (\"the user\"), without addressing the user.\n- Do not add emojis, opinions, or assumptions.\n- Only include background, preferences, or activities.\n${userRequestedMemory ? \"- The user explicitly asked you to remember this; capture the detail they want saved.\\n\" : \"\"}- If no clear personal fact is found, respond exactly with \"NO_UPDATE\".\n\nUser: \"${question}\"\nAssistant: \"${response}\"\n\nRespond with:\n- A clean, short memory statement (strictly factual).\n- Or \"NO_UPDATE\".`.trim();\n\n try {\n let finalMemory = await requestMemorySuggestion(prompt, \"primary\");\n\n if (!finalMemory) {\n return false;\n }\n\n if (finalMemory === \"NO_UPDATE\" && userRequestedMemory) {\n debugLogger.memoryDebug(\"Retrying memory extraction due to explicit user request\", {\n questionPreview: question.slice(0, 120),\n });\n\n const forcedPrompt = `${prompt}\\n\\nThe user explicitly asked you to remember this. Respond with a short third-person memory sentence and do not reply with \"NO_UPDATE\".`;\n const forcedMemory = await requestMemorySuggestion(forcedPrompt, \"forced\");\n if (forcedMemory) {\n finalMemory = forcedMemory;\n }\n }\n\n if (\n finalMemory === \"NO_UPDATE\" ||\n finalMemory.length < 10 ||\n finalMemory.startsWith(\"{\") ||\n finalMemory.startsWith(\"[\")\n ) {\n debugLogger.info(\"Memory rejected - NO_UPDATE or invalid format\", {\n finalMemory,\n reason: finalMemory === \"NO_UPDATE\" ? \"NO_UPDATE\" : \n finalMemory.length < 10 ? \"too short\" : \"invalid format\"\n });\n return false;\n }\n\n const memoryAccepted = await shouldAcceptMemory(\n finalMemory,\n question,\n shouldUseVectorForMemories,\n userRequestedMemory\n );\n debugLogger.memoryDebug(\"Memory validation result\", {\n memoryAccepted,\n finalMemory: finalMemory.slice(0, 150),\n questionPreview: question.slice(0, 100),\n storageMode: shouldUseVectorForMemories ? 'vector' : 'indexeddb'\n });\n \n if (!memoryAccepted) {\n debugLogger.info(\"Memory rejected after validation checks\", {\n finalMemory: finalMemory.slice(0, 150),\n questionPreview: question.slice(0, 100)\n });\n return false;\n }\n\n // Use vector store if both vector is enabled AND advanced memories are specifically enabled\n if (shouldUseVectorForMemories) {\n // For vector store, we don't need to manage merging/duplicates manually\n // as the vector database will handle semantic search and relevance\n try {\n const result = await addVectorMemory(finalMemory, [], 'auto'); // Pass source as 'auto' for automatically detected memories\n if (result.success) {\n debugLogger.info(\"Memory successfully added to vector store\", {\n contentPreview: finalMemory.slice(0, 100),\n source: 'auto'\n });\n return true;\n } else {\n debugLogger.warn(\"Vector memory save failed, falling back to local store\", { \n error: result.error,\n contentPreview: finalMemory.slice(0, 100)\n });\n // Continue with local store logic as fallback\n }\n } catch (error) {\n debugLogger.error(\"Failed to add memory to vector store, falling back to local\", { error });\n // Continue with local store logic as fallback\n }\n }\n\n // Local store logic (original implementation)\n const { entries, addMemory } = useMemoryStore.getState();\n if (entries.length >= MEMORY_LIMIT) {\n debugLogger.warn(\"Memory limit reached - skipping save\", { \n currentCount: entries.length, \n limit: MEMORY_LIMIT \n });\n return false;\n }\n\n const newEmbedding = await embeddingService.generate(finalMemory);\n\n let merged = false;\n for (const entry of entries) {\n if (entry.embedding) {\n const sim = embeddingService.cosineSimilarity(entry.embedding, newEmbedding);\n if (\n isStructurallyDuplicate(entry.content, finalMemory) ||\n (sim >= MERGE_THRESHOLD &&\n !isVoiceShifted(finalMemory) &&\n !(await isContextuallyDivergent(entry.content, finalMemory)))\n ) {\n useMemoryStore.setState((state) => ({\n entries: state.entries.map((e) =>\n e.id === entry.id\n ? { ...e, content: mergeMemory(e.content, finalMemory) }\n : e\n ),\n }));\n merged = true;\n break;\n }\n }\n }\n\n if (!merged) {\n addMemory(finalMemory, [], \"auto\", newEmbedding);\n }\n\n return true;\n } catch (err) {\n debugLogger.error(\"Memory scan failed\", { error: err });\n return false;\n }\n };\n\n return { runMemoryScan };\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-BA71-78AB05\nconst __banditFingerprint_hooks_useMoodEnginetsx = 'BL-FP-E2C2A9-C9A6';\nconst __auditTrail_hooks_useMoodEnginetsx = 'BL-AU-MGOIKVV2-TYFB';\n// File: useMoodEngine.tsx | Path: src/chat/hooks/useMoodEngine.tsx | Hash: ba71c9a6\n\nimport { useState } from \"react\";\nimport { detectMessageMood } from \"../../services/prompts\";\nimport { debugLogger } from \"../../services/logging/debugLogger\";\n\nexport type UserMood = \"high\" | \"neutral\" | \"low\";\n\n/**\n * useMoodEngine\n *\n * Centralized hook for detecting and managing user mood.\n * - Uses Bandit's micro-LLM for emotional tone classification.\n * - Persists latest mood in memory for companion awareness.\n * - Can be used to drive UI styling, voice tone, or model behavior.\n */\nexport const useMoodEngine = () => {\n const [mood, setMood] = useState<UserMood>(\"neutral\");\n\n /**\n * Analyze user message and update mood.\n * Optionally logs response for debugging.\n */\n const analyzeMood = async (message: string): Promise<UserMood> => {\n try {\n const detected = await detectMessageMood(message);\n setMood(detected);\n debugLogger.debug(\"🧠 Mood Engine: updated mood to\", { mood: detected });\n return detected;\n } catch (err) {\n debugLogger.warn(\"⚠️ Mood Engine fallback to neutral due to error:\", { error: err });\n setMood(\"neutral\");\n return \"neutral\";\n }\n };\n\n // Reward-based token boost for excited users\n const moodTokenBoost = mood === \"high\" ? 250 : 0;\n\n return {\n mood,\n setMood,\n analyzeMood,\n moodTokenBoost,\n };\n};\n\nexport const moodPromptMap = {\n high: \"The user is highly energized and excited. Respond with enthusiasm, creativity, and momentum.\",\n neutral: \"Respond in your usual helpful, clear, and personable tone.\",\n low: \"The user may be feeling a bit off. Respond gently, with encouragement and calm support.\",\n };\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-BF8A-82BFF7\nconst __banditFingerprint_store_mcpToolsStorets = 'BL-FP-414506-12AF';\nconst __auditTrail_store_mcpToolsStorets = 'BL-AU-MGOIKVW4-PIWV';\n// File: mcpToolsStore.ts | Path: src/store/mcpToolsStore.ts | Hash: bf8a12af\n\nimport { create } from \"zustand\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\n\nexport interface MCPTool {\n id: string;\n name: string;\n description: string;\n enabled: boolean;\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: Record<string, unknown>;\n required: string[];\n };\n };\n endpoint?: string; // API endpoint for gateway calls\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n isBuiltIn?: boolean;\n}\n\ninterface MCPToolsStore {\n tools: MCPTool[];\n isLoaded: boolean;\n addTool: (tool: Omit<MCPTool, \"id\">) => void;\n updateTool: (id: string, updates: Partial<MCPTool>) => void;\n deleteTool: (id: string) => void;\n toggleTool: (id: string) => void;\n loadTools: () => Promise<void>;\n saveTools: () => Promise<void>;\n getEnabledTools: () => MCPTool[];\n}\n\n// Built-in controller-backed tools\nconst healthCheckTool: MCPTool = {\n id: \"health-check\",\n name: \"check_gateway_health\",\n description: \"Check the health status of the gateway API service\",\n enabled: true,\n type: \"function\",\n function: {\n name: \"check_gateway_health\",\n description: \"Check the health status of the gateway API service\",\n parameters: {\n type: \"object\",\n properties: {},\n required: []\n }\n },\n endpoint: \"/mcp/health\",\n method: \"GET\",\n isBuiltIn: true\n};\n\nconst newsTool: MCPTool = {\n id: \"news\",\n name: \"news\",\n description: \"Get the latest news headlines and articles from various sources\",\n enabled: true,\n type: \"function\",\n function: {\n name: \"news\",\n description: \"Get news articles and headlines\",\n parameters: {\n type: \"object\",\n properties: {\n topic: { type: \"string\", description: \"Filter news by topic\" },\n count: { type: \"number\", description: \"Number of articles to return (1-100)\" },\n headlines: { type: \"boolean\", description: \"Return top headlines instead of searching\" }\n },\n required: []\n }\n },\n endpoint: \"/mcp/news\",\n method: \"GET\",\n isBuiltIn: true\n};\n\nconst weatherTool: MCPTool = {\n id: \"weather\",\n name: \"weather\",\n description: \"Get current weather conditions and forecasts by location\",\n enabled: true,\n type: \"function\",\n function: {\n name: \"weather\",\n description: \"Get weather information by location\",\n parameters: {\n type: \"object\",\n properties: {\n zip: { type: \"string\", description: \"US zip code\" },\n latitude: { type: \"number\", description: \"Latitude\" },\n longitude: { type: \"number\", description: \"Longitude\" }\n },\n required: []\n }\n },\n endpoint: \"/mcp/weather\",\n method: \"GET\",\n isBuiltIn: true\n};\n\nconst docsTool: MCPTool = {\n id: \"docs\",\n name: \"docs\",\n description: \"Search framework documentation\",\n enabled: true,\n type: \"function\",\n function: {\n name: \"docs\",\n description: \"Search framework documentation\",\n parameters: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search query\" },\n framework: { type: \"string\", description: \"Specific framework to search\" },\n count: { type: \"number\", description: \"Number of results (1-50)\" }\n },\n required: [\"query\"]\n }\n },\n endpoint: \"/mcp/docs\",\n method: \"GET\",\n isBuiltIn: true\n};\n\nconst sportsTool: MCPTool = {\n id: \"sports\",\n name: \"sports\",\n description: \"Get sports scores and game information\",\n enabled: true,\n type: \"function\",\n function: {\n name: \"sports\",\n description: \"Get sports scores and game information\",\n parameters: {\n type: \"object\",\n properties: {\n league: { type: \"string\", description: \"Filter by specific league (e.g., nfl, nba)\" },\n date: { type: \"string\", description: \"Date in YYYY-MM-DD format\" }\n },\n required: []\n }\n },\n endpoint: \"/mcp/sports\",\n method: \"GET\",\n isBuiltIn: true\n};\n\n// New: Image Generation tool (OpenAI DALL·E 3)\nconst imageGenerationTool: MCPTool = {\n id: \"image-generation\",\n name: \"image_generation\",\n description: \"Generate high-quality images using DALL-E 3 from text prompts\",\n enabled: true,\n type: \"function\",\n function: {\n name: \"image_generation\",\n description: \"Generate high-quality images using DALL-E 3 from text prompts\",\n parameters: {\n type: \"object\",\n properties: {\n prompt: { type: \"string\", description: \"Text description of the image to generate\" },\n size: { type: \"string\", enum: [\"1024x1024\", \"1024x1792\", \"1792x1024\"], description: \"Image dimensions\" },\n quality: { type: \"string\", enum: [\"standard\", \"hd\"], description: \"Image quality\" },\n style: { type: \"string\", enum: [\"vivid\", \"natural\"], description: \"Style preference\" }\n },\n required: [\"prompt\"]\n }\n },\n endpoint: \"/mcp/generate-image\",\n method: \"POST\",\n isBuiltIn: true\n};\n\nconst defaultTools: MCPTool[] = [healthCheckTool, newsTool, weatherTool, docsTool, sportsTool, imageGenerationTool];\n\nexport const useMCPToolsStore = create<MCPToolsStore>((set, get) => ({\n tools: defaultTools,\n isLoaded: false,\n \n addTool: (toolData) => {\n const newTool: MCPTool = {\n ...toolData,\n id: `tool-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n };\n set((state) => ({\n tools: [...state.tools, newTool],\n }));\n get().saveTools();\n },\n \n updateTool: (id, updates) => {\n set((state) => ({\n tools: state.tools.map((tool) =>\n tool.id === id ? { ...tool, ...updates } : tool\n ),\n }));\n get().saveTools();\n },\n \n deleteTool: (id) => {\n set((state) => ({\n tools: state.tools.filter((tool) => tool.id !== id || tool.isBuiltIn),\n }));\n get().saveTools();\n },\n \n toggleTool: (id) => {\n set((state) => ({\n tools: state.tools.map((tool) =>\n tool.id === id ? { ...tool, enabled: !tool.enabled } : tool\n ),\n }));\n get().saveTools();\n },\n \n getEnabledTools: () => {\n return get().tools.filter((tool) => tool.enabled);\n },\n \n loadTools: async () => {\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n const data = await indexedDBService.get(\"banditConfig\", 1, \"config\", \"mcpTools\", storeConfigs);\n \n if (data?.tools && Array.isArray(data.tools)) {\n // Merge saved tools with built-in tools, ensuring built-ins always use default definition\n const savedTools = data.tools as MCPTool[];\n const builtInIds = defaultTools.map(t => t.id);\n const customTools = savedTools.filter(\n (tool) => !tool.isBuiltIn && !builtInIds.includes(tool.id)\n );\n\n set({\n tools: [...defaultTools, ...customTools],\n isLoaded: true\n });\n debugLogger.info(\"MCP tools loaded from IndexedDB\", { \n totalTools: defaultTools.length + customTools.length,\n builtInTools: defaultTools.length,\n customTools: customTools.length\n });\n } else {\n // First time, save defaults\n set({ isLoaded: true });\n await get().saveTools();\n debugLogger.info(\"Default MCP tools initialized\");\n }\n } catch (error) {\n debugLogger.error(\"Failed to load MCP tools from IndexedDB\", { error });\n set({ isLoaded: true }); // Mark as loaded even if failed, so UI can render\n }\n },\n \n saveTools: async () => {\n try {\n const { tools } = get();\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n \n const customTools = tools.filter((tool) => !tool.isBuiltIn);\n\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: \"mcpTools\",\n tools: customTools,\n }, storeConfigs);\n\n debugLogger.debug(\"MCP tools saved to IndexedDB\", { toolCount: customTools.length });\n } catch (error) {\n debugLogger.error(\"Failed to save MCP tools to IndexedDB\", { error });\n }\n },\n}));\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-1A78-E27B68\nconst __banditFingerprint_mcp_mcpServicets = 'BL-FP-11075C-9BD5';\nconst __auditTrail_mcp_mcpServicets = 'BL-AU-MGOIKVVV-87H3';\n// File: mcpService.ts | Path: src/services/mcp/mcpService.ts | Hash: 1a789bd5\n\nimport { useMCPToolsStore } from \"../../store/mcpToolsStore\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { authenticationService } from \"../auth/authenticationService\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\nexport interface MCPToolCall {\n toolName: string;\n parameters?: Record<string, unknown>;\n}\n\nexport interface MCPToolResult {\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\n/**\n * Execute an MCP tool by name with the given parameters\n */\nexport const executeMCPTool = async (toolCall: MCPToolCall): Promise<MCPToolResult> => {\n try {\n const { tools } = useMCPToolsStore.getState();\n const { settings } = usePackageSettingsStore.getState();\n \n // Find the tool\n const tool = tools.find(t => t.function.name === toolCall.toolName && t.enabled);\n if (!tool) {\n return {\n success: false,\n error: `Tool '${toolCall.toolName}' not found or not enabled`\n };\n }\n \n // Ensure gateway is configured (tool execution goes through gateway)\n if (!settings?.gatewayApiUrl) {\n return {\n success: false,\n error: \"Gateway API not configured\"\n };\n }\n\n // Check if tool has an endpoint\n if (!tool.endpoint) {\n return {\n success: false,\n error: `Tool '${toolCall.toolName}' has no endpoint configured`\n };\n }\n \n // Build the API call\n const base = settings.gatewayApiUrl.replace(/\\/$/, \"\");\n let url = `${base}${tool.endpoint}`;\n const method = tool.method || 'GET';\n \n debugLogger.info(\"Executing MCP tool\", { \n toolName: toolCall.toolName, \n method, \n endpoint: tool.endpoint,\n parameters: toolCall.parameters \n });\n \n // Prepare request options\n const requestOptions: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n },\n };\n \n // Add authentication if available\n const token = authenticationService.getToken();\n if (token) {\n requestOptions.headers = {\n ...requestOptions.headers,\n 'Authorization': `Bearer ${token}`,\n };\n }\n \n // Attach parameters\n if (toolCall.parameters && Object.keys(toolCall.parameters).length > 0) {\n if (method === 'GET' || method === 'DELETE') {\n // Append as query string\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(toolCall.parameters)) {\n if (Array.isArray(value)) {\n value.forEach(v => params.append(key, String(v)));\n } else if (value !== undefined && value !== null) {\n params.append(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) {\n url += (url.includes('?') ? '&' : '?') + qs;\n }\n } else {\n // Add body for POST/PUT requests\n requestOptions.body = JSON.stringify(toolCall.parameters);\n }\n }\n \n // Make the API call\n const response = await fetch(url, requestOptions);\n const data = await response.json();\n \n if (!response.ok) {\n debugLogger.error(\"MCP tool execution failed\", { \n toolName: toolCall.toolName, \n status: response.status, \n statusText: response.statusText,\n data \n });\n \n return {\n success: false,\n error: `API call failed: ${response.status} ${response.statusText}`,\n data\n };\n }\n \n debugLogger.info(\"MCP tool executed successfully\", { \n toolName: toolCall.toolName, \n resultPreview: JSON.stringify(data).substring(0, 200) + \"...\"\n });\n \n return {\n success: true,\n data\n };\n \n } catch (error) {\n debugLogger.error(\"MCP tool execution error\", { \n toolName: toolCall.toolName, \n error: error instanceof Error ? error.message : String(error)\n });\n \n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error occurred\"\n };\n }\n};\n\n/**\n * Get all enabled MCP tools formatted for AI provider consumption\n */\nexport const getEnabledMCPToolsForAI = () => {\n const { getEnabledTools } = useMCPToolsStore.getState();\n const enabledTools = getEnabledTools();\n \n return enabledTools.map(tool => ({\n type: tool.type,\n function: tool.function\n }));\n};\n\n/**\n * Check if MCP tools are available and configured\n */\nexport const isMCPAvailable = (): boolean => {\n const { settings } = usePackageSettingsStore.getState();\n const { tools } = useMCPToolsStore.getState();\n \n return !!(settings?.gatewayApiUrl && tools.some(t => t.enabled));\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-CB36-E68584\nconst __banditFingerprint_hooks_useAutoScrollts = 'BL-FP-CB225C-6283';\nconst __auditTrail_hooks_useAutoScrollts = 'BL-AU-MGOIKVVE-3F6Z';\n// File: useAutoScroll.ts | Path: src/hooks/useAutoScroll.ts | Hash: cb366283\n\nimport { useRef, useEffect, useCallback } from \"react\";\n\n// A stable event name that components can listen to for scroll state updates\nexport const SCROLL_STATE_CHANGED_EVENT = 'scrollStateChanged';\n\ninterface UseAutoScrollOptions {\n threshold?: number; // Distance from bottom to consider \"near bottom\"\n behavior?: ScrollBehavior;\n enabled?: boolean;\n isMobile?: boolean; // Add mobile flag for smart scrolling\n}\n\nexport const useAutoScroll = (options: UseAutoScrollOptions = {}) => {\n const {\n threshold = 100,\n behavior = \"smooth\",\n enabled = true,\n isMobile = false,\n } = options;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const targetRef = useRef<HTMLDivElement>(null);\n const shouldAutoScrollRef = useRef(true);\n\n // Check if user is near bottom\n const isNearBottom = useCallback(() => {\n const container = containerRef.current;\n if (!container) return true;\n\n const { scrollTop, scrollHeight, clientHeight } = container;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n \n // Consider \"near bottom\" if within threshold pixels, with a minimum of 10px\n // to ensure reliable detection after scrollToBottom() completes\n const effectiveThreshold = Math.max(threshold, 10);\n return distanceFromBottom <= effectiveThreshold;\n }, [threshold]);\n\n // Scroll to bottom with mobile-aware behavior\n const scrollToBottom = useCallback((forceBehavior?: ScrollBehavior) => {\n if (!enabled) return;\n \n const container = containerRef.current;\n if (container) {\n // Use scrollTop directly to avoid scrollIntoView issues\n const scrollBehavior = forceBehavior || behavior;\n \n if (isMobile) {\n // On mobile, scroll to show content optimally (not necessarily the very bottom)\n const optimalScrollTop = Math.max(0, container.scrollHeight - container.clientHeight);\n if (scrollBehavior === \"smooth\") {\n container.scrollTo({\n top: optimalScrollTop,\n behavior: \"smooth\"\n });\n } else {\n container.scrollTop = optimalScrollTop;\n }\n } else {\n // Desktop behavior - scroll to absolute bottom\n if (scrollBehavior === \"smooth\") {\n container.scrollTo({\n top: container.scrollHeight,\n behavior: \"smooth\"\n });\n } else {\n container.scrollTop = container.scrollHeight;\n }\n }\n }\n }, [enabled, behavior, isMobile]);\n\n // Force scroll to bottom (ignores auto-scroll state)\n const forceScrollToBottom = useCallback(() => {\n scrollToBottom(\"smooth\");\n \n // Ensure button state updates after forced scroll using rAF to catch the end of scroll\n const container = containerRef.current;\n if (container) {\n let rafId: number | null = null;\n let attempts = 0;\n\n const tick = () => {\n attempts += 1;\n // Dispatch on each frame so listeners can update progressively\n container.dispatchEvent(new CustomEvent(SCROLL_STATE_CHANGED_EVENT));\n\n // Stop once we're near bottom or after a reasonable number of frames\n if (isNearBottom() || attempts > 30) {\n if (rafId) cancelAnimationFrame(rafId);\n return;\n }\n rafId = requestAnimationFrame(tick);\n };\n\n rafId = requestAnimationFrame(tick);\n }\n }, [scrollToBottom, isNearBottom]);\n\n // Auto-scroll if conditions are met\n const autoScrollIfNeeded = useCallback(() => {\n if (enabled && shouldAutoScrollRef.current && isNearBottom()) {\n scrollToBottom();\n \n // Dispatch event(s) to update UI state after auto-scroll using rAF\n const container = containerRef.current;\n if (container) {\n let rafId: number | null = null;\n let frames = 0;\n const pump = () => {\n frames += 1;\n container.dispatchEvent(new CustomEvent(SCROLL_STATE_CHANGED_EVENT));\n if (frames < 20) {\n rafId = requestAnimationFrame(pump);\n } else if (rafId) {\n cancelAnimationFrame(rafId);\n }\n };\n rafId = requestAnimationFrame(pump);\n }\n }\n }, [enabled, isNearBottom, scrollToBottom]);\n\n // Handle scroll events to determine if user manually scrolled\n const containerElement = containerRef.current;\n\n useEffect(() => {\n if (!containerElement) return;\n\n const handleScroll = () => {\n const currentlyNearBottom = isNearBottom();\n\n // Update auto-scroll state based on current position\n shouldAutoScrollRef.current = currentlyNearBottom;\n\n // Always dispatch scroll state change event to ensure UI updates\n containerElement.dispatchEvent(new CustomEvent(SCROLL_STATE_CHANGED_EVENT));\n };\n\n containerElement.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => containerElement.removeEventListener(\"scroll\", handleScroll);\n }, [containerElement, isNearBottom]);\n\n // Auto-scroll on content changes\n useEffect(() => {\n autoScrollIfNeeded();\n });\n\n // Get scroll state info\n const getScrollState = useCallback(() => {\n const container = containerRef.current;\n if (!container) {\n return {\n isNearBottom: true,\n shouldAutoScroll: true,\n canScroll: false,\n scrollTop: 0,\n scrollHeight: 0,\n clientHeight: 0,\n };\n }\n\n const { scrollTop, scrollHeight, clientHeight } = container;\n const canScroll = scrollHeight > clientHeight;\n const nearBottom = isNearBottom();\n \n // Update the ref to reflect current state\n shouldAutoScrollRef.current = nearBottom;\n\n return {\n isNearBottom: nearBottom,\n shouldAutoScroll: nearBottom,\n canScroll,\n scrollTop,\n scrollHeight,\n clientHeight,\n };\n }, [isNearBottom]);\n\n return {\n containerRef,\n targetRef,\n scrollToBottom: forceScrollToBottom,\n autoScrollIfNeeded,\n getScrollState,\n isNearBottom,\n };\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-9120-F74DEA\nconst __banditFingerprint_hooks_useNetworkStatusts = 'BL-FP-517F02-D84F';\nconst __auditTrail_hooks_useNetworkStatusts = 'BL-AU-MGOIKVVE-S29A';\n// File: useNetworkStatus.ts | Path: src/hooks/useNetworkStatus.ts | Hash: 9120d84f\n\nimport { useState, useEffect, useCallback } from \"react\";\n\ntype NetworkEffectiveType = \"slow-2g\" | \"2g\" | \"3g\" | \"4g\";\n\ninterface NetworkInformation extends EventTarget {\n readonly effectiveType?: NetworkEffectiveType;\n readonly downlink?: number;\n readonly rtt?: number;\n readonly saveData?: boolean;\n onchange?: ((this: NetworkInformation, ev: Event) => unknown) | null;\n addEventListener(\n type: \"change\",\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions\n ): void;\n removeEventListener(\n type: \"change\",\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions\n ): void;\n}\n\ninterface NavigatorWithConnection extends Navigator {\n connection?: NetworkInformation;\n}\n\ninterface NetworkStatus {\n isOnline: boolean;\n isSlowConnection: boolean;\n connectionQuality: \"fast\" | \"slow\" | \"offline\";\n lastRequestTime: number;\n}\n\nexport const useNetworkStatus = () => {\n const [networkStatus, setNetworkStatus] = useState<NetworkStatus>({\n isOnline: navigator.onLine,\n isSlowConnection: false,\n connectionQuality: \"fast\",\n lastRequestTime: 0,\n });\n\n // Track request timing to detect slow connections\n const trackRequestStart = useCallback(() => {\n const startTime = Date.now();\n setNetworkStatus(prev => ({ ...prev, lastRequestTime: startTime }));\n return startTime;\n }, []);\n\n const trackRequestEnd = useCallback((startTime: number) => {\n const duration = Date.now() - startTime;\n const isSlowConnection = duration > 2000; // Consider >2s as slow\n \n setNetworkStatus(prev => ({\n ...prev,\n isSlowConnection,\n connectionQuality: !navigator.onLine \n ? \"offline\" \n : isSlowConnection \n ? \"slow\" \n : \"fast\",\n }));\n }, []);\n\n // Monitor online/offline status\n useEffect(() => {\n const handleOnline = () => {\n setNetworkStatus(prev => ({ \n ...prev, \n isOnline: true, \n connectionQuality: prev.isSlowConnection ? \"slow\" : \"fast\" \n }));\n };\n\n const handleOffline = () => {\n setNetworkStatus(prev => ({ \n ...prev, \n isOnline: false, \n connectionQuality: \"offline\" \n }));\n };\n\n window.addEventListener(\"online\", handleOnline);\n window.addEventListener(\"offline\", handleOffline);\n\n return () => {\n window.removeEventListener(\"online\", handleOnline);\n window.removeEventListener(\"offline\", handleOffline);\n };\n }, []);\n\n // Detect slow connection using Connection API if available\n useEffect(() => {\n const { connection } = navigator as NavigatorWithConnection;\n if (connection) {\n \n const updateConnectionInfo = () => {\n // Consider 2g/slow-2g as slow connections\n const slowConnections = ['slow-2g', '2g'];\n const isSlowConnection = slowConnections.includes(connection.effectiveType);\n \n setNetworkStatus(prev => ({\n ...prev,\n isSlowConnection,\n connectionQuality: !navigator.onLine \n ? \"offline\" \n : isSlowConnection \n ? \"slow\" \n : \"fast\",\n }));\n };\n\n updateConnectionInfo();\n\n const handleChange = () => updateConnectionInfo();\n\n if (typeof connection.addEventListener === \"function\") {\n connection.addEventListener(\"change\", handleChange);\n return () => connection.removeEventListener(\"change\", handleChange);\n }\n\n if (connection) {\n connection.onchange = handleChange;\n return () => {\n if (connection.onchange === handleChange) {\n connection.onchange = null;\n }\n };\n }\n }\n }, []);\n\n return {\n ...networkStatus,\n trackRequestStart,\n trackRequestEnd,\n };\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-0868-1B08DD\nconst __banditFingerprint_chat_chatappbartsx = 'BL-FP-17AC7A-1F59';\nconst __auditTrail_chat_chatappbartsx = 'BL-AU-MGOIKVUW-HL0K';\n// File: chat-app-bar.tsx | Path: src/chat/chat-app-bar.tsx | Hash: 08681f59\n\nimport { Avatar } from \"@mui/material\";\nimport { useModelStore } from \"../store/modelStore\";\nimport { BanditPersonality } from \"../store/modelStore\";\n\nconst CDN_BASE = \"https://cdn.burtson.ai/\";\nconst banditHead = `${CDN_BASE}/images/bandit-head.png`;\n\nconst modelAvatars: Record<string, string> = {\n \"Bandit-Core\": `${CDN_BASE}/avatars/core-avatar.png`,\n \"Bandit-Muse\": `${CDN_BASE}/avatars/muse-avatar.png`,\n \"Bandit-Logic\": `${CDN_BASE}/avatars/logic-avatar.png`,\n \"Bandit-D1VA\": `${CDN_BASE}/avatars/d1va-avatar.png`,\n \"Bandit-Exec\": `${CDN_BASE}/avatars/exec-avatar.png`,\n};\nimport React, { useRef, useState } from \"react\";\nimport {\n Box,\n IconButton,\n Menu,\n MenuItem,\n Tooltip,\n useMediaQuery,\n useTheme,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Typography,\n Button,\n} from \"@mui/material\";\nimport HomeIcon from \"@mui/icons-material/Home\";\nimport RecordVoiceOverIcon from \"@mui/icons-material/RecordVoiceOver\";\nimport AddIcon from \"@mui/icons-material/Add\";\nimport SettingsIcon from \"@mui/icons-material/Settings\";\nimport NotesIcon from \"@mui/icons-material/Notes\";\nimport NotesIconOutlined from \"@mui/icons-material/NotesOutlined\";\nimport CloudDoneIcon from \"@mui/icons-material/CloudDone\";\nimport CloudOffIcon from \"@mui/icons-material/CloudOff\";\nimport SyncIcon from \"@mui/icons-material/Sync\";\nimport ErrorOutlineIcon from \"@mui/icons-material/ErrorOutline\";\nimport { useNavigate, type NavigateFunction } from \"react-router-dom\";\nimport { toTitleCase } from \"../util\";\nimport ConversationDrawer from \"./conversation-drawer\";\nimport MobileConversationsModal from \"./enhanced-mobile-conversations-modal\";\nimport { useConversationStore } from \"../store/conversationStore\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport { usePreferencesStore } from \"../store/preferencesStore\";\nimport { usePackageSettingsStore } from \"../store/packageSettingsStore\";\nimport { useFeatures, useFeatureVisibility } from \"../hooks/useFeatures\";\nimport { useConversationSyncStore } from \"../store/conversationSyncStore\";\nimport { shallow } from \"zustand/shallow\";\n\ninterface ChatAppBarProps {\n availableModels: BanditPersonality[];\n handleModelChange: (modelId: string) => void;\n selectedVoice: string;\n availableVoices: string[];\n handleVoiceChange: (voiceId: string) => void;\n drawerOpen: boolean;\n setDrawerOpen: (open: boolean) => void;\n}\n\nconst ChatAppBar: React.FC<ChatAppBarProps> = ({\n availableModels,\n handleModelChange,\n selectedVoice,\n availableVoices,\n handleVoiceChange,\n drawerOpen,\n setDrawerOpen,\n}) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down(\"sm\"));\n\n const hasLoggedRouterWarningRef = useRef(false);\n let navigate: NavigateFunction | null = null;\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n navigate = useNavigate();\n } catch (error) {\n if (!hasLoggedRouterWarningRef.current) {\n debugLogger.warn(\"ChatAppBar: Navigation not available (missing Router context)\", { error });\n hasLoggedRouterWarningRef.current = true;\n }\n navigate = null;\n }\n\n const safeNavigate = (to: string) => {\n if (navigate) {\n navigate(to);\n } else if (typeof window !== \"undefined\") {\n window.location.href = to;\n }\n };\n\n const {\n background,\n border,\n icon,\n iconHover,\n menuBackground,\n menuText,\n } = theme.palette.chat.appBar;\n\n const [modelAnchorEl, setModelAnchorEl] = useState<null | HTMLElement>(null);\n const [voiceAnchorEl, setVoiceAnchorEl] = useState<null | HTMLElement>(null);\n const [modalOpen, setModalOpen] = useState(false);\n\n const [confirmModelChangeOpen, setConfirmModelChangeOpen] = useState(false);\n const [pendingModel, setPendingModel] = useState<string | null>(null);\n\n const { conversations, currentId, createNewConversation, _hasHydrated } =\n useConversationStore();\n const { preferences } = usePreferencesStore();\n const { settings: packageSettings } = usePackageSettingsStore();\n\n const {\n syncEnabled,\n syncStatus,\n lastSyncAt,\n pendingCount,\n warningConversations,\n oversizedConversations,\n triggerSync,\n } = useConversationSyncStore((state) => ({\n syncEnabled: state.syncEnabled,\n syncStatus: state.status,\n lastSyncAt: state.lastSyncAt,\n pendingCount:\n state.pendingConversationUpserts.size +\n state.pendingConversationDeletes.size +\n state.pendingProjectUpserts.size +\n state.pendingProjectDeletes.size,\n warningConversations: state.warningConversations,\n oversizedConversations: state.oversizedConversations,\n triggerSync: state.runSync,\n }), shallow);\n\n const syncSpinSx = {\n animation: 'spin 1s linear infinite',\n '@keyframes spin': {\n '0%': { transform: 'rotate(0deg)' },\n '100%': { transform: 'rotate(360deg)' },\n },\n } as const;\n\n const syncIndicatorIcon = (() => {\n if (!syncEnabled) {\n return <CloudOffIcon fontSize=\"small\" color=\"disabled\" />;\n }\n switch (syncStatus) {\n case 'syncing':\n return <SyncIcon fontSize=\"small\" sx={syncSpinSx} color=\"primary\" />;\n case 'error':\n return <ErrorOutlineIcon fontSize=\"small\" color=\"error\" />;\n case 'idle':\n default:\n return <CloudDoneIcon fontSize=\"small\" color=\"success\" />;\n }\n })();\n\n const syncTooltip = (() => {\n if (!syncEnabled) {\n return \"Cloud sync is disabled. Enable it from Management > Preferences.\";\n }\n let base: string;\n if (oversizedConversations.length > 0) {\n base = 'Some conversations are too large for Bandit Cloud. Start a new conversation to keep syncing.';\n } else if (syncStatus === 'syncing') {\n base = 'Syncing changes to Bandit Cloud…';\n } else if (warningConversations.length > 0) {\n base = 'Conversations are nearing the Bandit Cloud limit. Consider starting a new one soon.';\n } else if (syncStatus === 'error') {\n base = 'Sync needs attention. Visit Management > Preferences for details.';\n } else {\n base = 'Conversations are in sync with Bandit Cloud.';\n }\n const pending = pendingCount > 0\n ? ` ${pendingCount} change${pendingCount === 1 ? '' : 's'} queued.`\n : '';\n const last = lastSyncAt\n ? ` Last sync ${new Date(lastSyncAt).toLocaleTimeString()}.`\n : '';\n return `${base}${pending}${last}`;\n })();\n\n const handleSyncBadgeClick = () => {\n if (!syncEnabled || syncStatus === 'syncing') {\n return;\n }\n void triggerSync({ force: true });\n };\n\n // Feature flag checks\n const { hasTTS, hasSTT, isAdmin, getCurrentTier, hasLimitedAdminDashboard } = useFeatures();\n const { showVoiceControls, showLimitedAdminPanel } = useFeatureVisibility();\n\n // Check if TTS is available and enabled\n const isTTSAvailable = !!packageSettings?.gatewayApiUrl && preferences.ttsEnabled && hasTTS();\n\n const currentConversation = conversations.find((c) => c.id === currentId);\n const conversationCountDisplay = conversations.length > 99\n ? \"99+\"\n : conversations.length.toString();\n const isTrulyNewConversation =\n currentConversation?.name === \"New Conversation\" &&\n currentConversation.history.length === 0;\n\n const canShowNewConversationButton =\n _hasHydrated && currentConversation && !isTrulyNewConversation;\n\n // 🧼 Enhanced button styles with better UX\n const pillButtonStyles = {\n width: 36,\n height: 36,\n borderRadius: \"50%\",\n transition: \"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n color: icon,\n bgcolor: background,\n position: \"relative\",\n \"&:hover\": { \n bgcolor: iconHover,\n transform: \"scale(1.05)\",\n boxShadow: theme.palette.mode === \"dark\" \n ? \"0 2px 8px rgba(255,255,255,0.1)\" \n : \"0 2px 8px rgba(0,0,0,0.1)\",\n },\n \"&:active\": {\n transform: \"scale(0.95)\",\n },\n \"&:focus-visible\": {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: \"2px\",\n },\n } as const;\n\n const selectedModel = useModelStore((s) => s.selectedModel);\n const currentModel = useModelStore((s) => s.availableModels.find((m) => m.name === selectedModel));\n const currentAvatar = currentModel?.avatarBase64 || modelAvatars[selectedModel] || banditHead;\n\n const pendingModelAvatar =\n useModelStore.getState().availableModels.find((m) => m.name === pendingModel)?.avatarBase64 ||\n modelAvatars[pendingModel || \"\"] ||\n banditHead;\n\n function goToHome() {\n // Check if user has configured a custom home URL\n if (preferences.homeUrl && preferences.homeUrl.trim()) {\n window.location.href = preferences.homeUrl;\n return;\n }\n\n // Default to React Router navigation within the current app\n if (typeof window !== 'undefined') {\n const navigatorWithStandalone = window.navigator as Navigator & { standalone?: boolean };\n const isStandalone =\n window.matchMedia?.('(display-mode: standalone)').matches ||\n navigatorWithStandalone.standalone === true;\n if (isStandalone) {\n try {\n sessionStorage.setItem('banditPwaStayOnHome', 'true');\n } catch (error) {\n debugLogger.warn('[chat-app-bar] Unable to persist home preference', {\n error: error instanceof Error ? error.message : String(error)\n });\n }\n safeNavigate('/?mode=home');\n return;\n }\n }\n\n safeNavigate('/');\n }\n\n return (\n <>\n <Box\n sx={{\n position: \"fixed\",\n top: 0,\n left: 0,\n width: \"100%\",\n px: 2,\n py: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n bgcolor: \"transparent\",\n zIndex: 1300,\n pointerEvents: \"none\",\n \"& > *\": {\n pointerEvents: \"auto\",\n },\n }}\n >\n {/* LEFT PILL */}\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n bgcolor: background,\n px: 1.25,\n py: 0.5,\n borderRadius: \"9999px\",\n border: `1px solid ${border}`,\n backdropFilter: \"blur(10px)\",\n boxShadow: theme.palette.mode === \"dark\" \n ? \"0 4px 16px rgba(0,0,0,0.3)\" \n : \"0 4px 16px rgba(0,0,0,0.1)\",\n transition: \"all 0.2s ease-in-out\",\n \"&:hover\": {\n transform: \"translateY(-1px)\",\n boxShadow: theme.palette.mode === \"dark\" \n ? \"0 6px 20px rgba(0,0,0,0.4)\" \n : \"0 6px 20px rgba(0,0,0,0.15)\",\n },\n }}\n >\n <Tooltip title={preferences.homeUrl && preferences.homeUrl.trim() ? `Home (${new URL(preferences.homeUrl).hostname})` : \"Home\"} arrow>\n <IconButton\n onClick={goToHome}\n sx={pillButtonStyles}\n aria-label=\"Go to home page\"\n >\n <HomeIcon />\n </IconButton>\n </Tooltip>\n \n {showLimitedAdminPanel() && (\n <Tooltip title=\"Management & Settings\" arrow>\n <IconButton \n onClick={() => safeNavigate(\"/management\")} \n sx={{\n ...pillButtonStyles,\n ...(window.location.pathname === \"/management\" && {\n bgcolor: theme.palette.primary.main + \"20\",\n color: theme.palette.primary.main,\n }),\n }}\n aria-label=\"Open management settings\"\n >\n <SettingsIcon />\n </IconButton>\n </Tooltip>\n )}\n\n <Tooltip title={syncTooltip} arrow>\n <IconButton\n onClick={handleSyncBadgeClick}\n sx={{\n ...pillButtonStyles,\n color: syncEnabled ? theme.palette.primary.main : theme.palette.action.disabled,\n bgcolor: syncEnabled\n ? syncStatus === 'error'\n ? theme.palette.error.main + '20'\n : theme.palette.primary.main + '12'\n : 'transparent',\n '&:hover': syncEnabled\n ? {\n bgcolor: syncStatus === 'error'\n ? theme.palette.error.main + '30'\n : theme.palette.primary.main + '20',\n }\n : {},\n }}\n aria-label=\"Conversation sync status\"\n >\n {syncIndicatorIcon}\n {pendingCount > 0 && syncEnabled && syncStatus !== 'syncing' && (\n <Box\n sx={{\n position: 'absolute',\n top: -2,\n right: -2,\n minWidth: 16,\n height: 16,\n px: 0.3,\n bgcolor: theme.palette.warning.main,\n color: theme.palette.getContrastText(theme.palette.warning.main),\n borderRadius: '999px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '0.6rem',\n fontWeight: 600,\n border: `2px solid ${background}`,\n }}\n >\n {pendingCount > 9 ? '9+' : pendingCount}\n </Box>\n )}\n </IconButton>\n </Tooltip>\n\n {!isMobile && (\n <Tooltip title={`${drawerOpen ? \"Close\" : \"Open\"} Conversations`} arrow>\n <IconButton\n onClick={() => setDrawerOpen(!drawerOpen)}\n sx={{\n ...pillButtonStyles,\n ...(drawerOpen && {\n bgcolor: theme.palette.primary.main + \"20\",\n color: theme.palette.primary.main,\n }),\n }}\n aria-label={`${drawerOpen ? \"Close\" : \"Open\"} conversations drawer`}\n aria-pressed={drawerOpen}\n >\n {drawerOpen ? (\n <NotesIcon />\n ) : (\n <NotesIconOutlined />\n )}\n {conversations.length > 0 && (\n <Box\n sx={{\n position: \"absolute\",\n top: -2,\n right: -2,\n minWidth: 16,\n height: 16,\n px: 0.3,\n bgcolor: theme.palette.primary.main,\n color: \"white\",\n borderRadius: \"50%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"0.6rem\",\n fontWeight: \"bold\",\n border: `2px solid ${background}`,\n }}\n >\n {conversationCountDisplay}\n </Box>\n )}\n </IconButton>\n </Tooltip>\n )}\n\n {!isMobile && canShowNewConversationButton && (\n <Tooltip title=\"Start New Conversation\" arrow>\n <IconButton \n onClick={() => createNewConversation()} \n sx={{\n ...pillButtonStyles,\n bgcolor: theme.palette.success.main + \"20\",\n color: theme.palette.success.main,\n \"&:hover\": {\n bgcolor: theme.palette.success.main + \"30\",\n transform: \"scale(1.1)\",\n },\n }}\n aria-label=\"Create new conversation\"\n >\n <AddIcon />\n </IconButton>\n </Tooltip>\n )}\n </Box>\n\n {/* RIGHT PILL */}\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n bgcolor: background,\n px: 1.25,\n py: 0.5,\n borderRadius: \"9999px\",\n border: `1px solid ${border}`,\n backdropFilter: \"blur(10px)\",\n boxShadow: theme.palette.mode === \"dark\" \n ? \"0 4px 16px rgba(0,0,0,0.3)\" \n : \"0 4px 16px rgba(0,0,0,0.1)\",\n transition: \"all 0.2s ease-in-out\",\n \"&:hover\": {\n transform: \"translateY(-1px)\",\n boxShadow: theme.palette.mode === \"dark\" \n ? \"0 6px 20px rgba(0,0,0,0.4)\" \n : \"0 6px 20px rgba(0,0,0,0.15)\",\n },\n }}\n >\n {isMobile && (\n <Tooltip title={`Conversations (${conversations.length})`} arrow>\n <IconButton \n onClick={() => setModalOpen(true)} \n sx={{\n ...pillButtonStyles,\n position: \"relative\",\n }}\n aria-label={`Open conversations modal with ${conversations.length} conversations`}\n >\n <NotesIcon fontSize=\"small\" />\n {conversations.length > 0 && (\n <Box\n sx={{\n position: \"absolute\",\n top: -2,\n right: -2,\n minWidth: 14,\n height: 14,\n px: 0.35,\n bgcolor: theme.palette.primary.main,\n color: \"white\",\n borderRadius: \"50%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"0.55rem\",\n fontWeight: \"bold\",\n border: `1.5px solid ${background}`,\n }}\n >\n {conversationCountDisplay}\n </Box>\n )}\n </IconButton>\n </Tooltip>\n )}\n\n {isMobile && canShowNewConversationButton && (\n <Tooltip title=\"Start New Conversation\" arrow>\n <IconButton\n onClick={() => {\n createNewConversation();\n setModalOpen(false);\n }}\n sx={{\n ...pillButtonStyles,\n bgcolor: theme.palette.success.main + \"20\",\n color: theme.palette.success.main,\n \"&:hover\": {\n bgcolor: theme.palette.success.main + \"30\",\n transform: \"scale(1.1)\",\n },\n }}\n aria-label=\"Create new conversation\"\n >\n <AddIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n\n <Tooltip title={`Current AI: ${selectedModel.replace(\"Bandit-\", \"\")}`} arrow>\n <IconButton\n onClick={(e) => setModelAnchorEl(e.currentTarget)}\n sx={{\n ...pillButtonStyles,\n \"&:hover\": {\n ...pillButtonStyles[\"&:hover\"],\n \"& .MuiAvatar-root\": {\n transform: \"scale(1.1)\",\n filter: \"brightness(2) saturate(1.2)\",\n },\n },\n }}\n aria-label={`Change AI personality. Currently using ${selectedModel}`}\n >\n <Avatar\n src={currentAvatar}\n alt={selectedModel}\n sx={{\n width: \"36px\",\n height: \"36px\",\n filter: \"brightness(1.7)\",\n transition: \"all 0.2s ease-in-out\",\n border: `2px solid ${theme.palette.primary.main}20`,\n }}\n className=\"MuiAvatar-root\"\n />\n </IconButton>\n </Tooltip>\n <Menu\n anchorEl={modelAnchorEl}\n open={Boolean(modelAnchorEl)}\n onClose={() => setModelAnchorEl(null)}\n transformOrigin={{ horizontal: 'right', vertical: 'top' }}\n anchorOrigin={{ horizontal: 'right', vertical: 'bottom' }}\n PaperProps={{\n sx: {\n bgcolor: menuBackground,\n color: menuText,\n fontSize: \"0.875rem\",\n zIndex: 20000,\n borderRadius: 2,\n border: `1px solid ${border}`,\n boxShadow: theme.palette.mode === \"dark\" \n ? \"0 8px 32px rgba(0,0,0,0.5)\" \n : \"0 8px 32px rgba(0,0,0,0.2)\",\n minWidth: 200,\n \"& .MuiMenuItem-root\": {\n transition: \"all 0.15s ease-in-out\",\n borderRadius: \"6px\",\n margin: \"2px 4px\",\n \"&:hover\": {\n bgcolor: theme.palette.mode === \"dark\" ? \"rgba(255,255,255,0.08)\" : \"rgba(0,0,0,0.04)\",\n transform: \"translateX(2px)\",\n },\n \"&.Mui-selected\": {\n bgcolor: theme.palette.primary.main + \"20\",\n color: theme.palette.primary.main,\n \"&:hover\": {\n bgcolor: theme.palette.primary.main + \"30\",\n },\n },\n },\n },\n }}\n >\n {availableModels.map((model) => (\n <MenuItem\n key={model.name}\n selected={model.name === selectedModel}\n onClick={() => {\n if (\n !currentConversation?.history.length ||\n currentConversation?.history.length === 0\n ) {\n handleModelChange(model.name);\n useModelStore.getState().setSelectedModel(model.name);\n (async () => {\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n const current = await indexedDBService.get(\"banditConfig\", 1, \"config\", \"main\", storeConfigs);\n const updated = {\n ...current,\n id: \"main\",\n model: {\n ...(current?.model || {}),\n name: model.name,\n selectedModel: model.name,\n },\n };\n await indexedDBService.put(\"banditConfig\", 1, \"config\", updated, storeConfigs);\n } catch (err) {\n debugLogger.error(\"Failed to persist selectedModel to IndexedDB\", { error: err });\n }\n })();\n setModelAnchorEl(null);\n return;\n }\n\n setPendingModel(model.name);\n setConfirmModelChangeOpen(true);\n setModelAnchorEl(null);\n }}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 1.5,\n minHeight: 48,\n px: 2,\n }}\n >\n <Avatar\n src={\n model.avatarBase64 || \n modelAvatars[model.name] || \n banditHead\n }\n alt={model.name}\n sx={{ \n width: 28, \n height: 28, \n filter: \"brightness(1.7)\",\n transition: \"all 0.2s ease-in-out\",\n }}\n />\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 500 }}>\n {model.name.replace(\"Bandit-\", \"\")}\n </Typography>\n <Typography variant=\"caption\" sx={{ color: theme.palette.text.secondary, display: \"block\" }}>\n {model.name === selectedModel ? \"Currently active\" : \"Switch to this AI\"}\n </Typography>\n </Box>\n {model.name === selectedModel && (\n <Box\n sx={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n bgcolor: theme.palette.primary.main,\n }}\n />\n )}\n </MenuItem>\n ))}\n </Menu>\n\n {isTTSAvailable && (\n <>\n <Tooltip title={`Voice: ${selectedVoice ? toTitleCase(selectedVoice.split(\"-\")[1]) : \"Default\"}`} arrow>\n <IconButton\n onClick={(e) => setVoiceAnchorEl(e.currentTarget)}\n sx={{\n ...pillButtonStyles,\n bgcolor: theme.palette.info.main + \"20\",\n color: theme.palette.info.main,\n \"&:hover\": {\n ...pillButtonStyles[\"&:hover\"],\n bgcolor: theme.palette.info.main + \"30\",\n },\n }}\n aria-label={`Change voice. Currently using ${selectedVoice ? toTitleCase(selectedVoice.split(\"-\")[1]) : \"default\"}`}\n >\n <RecordVoiceOverIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n <Menu\n anchorEl={voiceAnchorEl}\n open={Boolean(voiceAnchorEl)}\n onClose={() => setVoiceAnchorEl(null)}\n transformOrigin={{ horizontal: 'right', vertical: 'top' }}\n anchorOrigin={{ horizontal: 'right', vertical: 'bottom' }}\n PaperProps={{\n sx: {\n bgcolor: menuBackground,\n color: menuText,\n fontSize: \"0.875rem\",\n zIndex: 20000,\n borderRadius: 2,\n border: `1px solid ${border}`,\n boxShadow: theme.palette.mode === \"dark\" \n ? \"0 8px 32px rgba(0,0,0,0.5)\" \n : \"0 8px 32px rgba(0,0,0,0.2)\",\n minWidth: 180,\n \"& .MuiMenuItem-root\": {\n transition: \"all 0.15s ease-in-out\",\n borderRadius: \"6px\",\n margin: \"2px 4px\",\n minHeight: 40,\n \"&:hover\": {\n bgcolor: theme.palette.mode === \"dark\" ? \"rgba(255,255,255,0.08)\" : \"rgba(0,0,0,0.04)\",\n transform: \"translateX(2px)\",\n },\n \"&.Mui-selected\": {\n bgcolor: theme.palette.info.main + \"20\",\n color: theme.palette.info.main,\n \"&:hover\": {\n bgcolor: theme.palette.info.main + \"30\",\n },\n },\n },\n },\n }}\n >\n {availableVoices.length > 0 ? (\n availableVoices.map((voice) => (\n <MenuItem\n key={voice}\n selected={voice === selectedVoice}\n onClick={() => {\n handleVoiceChange(voice);\n setVoiceAnchorEl(null);\n }}\n >\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1, width: \"100%\" }}>\n <RecordVoiceOverIcon fontSize=\"small\" sx={{ color: theme.palette.text.secondary }} />\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"body2\">\n {toTitleCase(voice.split(\"-\")[1])}\n </Typography>\n <Typography variant=\"caption\" sx={{ color: theme.palette.text.secondary }}>\n {voice === selectedVoice ? \"Currently active\" : \"Switch to this voice\"}\n </Typography>\n </Box>\n {voice === selectedVoice && (\n <Box\n sx={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n bgcolor: theme.palette.info.main,\n }}\n />\n )}\n </Box>\n </MenuItem>\n ))\n ) : (\n <MenuItem disabled>\n <Typography variant=\"body2\" color=\"text.secondary\">\n No voices available\n </Typography>\n </MenuItem>\n )}\n </Menu>\n </>\n )}\n </Box>\n </Box>\n\n <ConversationDrawer open={drawerOpen} onClose={() => setDrawerOpen(false)} />\n <MobileConversationsModal open={modalOpen} onClose={() => setModalOpen(false)} />\n <Dialog\n open={confirmModelChangeOpen}\n onClose={() => setConfirmModelChangeOpen(false)}\n >\n <DialogTitle>Change personality and start new conversation?</DialogTitle>\n <DialogContent>\n <Box display=\"flex\" alignItems=\"center\" gap={2} mt={1} justifyContent=\"center\">\n <Avatar\n src={pendingModelAvatar}\n alt={pendingModel || \"Personality Avatar\"}\n sx={{ width: 40, height: 40, filter: \"brightness(1.7)\" }}\n />\n <Typography variant=\"body2\">\n Your current conversation will be saved, and a new one will begin with <strong>{pendingModel}</strong>.\n </Typography>\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setConfirmModelChangeOpen(false)}>Cancel</Button>\n <Button\n onClick={() => {\n if (pendingModel) {\n createNewConversation();\n handleModelChange(pendingModel);\n useModelStore.getState().setSelectedModel(pendingModel);\n (async () => {\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n const current = await indexedDBService.get(\"banditConfig\", 1, \"config\", \"main\", storeConfigs);\n const updated = {\n ...current,\n id: \"main\",\n model: {\n ...(current?.model || {}),\n name: pendingModel,\n selectedModel: pendingModel,\n },\n };\n await indexedDBService.put(\"banditConfig\", 1, \"config\", updated, storeConfigs);\n } catch (err) {\n debugLogger.error(\"Failed to persist selectedModel to IndexedDB\", { error: err });\n }\n })();\n\n // Set the model on the new currentConversation\n const { conversations, currentId } = useConversationStore.getState();\n const conv = conversations.find((c) => c.id === currentId);\n if (conv) conv.model = pendingModel;\n }\n setConfirmModelChangeOpen(false);\n }}\n color=\"error\"\n >\n Change Personality\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n};\n\nexport default ChatAppBar;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-2968-6B1DA0\nconst __banditFingerprint_chat_conversationdrawertsx = 'BL-FP-4ABDAD-3ADB';\nconst __auditTrail_chat_conversationdrawertsx = 'BL-AU-MGOIKVUZ-GN4Q';\n// File: conversation-drawer.tsx | Path: src/chat/conversation-drawer.tsx | Hash: 29683adb\n\nimport React, { useState, useMemo, useEffect, useRef, useCallback } from \"react\";\nimport {\n Drawer,\n Box,\n Typography,\n IconButton,\n TextField,\n InputAdornment,\n useMediaQuery,\n Collapse,\n Divider,\n Menu,\n MenuItem,\n ListItemIcon,\n ListItemText,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n Avatar,\n alpha,\n} from \"@mui/material\";\nimport {\n Close as CloseIcon,\n Clear as ClearIcon,\n Search as SearchIcon,\n Folder as FolderIcon,\n MoreVert as MoreVertIcon,\n DeleteSweep as DeleteSweepIcon,\n Inbox as InboxIcon,\n} from \"@mui/icons-material\";\nimport { Add as AddIcon } from \"@mui/icons-material\";\nimport { useTheme } from \"@mui/material/styles\";\nimport { useConversationStore, type Conversation } from \"../store/conversationStore\";\nimport { useProjectStore } from \"../store/projectStore\";\nimport { HistoryEntry } from \"../store/aiQueryStore\";\nimport { useAuthenticationStore } from \"../store/authenticationStore\";\nimport brandingService from \"../services/branding/brandingService\";\nimport ProjectManagementModal from \"./project-management-modal\";\nimport MoveConversationModal from \"./move-conversation-modal\";\nimport SimpleConversationItem from \"./simple-conversation-item\";\nimport ProjectHeader from \"./project-header\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n}\n\ntype ProjectConversation = Conversation & {\n _snippet?: string;\n};\n\ninterface ProjectGroup {\n id: string | null;\n name: string;\n color?: string;\n conversations: ProjectConversation[];\n collapsed: boolean;\n}\n\nconst BANDIT_AVATAR = \"https://cdn.burtson.ai/images/bandit-head.png\";\n\nconst coerceOptionalString = (value: unknown): string | undefined => {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n};\n\nconst deriveInitials = (value: string): string => {\n if (!value) return \"B\";\n const sanitized = value.trim();\n if (!sanitized) return \"B\";\n\n const words = sanitized.split(/\\s+/).filter(Boolean);\n if (words.length >= 2) {\n const first = words[0]?.charAt(0) ?? \"\";\n const last = words[words.length - 1]?.charAt(0) ?? \"\";\n const initials = `${first}${last}`.trim();\n return initials ? initials.toUpperCase() : sanitized.slice(0, 2).toUpperCase();\n }\n\n const alphanumeric = sanitized.replace(/[^A-Za-z0-9]/g, \"\");\n if (alphanumeric.length >= 2) {\n return alphanumeric.slice(0, 2).toUpperCase();\n }\n if (alphanumeric.length === 1) {\n return alphanumeric.toUpperCase();\n }\n return sanitized.slice(0, 2).toUpperCase();\n};\n\nconst ConversationDrawer: React.FC<Props> = ({ open, onClose }) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down(\"sm\"));\n const { user } = useAuthenticationStore();\n const baseRadius = typeof theme.shape.borderRadius === \"number\"\n ? theme.shape.borderRadius\n : parseFloat(theme.shape.borderRadius) || 0;\n const drawerCornerRadius = baseRadius * 3;\n \n const {\n conversations,\n currentId,\n switchConversation,\n deleteConversation,\n renameConversation,\n createNewConversation,\n clearAllConversations,\n moveConversationToProject,\n getConversationsByProject,\n } = useConversationStore();\n\n const {\n projects,\n _hasHydrated: projectsHydrated,\n hydrate: hydrateProjects,\n createProject,\n deleteProject,\n } = useProjectStore();\n\n // State for UI\n const [projectManagementOpen, setProjectManagementOpen] = useState(false);\n const [collapsedProjects, setCollapsedProjects] = useState<Set<string>>(new Set());\n const didInitCollapseRef = useRef(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [menuAnchorEl, setMenuAnchorEl] = useState<null | HTMLElement>(null);\n const [clearConfirmOpen, setClearConfirmOpen] = useState(false);\n const [moveModalOpen, setMoveModalOpen] = useState(false);\n const [conversationToMove, setConversationToMove] = useState<Conversation | null>(null);\n const [renameProjectId, setRenameProjectId] = useState<string | null>(null);\n\n const getCustomClaim = useCallback((key: string): string | undefined => {\n if (!user) return undefined;\n const record = user as unknown as Record<string, unknown>;\n return coerceOptionalString(record[key]);\n }, [user]);\n\n const userDisplayName = useMemo(() => {\n if (!user) return undefined;\n\n const candidateFields = [\n coerceOptionalString(user.name),\n coerceOptionalString(user.preferred_username),\n user.given_name && user.family_name\n ? coerceOptionalString(`${user.given_name} ${user.family_name}`)\n : undefined,\n getCustomClaim(\"full_name\"),\n getCustomClaim(\"displayName\"),\n ];\n\n const resolvedName = candidateFields.find(Boolean);\n if (resolvedName) return resolvedName;\n\n const trimmedEmail = coerceOptionalString(user.email);\n if (trimmedEmail) return trimmedEmail;\n\n return user.sub;\n }, [user, getCustomClaim]);\n\n const userSecondaryText = useMemo(() => {\n if (!user) return undefined;\n\n const trimmedEmail = coerceOptionalString(user.email);\n if (trimmedEmail && trimmedEmail !== userDisplayName) {\n return trimmedEmail;\n }\n\n const subId = coerceOptionalString(user.sub);\n if (subId && subId !== userDisplayName) {\n return subId;\n }\n\n return undefined;\n }, [user, userDisplayName]);\n\n const [avatarImage, setAvatarImage] = useState<string>(BANDIT_AVATAR);\n\n useEffect(() => {\n const fetchBranding = async () => {\n try {\n const branding = await brandingService.getBranding();\n setAvatarImage(branding?.logoBase64 || BANDIT_AVATAR);\n } catch (error) {\n debugLogger.error(\"Failed to load branding avatar\", {\n error: error instanceof Error ? error.message : String(error),\n });\n setAvatarImage(BANDIT_AVATAR);\n }\n };\n\n fetchBranding();\n }, []);\n\n const avatarLabel = userDisplayName || user?.email || \"Bandit\";\n const avatarInitials = useMemo(() => deriveInitials(avatarLabel), [avatarLabel]);\n\n // Hydrate projects on mount\n useEffect(() => {\n if (!projectsHydrated) {\n hydrateProjects();\n }\n }, [projectsHydrated, hydrateProjects]);\n\n // Collapse all projects by default after projects hydrate (one-time)\n useEffect(() => {\n if (projectsHydrated && !didInitCollapseRef.current) {\n didInitCollapseRef.current = true;\n if (projects && projects.length > 0) {\n setCollapsedProjects(new Set(projects.map(p => p.id)));\n }\n }\n }, [projectsHydrated, projects]);\n\n // Build searchable results with a short snippet from questions/answers\n const buildSnippet = (text: string, query: string, idx: number) => {\n const start = Math.max(0, idx - 40);\n const end = Math.min(text.length, idx + query.length + 60);\n return text.slice(start, end).replace(/\\s+/g, \" \").trim();\n };\n\n // Organize conversations by projects\n const projectGroups = useMemo((): ProjectGroup[] => {\n const groups: ProjectGroup[] = [];\n \n // Add project groups FIRST (to encourage project usage)\n projects.forEach(project => {\n const projectConversations = getConversationsByProject(project.id).map<ProjectConversation>((conversation) => ({\n ...conversation,\n }));\n groups.push({\n id: project.id,\n name: project.name,\n color: project.color,\n conversations: projectConversations,\n collapsed: collapsedProjects.has(project.id),\n });\n });\n\n // Add ungrouped conversations LAST (to discourage ungrouped usage)\n const ungroupedConversations = getConversationsByProject(null).map<ProjectConversation>((conversation) => ({\n ...conversation,\n }));\n if (ungroupedConversations.length > 0) {\n groups.push({\n id: null,\n name: \"Ungrouped\",\n conversations: ungroupedConversations,\n collapsed: false, // Never collapsed for ungrouped\n });\n }\n\n return groups.filter(group => group.conversations.length > 0 || group.id !== null);\n }, [projects, getConversationsByProject, collapsedProjects]);\n\n // Filter conversations based on search query and attach snippet previews\n const filteredProjectGroups = useMemo((): ProjectGroup[] => {\n if (!searchQuery.trim()) return projectGroups;\n\n const query = searchQuery.toLowerCase();\n\n return projectGroups\n .map(group => {\n const conversationsWithSnippets = group.conversations\n .map<ProjectConversation | null>((conv) => {\n if (conv.name.toLowerCase().includes(query)) {\n return { ...conv, _snippet: undefined };\n }\n\n for (const entry of conv.history as HistoryEntry[]) {\n const body = `${entry.question || \"\"} ${entry.answer || \"\"}`;\n const hay = body.toLowerCase();\n const idx = hay.indexOf(query);\n if (idx !== -1) {\n return { ...conv, _snippet: buildSnippet(body, query, idx) };\n }\n }\n return null;\n })\n .filter((conv): conv is ProjectConversation => conv !== null);\n\n return {\n ...group,\n conversations: conversationsWithSnippets,\n };\n })\n .filter(group => group.conversations.length > 0);\n }, [projectGroups, searchQuery]);\n\n const handleToggleProject = (projectId: string | null) => {\n const key = projectId || \"ungrouped\";\n const newCollapsed = new Set(collapsedProjects);\n if (newCollapsed.has(key)) {\n newCollapsed.delete(key);\n } else {\n newCollapsed.add(key);\n }\n setCollapsedProjects(newCollapsed);\n };\n\n const handleDropConversation = (projectId: string | null, conversationId: string) => {\n moveConversationToProject(conversationId, projectId === null ? null : projectId);\n };\n\n const handleCreateConversation = () => {\n createNewConversation();\n if (isMobile) {\n onClose();\n }\n };\n\n const handleSearchClear = () => {\n setSearchQuery(\"\");\n };\n\n const handleMenuOpen = (event: React.MouseEvent<HTMLElement>) => {\n setMenuAnchorEl(event.currentTarget);\n };\n\n const handleMenuClose = () => {\n setMenuAnchorEl(null);\n };\n\n const handleClearAllConfirm = async () => {\n try {\n await clearAllConversations();\n setClearConfirmOpen(false);\n handleMenuClose();\n } catch (error) {\n debugLogger.error(\"Failed to clear conversations:\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n const handleMoveConversation = (conversation: ProjectConversation) => {\n setConversationToMove(conversation);\n setMoveModalOpen(true);\n };\n\n const handleMoveModalClose = () => {\n setMoveModalOpen(false);\n setConversationToMove(null);\n };\n\n return (\n <>\n <Drawer\n anchor=\"left\"\n open={open}\n onClose={onClose}\n variant={isMobile ? \"temporary\" : \"persistent\"}\n sx={{\n width: isMobile ? \"auto\" : 340,\n flexShrink: 0,\n \"& .MuiDrawer-paper\": {\n width: isMobile ? `min(94vw, 360px)` : 340,\n maxWidth: 360,\n bgcolor: theme.palette.background.paper,\n borderRight: `1px solid ${isMobile ? alpha(theme.palette.divider, 0.4) : theme.palette.divider}`,\n display: \"flex\",\n flexDirection: \"column\",\n height: isMobile ? `calc(100dvh - ${theme.spacing(4)})` : \"100dvh\",\n top: isMobile ? theme.spacing(2) : 0,\n bottom: isMobile ? theme.spacing(2) : 0,\n left: 0,\n borderRadius: isMobile ? `0 ${drawerCornerRadius}px ${drawerCornerRadius}px 0` : 0,\n boxShadow: isMobile ? `0 18px 36px ${alpha(theme.palette.common.black, 0.28)}` : \"none\",\n overflow: \"hidden\",\n },\n }}\n ModalProps={{\n keepMounted: true, // Better performance on mobile\n ...(isMobile && {\n onBackdropClick: onClose, // Ensure backdrop click closes on mobile\n }),\n }}\n SlideProps={{\n ...(isMobile && {\n onExited: () => {}, // Ensure slide animation completes\n }),\n }}\n >\n {/* Header */}\n <Box\n sx={{\n p: 2,\n borderBottom: `1px solid ${theme.palette.divider}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n gap: 1,\n }}\n >\n <IconButton\n onClick={() => setProjectManagementOpen(true)}\n size=\"small\"\n sx={{\n color: theme.palette.text.secondary,\n \"&:hover\": {\n color: theme.palette.primary.main,\n bgcolor: alpha(theme.palette.primary.main, 0.1),\n },\n }}\n >\n <FolderIcon />\n </IconButton>\n\n <IconButton\n onClick={handleMenuOpen}\n size=\"small\"\n sx={{\n color: theme.palette.text.secondary,\n \"&:hover\": {\n color: theme.palette.text.primary,\n bgcolor: alpha(theme.palette.text.primary, 0.1),\n },\n }}\n >\n <MoreVertIcon />\n </IconButton>\n \n {isMobile && (\n <IconButton\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClose();\n }}\n size=\"small\"\n sx={{ \n color: theme.palette.text.secondary,\n \"&:hover\": {\n color: theme.palette.error.main,\n bgcolor: alpha(theme.palette.error.main, 0.1),\n },\n }}\n >\n <CloseIcon />\n </IconButton>\n )}\n </Box>\n\n {/* Search Bar */}\n <Box sx={{ p: 2, pb: 1 }}>\n <TextField\n fullWidth\n size=\"small\"\n placeholder=\"Search conversations and content...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n variant=\"outlined\"\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon fontSize=\"small\" sx={{ color: theme.palette.text.secondary }} />\n </InputAdornment>\n ),\n endAdornment: searchQuery && (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={handleSearchClear}\n size=\"small\"\n edge=\"end\"\n sx={{ color: theme.palette.text.secondary }}\n >\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n ),\n }}\n sx={{\n \"& .MuiOutlinedInput-root\": {\n bgcolor: alpha(theme.palette.background.default, 0.5),\n \"&:hover\": {\n bgcolor: alpha(theme.palette.background.default, 0.8),\n },\n \"&.Mui-focused\": {\n bgcolor: theme.palette.background.default,\n },\n },\n }}\n />\n </Box>\n\n {/* Content */}\n <Box sx={{ flex: 1, overflow: \"auto\", display: \"flex\", flexDirection: \"column\" }}>\n {/* Quick Add Project */}\n <Box\n onClick={async () => {\n const names = new Set(projects.map(p => p.name));\n const base = \"New Project\";\n let name = base;\n if (names.has(name)) {\n for (let i = 2; i < 1000; i++) {\n const candidate = `${base} ${i}`;\n if (!names.has(candidate)) { name = candidate; break; }\n }\n }\n try {\n const created = await createProject(name);\n setRenameProjectId(created.id);\n } catch (error) {\n debugLogger.error(\"Failed to create project\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }}\n sx={{\n px: 2,\n py: 1.25,\n display: \"flex\",\n alignItems: \"center\",\n gap: 1.5,\n cursor: \"pointer\",\n '&:hover': { bgcolor: alpha(theme.palette.text.primary, 0.04) },\n }}\n >\n <Box\n sx={{\n width: 28,\n height: 28,\n borderRadius: \"50%\",\n bgcolor: alpha(theme.palette.success.main, 0.15),\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <FolderIcon fontSize=\"small\" sx={{ color: theme.palette.success.main }} />\n </Box>\n <Typography\n variant=\"subtitle2\"\n sx={{ flex: 1, fontWeight: 600, fontSize: \"0.875rem\" }}\n >\n New Project\n </Typography>\n <IconButton size=\"small\" sx={{ color: theme.palette.success.main }}>\n <AddIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n <Divider sx={{ opacity: 0.3 }} />\n\n {filteredProjectGroups.map((group, index) => (\n <Box key={group.id || \"ungrouped\"}>\n {/* Add visual separator before ungrouped section */}\n {group.id === null && filteredProjectGroups.length > 1 && (\n <Box\n sx={{\n py: 2,\n px: 2,\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n }}\n >\n <Divider sx={{ flex: 1, opacity: 0.6 }} />\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n <InboxIcon \n sx={{ \n color: theme.palette.text.disabled,\n fontSize: \"0.9rem\",\n opacity: 0.7,\n }} \n />\n <Typography \n variant=\"caption\" \n sx={{ \n color: theme.palette.text.disabled,\n fontSize: \"0.7rem\",\n fontWeight: 500,\n letterSpacing: \"0.5px\",\n textTransform: \"uppercase\",\n }}\n >\n Other Conversations\n </Typography>\n </Box>\n <Divider sx={{ flex: 1, opacity: 0.6 }} />\n </Box>\n )}\n\n {/* Only show project header for actual projects, not ungrouped */}\n {group.id !== null ? (\n <>\n <ProjectHeader\n projectId={group.id}\n projectName={group.name}\n projectColor={group.color}\n conversationCount={group.conversations.length}\n isCollapsed={group.collapsed}\n onToggleCollapse={() => handleToggleProject(group.id)}\n onDropConversation={(conversationId) => \n handleDropConversation(group.id, conversationId)\n }\n isRenaming={renameProjectId === group.id}\n onRenameComplete={() => setRenameProjectId(null)}\n onRenameCancelDelete={async () => {\n if (renameProjectId === group.id) {\n try {\n if (typeof group.id === 'string') {\n await deleteProject(group.id);\n }\n } catch (error) {\n debugLogger.error(\"Failed to delete project\", {\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n setRenameProjectId(null);\n }\n }\n }}\n />\n \n <Collapse in={!group.collapsed}>\n <Box sx={{ pb: 1 }}>\n {group.conversations.map((conversation) => (\n <SimpleConversationItem\n key={conversation.id}\n conversation={conversation}\n isSelected={conversation.id === currentId}\n onSelect={() => {\n switchConversation(conversation.id);\n if (isMobile) {\n // Force close on mobile after conversation switch\n setTimeout(() => onClose(), 100);\n }\n }}\n onDelete={() => deleteConversation(conversation.id)}\n onRename={(newName) => renameConversation(conversation.id, newName)}\n onMove={() => handleMoveConversation(conversation)}\n projectColor={group.color}\n snippet={searchQuery ? conversation._snippet : undefined}\n searchQuery={searchQuery.trim() || undefined}\n />\n ))}\n \n {group.conversations.length === 0 && !group.collapsed && group.id !== null && (\n <Box\n sx={{\n p: 3,\n textAlign: \"center\",\n color: theme.palette.text.secondary,\n }}\n >\n <Typography variant=\"body2\">\n No conversations in this project yet\n </Typography>\n <Typography variant=\"caption\" sx={{ mt: 1, display: \"block\" }}>\n Drag conversations here or use the + button above\n </Typography>\n </Box>\n )}\n </Box>\n </Collapse>\n \n <Divider sx={{ opacity: 0.3 }} />\n </>\n ) : (\n // Special handling for ungrouped - no header, just conversations in scrollable area\n <Box \n sx={{ \n minHeight: 0, // Allow shrinking\n overflow: \"auto\",\n px: 1,\n py: 1,\n bgcolor: alpha(theme.palette.background.default, 0.3),\n borderRadius: \"8px 8px 0 0\",\n mx: 1,\n mb: 1,\n }}\n >\n {group.conversations.map((conversation) => (\n <SimpleConversationItem\n key={conversation.id}\n conversation={conversation}\n isSelected={conversation.id === currentId}\n onSelect={() => {\n switchConversation(conversation.id);\n if (isMobile) {\n // Force close on mobile after conversation switch\n setTimeout(() => onClose(), 100);\n }\n }}\n onDelete={() => deleteConversation(conversation.id)}\n onRename={(newName) => renameConversation(conversation.id, newName)}\n onMove={() => handleMoveConversation(conversation)}\n projectColor={group.color}\n snippet={searchQuery ? conversation._snippet : undefined}\n searchQuery={searchQuery.trim() || undefined}\n />\n ))}\n </Box>\n )}\n </Box>\n ))}\n \n {filteredProjectGroups.length === 0 && (\n <Box\n sx={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n p: 4,\n textAlign: \"center\",\n color: theme.palette.text.secondary,\n }}\n >\n <Typography variant=\"h6\" sx={{ mb: 1 }}>\n {searchQuery ? \"No conversations found\" : \"No conversations yet\"}\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 3, maxWidth: 280 }}>\n {searchQuery \n ? `No conversations match \"${searchQuery}\"`\n : \"Start your first conversation to begin organizing your chats into projects\"\n }\n </Typography>\n </Box>\n )}\n </Box>\n\n {/* User badge */}\n <Box\n sx={{\n mt: \"auto\",\n px: 2,\n py: 1.75,\n borderTop: `1px solid ${alpha(theme.palette.divider, 0.6)}`,\n display: \"flex\",\n alignItems: \"center\",\n gap: 1.5,\n bgcolor: alpha(theme.palette.background.default, isMobile ? 0.9 : 0.6),\n }}\n >\n <Avatar\n src={avatarImage}\n alt={avatarLabel}\n sx={{\n width: 36,\n height: 36,\n fontSize: \"0.95rem\",\n bgcolor: alpha(theme.palette.primary.main, 0.12),\n color: theme.palette.primary.main,\n }}\n >\n {avatarInitials}\n </Avatar>\n <Box sx={{ minWidth: 0, flex: 1 }}>\n <Typography\n variant=\"subtitle2\"\n noWrap\n sx={{ fontWeight: 600, color: theme.palette.text.primary }}\n >\n {user ? userDisplayName : \"Not signed in\"}\n </Typography>\n {user ? (\n userSecondaryText ? (\n <Typography\n variant=\"caption\"\n noWrap\n sx={{ color: theme.palette.text.secondary }}\n >\n {userSecondaryText}\n </Typography>\n ) : null\n ) : (\n <Typography\n variant=\"caption\"\n sx={{ color: theme.palette.text.secondary }}\n >\n Connect your account to sync chats\n </Typography>\n )}\n </Box>\n </Box>\n </Drawer>\n\n {/* Project Management Modal */}\n <ProjectManagementModal\n open={projectManagementOpen}\n onClose={() => setProjectManagementOpen(false)}\n />\n\n {/* Move Conversation Modal */}\n {conversationToMove && (\n <MoveConversationModal\n open={moveModalOpen}\n onClose={handleMoveModalClose}\n conversations={[conversationToMove]}\n currentProjectId={conversationToMove.projectId}\n />\n )}\n\n {/* Actions Menu */}\n <Menu\n anchorEl={menuAnchorEl}\n open={Boolean(menuAnchorEl)}\n onClose={handleMenuClose}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"right\",\n }}\n >\n <MenuItem \n onClick={() => {\n setClearConfirmOpen(true);\n handleMenuClose();\n }}\n sx={{ color: theme.palette.error.main }}\n >\n <ListItemIcon>\n <DeleteSweepIcon fontSize=\"small\" sx={{ color: theme.palette.error.main }} />\n </ListItemIcon>\n <ListItemText>Clear All Conversations</ListItemText>\n </MenuItem>\n </Menu>\n\n {/* Clear All Confirmation Dialog */}\n <Dialog\n open={clearConfirmOpen}\n onClose={() => setClearConfirmOpen(false)}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>Clear All Conversations?</DialogTitle>\n <DialogContent>\n <Typography>\n This will permanently delete all conversations and cannot be undone. \n Are you sure you want to continue?\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setClearConfirmOpen(false)}>\n Cancel\n </Button>\n <Button \n onClick={handleClearAllConfirm}\n color=\"error\"\n variant=\"contained\"\n >\n Clear All\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n};\n\nexport default ConversationDrawer;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-4562-87A9A9\nconst __banditFingerprint_chat_projectmanagementmodaltsx = 'BL-FP-3B1138-F94C';\nconst __auditTrail_chat_projectmanagementmodaltsx = 'BL-AU-MGOIKVV5-QMKL';\n// File: project-management-modal.tsx | Path: src/chat/project-management-modal.tsx | Hash: 4562f94c\n\nimport React, { useState, useEffect, useRef } from \"react\";\nimport {\n Modal,\n Button,\n TextField,\n List,\n ListItem,\n IconButton,\n Box,\n Typography,\n Avatar,\n Chip,\n Menu,\n MenuItem,\n Alert,\n CircularProgress,\n SwipeableDrawer,\n useMediaQuery,\n} from \"@mui/material\";\nimport {\n Add as AddIcon,\n Edit as EditIcon,\n Delete as DeleteIcon,\n MoreVert as MoreVertIcon,\n Folder as FolderIcon,\n Close as CloseIcon,\n ArrowBack as ArrowBackIcon,\n} from \"@mui/icons-material\";\nimport { useTheme, alpha } from \"@mui/material/styles\";\nimport { useProjectStore, Project } from \"../store/projectStore\";\nimport { useConversationStore } from \"../store/conversationStore\";\n\ninterface ProjectManagementModalProps {\n open: boolean;\n onClose: () => void;\n}\n\ninterface ProjectFormData {\n name: string;\n description: string;\n color: string;\n}\n\nconst DEFAULT_COLORS = [\n \"#2196F3\", \"#4CAF50\", \"#FF9800\", \"#9C27B0\", \"#F44336\",\n \"#00BCD4\", \"#FFEB3B\", \"#795548\", \"#607D8B\", \"#E91E63\",\n];\n\nconst ProjectManagementModal: React.FC<ProjectManagementModalProps> = ({\n open,\n onClose,\n}) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n const {\n projects,\n _hasHydrated,\n createProject,\n deleteProject,\n renameProject,\n updateProjectColor,\n hydrate,\n } = useProjectStore();\n\n const { getConversationsByProject } = useConversationStore();\n\n const [showCreateForm, setShowCreateForm] = useState(false);\n const [editingProject, setEditingProject] = useState<Project | null>(null);\n const [formData, setFormData] = useState<ProjectFormData>({\n name: \"\",\n description: \"\",\n color: DEFAULT_COLORS[0],\n });\n const [menuAnchor, setMenuAnchor] = useState<null | HTMLElement>(null);\n const [selectedProject, setSelectedProject] = useState<Project | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Container ref to anchor the menu within the sheet/drawer\n const modalContainerRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (open && !_hasHydrated) {\n hydrate();\n }\n }, [open, _hasHydrated, hydrate]);\n\n useEffect(() => {\n if (!open) {\n setMenuAnchor(null);\n setSelectedProject(null);\n }\n }, [open]);\n\n const resetForm = () => {\n setFormData({\n name: \"\",\n description: \"\",\n color: DEFAULT_COLORS[0],\n });\n setEditingProject(null);\n setShowCreateForm(false);\n setError(null);\n };\n\n const handleClose = () => {\n resetForm();\n setMenuAnchor(null);\n setSelectedProject(null);\n onClose();\n };\n\n const handleCreateProject = async () => {\n if (!formData.name.trim()) {\n setError(\"Project name is required\");\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n await createProject(formData.name, formData.description, formData.color);\n resetForm();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to create project\");\n } finally {\n setLoading(false);\n }\n };\n\n const handleEditProject = async () => {\n if (!editingProject || !formData.name.trim()) {\n setError(\"Project name is required\");\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n await renameProject(editingProject.id, formData.name, formData.description);\n if (formData.color !== editingProject.color) {\n await updateProjectColor(editingProject.id, formData.color);\n }\n resetForm();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to update project\");\n } finally {\n setLoading(false);\n }\n };\n\n const handleDeleteProject = async (project: Project) => {\n const conversationCount = getConversationsByProject(project.id).length;\n\n if (conversationCount > 0) {\n setError(`Cannot delete project \"${project.name}\" - it contains ${conversationCount} conversation(s). Move conversations to another project first.`);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n setMenuAnchor(null);\n setSelectedProject(null);\n await deleteProject(project.id);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to delete project\");\n } finally {\n setLoading(false);\n }\n };\n\n const startEdit = (project: Project) => {\n setEditingProject(project);\n setFormData({\n name: project.name,\n description: project.description || \"\",\n color: project.color || DEFAULT_COLORS[0],\n });\n setShowCreateForm(true);\n setMenuAnchor(null);\n };\n\n const openMenu = (event: React.MouseEvent<HTMLButtonElement>, project: Project) => {\n event.stopPropagation();\n setMenuAnchor(event.currentTarget);\n setSelectedProject(project);\n };\n\n const closeMenu = () => {\n setMenuAnchor(null);\n setSelectedProject(null);\n };\n\n const chatPalette = theme.palette.chat ?? {};\n const overlayZIndex = (theme.zIndex?.modal ?? 1300) + 20;\n const surfaceColor = isMobile\n ? theme.palette.background.paper\n : chatPalette.shell ?? theme.palette.background.paper;\n const borderColor = chatPalette.appBar?.border ?? alpha(theme.palette.divider, 0.12);\n const subtleSurface = theme.palette.mode === \"dark\"\n ? alpha(theme.palette.common.white, 0.04)\n : alpha(theme.palette.common.black, 0.03);\n const hoverSurface = alpha(theme.palette.primary.main, theme.palette.mode === \"dark\" ? 0.22 : 0.08);\n\n const headerTitle = showCreateForm\n ? editingProject\n ? \"Edit Project\"\n : \"Create Project\"\n : \"Manage Projects\";\n\n const headerSubtitle = showCreateForm\n ? \"Name, describe, and color-code your project.\"\n : \"Organize conversations into cohesive projects.\";\n\n const content = (\n <Box\n ref={modalContainerRef}\n sx={{\n width: \"100%\",\n maxWidth: isMobile ? undefined : 560,\n maxHeight: isMobile ? \"min(720px, 82vh)\" : \"90vh\",\n height: isMobile ? \"100%\" : \"auto\",\n bgcolor: surfaceColor,\n borderRadius: isMobile ? \"22px 22px 0 0\" : 3,\n overflow: \"hidden\",\n boxShadow: isMobile ? \"none\" : `0 20px 60px ${alpha(theme.palette.common.black, 0.32)}`,\n border: isMobile ? \"none\" : `1px solid ${alpha(theme.palette.divider, 0.18)}`,\n display: \"flex\",\n flexDirection: \"column\",\n position: \"relative\",\n }}\n >\n {isMobile && (\n <Box\n sx={{\n width: 56,\n height: 6,\n borderRadius: 999,\n bgcolor: alpha(theme.palette.text.primary, 0.18),\n alignSelf: \"center\",\n mt: 1.25,\n mb: 0.75,\n }}\n />\n )}\n\n <Box\n sx={{\n px: isMobile ? 1.5 : 2.75,\n pt: isMobile ? 1.25 : 2.5,\n pb: isMobile ? 1 : 2,\n borderBottom: `1px solid ${borderColor}`,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 1,\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 1,\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n minWidth: 0,\n flex: 1,\n }}\n >\n {showCreateForm && (\n <IconButton onClick={resetForm} size=\"small\" sx={{ mr: 0.5 }}>\n <ArrowBackIcon fontSize=\"small\" />\n </IconButton>\n )}\n <Typography\n variant=\"h6\"\n sx={{\n fontSize: isMobile ? \"1rem\" : \"1.125rem\",\n fontWeight: 600,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {headerTitle}\n </Typography>\n </Box>\n <IconButton onClick={handleClose} size=\"small\">\n <CloseIcon />\n </IconButton>\n </Box>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {headerSubtitle}\n </Typography>\n </Box>\n\n <Box\n sx={{\n flex: 1,\n overflowY: \"auto\",\n px: isMobile ? 1.5 : 2.75,\n py: isMobile ? 1.5 : 2,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 2.5,\n }}\n >\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n\n {showCreateForm ? (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n <TextField\n label=\"Project name\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n fullWidth\n required\n disabled={loading}\n autoFocus\n />\n\n <TextField\n label=\"Description (optional)\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n fullWidth\n multiline\n minRows={2}\n disabled={loading}\n />\n\n <Box>\n <Typography variant=\"subtitle2\" sx={{ mb: 1 }}>\n Color\n </Typography>\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 1 }}>\n {DEFAULT_COLORS.map((color) => (\n <Box\n key={color}\n sx={{\n width: 32,\n height: 32,\n borderRadius: \"50%\",\n bgcolor: color,\n cursor: \"pointer\",\n border: formData.color === color\n ? `3px solid ${theme.palette.primary.main}`\n : \"2px solid transparent\",\n transition: \"transform 0.2s ease\",\n \"&:hover\": {\n transform: \"scale(1.08)\",\n },\n }}\n onClick={() => setFormData({ ...formData, color })}\n aria-label={`Select ${color} for project color`}\n />\n ))}\n </Box>\n </Box>\n </Box>\n ) : (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n <Button\n startIcon={<AddIcon />}\n onClick={() => setShowCreateForm(true)}\n variant=\"contained\"\n sx={{\n alignSelf: \"flex-start\",\n textTransform: \"none\",\n borderRadius: 2,\n px: 2.5,\n }}\n >\n Create project\n </Button>\n\n {projects.length === 0 ? (\n <Box\n sx={{\n textAlign: \"center\",\n py: 4,\n px: 2,\n color: theme.palette.text.secondary,\n borderRadius: 2,\n border: `1px dashed ${alpha(theme.palette.divider, 0.4)}`,\n backgroundColor: subtleSurface,\n }}\n >\n <FolderIcon sx={{ fontSize: 48, mb: 2, opacity: 0.5 }} />\n <Typography variant=\"body1\" sx={{ fontWeight: 600 }}>\n No projects yet\n </Typography>\n <Typography variant=\"body2\">\n Create your first project to organize conversations.\n </Typography>\n </Box>\n ) : (\n <List sx={{ display: \"flex\", flexDirection: \"column\", gap: 1.25, py: 0 }}>\n {projects.map((project) => {\n const conversationCount = getConversationsByProject(project.id).length;\n\n return (\n <ListItem key={project.id} disablePadding>\n <Box\n sx={{\n display: \"flex\",\n width: \"100%\",\n borderRadius: 2,\n alignItems: \"center\",\n gap: 1.5,\n px: 1.5,\n py: 1.25,\n backgroundColor: subtleSurface,\n transition: \"background-color 0.2s ease, transform 0.2s ease\",\n \"&:hover\": {\n backgroundColor: hoverSurface,\n transform: \"translateY(-1px)\",\n },\n }}\n >\n <Avatar\n sx={{\n bgcolor: project.color,\n width: 36,\n height: 36,\n fontSize: \"1rem\",\n }}\n >\n <FolderIcon fontSize=\"small\" />\n </Avatar>\n\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1, flexWrap: \"wrap\" }}>\n <Typography\n variant=\"subtitle1\"\n sx={{ fontWeight: 600, overflow: \"hidden\", textOverflow: \"ellipsis\" }}\n >\n {project.name}\n </Typography>\n <Chip\n label={`${conversationCount}`}\n size=\"small\"\n sx={{\n height: 22,\n borderRadius: 999,\n fontWeight: 600,\n bgcolor: alpha(theme.palette.text.primary, 0.08),\n color: theme.palette.text.primary,\n }}\n />\n </Box>\n {project.description && (\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ mt: 0.5, display: \"-webkit-box\", WebkitLineClamp: 2, WebkitBoxOrient: \"vertical\", overflow: \"hidden\" }}\n >\n {project.description}\n </Typography>\n )}\n </Box>\n\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n openMenu(e, project);\n }}\n size=\"small\"\n sx={{\n alignSelf: \"flex-start\",\n mt: 0.25,\n zIndex: 1,\n }}\n >\n <MoreVertIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n </ListItem>\n );\n })}\n </List>\n )}\n </Box>\n )}\n </Box>\n\n <Box\n sx={{\n px: isMobile ? 1.5 : 2.75,\n py: isMobile ? 1.25 : 2,\n borderTop: `1px solid ${borderColor}`,\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: 1,\n }}\n >\n {showCreateForm ? (\n <>\n <Button\n onClick={resetForm}\n disabled={loading}\n sx={{ textTransform: \"none\", borderRadius: 2 }}\n >\n Cancel\n </Button>\n <Button\n onClick={editingProject ? handleEditProject : handleCreateProject}\n variant=\"contained\"\n disabled={loading}\n startIcon={loading ? <CircularProgress size={16} /> : undefined}\n sx={{ textTransform: \"none\", borderRadius: 2 }}\n >\n {editingProject ? \"Update project\" : \"Create project\"}\n </Button>\n </>\n ) : (\n <Button onClick={handleClose} sx={{ textTransform: \"none\", borderRadius: 2 }}>\n Close\n </Button>\n )}\n </Box>\n\n {/* Menu rendered here so we can control z-index/positioning across modal + drawer modes */}\n <Menu\n anchorEl={menuAnchor}\n open={Boolean(menuAnchor)}\n onClose={closeMenu}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n transformOrigin={{ vertical: \"top\", horizontal: \"right\" }}\n MenuListProps={{\n dense: true,\n disablePadding: false,\n }}\n disablePortal\n container={modalContainerRef.current ?? undefined}\n PaperProps={{\n sx: {\n zIndex: overlayZIndex + (isMobile ? 10 : 40),\n mt: 0.5,\n minWidth: 160,\n }\n }}\n >\n <MenuItem\n onClick={() => {\n if (!selectedProject) return;\n startEdit(selectedProject);\n }}\n >\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n <EditIcon fontSize=\"small\" />\n <Typography variant=\"body2\" color=\"inherit\">\n Edit\n </Typography>\n </Box>\n </MenuItem>\n <MenuItem\n onClick={() => {\n if (!selectedProject) return;\n handleDeleteProject(selectedProject);\n }}\n sx={{ color: theme.palette.error.main }}\n >\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n <DeleteIcon fontSize=\"small\" />\n <Typography variant=\"body2\" color=\"inherit\">\n Delete\n </Typography>\n </Box>\n </MenuItem>\n </Menu>\n </Box>\n );\n\n return (\n <>\n {isMobile ? (\n <SwipeableDrawer\n anchor=\"bottom\"\n open={open}\n onClose={handleClose}\n onOpen={() => { }}\n disableSwipeToOpen\n ModalProps={{ keepMounted: true }}\n sx={{ zIndex: overlayZIndex }}\n PaperProps={{\n sx: {\n height: \"min(720px, 82vh)\",\n borderRadius: \"22px 22px 0 0\",\n overflow: \"hidden\",\n },\n }}\n >\n {content}\n </SwipeableDrawer>\n ) : (\n <Modal\n open={open}\n onClose={handleClose}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n p: 2,\n zIndex: overlayZIndex,\n }}\n >\n {content}\n </Modal>\n )}\n </>\n );\n};\n\nexport default ProjectManagementModal;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-EA1F-008865\nconst __banditFingerprint_chat_moveconversationmodaltsx = 'BL-FP-DB7872-D83A';\nconst __auditTrail_chat_moveconversationmodaltsx = 'BL-AU-MGOIKVV4-0HEP';\n// File: move-conversation-modal.tsx | Path: src/chat/move-conversation-modal.tsx | Hash: ea1fd83a\n\nimport React, { useState, useEffect } from \"react\";\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n List,\n ListItem,\n ListItemButton,\n ListItemText,\n ListItemIcon,\n Typography,\n Avatar,\n Radio,\n Box,\n Divider,\n} from \"@mui/material\";\nimport {\n Folder as FolderIcon,\n Inbox as InboxIcon,\n} from \"@mui/icons-material\";\nimport { useTheme } from \"@mui/material/styles\";\nimport { useProjectStore } from \"../store/projectStore\";\nimport { useConversationStore, Conversation } from \"../store/conversationStore\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\n\ninterface MoveConversationModalProps {\n open: boolean;\n onClose: () => void;\n conversations: Conversation[];\n currentProjectId?: string | null;\n}\n\nconst MoveConversationModal: React.FC<MoveConversationModalProps> = ({\n open,\n onClose,\n conversations,\n currentProjectId = null,\n}) => {\n const theme = useTheme();\n const { projects, _hasHydrated, hydrate } = useProjectStore();\n const { moveConversationToProject } = useConversationStore();\n \n const [selectedProjectId, setSelectedProjectId] = useState<string | null>(\n currentProjectId\n );\n\n useEffect(() => {\n if (open && !_hasHydrated) {\n hydrate();\n }\n }, [open, _hasHydrated, hydrate]);\n\n useEffect(() => {\n setSelectedProjectId(currentProjectId);\n }, [currentProjectId, open]);\n\n const handleMove = async () => {\n try {\n await Promise.all(\n conversations.map((conv) =>\n moveConversationToProject(conv.id, selectedProjectId)\n )\n );\n onClose();\n } catch (error) {\n debugLogger.error(\"Failed to move conversations\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n const conversationCount = conversations.length;\n const isMultiple = conversationCount > 1;\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n maxWidth=\"sm\"\n fullWidth\n PaperProps={{\n sx: {\n bgcolor: theme.palette.background.paper,\n backgroundImage: \"none\",\n },\n }}\n >\n <DialogTitle>\n Move {isMultiple ? `${conversationCount} Conversations` : \"Conversation\"}\n </DialogTitle>\n\n <DialogContent sx={{ px: 3 }}>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n {isMultiple\n ? `Select a project to move ${conversationCount} conversations to:`\n : `Select a project to move \"${conversations[0]?.name}\" to:`}\n </Typography>\n\n <List>\n {/* No Project (Ungrouped) Option */}\n <ListItem disablePadding>\n <ListItemButton\n onClick={() => setSelectedProjectId(null)}\n selected={selectedProjectId === null}\n >\n <ListItemIcon>\n <Radio\n checked={selectedProjectId === null}\n onChange={() => setSelectedProjectId(null)}\n size=\"small\"\n />\n </ListItemIcon>\n <ListItemIcon>\n <Avatar\n sx={{\n bgcolor: theme.palette.grey[400],\n width: 32,\n height: 32,\n }}\n >\n <InboxIcon />\n </Avatar>\n </ListItemIcon>\n <ListItemText\n primary=\"No Project\"\n secondary=\"Keep conversations ungrouped\"\n />\n </ListItemButton>\n </ListItem>\n\n <Divider sx={{ my: 1 }} />\n\n {/* Project Options */}\n {projects.map((project) => (\n <ListItem key={project.id} disablePadding>\n <ListItemButton\n onClick={() => setSelectedProjectId(project.id)}\n selected={selectedProjectId === project.id}\n >\n <ListItemIcon>\n <Radio\n checked={selectedProjectId === project.id}\n onChange={() => setSelectedProjectId(project.id)}\n size=\"small\"\n />\n </ListItemIcon>\n <ListItemIcon>\n <Avatar\n sx={{\n bgcolor: project.color,\n width: 32,\n height: 32,\n }}\n >\n <FolderIcon />\n </Avatar>\n </ListItemIcon>\n <ListItemText\n primary={project.name}\n secondary={project.description}\n />\n </ListItemButton>\n </ListItem>\n ))}\n\n {projects.length === 0 && (\n <Box sx={{ \n textAlign: \"center\", \n py: 2,\n color: theme.palette.text.secondary \n }}>\n <Typography variant=\"body2\">\n No projects available. Create a project first to organize conversations.\n </Typography>\n </Box>\n )}\n </List>\n </DialogContent>\n\n <DialogActions sx={{ px: 3, pb: 2 }}>\n <Button onClick={onClose}>\n Cancel\n </Button>\n <Button\n onClick={handleMove}\n variant=\"contained\"\n disabled={selectedProjectId === currentProjectId}\n >\n Move {isMultiple ? \"Conversations\" : \"Conversation\"}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default MoveConversationModal;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-034C-6B5D35\nconst __banditFingerprint_chat_simpleconversationitemtsx = 'BL-FP-F0F022-71F5';\nconst __auditTrail_chat_simpleconversationitemtsx = 'BL-AU-MGOIKVV6-OIQT';\n// File: simple-conversation-item.tsx | Path: src/chat/simple-conversation-item.tsx | Hash: 034c71f5\n\nimport React, { useState, useRef, useEffect } from \"react\";\nimport {\n Box,\n Typography,\n IconButton,\n Menu,\n MenuItem,\n ListItemIcon,\n ListItemText,\n useMediaQuery,\n TextField,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n} from \"@mui/material\";\nimport {\n MoreVert as MoreVertIcon,\n Edit as EditIcon,\n Delete as DeleteIcon,\n DragIndicator as DragIcon,\n MoveToInbox as MoveIcon,\n} from \"@mui/icons-material\";\nimport { useTheme, alpha } from \"@mui/material/styles\";\nimport { Conversation } from \"../store/conversationStore\";\n\ninterface SimpleConversationItemProps {\n conversation: Conversation;\n isSelected: boolean;\n onSelect: () => void;\n onDelete: () => void;\n onRename?: (newName: string) => void;\n onMove?: () => void;\n projectColor?: string;\n // Optional short preview shown when searching\n snippet?: string;\n // Search query for highlighting\n searchQuery?: string;\n onTouchDragStart?: (conversation: Conversation, touch: React.Touch) => void;\n onTouchDragMove?: (touch: React.Touch) => void;\n onTouchDragEnd?: (touch?: React.Touch) => void;\n isTouchDragActive?: boolean;\n}\n\nconst SimpleConversationItem: React.FC<SimpleConversationItemProps> = ({\n conversation,\n isSelected,\n onSelect,\n onDelete,\n onRename,\n onMove,\n projectColor,\n snippet,\n searchQuery,\n onTouchDragStart,\n onTouchDragMove,\n onTouchDragEnd,\n isTouchDragActive,\n}) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down(\"sm\"));\n \n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const [isEditing, setIsEditing] = useState(false);\n const [editName, setEditName] = useState(conversation.name);\n const [isDragging, setIsDragging] = useState(false);\n const [isTouchDragging, setIsTouchDragging] = useState(false);\n const [showRenameDialog, setShowRenameDialog] = useState(false);\n const longPressTimeoutRef = useRef<number | null>(null);\n const touchStartPointRef = useRef<{ x: number; y: number } | null>(null);\n const activeTouchIdRef = useRef<number | null>(null);\n const suppressClickRef = useRef(false);\n\n // Helper function to highlight search terms\n const highlightText = (text: string, query?: string) => {\n if (!query || !query.trim()) {\n return text;\n }\n\n const regex = new RegExp(`(${query.trim()})`, 'gi');\n const parts = text.split(regex);\n\n return parts.map((part, index) => \n regex.test(part) ? (\n <Box\n component=\"span\"\n key={index}\n sx={{\n bgcolor: alpha(theme.palette.warning.main, 0.3),\n color: theme.palette.text.primary,\n fontWeight: 600,\n borderRadius: 0.5,\n px: 0.25,\n }}\n >\n {part}\n </Box>\n ) : part\n );\n };\n\n const handleMenuOpen = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n event.preventDefault();\n setAnchorEl(event.currentTarget);\n };\n\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n const handleEdit = () => {\n setEditName(conversation.name);\n\n if (isMobile) {\n setShowRenameDialog(true);\n } else {\n setIsEditing(true);\n }\n\n handleMenuClose();\n };\n\n const handleMove = () => {\n if (onMove) {\n onMove();\n }\n handleMenuClose();\n };\n\n const handleDelete = () => {\n onDelete();\n handleMenuClose();\n };\n\n const commitRename = () => {\n const trimmed = editName.trim();\n if (!trimmed) {\n return;\n }\n\n if (trimmed !== conversation.name) {\n onRename?.(trimmed);\n }\n\n setEditName(trimmed);\n };\n\n const handleSaveEdit = () => {\n commitRename();\n setIsEditing(false);\n };\n\n const handleCancelEdit = () => {\n setIsEditing(false);\n setEditName(conversation.name);\n };\n\n const handleDragStart = (e: React.DragEvent) => {\n setIsDragging(true);\n e.dataTransfer.setData(\"text/plain\", conversation.id);\n e.dataTransfer.effectAllowed = \"move\";\n };\n\n const handleDragEnd = () => {\n setIsDragging(false);\n };\n\n const cancelLongPress = () => {\n if (longPressTimeoutRef.current !== null) {\n window.clearTimeout(longPressTimeoutRef.current);\n longPressTimeoutRef.current = null;\n }\n };\n\n const handleTouchStart = (e: React.TouchEvent<HTMLDivElement>) => {\n if (!isMobile || isEditing) return;\n if (e.touches.length === 0) return;\n const touch = e.touches[0];\n touchStartPointRef.current = { x: touch.clientX, y: touch.clientY };\n activeTouchIdRef.current = touch.identifier;\n suppressClickRef.current = false;\n cancelLongPress();\n const initialTouch = touch;\n longPressTimeoutRef.current = window.setTimeout(() => {\n if (activeTouchIdRef.current !== null) {\n setIsTouchDragging(true);\n onTouchDragStart?.(conversation, initialTouch);\n }\n }, 350);\n };\n\n const handleTouchMove = (e: React.TouchEvent<HTMLDivElement>) => {\n if (!isMobile) return;\n const targetTouch = activeTouchIdRef.current !== null\n ? Array.from(e.touches).find(t => t.identifier === activeTouchIdRef.current)\n : e.touches[0];\n\n if (!targetTouch) return;\n\n if (isTouchDragging) {\n if (e.cancelable) {\n e.preventDefault();\n }\n onTouchDragMove?.(targetTouch);\n return;\n }\n\n const startPoint = touchStartPointRef.current;\n if (startPoint) {\n const deltaX = Math.abs(targetTouch.clientX - startPoint.x);\n const deltaY = Math.abs(targetTouch.clientY - startPoint.y);\n if (deltaX > 8 || deltaY > 8) {\n cancelLongPress();\n }\n }\n };\n\n const finalizeTouchDrag = (touch?: React.Touch) => {\n if (isTouchDragging) {\n onTouchDragEnd?.(touch);\n suppressClickRef.current = true;\n }\n setIsTouchDragging(false);\n activeTouchIdRef.current = null;\n touchStartPointRef.current = null;\n cancelLongPress();\n };\n\n const handleTouchEnd = (e: React.TouchEvent<HTMLDivElement>) => {\n if (!isMobile) return;\n const touch = activeTouchIdRef.current !== null\n ? Array.from(e.changedTouches).find(t => t.identifier === activeTouchIdRef.current)\n : e.changedTouches[0];\n finalizeTouchDrag(touch);\n };\n\n const handleTouchCancel = () => {\n if (!isMobile) return;\n finalizeTouchDrag();\n };\n\n useEffect(() => {\n if (!isTouchDragActive && isTouchDragging) {\n setIsTouchDragging(false);\n }\n }, [isTouchDragActive, isTouchDragging]);\n\n return (\n <>\n <Box\n data-project-id={conversation.projectId ?? \"__ungrouped\"}\n draggable={!isMobile && !isEditing}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n onTouchCancel={handleTouchCancel}\n onClick={\n isEditing || isTouchDragging\n ? undefined\n : (event) => {\n if (suppressClickRef.current) {\n suppressClickRef.current = false;\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n onSelect();\n }\n }\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n px: 2,\n py: 1.5,\n mx: 1,\n borderRadius: 1,\n cursor: isEditing || isTouchDragging ? \"default\" : \"pointer\",\n bgcolor: isSelected \n ? alpha(projectColor || theme.palette.primary.main, 0.15)\n : \"transparent\",\n border: isSelected \n ? `1px solid ${alpha(projectColor || theme.palette.primary.main, 0.3)}`\n : \"1px solid transparent\",\n opacity: isDragging || isTouchDragActive ? 0.55 : 1,\n transition: \"all 0.2s ease\",\n transform: isTouchDragActive ? \"scale(0.98)\" : \"none\",\n boxShadow: isTouchDragActive\n ? `0 12px 24px ${alpha(theme.palette.common.black, 0.25)}`\n : undefined,\n touchAction: isTouchDragActive ? \"none\" : undefined,\n userSelect: isTouchDragging || isTouchDragActive ? \"none\" : undefined,\n WebkitUserSelect: isTouchDragging || isTouchDragActive ? \"none\" : undefined,\n \"&:hover\": !isEditing && !isTouchDragging ? {\n bgcolor: alpha(theme.palette.text.primary, 0.04),\n } : {},\n // Better touch handling on mobile\n ...(isMobile && {\n minHeight: 48, // Larger touch target\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n WebkitTouchCallout: \"none\",\n \"&:active\": {\n bgcolor: alpha(theme.palette.text.primary, 0.08),\n },\n }),\n }}\n >\n {/* Drag Handle */}\n {!isMobile && !isEditing && (\n <DragIcon \n sx={{ \n color: theme.palette.text.disabled,\n mr: 1,\n cursor: \"grab\",\n fontSize: \"1rem\",\n \"&:active\": {\n cursor: \"grabbing\",\n },\n }} \n />\n )}\n\n {/* Conversation Name */}\n <Box sx={{ flex: 1, minWidth: 0 }}>\n {isEditing ? (\n <TextField\n value={editName}\n onChange={(e) => setEditName(e.target.value)}\n onBlur={handleSaveEdit}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n handleSaveEdit();\n } else if (e.key === \"Escape\") {\n handleCancelEdit();\n }\n }}\n size=\"small\"\n variant=\"standard\"\n autoFocus\n fullWidth\n sx={{\n \"& .MuiInput-root\": {\n fontSize: \"0.875rem\",\n },\n }}\n />\n ) : (\n <Typography\n variant=\"body2\"\n sx={{\n fontWeight: isSelected ? 600 : 400,\n color: isSelected \n ? projectColor || theme.palette.primary.main\n : theme.palette.text.primary,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n fontSize: \"0.875rem\",\n }}\n >\n {highlightText(conversation.name, searchQuery)}\n </Typography>\n )}\n\n {/* Optional snippet preview when searching */}\n {!isEditing && snippet && (\n <Typography\n variant=\"caption\"\n sx={{\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n color: alpha(theme.palette.text.secondary, 0.9),\n mt: 0.25,\n lineHeight: 1.3,\n fontSize: \"0.72rem\",\n }}\n title={snippet}\n >\n {highlightText(snippet, searchQuery)}\n </Typography>\n )}\n </Box>\n\n {/* Menu Button */}\n {!isEditing && (\n <IconButton\n onClick={handleMenuOpen}\n size=\"small\"\n sx={{\n opacity: isMobile ? 1 : (isSelected ? 1 : 0), // Always visible on mobile\n color: theme.palette.text.secondary,\n ml: 1,\n minWidth: 32,\n minHeight: 32,\n transition: \"opacity 0.2s ease\",\n \".MuiBox-root:hover &\": {\n opacity: 1,\n },\n // Larger touch target on mobile\n ...(isMobile && {\n padding: 1,\n \"&:before\": {\n content: '\"\"',\n position: \"absolute\",\n top: -8,\n left: -8,\n right: -8,\n bottom: -8,\n },\n }),\n }}\n >\n <MoreVertIcon fontSize=\"small\" />\n </IconButton>\n )}\n\n {/* Context Menu */}\n <Menu\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={handleMenuClose}\n onClick={(e) => e.stopPropagation()} // Prevent menu clicks from bubbling\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n anchorOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n PaperProps={{\n sx: {\n // Larger menu items on mobile for easier touch\n ...(isMobile && {\n \"& .MuiMenuItem-root\": {\n minHeight: 48,\n fontSize: \"1rem\",\n },\n }),\n },\n }}\n >\n {onRename && (\n <MenuItem onClick={handleEdit}>\n <ListItemIcon>\n <EditIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>Rename</ListItemText>\n </MenuItem>\n )}\n {onMove && (\n <MenuItem onClick={handleMove}>\n <ListItemIcon>\n <MoveIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>Move to Project</ListItemText>\n </MenuItem>\n )}\n <MenuItem onClick={handleDelete}>\n <ListItemIcon>\n <DeleteIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>Delete</ListItemText>\n </MenuItem>\n </Menu>\n </Box>\n\n {/* Mobile rename dialog */}\n {isMobile && (\n <Dialog\n open={showRenameDialog}\n onClose={() => {\n setShowRenameDialog(false);\n setEditName(conversation.name);\n }}\n fullWidth\n PaperProps={{\n sx: {\n borderRadius: 3,\n pb: 1,\n },\n }}\n >\n <DialogTitle sx={{ pb: 1 }}>Rename Conversation</DialogTitle>\n <DialogContent>\n <TextField\n value={editName}\n onChange={(e) => setEditName(e.target.value)}\n autoFocus\n fullWidth\n placeholder=\"Enter a new name\"\n InputProps={{\n sx: { fontSize: \"1rem\" },\n }}\n />\n </DialogContent>\n <DialogActions sx={{ px: 3, pb: 2 }}>\n <Button\n onClick={() => {\n setShowRenameDialog(false);\n setEditName(conversation.name);\n }}\n >\n Cancel\n </Button>\n <Button\n onClick={() => {\n commitRename();\n setShowRenameDialog(false);\n }}\n variant=\"contained\"\n disabled={!editName.trim() || editName.trim() === conversation.name}\n >\n Save\n </Button>\n </DialogActions>\n </Dialog>\n )}\n </>\n );\n};\n\nexport default SimpleConversationItem;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-9FF1-8A9606\nconst __banditFingerprint_chat_projectheadertsx = 'BL-FP-8E1E75-E3D0';\nconst __auditTrail_chat_projectheadertsx = 'BL-AU-MGOIKVV4-JNZM';\n// File: project-header.tsx | Path: src/chat/project-header.tsx | Hash: 9ff1e3d0\n\nimport React, { useRef, useState } from \"react\";\nimport {\n Box,\n Typography,\n IconButton,\n Avatar,\n Chip,\n Tooltip,\n TextField,\n alpha,\n} from \"@mui/material\";\nimport {\n ExpandMore as ExpandMoreIcon,\n ExpandLess as ExpandLessIcon,\n Add as AddIcon,\n Folder as FolderIcon,\n FolderOpen as FolderOpenIcon,\n Inbox as InboxIcon,\n Close as CloseIcon,\n Check as CheckIcon,\n} from \"@mui/icons-material\";\nimport { useTheme } from \"@mui/material/styles\";\nimport { useConversationStore } from \"../store/conversationStore\";\nimport { useProjectStore } from \"../store/projectStore\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\n\ninterface ProjectHeaderProps {\n projectId: string | null;\n projectName: string;\n projectColor?: string;\n conversationCount: number;\n isCollapsed: boolean;\n onToggleCollapse: () => void;\n onDropConversation?: (conversationId: string) => void;\n // Inline rename controls\n isRenaming?: boolean;\n onRenameComplete?: () => void;\n onRenameCancelDelete?: () => void;\n isTouchTarget?: boolean;\n}\n\nconst ProjectHeader: React.FC<ProjectHeaderProps> = ({\n projectId,\n projectName,\n projectColor,\n conversationCount,\n isCollapsed,\n onToggleCollapse,\n onDropConversation,\n isRenaming,\n onRenameComplete,\n onRenameCancelDelete,\n isTouchTarget,\n}) => {\n const theme = useTheme();\n const { createNewConversation } = useConversationStore();\n const { renameProject } = useProjectStore();\n const [isHovered, setIsHovered] = useState(false);\n const [isDragOver, setIsDragOver] = useState(false);\n const [renameDraft, setRenameDraft] = useState(projectName);\n // Track pre-blur intent to avoid committing when cancel/delete is clicked\n const renameActionRef = useRef<\"none\" | \"save\" | \"delete\">(\"none\");\n\n const isUngrouped = projectId === null;\n const Icon = isCollapsed ? FolderIcon : FolderOpenIcon;\n\n const handleAddConversation = (e: React.MouseEvent) => {\n e.stopPropagation();\n createNewConversation(projectId || undefined);\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(true);\n };\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n \n const conversationId = e.dataTransfer.getData(\"text/plain\");\n if (conversationId && onDropConversation) {\n onDropConversation(conversationId);\n }\n };\n\n const commitRename = async () => {\n if (!isRenaming || projectId === null) return;\n const next = renameDraft.trim();\n try {\n if (next && next !== projectName) {\n await renameProject(projectId, next);\n }\n } catch (error) {\n // swallow; keep original name on failure\n debugLogger.error(\"Failed to rename project\", {\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n onRenameComplete?.();\n renameActionRef.current = \"none\";\n }\n };\n\n const cancelRename = () => {\n setRenameDraft(projectName);\n onRenameComplete?.();\n };\n\n return (\n <Box\n data-project-id={projectId ?? \"__ungrouped\"}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={isUngrouped || isRenaming ? undefined : onToggleCollapse} // Disable toggle while renaming\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n px: 2,\n py: 1.5,\n cursor: isUngrouped ? \"default\" : \"pointer\", // No pointer cursor for ungrouped\n bgcolor: (isDragOver || isTouchTarget)\n ? alpha(projectColor || theme.palette.primary.main, 0.1)\n : undefined,\n border: (isDragOver || isTouchTarget)\n ? `2px dashed ${projectColor || theme.palette.primary.main}`\n : \"2px solid transparent\",\n borderRadius: (isDragOver || isTouchTarget) ? 1 : 0,\n transition: \"all 0.2s ease\",\n \"&:hover\": !isUngrouped ? { // Only show hover for projects, not ungrouped\n bgcolor: alpha(theme.palette.text.primary, 0.04),\n } : {},\n }}\n >\n {/* Project Icon */}\n <Avatar\n sx={{\n bgcolor: isUngrouped \n ? alpha(theme.palette.text.disabled, 0.1)\n : projectColor || theme.palette.grey[400],\n width: 28,\n height: 28,\n mr: 1.5,\n }}\n >\n {isUngrouped ? (\n <InboxIcon \n fontSize=\"small\" \n sx={{ \n color: theme.palette.text.disabled,\n opacity: 0.7,\n }} \n />\n ) : (\n <Icon fontSize=\"small\" />\n )}\n </Avatar>\n \n {/* Project Name */}\n {isRenaming && !isUngrouped ? (\n <TextField\n value={renameDraft}\n onChange={(e) => setRenameDraft(e.target.value)}\n onBlur={() => {\n // If cancel/delete was initiated, skip committing on blur\n if (renameActionRef.current === \"delete\") {\n renameActionRef.current = \"none\";\n return;\n }\n // If explicit save already triggered, do nothing\n if (renameActionRef.current === \"save\") {\n renameActionRef.current = \"none\";\n return;\n }\n commitRename();\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") { \n renameActionRef.current = \"save\"; \n commitRename();\n }\n if (e.key === \"Escape\") {\n renameActionRef.current = \"delete\";\n if (onRenameCancelDelete) {\n onRenameCancelDelete();\n } else {\n cancelRename();\n }\n }\n }}\n variant=\"standard\"\n autoFocus\n fullWidth\n inputProps={{\n style: {\n fontSize: \"0.875rem\",\n fontWeight: 600,\n },\n }}\n sx={{\n flex: 1,\n mr: 2,\n '& .MuiInputBase-input': {\n color: theme.palette.text.primary,\n },\n }}\n />\n ) : (\n <Typography\n variant=\"subtitle2\"\n sx={{\n flex: 1,\n fontWeight: 600,\n color: isUngrouped \n ? theme.palette.text.disabled\n : theme.palette.text.primary,\n fontSize: \"0.875rem\",\n opacity: isUngrouped ? 0.8 : 1,\n }}\n >\n {projectName}\n {isDragOver && (\n <Typography \n component=\"span\" \n variant=\"caption\" \n sx={{ \n ml: 1, \n color: projectColor || theme.palette.primary.main,\n fontWeight: 500,\n }}\n >\n Drop here\n </Typography>\n )}\n </Typography>\n )}\n \n {/* Conversation Count */}\n <Chip\n label={conversationCount}\n size=\"small\"\n sx={{\n bgcolor: isUngrouped\n ? alpha(theme.palette.text.disabled, 0.1)\n : alpha(projectColor || theme.palette.primary.main, 0.15),\n color: isUngrouped\n ? theme.palette.text.disabled\n : projectColor || theme.palette.primary.main,\n minWidth: 28,\n height: 22,\n mr: 1,\n opacity: isUngrouped ? 0.7 : 1,\n \"& .MuiChip-label\": {\n fontSize: \"0.7rem\",\n px: 0.5,\n fontWeight: 600,\n },\n }}\n />\n\n {/* Rename actions when inline editing */}\n {isRenaming && !isUngrouped && (\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5, ml: 1 }}>\n <Tooltip title=\"Cancel and remove\">\n <IconButton\n size=\"small\"\n onMouseDown={(e) => {\n e.stopPropagation();\n // Mark delete intent before blur fires\n renameActionRef.current = \"delete\";\n onRenameCancelDelete ? onRenameCancelDelete() : cancelRename();\n }}\n sx={{ color: alpha(theme.palette.error.main, 0.9) }}\n >\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Save\">\n <IconButton\n size=\"small\"\n onMouseDown={(e) => {\n e.stopPropagation();\n renameActionRef.current = \"save\";\n commitRename();\n }}\n sx={{ color: theme.palette.success.main }}\n >\n <CheckIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n </Box>\n )}\n\n {/* Add Conversation Button (on hover) - Hidden for ungrouped to discourage usage */}\n {isHovered && !isDragOver && !isUngrouped && !isRenaming && (\n <Tooltip title={`Add conversation to ${projectName.toLowerCase()}`} arrow>\n <IconButton\n onClick={handleAddConversation}\n size=\"small\"\n sx={{\n color: projectColor || theme.palette.primary.main,\n bgcolor: alpha(projectColor || theme.palette.primary.main, 0.1),\n width: 24,\n height: 24,\n mr: 0.5,\n \"&:hover\": {\n bgcolor: alpha(projectColor || theme.palette.primary.main, 0.2),\n transform: \"scale(1.1)\",\n },\n transition: \"all 0.2s ease\",\n }}\n >\n <AddIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n \n {/* Expand/Collapse Button - Hidden for ungrouped */}\n {!isUngrouped && !isRenaming && (\n <IconButton \n size=\"small\"\n sx={{\n color: theme.palette.text.secondary,\n transition: \"transform 0.2s ease\",\n }}\n >\n {isCollapsed ? (\n <ExpandMoreIcon fontSize=\"small\" />\n ) : (\n <ExpandLessIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n </Box>\n );\n};\n\nexport default ProjectHeader;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-817D-B6A919\nconst __banditFingerprint_chat_enhancedmobileconversationsmodaltsx = 'BL-FP-E99537-679F';\nconst __auditTrail_chat_enhancedmobileconversationsmodaltsx = 'BL-AU-MGOIKVV1-DNC2';\n// File: enhanced-mobile-conversations-modal.tsx | Path: src/chat/enhanced-mobile-conversations-modal.tsx | Hash: 817d679f\n\nimport React, { useState, useMemo, useEffect, useRef, useCallback } from \"react\";\nimport {\n Box,\n IconButton,\n Modal,\n Typography,\n TextField,\n InputAdornment,\n Slide,\n Collapse,\n Divider,\n Menu,\n MenuItem,\n ListItemIcon,\n ListItemText,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n AppBar,\n Toolbar,\n Avatar,\n} from \"@mui/material\";\nimport {\n Close as CloseIcon,\n Clear as ClearIcon,\n Search as SearchIcon,\n Folder as FolderIcon,\n MoreVert as MoreVertIcon,\n DeleteSweep as DeleteSweepIcon,\n Inbox as InboxIcon,\n} from \"@mui/icons-material\";\nimport { Add as AddIcon } from \"@mui/icons-material\";\nimport { useTheme, alpha } from \"@mui/material/styles\";\nimport { useConversationStore, Conversation } from \"../store/conversationStore\";\nimport { useProjectStore } from \"../store/projectStore\";\nimport { HistoryEntry } from \"../store/aiQueryStore\";\nimport { useAuthenticationStore } from \"../store/authenticationStore\";\nimport brandingService from \"../services/branding/brandingService\";\nimport ProjectManagementModal from \"./project-management-modal\";\nimport MoveConversationModal from \"./move-conversation-modal\";\nimport SimpleConversationItem from \"./simple-conversation-item\";\nimport ProjectHeader from \"./project-header\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\n\ninterface MobileConversationsModalProps {\n open: boolean;\n onClose: () => void;\n}\n\ntype ProjectConversation = Conversation & {\n _snippet?: string;\n};\n\ninterface ProjectGroup {\n id: string | null;\n name: string;\n color?: string;\n conversations: ProjectConversation[];\n collapsed: boolean;\n}\n\nconst BANDIT_AVATAR = \"https://cdn.burtson.ai/images/bandit-head.png\";\n\nconst coerceOptionalString = (value: unknown): string | undefined => {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n};\n\nconst deriveInitials = (value: string): string => {\n if (!value) return \"B\";\n const sanitized = value.trim();\n if (!sanitized) return \"B\";\n\n const words = sanitized.split(/\\s+/).filter(Boolean);\n if (words.length >= 2) {\n const first = words[0]?.charAt(0) ?? \"\";\n const last = words[words.length - 1]?.charAt(0) ?? \"\";\n const initials = `${first}${last}`.trim();\n return initials ? initials.toUpperCase() : sanitized.slice(0, 2).toUpperCase();\n }\n\n const alphanumeric = sanitized.replace(/[^A-Za-z0-9]/g, \"\");\n if (alphanumeric.length >= 2) {\n return alphanumeric.slice(0, 2).toUpperCase();\n }\n if (alphanumeric.length === 1) {\n return alphanumeric.toUpperCase();\n }\n return sanitized.slice(0, 2).toUpperCase();\n};\n\nconst EnhancedMobileConversationsModal: React.FC<MobileConversationsModalProps> = ({\n open,\n onClose,\n}) => {\n const theme = useTheme();\n const { user } = useAuthenticationStore();\n \n const {\n conversations,\n currentId,\n switchConversation,\n deleteConversation,\n renameConversation,\n createNewConversation,\n clearAllConversations,\n moveConversationToProject,\n getConversationsByProject,\n } = useConversationStore();\n\n const {\n projects,\n _hasHydrated: projectsHydrated,\n hydrate: hydrateProjects,\n createProject,\n deleteProject,\n } = useProjectStore();\n\n // State for UI\n const [projectManagementOpen, setProjectManagementOpen] = useState(false);\n const [collapsedProjects, setCollapsedProjects] = useState<Set<string>>(new Set());\n const didInitCollapseRef = useRef(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [menuAnchorEl, setMenuAnchorEl] = useState<null | HTMLElement>(null);\n const [clearConfirmOpen, setClearConfirmOpen] = useState(false);\n const [moveModalOpen, setMoveModalOpen] = useState(false);\n const [conversationToMove, setConversationToMove] = useState<Conversation | null>(null);\n const [renameProjectId, setRenameProjectId] = useState<string | null>(null);\n const [touchDragState, setTouchDragState] = useState<{\n conversationId: string | null;\n originProjectId: string | null;\n hoverProjectId: string | null;\n }>({ conversationId: null, originProjectId: null, hoverProjectId: null });\n const [avatarImage, setAvatarImage] = useState<string>(BANDIT_AVATAR);\n\n const getCustomClaim = useCallback((key: string): string | undefined => {\n if (!user) return undefined;\n const record = user as unknown as Record<string, unknown>;\n return coerceOptionalString(record[key]);\n }, [user]);\n\n const userDisplayName = useMemo(() => {\n if (!user) return undefined;\n\n const candidateFields = [\n coerceOptionalString(user.name),\n coerceOptionalString(user.preferred_username),\n user.given_name && user.family_name\n ? coerceOptionalString(`${user.given_name} ${user.family_name}`)\n : undefined,\n getCustomClaim(\"full_name\"),\n getCustomClaim(\"displayName\"),\n ];\n\n const resolvedName = candidateFields.find(Boolean);\n if (resolvedName) return resolvedName;\n\n const trimmedEmail = coerceOptionalString(user.email);\n if (trimmedEmail) return trimmedEmail;\n\n return user.sub;\n }, [user, getCustomClaim]);\n\n const userSecondaryText = useMemo(() => {\n if (!user) return undefined;\n\n const trimmedEmail = coerceOptionalString(user.email);\n if (trimmedEmail && trimmedEmail !== userDisplayName) {\n return trimmedEmail;\n }\n\n const subId = coerceOptionalString(user.sub);\n if (subId && subId !== userDisplayName) {\n return subId;\n }\n\n return undefined;\n }, [user, userDisplayName]);\n\n useEffect(() => {\n const fetchBranding = async () => {\n try {\n const branding = await brandingService.getBranding();\n setAvatarImage(branding?.logoBase64 || BANDIT_AVATAR);\n } catch (error) {\n debugLogger.error(\"Failed to load branding avatar\", {\n error: error instanceof Error ? error.message : String(error),\n });\n setAvatarImage(BANDIT_AVATAR);\n }\n };\n\n if (open) {\n fetchBranding();\n }\n }, [open]);\n\n const avatarLabel = userDisplayName || user?.email || \"Bandit\";\n const avatarInitials = useMemo(() => deriveInitials(avatarLabel), [avatarLabel]);\n\n // Build snippet helper\n const buildSnippet = (text: string, query: string, idx: number) => {\n const start = Math.max(0, idx - 40);\n const end = Math.min(text.length, idx + query.length + 60);\n return text.slice(start, end).replace(/\\s+/g, \" \").trim();\n };\n\n // Hydrate projects on mount\n useEffect(() => {\n if (open && !projectsHydrated) {\n hydrateProjects();\n }\n }, [open, projectsHydrated, hydrateProjects]);\n\n // Collapse all projects by default after hydrate (one-time per mount)\n useEffect(() => {\n if (projectsHydrated && !didInitCollapseRef.current) {\n didInitCollapseRef.current = true;\n if (projects && projects.length > 0) {\n setCollapsedProjects(new Set(projects.map(p => p.id)));\n }\n }\n }, [projectsHydrated, projects]);\n\n // Organize conversations by projects (same as desktop)\n const projectGroups = useMemo((): ProjectGroup[] => {\n const groups: ProjectGroup[] = [];\n \n // Add project groups FIRST (to encourage project usage)\n projects.forEach(project => {\n const projectConversations = getConversationsByProject(project.id).map<ProjectConversation>((conversation) => ({\n ...conversation,\n }));\n groups.push({\n id: project.id,\n name: project.name,\n color: project.color,\n conversations: projectConversations,\n collapsed: collapsedProjects.has(project.id),\n });\n });\n\n // Add ungrouped conversations LAST (to discourage ungrouped usage)\n const ungroupedConversations = getConversationsByProject(null).map<ProjectConversation>((conversation) => ({\n ...conversation,\n }));\n if (ungroupedConversations.length > 0) {\n groups.push({\n id: null,\n name: \"Ungrouped\",\n conversations: ungroupedConversations,\n collapsed: false, // Never collapsed for ungrouped\n });\n }\n\n return groups.filter(group => group.conversations.length > 0 || group.id !== null);\n }, [projects, getConversationsByProject, collapsedProjects]);\n\n // Filter conversations based on search query and attach snippets\n const filteredProjectGroups = useMemo((): ProjectGroup[] => {\n if (!searchQuery.trim()) return projectGroups;\n\n const query = searchQuery.toLowerCase();\n\n return projectGroups\n .map(group => {\n const conversationsWithSnippets = group.conversations\n .map<ProjectConversation | null>((conv) => {\n if (conv.name.toLowerCase().includes(query)) {\n return { ...conv, _snippet: undefined };\n }\n\n for (const entry of conv.history as HistoryEntry[]) {\n const body = `${entry.question || \"\"} ${entry.answer || \"\"}`;\n const hay = body.toLowerCase();\n const idx = hay.indexOf(query);\n if (idx !== -1) {\n return { ...conv, _snippet: buildSnippet(body, query, idx) };\n }\n }\n return null;\n })\n .filter((conv): conv is ProjectConversation => conv !== null);\n\n return {\n ...group,\n conversations: conversationsWithSnippets,\n };\n })\n .filter(group => group.conversations.length > 0);\n }, [projectGroups, searchQuery]);\n\n const touchDragActive = Boolean(touchDragState.conversationId);\n\n const getProjectIdFromPoint = useCallback((clientX: number, clientY: number) => {\n if (typeof document === \"undefined\") return null;\n const element = document.elementFromPoint(clientX, clientY) as HTMLElement | null;\n if (!element) return null;\n const projectNode = element.closest('[data-project-id]') as HTMLElement | null;\n return projectNode?.getAttribute('data-project-id') ?? null;\n }, []);\n\n const handleTouchDragStart = useCallback((conversation: Conversation, touch: React.Touch) => {\n const initialHover = getProjectIdFromPoint(touch.clientX, touch.clientY);\n setTouchDragState({\n conversationId: conversation.id,\n originProjectId: conversation.projectId ?? null,\n hoverProjectId: initialHover ?? (conversation.projectId ?? null),\n });\n }, [getProjectIdFromPoint]);\n\n const handleTouchDragMove = useCallback((touch: React.Touch) => {\n setTouchDragState(prev => {\n if (!prev.conversationId) return prev;\n const hoverId = getProjectIdFromPoint(touch.clientX, touch.clientY);\n if (hoverId === prev.hoverProjectId) return prev;\n return { ...prev, hoverProjectId: hoverId };\n });\n }, [getProjectIdFromPoint]);\n\n const handleTouchDragEnd = useCallback((touch?: React.Touch) => {\n setTouchDragState(prev => {\n if (!prev.conversationId) {\n return { conversationId: null, originProjectId: null, hoverProjectId: null };\n }\n\n let hoverId = prev.hoverProjectId;\n if (touch) {\n const resolved = getProjectIdFromPoint(touch.clientX, touch.clientY);\n if (resolved !== null) hoverId = resolved;\n }\n\n if (hoverId) {\n const targetProjectId = hoverId === \"__ungrouped\" ? null : hoverId;\n if (targetProjectId !== prev.originProjectId) {\n const conversationId = prev.conversationId;\n setTimeout(() => {\n try {\n moveConversationToProject(conversationId, targetProjectId);\n } catch (error) {\n debugLogger.error(\"Failed to move conversation via touch drag\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }, 0);\n }\n }\n\n return { conversationId: null, originProjectId: null, hoverProjectId: null };\n });\n }, [getProjectIdFromPoint, moveConversationToProject]);\n\n const activeDragConversation = useMemo(() => {\n if (!touchDragState.conversationId) return null;\n return conversations.find(conv => conv.id === touchDragState.conversationId) || null;\n }, [touchDragState.conversationId, conversations]);\n\n const activeHoverLabel = useMemo(() => {\n if (!touchDragState.hoverProjectId) return \"\";\n if (touchDragState.hoverProjectId === \"__ungrouped\") return \"Ungrouped\";\n const project = projects.find(p => p.id === touchDragState.hoverProjectId);\n return project?.name || \"\";\n }, [touchDragState.hoverProjectId, projects]);\n\n const handleToggleProject = (projectId: string | null) => {\n const key = projectId || \"ungrouped\";\n const newCollapsed = new Set(collapsedProjects);\n if (newCollapsed.has(key)) {\n newCollapsed.delete(key);\n } else {\n newCollapsed.add(key);\n }\n setCollapsedProjects(newCollapsed);\n };\n\n const handleDropConversation = (projectId: string | null, conversationId: string) => {\n moveConversationToProject(conversationId, projectId === null ? null : projectId);\n };\n\n const handleSearchClear = () => {\n setSearchQuery(\"\");\n };\n\n const handleMenuOpen = (event: React.MouseEvent<HTMLElement>) => {\n setMenuAnchorEl(event.currentTarget);\n };\n\n const handleMenuClose = () => {\n setMenuAnchorEl(null);\n };\n\n const handleClearAllConfirm = async () => {\n try {\n await clearAllConversations();\n setClearConfirmOpen(false);\n handleMenuClose();\n onClose(); // Close modal after clearing\n } catch (error) {\n debugLogger.error(\"Failed to clear conversations\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n const handleMoveConversation = (conversation: ProjectConversation) => {\n setConversationToMove(conversation);\n setMoveModalOpen(true);\n };\n\n const handleMoveModalClose = () => {\n setMoveModalOpen(false);\n setConversationToMove(null);\n };\n\n return (\n <>\n <Modal\n open={open}\n onClose={onClose}\n sx={{\n display: \"flex\",\n alignItems: \"flex-end\",\n }}\n >\n <Slide direction=\"up\" in={open}>\n <Box\n sx={{\n width: \"100%\",\n height: \"86vh\",\n maxHeight: 720,\n bgcolor: theme.palette.background.paper,\n borderRadius: \"20px 20px 0 0\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n >\n {/* Header */}\n <AppBar \n position=\"static\" \n elevation={0}\n sx={{\n bgcolor: theme.palette.background.paper,\n color: theme.palette.text.primary,\n borderBottom: `1px solid ${theme.palette.divider}`,\n }}\n >\n <Toolbar>\n <Typography variant=\"h6\" sx={{ flex: 1, fontWeight: 600 }}>\n Conversations\n </Typography>\n \n <IconButton\n onClick={() => setProjectManagementOpen(true)}\n sx={{ color: theme.palette.text.secondary }}\n >\n <FolderIcon />\n </IconButton>\n\n <IconButton\n onClick={handleMenuOpen}\n sx={{ color: theme.palette.text.secondary }}\n >\n <MoreVertIcon />\n </IconButton>\n \n <IconButton\n onClick={onClose}\n sx={{ color: theme.palette.text.secondary }}\n >\n <CloseIcon />\n </IconButton>\n </Toolbar>\n </AppBar>\n\n {/* Search Bar */}\n <Box sx={{ p: 2, pb: 1 }}>\n <TextField\n fullWidth\n size=\"small\"\n placeholder=\"Search conversations and content...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n variant=\"outlined\"\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon fontSize=\"small\" sx={{ color: theme.palette.text.secondary }} />\n </InputAdornment>\n ),\n endAdornment: searchQuery && (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={handleSearchClear}\n size=\"small\"\n edge=\"end\"\n sx={{ color: theme.palette.text.secondary }}\n >\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n </Box>\n\n {/* Content */}\n <Box\n sx={{\n flex: 1,\n overflow: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n position: \"relative\",\n pb: 2,\n }}\n >\n {touchDragActive && activeDragConversation && (\n <Box\n sx={{\n position: \"absolute\",\n top: theme.spacing(5),\n left: \"50%\",\n transform: \"translate(-50%, -100%)\",\n zIndex: theme.zIndex.modal + 10,\n pointerEvents: \"none\",\n bgcolor: theme.palette.mode === \"dark\"\n ? alpha(theme.palette.common.black, 0.82)\n : alpha(theme.palette.common.white, 0.95),\n color: theme.palette.mode === \"dark\"\n ? theme.palette.common.white\n : theme.palette.text.primary,\n border: `1px solid ${theme.palette.mode === \"dark\"\n ? alpha(theme.palette.common.white, 0.25)\n : alpha(theme.palette.common.black, 0.2)}`,\n borderRadius: 999,\n px: 2,\n py: 0.75,\n boxShadow: `0 16px 32px ${alpha(theme.palette.common.black, 0.3)}`,\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n backdropFilter: \"blur(12px)\",\n whiteSpace: \"nowrap\",\n maxWidth: \"min(90vw, 520px)\",\n overflow: \"hidden\",\n }}\n >\n <Typography\n variant=\"caption\"\n sx={{\n fontWeight: 600,\n display: \"flex\",\n alignItems: \"center\",\n gap: 0.75,\n whiteSpace: \"nowrap\",\n }}\n >\n Move\n <Box\n component=\"span\"\n sx={{\n fontWeight: 700,\n maxWidth: \"45vw\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n “{activeDragConversation.name}”\n </Box>\n </Typography>\n <Typography\n variant=\"caption\"\n color=\"inherit\"\n sx={{\n fontWeight: 500,\n whiteSpace: \"nowrap\",\n }}\n >\n {activeHoverLabel ? (\n <>\n to{\" \"}\n <Box\n component=\"span\"\n sx={{\n fontWeight: 700,\n whiteSpace: \"nowrap\",\n }}\n >\n {activeHoverLabel}\n </Box>\n </>\n ) : (\n \"Drag over a project to drop\"\n )}\n </Typography>\n </Box>\n )}\n {/* Quick Add Project */}\n <Box\n onClick={async () => {\n const names = new Set(projects.map(p => p.name));\n const base = \"New Project\";\n let name = base;\n if (names.has(name)) {\n for (let i = 2; i < 1000; i++) {\n const candidate = `${base} ${i}`;\n if (!names.has(candidate)) { name = candidate; break; }\n }\n }\n try {\n const created = await createProject(name);\n setRenameProjectId(created.id);\n } catch (error) {\n debugLogger.error(\"Failed to create project\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }}\n sx={{\n px: 2,\n py: 1.25,\n display: \"flex\",\n alignItems: \"center\",\n gap: 1.5,\n cursor: \"pointer\",\n '&:hover': { bgcolor: alpha(theme.palette.text.primary, 0.04) },\n }}\n >\n <Box\n sx={{\n width: 28,\n height: 28,\n borderRadius: \"50%\",\n bgcolor: alpha(theme.palette.success.main, 0.15),\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <FolderIcon fontSize=\"small\" sx={{ color: theme.palette.success.main }} />\n </Box>\n <Typography\n variant=\"subtitle2\"\n sx={{ flex: 1, fontWeight: 600, fontSize: \"0.875rem\" }}\n >\n New Project\n </Typography>\n <IconButton size=\"small\" sx={{ color: theme.palette.success.main }}>\n <AddIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n <Divider sx={{ opacity: 0.3 }} />\n\n {filteredProjectGroups.map((group, index) => (\n <Box key={group.id || \"ungrouped\"}>\n {/* Add visual separator before ungrouped section */}\n {group.id === null && filteredProjectGroups.length > 1 && (\n <Box\n sx={{\n py: 2,\n px: 2,\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n }}\n >\n <Divider sx={{ flex: 1, opacity: 0.6 }} />\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n <InboxIcon \n sx={{ \n color: theme.palette.text.disabled,\n fontSize: \"0.9rem\",\n opacity: 0.7,\n }} \n />\n <Typography \n variant=\"caption\" \n sx={{ \n color: theme.palette.text.disabled,\n fontSize: \"0.7rem\",\n fontWeight: 500,\n letterSpacing: \"0.5px\",\n textTransform: \"uppercase\",\n }}\n >\n Other Conversations\n </Typography>\n </Box>\n <Divider sx={{ flex: 1, opacity: 0.6 }} />\n </Box>\n )}\n\n {/* Only show project header for actual projects, not ungrouped */}\n {group.id !== null ? (\n <>\n <ProjectHeader\n projectId={group.id}\n projectName={group.name}\n projectColor={group.color}\n conversationCount={group.conversations.length}\n isCollapsed={group.collapsed}\n onToggleCollapse={() => handleToggleProject(group.id)}\n onDropConversation={(conversationId) => \n handleDropConversation(group.id, conversationId)\n }\n isRenaming={renameProjectId === group.id}\n onRenameComplete={() => setRenameProjectId(null)}\n onRenameCancelDelete={async () => {\n if (renameProjectId === group.id) {\n try {\n if (typeof group.id === 'string') {\n await deleteProject(group.id);\n }\n } catch (error) {\n debugLogger.error(\"Failed to delete project\", {\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n setRenameProjectId(null);\n }\n }\n }}\n isTouchTarget={touchDragActive && touchDragState.hoverProjectId === group.id}\n />\n \n <Collapse in={!group.collapsed}>\n <Box\n data-project-id={group.id ?? \"__ungrouped\"}\n sx={{\n pb: 1,\n border: touchDragActive && touchDragState.hoverProjectId === group.id\n ? `2px dashed ${theme.palette.primary.main}`\n : \"1px solid transparent\",\n borderRadius: touchDragActive && touchDragState.hoverProjectId === group.id ? 2 : 0,\n transition: \"border 0.2s ease, background-color 0.2s ease\",\n backgroundColor: touchDragActive && touchDragState.hoverProjectId === group.id\n ? alpha(theme.palette.primary.main, 0.08)\n : \"transparent\",\n }}\n >\n {group.conversations.map((conversation) => (\n <SimpleConversationItem\n key={conversation.id}\n conversation={conversation}\n isSelected={conversation.id === currentId}\n onSelect={() => {\n switchConversation(conversation.id);\n onClose();\n }}\n onDelete={() => deleteConversation(conversation.id)}\n onRename={(newName) => renameConversation(conversation.id, newName)}\n onMove={() => handleMoveConversation(conversation)}\n projectColor={group.color}\n snippet={searchQuery ? conversation._snippet : undefined}\n searchQuery={searchQuery.trim() || undefined}\n onTouchDragStart={handleTouchDragStart}\n onTouchDragMove={handleTouchDragMove}\n onTouchDragEnd={handleTouchDragEnd}\n isTouchDragActive={touchDragState.conversationId === conversation.id}\n />\n ))}\n </Box>\n </Collapse>\n </>\n ) : (\n // Special handling for ungrouped - no header, just conversations in scrollable area\n <Box \n sx={{ \n minHeight: 0,\n overflow: \"auto\",\n px: 1,\n py: 1,\n bgcolor: alpha(theme.palette.background.default, 0.3),\n borderRadius: \"8px 8px 0 0\",\n mx: 1,\n mb: 1,\n border: touchDragActive && touchDragState.hoverProjectId === \"__ungrouped\"\n ? `2px dashed ${theme.palette.primary.main}`\n : \"1px solid transparent\",\n transition: \"border 0.2s ease, background-color 0.2s ease\",\n backgroundColor: touchDragActive && touchDragState.hoverProjectId === \"__ungrouped\"\n ? alpha(theme.palette.primary.main, 0.08)\n : alpha(theme.palette.background.default, 0.3),\n }}\n data-project-id=\"__ungrouped\"\n >\n {group.conversations.map((conversation) => (\n <SimpleConversationItem\n key={conversation.id}\n conversation={conversation}\n isSelected={conversation.id === currentId}\n onSelect={() => {\n switchConversation(conversation.id);\n onClose();\n }}\n onDelete={() => deleteConversation(conversation.id)}\n onRename={(newName) => renameConversation(conversation.id, newName)}\n onMove={() => handleMoveConversation(conversation)}\n projectColor={group.color}\n snippet={searchQuery ? conversation._snippet : undefined}\n searchQuery={searchQuery.trim() || undefined}\n onTouchDragStart={handleTouchDragStart}\n onTouchDragMove={handleTouchDragMove}\n onTouchDragEnd={handleTouchDragEnd}\n isTouchDragActive={touchDragState.conversationId === conversation.id}\n />\n ))}\n </Box>\n )}\n </Box>\n ))}\n \n {filteredProjectGroups.length === 0 && (\n <Box\n sx={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n p: 4,\n textAlign: \"center\",\n color: theme.palette.text.secondary,\n }}\n >\n <Typography variant=\"h6\" sx={{ mb: 1 }}>\n {searchQuery ? \"No conversations found\" : \"No conversations yet\"}\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 3, maxWidth: 280 }}>\n {searchQuery \n ? `No conversations match \"${searchQuery}\"`\n : \"Start your first conversation to begin organizing your chats into projects\"\n }\n </Typography>\n </Box>\n )}\n </Box>\n\n <Box\n sx={{\n mt: \"auto\",\n px: 2,\n py: 1.75,\n borderTop: `1px solid ${alpha(theme.palette.divider, 0.6)}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 1.25,\n bgcolor: alpha(theme.palette.background.default, 0.88),\n flexWrap: \"wrap\",\n }}\n >\n <Avatar\n src={avatarImage}\n alt={avatarLabel}\n sx={{\n width: 40,\n height: 40,\n fontSize: \"1rem\",\n bgcolor: alpha(theme.palette.primary.main, 0.12),\n color: theme.palette.primary.main,\n }}\n >\n {avatarInitials}\n </Avatar>\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1, minWidth: 0, flexWrap: \"wrap\", justifyContent: \"center\" }}>\n <Typography\n variant=\"subtitle2\"\n noWrap\n sx={{ fontWeight: 600, color: theme.palette.text.primary }}\n >\n {user ? userDisplayName : \"Not signed in\"}\n </Typography>\n {user ? (\n userSecondaryText ? (\n <Typography\n variant=\"caption\"\n noWrap\n sx={{ color: theme.palette.text.secondary }}\n >\n • {userSecondaryText}\n </Typography>\n ) : null\n ) : (\n <Typography\n variant=\"caption\"\n sx={{ color: theme.palette.text.secondary }}\n noWrap\n >\n • Connect your account to sync chats\n </Typography>\n )}\n </Box>\n </Box>\n </Box>\n </Slide>\n </Modal>\n\n {/* Project Management Modal */}\n <ProjectManagementModal\n open={projectManagementOpen}\n onClose={() => setProjectManagementOpen(false)}\n />\n\n {/* Move Conversation Modal */}\n {conversationToMove && (\n <MoveConversationModal\n open={moveModalOpen}\n onClose={handleMoveModalClose}\n conversations={[conversationToMove]}\n currentProjectId={conversationToMove.projectId}\n />\n )}\n\n {/* Actions Menu */}\n <Menu\n anchorEl={menuAnchorEl}\n open={Boolean(menuAnchorEl)}\n onClose={handleMenuClose}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"right\",\n }}\n >\n <MenuItem \n onClick={() => {\n setClearConfirmOpen(true);\n handleMenuClose();\n }}\n sx={{ color: theme.palette.error.main }}\n >\n <ListItemIcon>\n <DeleteSweepIcon fontSize=\"small\" sx={{ color: theme.palette.error.main }} />\n </ListItemIcon>\n <ListItemText>Clear All Conversations</ListItemText>\n </MenuItem>\n </Menu>\n\n {/* Clear All Confirmation Dialog */}\n <Dialog\n open={clearConfirmOpen}\n onClose={() => setClearConfirmOpen(false)}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>Clear All Conversations?</DialogTitle>\n <DialogContent>\n <Typography>\n This will permanently delete all conversations and cannot be undone. \n Are you sure you want to continue?\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setClearConfirmOpen(false)}>\n Cancel\n </Button>\n <Button \n onClick={handleClearAllConfirm}\n color=\"error\"\n variant=\"contained\"\n >\n Clear All\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n};\n\nexport default EnhancedMobileConversationsModal;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-75D8-51D2DC\nconst __banditFingerprint_hooks_useConversationNameGeneratortsx = 'BL-FP-10F724-D630';\nconst __auditTrail_hooks_useConversationNameGeneratortsx = 'BL-AU-MGOIKVV2-5247';\n// File: useConversationNameGenerator.tsx | Path: src/chat/hooks/useConversationNameGenerator.tsx | Hash: 75d8d630\n\nimport { useAIProviderStore } from \"../../store/aiProviderStore\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { debugLogger } from \"../../services/logging/debugLogger\";\nimport { lastValueFrom } from \"rxjs\";\nimport { map } from \"rxjs/operators\";\nimport { sanitizeConversationName } from \"../../store/conversationStore\";\n\nexport const useConversationNameGenerator = () => {\n const generateName = async (userMessage: string): Promise<string | null> => {\n // Get the provider fresh each time the function is called\n const provider = useAIProviderStore.getState().provider;\n const settings = usePackageSettingsStore.getState().settings;\n const defaultModel = settings?.defaultModel || \"bandit-core\";\n \n debugLogger.info(\"ConversationNameGenerator: Starting generation\", { \n hasProvider: !!provider, \n providerType: provider?.getProviderType?.(),\n defaultModel,\n settingsModel: settings?.defaultModel\n });\n\n if (!provider) {\n debugLogger.error(\"No AI provider available for conversation name generation\");\n return null;\n }\n\n // Use the same model selection as conversation starters\n const modelToUse = defaultModel;\n \n debugLogger.info(\"ConversationNameGenerator: Using model\", { modelToUse, fromSettings: settings?.defaultModel });\n\n const prompt = `\nSummarize this user message as a short and descriptive conversation name (max 6 words, title case):\n\"${userMessage}\"\n\nRespond with just the title and nothing else.\n `.trim();\n\n try {\n const result$ = provider.generate({\n model: modelToUse,\n prompt,\n stream: false,\n options: {\n temperature: 0.5,\n num_predict: 20,\n },\n });\n\n const title = await lastValueFrom(\n result$.pipe(map((d) => d.response?.trim().replace(/[\"']/g, \"\")))\n );\n\n if (title && title.length > 0) {\n const sanitizedTitle = sanitizeConversationName(title, 60);\n debugLogger.info(\"Generated conversation name:\", { title: sanitizedTitle, userMessage: userMessage.slice(0, 50) });\n return sanitizedTitle;\n }\n } catch (err) {\n debugLogger.error(\"Conversation name generation failed:\", { error: err, userMessage: userMessage.slice(0, 50), modelUsed: modelToUse });\n }\n\n return null;\n };\n\n return { generateName };\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-5238-C1AF86\nconst __banditFingerprint_chat_querysuggestionpickertsx = 'BL-FP-4174A5-AFBE';\nconst __auditTrail_chat_querysuggestionpickertsx = 'BL-AU-MGOIKVV5-AD62';\n// File: query-suggestion-picker.tsx | Path: src/chat/query-suggestion-picker.tsx | Hash: 5238afbe\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { Box, useMediaQuery, Theme } from \"@mui/material\";\nimport { useTheme, alpha } from \"@mui/material/styles\";\nimport ReactMarkdown from \"react-markdown\";\nimport type { Components } from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypeRaw from \"rehype-raw\";\nimport { generateConversationStarters } from \"../services/prompts\";\nimport {\n getRandomTopicOfInterest,\n QuestionPromptArgs,\n} from \"../prompts/getStableQuestionPrompt\";\nimport { useModelStore } from \"../store/modelStore\";\n\ninterface QuerySuggestionPickerProps {\n onSend: (prompt: string, images: string[]) => void;\n inputHeight: number;\n}\n\nconst markdownComponents: Components = {\n p: ({ node, ...props }) => <span {...props} />,\n mark: ({ node, children, ...props }) => (\n <mark {...props}>{children}</mark>\n ),\n code: ({ node, inline, children, ...props }) =>\n inline ? <code {...props}>{children}</code> : <code {...props}>{children}</code>,\n};\n\nexport const QuerySuggestionPicker: React.FC<QuerySuggestionPickerProps> = ({\n onSend,\n inputHeight,\n}) => {\n const hasGenerated = useRef(false);\n const [hasSentPrompt, setHasSentPrompt] = useState(false);\n const [examplePrompts, setExamplePrompts] = useState<string[]>([]);\n const [visiblePrompts, setVisiblePrompts] = useState<string[]>([]);\n\n const scrollRef = useRef<HTMLDivElement>(null);\n const theme = useTheme();\n const isMobile = useMediaQuery((theme: Theme) => theme.breakpoints.down(\"sm\"));\n const { background, text, border, hoverBackground, hoverBorder } =\n theme.palette.chat.suggestion;\n \n const { getCurrentModel, isLoading } = useModelStore();\n\n useEffect(() => {\n if (hasGenerated.current || isLoading) return;\n hasGenerated.current = true;\n\n const currentModel = getCurrentModel();\n const args: QuestionPromptArgs = {\n // keep responses quick and snappy, server may be handling concurrent requests adjust as needed\n limit: 9,\n // pick a random topic of interest from the list, consider using the users preference topics dynamically, otherwise get a random one\n topicOfInterest: getRandomTopicOfInterest(),\n // Pass the current model's system prompt to tailor suggestions\n modelSystemPrompt: currentModel?.systemPrompt,\n };\n generateConversationStarters(args)\n .then((prompts) => {\n // Only set prompts if we have meaningful conversation starters\n if (prompts.length > 0) {\n setExamplePrompts(prompts);\n setVisiblePrompts(prompts.slice(0, 3));\n } else {\n // No meaningful conversation starters generated - don't show component\n setExamplePrompts([]);\n setVisiblePrompts([]);\n }\n })\n .catch((error) => {\n // Error handling is already done in the generateConversationStarters function\n // Just ensure we don't render any prompts if generation fails\n setExamplePrompts([]);\n setVisiblePrompts([]);\n });\n }, [getCurrentModel, isLoading]);\n\n useEffect(() => {\n if (!isLoading) {\n hasGenerated.current = false;\n }\n }, [isLoading]);\n\n useEffect(() => {\n if (hasSentPrompt || examplePrompts.length === 0) return; // Don't shuffle if no prompts\n const interval = setInterval(() => {\n setExamplePrompts((prev) => {\n if (prev.length < 3) return prev; // Need at least 3 prompts to shuffle meaningfully\n const shuffled = [...prev].sort(() => 0.5 - Math.random());\n setVisiblePrompts((current) => [shuffled[0], current[1], current[2]]);\n setTimeout(() => {\n setVisiblePrompts((current) => [shuffled[0], shuffled[1], current[2]]);\n }, 400);\n setTimeout(() => {\n setVisiblePrompts(shuffled.slice(0, 3));\n }, 800);\n return shuffled;\n });\n }, 12000);\n return () => clearInterval(interval);\n }, [hasSentPrompt, examplePrompts.length]);\n\n const displayPrompts = isMobile\n ? visiblePrompts.slice(0, Math.min(visiblePrompts.length, 6))\n : visiblePrompts;\n\n return (\n displayPrompts.length > 0 && (\n <>\n <Box\n ref={scrollRef}\n sx={{\n zIndex: 1200,\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"row\",\n gap: isMobile ? 0.8 : 1,\n px: isMobile ? 1.5 : 2,\n overflowX: isMobile ? \"auto\" : \"visible\",\n scrollSnapType: isMobile ? \"x mandatory\" : \"none\",\n WebkitOverflowScrolling: \"touch\",\n pb: isMobile ? 0.4 : 0,\n \"&::-webkit-scrollbar\": { display: \"none\" },\n }}\n >\n {displayPrompts.map((prompt, i) => (\n <Box\n key={`${i}-${prompt}`}\n sx={{\n px: isMobile ? 1.4 : 2,\n py: isMobile ? 1.2 : 2,\n flex: isMobile ? \"0 0 85%\" : 1,\n minWidth: isMobile ? \"85%\" : \"auto\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: isMobile ? 0.9 : 1,\n backgroundColor: background,\n borderRadius: 2,\n fontSize: isMobile ? \"0.875rem\" : \"0.9rem\",\n color: text,\n userSelect: \"none\",\n cursor: \"pointer\",\n border: `1px solid ${border || alpha(text, 0.12)}`,\n boxShadow: theme.palette.mode === \"dark\"\n ? \"0 4px 18px rgba(0,0,0,0.25)\"\n : \"0 6px 20px rgba(15,23,42,0.12)\",\n scrollSnapAlign: isMobile ? \"start\" : \"none\",\n transition: \"transform 0.25s ease, box-shadow 0.25s ease, background-color 0.25s ease\",\n \"&:hover\": {\n backgroundColor: hoverBackground,\n borderColor: hoverBorder,\n transform: \"translateY(-2px)\",\n boxShadow: theme.palette.mode === \"dark\"\n ? \"0 6px 22px rgba(0,0,0,0.28)\"\n : \"0 8px 24px rgba(15,23,42,0.14)\",\n },\n \"&:active\": {\n transform: \"translateY(0) scale(0.98)\",\n },\n }}\n onClick={() => {\n onSend(prompt, []);\n setHasSentPrompt(true);\n }}\n >\n <Box\n sx={{\n flex: 1,\n lineHeight: 1.4,\n fontWeight: isMobile ? 500 : 400,\n textAlign: isMobile ? \"left\" : \"center\",\n ...(isMobile && { hyphens: \"auto\", wordBreak: \"break-word\" }),\n '& code': {\n borderRadius: 4,\n fontSize: \"0.92em\",\n fontFamily:\n \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\",\n backgroundColor:\n theme.palette.mode === \"dark\"\n ? alpha(theme.palette.common.white, 0.06)\n : alpha(theme.palette.text.primary, 0.06),\n border: `1px solid ${alpha(theme.palette.text.primary, 0.15)}`,\n padding: \"0.15em 0.35em\",\n },\n '& mark': {\n display: \"inline-block\",\n backgroundColor:\n theme.palette.mode === \"dark\"\n ? alpha(theme.palette.common.white, 0.06)\n : alpha(theme.palette.text.primary, 0.12),\n color: theme.palette.mode === \"dark\"\n ? theme.palette.common.white\n : theme.palette.text.primary,\n borderRadius: 4,\n padding: \"0.1em 0.25em\",\n },\n }}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw]}\n components={markdownComponents}\n >\n {prompt}\n </ReactMarkdown>\n </Box>\n </Box>\n ))}\n </Box>\n </>\n )\n );\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-E610-85E732\nconst __banditFingerprint_theme_banditThemets = 'BL-FP-8C4B75-D757';\nconst __auditTrail_theme_banditThemets = 'BL-AU-MGOIKVW6-JQUK';\n// File: banditTheme.ts | Path: src/theme/banditTheme.ts | Hash: e610d757\n\ndeclare module '@mui/material/styles' {\n interface Palette {\n chat: {\n shell: string;\n input: string;\n badge: string;\n badgeHover: string;\n file: string;\n fileIcon: string;\n fileText: string;\n caption: string;\n suggestion: {\n background: string;\n text: string;\n border: string;\n hoverBackground: string;\n hoverBorder: string;\n };\n appBar: {\n background: string;\n border: string;\n icon: string;\n iconHover: string;\n menuBackground: string;\n menuText: string;\n };\n response: {\n userBackground: string;\n userText: string;\n userBorder: string;\n userBubble: string;\n userAvatarBackground: string;\n modelLabel: string;\n border: string;\n aiBackground: string;\n aiText: string;\n aiBorder: string;\n aiBubble: string;\n memoryText: string;\n divider: string;\n containerBackground: string;\n codeBackground?: string;\n codeText?: string;\n };\n };\n }\n interface PaletteOptions {\n chat?: {\n shell: string;\n input: string;\n badge: string;\n badgeHover: string;\n file: string;\n fileIcon: string;\n fileText: string;\n caption: string;\n suggestion?: {\n background: string;\n text: string;\n border: string;\n hoverBackground: string;\n hoverBorder: string;\n };\n appBar?: {\n background: string;\n border: string;\n icon: string;\n iconHover: string;\n menuBackground: string;\n menuText: string;\n };\n response?: {\n userBackground: string;\n userText: string;\n userBorder: string;\n userBubble: string;\n userAvatarBackground: string;\n modelLabel: string;\n border: string;\n aiBackground: string;\n aiText: string;\n aiBorder: string;\n aiBubble: string;\n memoryText: string;\n divider: string;\n containerBackground: string;\n codeBackground?: string;\n codeText?: string;\n };\n };\n }\n}\n\nimport { createTheme, ThemeOptions } from '@mui/material/styles';\n\nconst commonOptions: Partial<ThemeOptions> = {\n typography: {\n fontFamily: `'Segoe UI', Roboto, sans-serif`,\n fontSize: 14,\n // Fix subtitle and heading variants for better dark theme contrast\n subtitle1: {\n color: 'inherit', // Use the theme's text.primary color\n fontWeight: 600,\n },\n subtitle2: {\n color: 'inherit', // Use the theme's text.primary color \n fontWeight: 600,\n },\n h6: {\n color: 'inherit', // Use the theme's text.primary color\n fontWeight: 600,\n },\n },\n shape: {\n borderRadius: 8,\n },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: {\n backgroundImage: 'none',\n },\n },\n },\n },\n};\n\nexport const banditDarkTheme = createTheme({\n ...commonOptions,\n palette: {\n mode: 'dark',\n primary: {\n main: '#e53935',\n },\n secondary: {\n main: '#8e24aa',\n },\n background: {\n default: '#121212',\n paper: '#1e1e1e',\n },\n text: {\n primary: '#ffffff',\n secondary: '#aaaaaa',\n },\n chat: {\n shell: '#121212',\n input: '#2a2a2a',\n badge: '#444',\n badgeHover: '#666',\n file: '#333',\n fileIcon: '#555',\n fileText: '#fff',\n caption: '#888',\n suggestion: {\n background: '#2a2a2a',\n text: '#ccc',\n border: '#444',\n hoverBackground: '#333',\n hoverBorder: '#666',\n },\n appBar: {\n background: \"#000\",\n border: \"#333\",\n icon: \"#fff\",\n iconHover: \"#222\",\n menuBackground: \"#222\",\n menuText: \"#fff\",\n },\n response: {\n userBackground: '#1f1f1f',\n userText: '#6C9AC5',\n userBorder: '#444',\n userBubble: '#2a2a2a',\n userAvatarBackground: 'transparent',\n modelLabel: '#888',\n border: '#444',\n aiBackground: '#2f2f2f',\n aiText: '#fff',\n aiBorder: '#444',\n aiBubble: '#2f2f2f',\n memoryText: '#00e676',\n divider: '#555',\n containerBackground: '#1c1c1c',\n },\n },\n },\n});\n\nexport const banditLightTheme = createTheme({\n ...commonOptions,\n palette: {\n mode: 'light',\n primary: {\n main: '#d32f2f',\n },\n secondary: {\n main: '#7b1fa2',\n },\n background: {\n default: '#fafafa',\n paper: '#ffffff',\n },\n text: {\n primary: '#1a1a1a',\n secondary: '#555555',\n },\n chat: {\n shell: '#f5f5f5',\n input: '#f5f5f5', // already matching shell, no change needed\n badge: '#ddd',\n badgeHover: '#bbb',\n file: '#eee',\n fileIcon: '#ccc',\n fileText: '#000',\n caption: '#555',\n suggestion: {\n background: '#f0f0f0',\n text: '#222',\n border: '#ddd',\n hoverBackground: '#e0e0e0',\n hoverBorder: '#ccc',\n },\n appBar: {\n background: \"#ffffff\",\n border: \"#ddd\",\n icon: \"#000\",\n iconHover: \"#f0f0f0\",\n menuBackground: \"#f9f9f9\",\n menuText: \"#000\",\n },\n response: {\n userBackground: '#f0f0f0', // improved for avatar appearance\n userText: '#1565c0',\n userBorder: '#bbb', // softened border\n userBubble: '#ffffff', // improved contrast and UX\n userAvatarBackground: '#cccccc',\n modelLabel: '#888',\n border: '#ccc',\n aiBackground: '#eaeaea', // softened container-style background for AI bubble\n aiText: '#1a1a1a',\n aiBorder: '#ccc',\n aiBubble: '#ffffff',\n memoryText: '#2e7d32',\n divider: '#ccc',\n containerBackground: '#eaeaea',\n },\n },\n },\n});\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-9A1D-23CF7B\nconst __banditFingerprint_theme_corporateThemets = 'BL-FP-223D0C-A225';\nconst __auditTrail_theme_corporateThemets = 'BL-AU-MGOIKVW7-CIOP';\n// File: corporateTheme.ts | Path: src/theme/corporateTheme.ts | Hash: 9a1da225\n\nimport { createTheme, ThemeOptions } from '@mui/material/styles';\n\nconst commonOptions: Partial<ThemeOptions> = {\n typography: {\n fontFamily: `'Segoe UI', Roboto, sans-serif`,\n fontSize: 14,\n // Fix subtitle and heading variants for better dark theme contrast\n subtitle1: {\n color: 'inherit', // Use the theme's text.primary color\n fontWeight: 600,\n },\n subtitle2: {\n color: 'inherit', // Use the theme's text.primary color \n fontWeight: 600,\n },\n h6: {\n color: 'inherit', // Use the theme's text.primary color\n fontWeight: 600,\n },\n },\n shape: {\n borderRadius: 6,\n },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: {\n backgroundImage: 'none',\n },\n },\n },\n },\n};\n\nexport const corporateDarkTheme = createTheme({\n ...commonOptions,\n palette: {\n mode: 'dark',\n primary: {\n main: '#0d47a1',\n },\n secondary: {\n main: '#546e7a',\n },\n background: {\n default: '#101820',\n paper: '#1c1f26',\n },\n text: {\n primary: '#e0e0e0',\n secondary: '#9e9e9e',\n },\n chat: {\n shell: '#101820',\n input: '#1c1f26',\n badge: '#263238',\n badgeHover: '#37474f',\n file: '#1a1a1a',\n fileIcon: '#607d8b',\n fileText: '#fff',\n caption: '#90a4ae',\n suggestion: {\n background: '#1e2935',\n text: '#cfd8dc',\n border: '#37474f',\n hoverBackground: '#263238',\n hoverBorder: '#455a64',\n },\n appBar: {\n background: \"#0d1117\",\n border: \"#1f2937\",\n icon: \"#e0e0e0\",\n iconHover: \"#263238\",\n menuBackground: \"#1f2937\",\n menuText: \"#ffffff\",\n },\n response: {\n userBackground: '#1e2935',\n userText: '#90caf9',\n userBorder: '#37474f',\n userBubble: '#263238',\n userAvatarBackground: 'transparent',\n modelLabel: '#b0bec5',\n border: '#455a64',\n aiBackground: '#1f2733',\n aiText: '#ffffff',\n aiBorder: '#37474f',\n aiBubble: '#2c3e50',\n memoryText: '#4db6ac',\n divider: '#546e7a',\n containerBackground: '#1c1f26',\n },\n },\n },\n});\n\nexport const corporateLightTheme = createTheme({\n ...commonOptions,\n palette: {\n mode: 'light',\n primary: {\n main: '#1565c0',\n },\n secondary: {\n main: '#607d8b',\n },\n background: {\n default: '#f7f9fc',\n paper: '#ffffff',\n },\n text: {\n primary: '#212121',\n secondary: '#616161',\n },\n chat: {\n shell: '#f2f5f9',\n input: '#ffffff',\n badge: '#cfd8dc',\n badgeHover: '#b0bec5',\n file: '#e0e0e0',\n fileIcon: '#546e7a',\n fileText: '#000',\n caption: '#607d8b',\n suggestion: {\n background: '#e3f2fd',\n text: '#1565c0',\n border: '#bbdefb',\n hoverBackground: '#d0e9ff',\n hoverBorder: '#90caf9',\n },\n appBar: {\n background: \"#ffffff\",\n border: \"#e0e0e0\",\n icon: \"#000\",\n iconHover: \"#eeeeee\",\n menuBackground: \"#f0f0f0\",\n menuText: \"#000\",\n },\n response: {\n userBackground: '#e3f2fd',\n userText: '#0d47a1',\n userBorder: '#90caf9',\n userBubble: '#ffffff',\n userAvatarBackground: '#bbdefb',\n modelLabel: '#78909c',\n border: '#90a4ae',\n aiBackground: '#f0f4f8',\n aiText: '#212121',\n aiBorder: '#cfd8dc',\n aiBubble: '#ffffff',\n memoryText: '#00796b',\n divider: '#bdbdbd',\n containerBackground: '#e3f2fd',\n },\n },\n },\n});","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-0FDA-7A06F8\nconst __banditFingerprint_theme_neutralThemets = 'BL-FP-B03C04-FA20';\nconst __auditTrail_theme_neutralThemets = 'BL-AU-MGOIKVW8-1YX7';\n// File: neutralTheme.ts | Path: src/theme/neutralTheme.ts | Hash: 0fdafa20\n\nimport { createTheme, ThemeOptions } from '@mui/material/styles';\n\nconst commonOptions: Partial<ThemeOptions> = {\n typography: {\n fontFamily: `'Segoe UI', Roboto, sans-serif`,\n fontSize: 14,\n // Fix subtitle and heading variants for better dark theme contrast\n subtitle1: {\n color: 'inherit', // Use the theme's text.primary color\n fontWeight: 600,\n },\n subtitle2: {\n color: 'inherit', // Use the theme's text.primary color \n fontWeight: 600,\n },\n h6: {\n color: 'inherit', // Use the theme's text.primary color\n fontWeight: 600,\n },\n },\n shape: {\n borderRadius: 8,\n },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: {\n backgroundImage: 'none',\n },\n },\n },\n },\n};\n\nexport const neutralDarkTheme = createTheme({\n ...commonOptions,\n palette: {\n mode: 'dark',\n primary: {\n main: '#4d90fe',\n },\n secondary: {\n main: '#b39ddb',\n },\n background: {\n default: '#121212',\n paper: '#1e1e1e',\n },\n text: {\n primary: '#f5f5f5',\n secondary: '#bbbbbb',\n },\n chat: {\n shell: '#121212',\n input: '#1c1c1c',\n badge: '#2c2c2c',\n badgeHover: '#3c3c3c',\n file: '#2a2a2a',\n fileIcon: '#90caf9',\n fileText: '#ffffff',\n caption: '#aaaaaa',\n suggestion: {\n background: '#1e1e1e',\n text: '#e3f2fd',\n border: '#333',\n hoverBackground: '#2a2a2a',\n hoverBorder: '#444',\n },\n appBar: {\n background: '#1a1a1a',\n border: '#333',\n icon: '#90caf9',\n iconHover: '#bbdefb',\n menuBackground: '#242424',\n menuText: '#e0e0e0',\n },\n response: {\n userBackground: '#2a2a2a',\n userText: '#82b1ff',\n userBorder: '#444',\n userBubble: '#2f2f2f',\n userAvatarBackground: '#3b3b3b',\n modelLabel: '#bbbbbb',\n border: '#444',\n aiBackground: '#232323',\n aiText: '#e0e0e0',\n aiBorder: '#444',\n aiBubble: '#292929',\n memoryText: '#aed581',\n divider: '#444',\n containerBackground: '#1c1c1c',\n },\n },\n },\n});\n\nexport const neutralLightTheme = createTheme({\n ...commonOptions,\n palette: {\n mode: 'light',\n primary: {\n main: '#1565c0',\n },\n secondary: {\n main: '#9575cd',\n },\n background: {\n default: '#f4f4f4',\n paper: '#ffffff',\n },\n text: {\n primary: '#1a1a1a',\n secondary: '#555',\n },\n chat: {\n shell: '#ffffff',\n input: '#f5f5f5',\n badge: '#ddd',\n badgeHover: '#ccc',\n file: '#eee',\n fileIcon: '#1565c0',\n fileText: '#000',\n caption: '#666',\n suggestion: {\n background: '#f9f9f9',\n text: '#333',\n border: '#ddd',\n hoverBackground: '#e0e0e0',\n hoverBorder: '#ccc',\n },\n appBar: {\n background: '#ffffff',\n border: '#ddd',\n icon: '#1565c0',\n iconHover: '#e3f2fd',\n menuBackground: '#fafafa',\n menuText: '#111',\n },\n response: {\n userBackground: '#e8f0fe',\n userText: '#0d47a1',\n userBorder: '#bbb',\n userBubble: '#ffffff',\n userAvatarBackground: '#bbdefb',\n modelLabel: '#666',\n border: '#ccc',\n aiBackground: '#f0f0f0',\n aiText: '#1a1a1a',\n aiBorder: '#ccc',\n aiBubble: '#ffffff',\n memoryText: '#558b2f',\n divider: '#ccc',\n containerBackground: '#f5f5f5',\n },\n },\n },\n});","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-558E-84B97F\nconst __banditFingerprint_theme_cyberPunkThemets = 'BL-FP-D0CD8A-872D';\nconst __auditTrail_theme_cyberPunkThemets = 'BL-AU-MGOIKVW7-6OGC';\n// File: cyberPunkTheme.ts | Path: src/theme/cyberPunkTheme.ts | Hash: 558e872d\n\nimport { createTheme } from \"@mui/material/styles\";\nimport { ThemeOptions } from \"@mui/material/styles\";\n\nconst commonOptions: Partial<ThemeOptions> = {\n typography: {\n fontFamily: `'Orbitron', 'Segoe UI', Roboto, sans-serif`,\n fontSize: 14,\n // Fix subtitle and heading variants for better dark theme contrast\n subtitle1: {\n color: 'inherit', // Use the theme's text.primary color\n fontWeight: 600,\n },\n subtitle2: {\n color: 'inherit', // Use the theme's text.primary color \n fontWeight: 600,\n },\n h6: {\n color: 'inherit', // Use the theme's text.primary color\n fontWeight: 600,\n },\n },\n shape: {\n borderRadius: 8,\n },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: {\n backgroundImage: \"none\",\n },\n },\n },\n },\n};\n\nexport const cyberPunkDarkTheme = createTheme({\n ...commonOptions,\n palette: {\n mode: \"dark\",\n primary: {\n main: \"#ff00ff\",\n },\n secondary: {\n main: \"#00ffff\",\n },\n background: {\n default: \"#0a0a0a\",\n paper: \"#1a1a1a\",\n },\n text: {\n primary: \"#e0e0e0\",\n secondary: \"#9c9c9c\",\n },\n chat: {\n shell: \"#0a0a0a\",\n input: \"#1a1a1a\",\n badge: \"#290033\",\n badgeHover: \"#3f004d\",\n file: \"#2d2d2d\",\n fileIcon: \"#d500f9\",\n fileText: \"#ffffff\",\n caption: \"#ff80ab\",\n suggestion: {\n background: \"#1a1a1a\",\n text: \"#e0e0e0\",\n border: \"#ff00ff\",\n hoverBackground: \"#2c2c2c\",\n hoverBorder: \"#ff80ff\",\n },\n appBar: {\n background: \"#0a0a0a\",\n border: \"#2c2c2c\",\n icon: \"#ff00ff\",\n iconHover: \"#ff80ff\",\n menuBackground: \"#1c1c1c\",\n menuText: \"#ffffff\",\n },\n response: {\n userBackground: \"#290033\",\n userText: \"#ffccff\",\n userBorder: \"#ff80ff\",\n userBubble: \"#330044\",\n userAvatarBackground: \"#ff00ff\",\n modelLabel: \"#ff80ff\",\n border: \"#ff00ff\",\n aiBackground: \"#1a1a1a\",\n aiText: \"#ffffff\",\n aiBorder: \"#ff00ff\",\n aiBubble: \"#1f002a\",\n memoryText: \"#00e676\",\n divider: \"#ff00ff\",\n containerBackground: \"#100010\",\n },\n },\n },\n});\n\nexport const cyberPunkLightTheme = createTheme({\n ...commonOptions,\n palette: {\n mode: \"light\",\n primary: {\n main: \"#d500f9\",\n },\n secondary: {\n main: \"#00bcd4\",\n },\n background: {\n default: \"#fdf6ff\",\n paper: \"#ffffff\",\n },\n text: {\n primary: \"#1a1a1a\",\n secondary: \"#555\",\n },\n chat: {\n shell: \"#fdf6ff\",\n input: \"#fdf6ff\",\n badge: \"#e0b3ff\",\n badgeHover: \"#cc99ff\",\n file: \"#f8e8ff\",\n fileIcon: \"#aa00ff\",\n fileText: \"#000\",\n caption: \"#9c27b0\",\n suggestion: {\n background: \"#f3e5f5\",\n text: \"#4a148c\",\n border: \"#ce93d8\",\n hoverBackground: \"#e1bee7\",\n hoverBorder: \"#ba68c8\",\n },\n appBar: {\n background: \"#fdf6ff\",\n border: \"#ce93d8\",\n icon: \"#aa00ff\",\n iconHover: \"#d500f9\",\n menuBackground: \"#f3e5f5\",\n menuText: \"#4a148c\",\n },\n response: {\n userBackground: \"#f3e5f5\",\n userText: \"#4a148c\",\n userBorder: \"#ba68c8\",\n userBubble: \"#ffffff\",\n userAvatarBackground: \"#aa00ff\",\n modelLabel: \"#6a1b9a\",\n border: \"#ce93d8\",\n aiBackground: \"#f8e8ff\",\n aiText: \"#1a1a1a\",\n aiBorder: \"#ba68c8\",\n aiBubble: \"#f3e5f5\",\n memoryText: \"#2e7d32\",\n divider: \"#ba68c8\",\n containerBackground: \"#fce4ec\",\n },\n },\n },\n});","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-90BA-28DE38\nconst __banditFingerprint_theme_dawnThemets = 'BL-FP-4593C0-E9E0';\nconst __auditTrail_theme_dawnThemets = 'BL-AU-MGOIKVW7-E0FE';\n// File: dawnTheme.ts | Path: src/theme/dawnTheme.ts | Hash: 90bae9e0\n\nimport { createTheme, ThemeOptions } from \"@mui/material/styles\";\n\nconst commonOptions: Partial<ThemeOptions> = {\n typography: {\n fontFamily: `'Segoe UI', Roboto, sans-serif`,\n fontSize: 14,\n // Fix subtitle and heading variants for better dark theme contrast\n subtitle1: {\n color: 'inherit', // Use the theme's text.primary color\n fontWeight: 600,\n },\n subtitle2: {\n color: 'inherit', // Use the theme's text.primary color \n fontWeight: 600,\n },\n h6: {\n color: 'inherit', // Use the theme's text.primary color\n fontWeight: 600,\n },\n },\n shape: {\n borderRadius: 8,\n },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: {\n backgroundImage: \"none\",\n },\n },\n },\n },\n};\n\nexport const dawnLightTheme = createTheme({\n ...commonOptions,\n palette: {\n mode: \"light\",\n primary: {\n main: \"#e07a5f\",\n },\n secondary: {\n main: \"#3d405b\",\n },\n background: {\n default: \"#f9f6f1\",\n paper: \"#ffffff\",\n },\n text: {\n primary: \"#2f2f2f\",\n secondary: \"#555555\",\n },\n chat: {\n shell: \"#f4f1ed\",\n input: \"#ffffff\",\n badge: \"#ddd\",\n badgeHover: \"#bbb\",\n file: \"#eee\",\n fileIcon: \"#ccc\",\n fileText: \"#000\",\n caption: \"#555\",\n suggestion: {\n background: \"#f0f0f0\",\n text: \"#222\",\n border: \"#ddd\",\n hoverBackground: \"#e0e0e0\",\n hoverBorder: \"#ccc\",\n },\n appBar: {\n background: \"#ffffff\",\n border: \"#ddd\",\n icon: \"#000\",\n iconHover: \"#f0f0f0\",\n menuBackground: \"#f9f9f9\",\n menuText: \"#000\",\n },\n response: {\n userBackground: \"#f1ede8\",\n userText: \"#1565c0\",\n userBorder: \"#bbb\",\n userBubble: \"#ffffff\",\n userAvatarBackground: \"#cccccc\",\n modelLabel: \"#888\",\n border: \"#ccc\",\n aiBackground: \"#f3e9e1\",\n aiText: \"#1a1a1a\",\n aiBorder: \"#ccc\",\n aiBubble: \"#ffffff\",\n memoryText: \"#2e7d32\",\n divider: \"#ccc\",\n containerBackground: \"#f3e9e1\",\n },\n },\n },\n});\n\nexport const dawnDarkTheme = createTheme({\n ...commonOptions,\n palette: {\n mode: \"dark\",\n primary: {\n main: \"#f4a261\",\n },\n secondary: {\n main: \"#8d99ae\",\n },\n background: {\n default: \"#2e2a26\",\n paper: \"#38322e\",\n },\n text: {\n primary: \"#f1f1f1\",\n secondary: \"#aaaaaa\",\n },\n chat: {\n shell: \"#2e2a26\",\n input: \"#3a3530\",\n badge: \"#444\",\n badgeHover: \"#666\",\n file: \"#333\",\n fileIcon: \"#555\",\n fileText: \"#fff\",\n caption: \"#888\",\n suggestion: {\n background: \"#3a3530\",\n text: \"#ccc\",\n border: \"#444\",\n hoverBackground: \"#444\",\n hoverBorder: \"#666\",\n },\n appBar: {\n background: \"#2e2a26\",\n border: \"#444\",\n icon: \"#fff\",\n iconHover: \"#222\",\n menuBackground: \"#3a3530\",\n menuText: \"#fff\",\n },\n response: {\n userBackground: \"#524841\",\n userText: \"#f4a261\",\n userBorder: \"#666\",\n userBubble: \"#3a3530\",\n userAvatarBackground: \"transparent\",\n modelLabel: \"#bbb\",\n border: \"#444\",\n aiBackground: \"#3b332d\",\n aiText: \"#ffffff\",\n aiBorder: \"#666\",\n aiBubble: \"#443c35\",\n memoryText: \"#e9c46a\",\n divider: \"#555\",\n containerBackground: \"#3b332d\",\n },\n },\n },\n});","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-21CD-792A03\nconst __banditFingerprint_theme_mistThemets = 'BL-FP-733EC7-1BFB';\nconst __auditTrail_theme_mistThemets = 'BL-AU-MGOIKVW8-CGIJ';\n// File: mistTheme.ts | Path: src/theme/mistTheme.ts | Hash: 21cd1bfb\n\nimport { createTheme } from '@mui/material/styles';\n\nexport const mistLightTheme = createTheme({\n typography: {\n fontFamily: `'Segoe UI', Roboto, sans-serif`,\n fontSize: 14,\n // Fix subtitle and heading variants for better dark theme contrast\n subtitle1: {\n color: 'inherit', // Use the theme's text.primary color\n fontWeight: 600,\n },\n subtitle2: {\n color: 'inherit', // Use the theme's text.primary color \n fontWeight: 600,\n },\n h6: {\n color: 'inherit', // Use the theme's text.primary color\n fontWeight: 600,\n },\n },\n shape: {\n borderRadius: 8,\n },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: {\n backgroundImage: 'none',\n },\n },\n },\n },\n palette: {\n mode: 'light',\n primary: { main: '#5c6bc0' }, // Indigo 400\n secondary: { main: '#8e99f3' }, // Indigo 200\n background: {\n default: '#f9fafc',\n paper: '#ffffff',\n },\n text: {\n primary: '#212121',\n secondary: '#555',\n },\n chat: {\n shell: '#f2f3f5',\n input: '#f9f9fb',\n badge: '#ddd',\n badgeHover: '#bbb',\n file: '#f5f5f5',\n fileIcon: '#aaa',\n fileText: '#000',\n caption: '#666',\n suggestion: {\n background: '#e8eaf6',\n text: '#1a237e',\n border: '#c5cae9',\n hoverBackground: '#dfe3f3',\n hoverBorder: '#b0bec5',\n },\n appBar: {\n background: '#e3eaf4',\n border: '#c5d3e5',\n icon: '#3f51b5',\n iconHover: '#5c6bc0',\n menuBackground: '#f0f2f7',\n menuText: '#1a1a1a',\n },\n response: {\n userBackground: '#e3f2fd',\n userText: '#0d47a1',\n userBorder: '#bbdefb',\n userBubble: '#ffffff',\n userAvatarBackground: '#cfd8dc',\n modelLabel: '#666',\n border: '#ccc',\n aiBackground: '#e8eaf6',\n aiText: '#1a1a1a',\n aiBorder: '#c5cae9',\n aiBubble: '#ffffff',\n memoryText: '#2e7d32',\n divider: '#ccc',\n containerBackground: '#eaeff7',\n },\n },\n },\n});\n\nexport const mistDarkTheme = createTheme({\n typography: {\n fontFamily: `'Segoe UI', Roboto, sans-serif`,\n fontSize: 14,\n // Fix subtitle and heading variants for better dark theme contrast\n subtitle1: {\n color: 'inherit', // Use the theme's text.primary color\n fontWeight: 600,\n },\n subtitle2: {\n color: 'inherit', // Use the theme's text.primary color \n fontWeight: 600,\n },\n h6: {\n color: 'inherit', // Use the theme's text.primary color\n fontWeight: 600,\n },\n },\n shape: {\n borderRadius: 8,\n },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: {\n backgroundImage: 'none',\n },\n },\n },\n },\n palette: {\n mode: 'dark',\n primary: { main: '#8c9eff' },\n secondary: { main: '#536dfe' },\n background: {\n default: '#1a1c23',\n paper: '#232631',\n },\n text: {\n primary: '#e0e0e0',\n secondary: '#aaa',\n },\n chat: {\n shell: '#1a1c23',\n input: '#2c2e38',\n badge: '#444',\n badgeHover: '#666',\n file: '#2e2e2e',\n fileIcon: '#777',\n fileText: '#fff',\n caption: '#888',\n suggestion: {\n background: '#303248',\n text: '#c5cae9',\n border: '#444',\n hoverBackground: '#3a3d5a',\n hoverBorder: '#666',\n },\n appBar: {\n background: '#20222a',\n border: '#333',\n icon: '#ccc',\n iconHover: '#fff',\n menuBackground: '#2c2e38',\n menuText: '#eee',\n },\n response: {\n userBackground: '#283593',\n userText: '#bbdefb',\n userBorder: '#3949ab',\n userBubble: '#303f9f',\n userAvatarBackground: '#3949ab',\n modelLabel: '#aaa',\n border: '#444',\n aiBackground: '#2f2f3f',\n aiText: '#e0e0e0',\n aiBorder: '#555',\n aiBubble: '#3a3a4f',\n memoryText: '#80cbc4',\n divider: '#444',\n containerBackground: '#232631',\n },\n },\n },\n});","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-32A4-940977\nconst __banditFingerprint_theme_sageThemets = 'BL-FP-A3B652-4130';\nconst __auditTrail_theme_sageThemets = 'BL-AU-MGOIKVW8-1SOQ';\n// File: sageTheme.ts | Path: src/theme/sageTheme.ts | Hash: 32a44130\n\nimport { createTheme } from '@mui/material/styles';\n\nexport const sageLightTheme = createTheme({\n typography: {\n fontFamily: `'Segoe UI', Roboto, sans-serif`,\n fontSize: 14,\n // Fix subtitle and heading variants for better contrast\n subtitle1: {\n color: 'inherit',\n fontWeight: 600,\n },\n subtitle2: {\n color: 'inherit',\n fontWeight: 600,\n },\n h6: {\n color: 'inherit',\n fontWeight: 600,\n },\n },\n shape: {\n borderRadius: 8,\n },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: {\n backgroundImage: 'none',\n },\n },\n },\n },\n palette: {\n mode: 'light',\n primary: {\n main: '#4CAF50',\n },\n secondary: {\n main: '#8BC34A',\n },\n background: {\n default: '#f8f8f4',\n paper: '#ffffff',\n },\n text: {\n primary: '#1a1a1a',\n secondary: '#555',\n },\n chat: {\n shell: '#f4f6f4',\n input: '#f0f2ef',\n badge: '#cfd8dc',\n badgeHover: '#b0bec5',\n file: '#e0f2f1',\n fileIcon: '#a5d6a7',\n fileText: '#1a1a1a',\n caption: '#5c6b5c',\n suggestion: {\n background: '#e8f5e9',\n text: '#2e7d32',\n border: '#c8e6c9',\n hoverBackground: '#dcedc8',\n hoverBorder: '#aed581',\n },\n appBar: {\n background: '#ffffff',\n border: '#c8e6c9',\n icon: '#2e7d32',\n iconHover: '#81c784',\n menuBackground: '#f1f8e9',\n menuText: '#2e7d32',\n },\n response: {\n userBackground: '#f1f8e9',\n userText: '#33691e',\n userBorder: '#aed581',\n userBubble: '#ffffff',\n userAvatarBackground: '#d0f0c0',\n modelLabel: '#689f38',\n border: '#c5e1a5',\n aiBackground: '#f0f4c3',\n aiText: '#2e7d32',\n aiBorder: '#cddc39',\n aiBubble: '#ffffff',\n memoryText: '#43a047',\n divider: '#cfd8dc',\n containerBackground: '#f8f8f4',\n },\n },\n },\n});\n\nexport const sageDarkTheme = createTheme({\n typography: {\n fontFamily: `'Segoe UI', Roboto, sans-serif`,\n fontSize: 14,\n // Fix subtitle and heading variants for better contrast\n subtitle1: {\n color: 'inherit',\n fontWeight: 600,\n },\n subtitle2: {\n color: 'inherit',\n fontWeight: 600,\n },\n h6: {\n color: 'inherit',\n fontWeight: 600,\n },\n },\n shape: {\n borderRadius: 8,\n },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: {\n backgroundImage: 'none',\n },\n },\n },\n },\n palette: {\n mode: 'dark',\n primary: {\n main: '#66bb6a',\n },\n secondary: {\n main: '#9ccc65',\n },\n background: {\n default: '#1c1f1c',\n paper: '#26332d',\n },\n text: {\n primary: '#e8f5e9',\n secondary: '#a5d6a7',\n },\n chat: {\n shell: '#1e221e',\n input: '#2a2f2a',\n badge: '#455a64',\n badgeHover: '#546e7a',\n file: '#37474f',\n fileIcon: '#81c784',\n fileText: '#ffffff',\n caption: '#a5d6a7',\n suggestion: {\n background: '#455e47',\n text: '#e8f5e9',\n border: '#388e3c',\n hoverBackground: '#1b5e20',\n hoverBorder: '#66bb6a',\n },\n appBar: {\n background: '#1c1f1c',\n border: '#2e7d32',\n icon: '#81c784',\n iconHover: '#a5d6a7',\n menuBackground: '#26332d',\n menuText: '#c8e6c9',\n },\n response: {\n userBackground: '#2a2f2a',\n userText: '#a5d6a7',\n userBorder: '#388e3c',\n userBubble: '#324934',\n userAvatarBackground: '#1b5e20',\n modelLabel: '#66bb6a',\n border: '#2e7d32',\n aiBackground: '#1e2f1e',\n aiText: '#ffffff',\n aiBorder: '#66bb6a',\n aiBubble: '#2e7d32',\n memoryText: '#66bb6a',\n divider: '#455a64',\n containerBackground: '#1c1f1c',\n },\n },\n },\n});","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-B064-6DA4AB\nconst __banditFingerprint_theme_stoneThemets = 'BL-FP-C51A0E-1014';\nconst __auditTrail_theme_stoneThemets = 'BL-AU-MGOIKVW8-CXXR';\n// File: stoneTheme.ts | Path: src/theme/stoneTheme.ts | Hash: b0641014\n\nimport { createTheme } from '@mui/material/styles';\n\nexport const stoneLightTheme = createTheme({\n typography: {\n fontFamily: `'Segoe UI', Roboto, sans-serif`,\n fontSize: 14,\n // Fix subtitle and heading variants for better contrast\n subtitle1: {\n color: 'inherit',\n fontWeight: 600,\n },\n subtitle2: {\n color: 'inherit',\n fontWeight: 600,\n },\n h6: {\n color: 'inherit',\n fontWeight: 600,\n },\n },\n shape: {\n borderRadius: 8,\n },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: {\n backgroundImage: 'none',\n },\n },\n },\n },\n palette: {\n mode: 'light',\n primary: {\n main: '#4a4a4a',\n },\n secondary: {\n main: '#767676',\n },\n background: {\n default: '#e5e5e0',\n paper: '#f0f0eb',\n },\n text: {\n primary: '#222222',\n secondary: '#555555',\n },\n chat: {\n shell: '#e5e5e0',\n input: '#f5f5f0',\n badge: '#d2d2d2',\n badgeHover: '#bababa',\n file: '#ecece8',\n fileIcon: '#aaaaaa',\n fileText: '#000000',\n caption: '#555',\n suggestion: {\n background: '#f0f0eb',\n text: '#222',\n border: '#d4d4d4',\n hoverBackground: '#e2e2e2',\n hoverBorder: '#c0c0c0',\n },\n appBar: {\n background: '#f9f9f4',\n border: '#d8d8d8',\n icon: '#1a1a1a',\n iconHover: '#e6e6e6',\n menuBackground: '#f0f0eb',\n menuText: '#1a1a1a',\n },\n response: {\n userBackground: '#efefea',\n userText: '#2e5c8a',\n userBorder: '#c5c5c5',\n userBubble: '#ffffff',\n userAvatarBackground: '#cfcfcf',\n modelLabel: '#777',\n border: '#ccc',\n aiBackground: '#e3e3dd',\n aiText: '#222',\n aiBorder: '#bbb',\n aiBubble: '#ffffff',\n memoryText: '#3c6e47',\n divider: '#ccc',\n containerBackground: '#e3e3dd',\n },\n },\n },\n});\n\nexport const stoneDarkTheme = createTheme({\n typography: {\n fontFamily: `'Segoe UI', Roboto, sans-serif`,\n fontSize: 14,\n // Fix subtitle and heading variants for better contrast\n subtitle1: {\n color: 'inherit',\n fontWeight: 600,\n },\n subtitle2: {\n color: 'inherit',\n fontWeight: 600,\n },\n h6: {\n color: 'inherit',\n fontWeight: 600,\n },\n },\n shape: {\n borderRadius: 8,\n },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: {\n backgroundImage: 'none',\n },\n },\n },\n },\n palette: {\n mode: 'dark',\n primary: {\n main: '#bfbfbf',\n },\n secondary: {\n main: '#999999',\n },\n background: {\n default: '#1b1b1b',\n paper: '#262626',\n },\n text: {\n primary: '#f5f5f5',\n secondary: '#c2c2c2',\n },\n chat: {\n shell: '#1b1b1b',\n input: '#232323',\n badge: '#444',\n badgeHover: '#666',\n file: '#2d2d2d',\n fileIcon: '#888',\n fileText: '#fff',\n caption: '#888',\n suggestion: {\n background: '#232323',\n text: '#ccc',\n border: '#444',\n hoverBackground: '#2e2e2e',\n hoverBorder: '#666',\n },\n appBar: {\n background: '#121212',\n border: '#2c2c2c',\n icon: '#f5f5f5',\n iconHover: '#1e1e1e',\n menuBackground: '#1f1f1f',\n menuText: '#eee',\n },\n response: {\n userBackground: '#2b2b2b',\n userText: '#80b3ff',\n userBorder: '#444',\n userBubble: '#232323',\n userAvatarBackground: 'transparent',\n modelLabel: '#888',\n border: '#444',\n aiBackground: '#2d2d2d',\n aiText: '#fff',\n aiBorder: '#444',\n aiBubble: '#2d2d2d',\n memoryText: '#9ccc65',\n divider: '#555',\n containerBackground: '#1f1f1f',\n },\n },\n },\n});","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-47A2-A8A3C4\nconst __banditFingerprint_theme_oceanThemets = 'BL-FP-A38F0D-008A';\nconst __auditTrail_theme_oceanThemets = 'BL-AU-MGOIKVW8-NS7W';\n// File: oceanTheme.ts | Path: src/theme/oceanTheme.ts | Hash: 47a2008a\n\nimport { createTheme, ThemeOptions } from \"@mui/material/styles\";\n\nexport const oceanDarkTheme: ThemeOptions = createTheme({\n typography: {\n fontFamily: '\"Inter\", \"Roboto\", \"Helvetica\", \"Arial\", sans-serif',\n fontSize: 14,\n subtitle1: { color: 'inherit', fontWeight: 600 },\n subtitle2: { color: 'inherit', fontWeight: 600 },\n h6: { color: 'inherit', fontWeight: 600 },\n },\n shape: { borderRadius: 8 },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: { backgroundImage: 'none' },\n },\n },\n },\n palette: {\n mode: \"dark\",\n primary: {\n main: \"#00bcd4\", // Cyan\n light: \"#33c9dc\",\n dark: \"#0097a7\",\n },\n secondary: {\n main: \"#004d5a\", // Deep ocean blue\n light: \"#336b7a\",\n dark: \"#00363f\",\n },\n background: {\n default: \"#0a1929\", // Deep ocean\n paper: \"#1a2332\",\n },\n text: {\n primary: \"#e1f5fe\",\n secondary: \"#b3e5fc\",\n },\n divider: \"#004d5a\",\n chat: {\n shell: \"#1a2332\",\n input: \"#1a2332\", \n badge: \"#00bcd4\",\n badgeHover: \"#33c9dc\",\n file: \"#004d5a\",\n fileIcon: \"#00bcd4\",\n fileText: \"#e1f5fe\",\n caption: \"#b3e5fc\",\n suggestion: {\n background: \"#1a2332\",\n text: \"#e1f5fe\",\n border: \"#004d5a\",\n hoverBackground: \"#004d5a\",\n hoverBorder: \"#00bcd4\",\n },\n appBar: {\n background: \"linear-gradient(135deg, #0a1929 0%, #1a2332 100%)\",\n border: \"#004d5a\",\n icon: \"#00bcd4\",\n iconHover: \"#33c9dc\",\n menuBackground: \"#1a2332\",\n menuText: \"#e1f5fe\",\n },\n response: {\n userBackground: \"#004d5a\",\n userText: \"#e1f5fe\",\n userBorder: \"#00bcd4\",\n userBubble: \"#1a2332\",\n userAvatarBackground: \"#00bcd4\",\n modelLabel: \"#b3e5fc\",\n border: \"#004d5a\",\n aiBackground: \"#0a1929\",\n aiText: \"#e1f5fe\",\n aiBorder: \"#004d5a\",\n aiBubble: \"#1a2332\",\n memoryText: \"#b3e5fc\",\n divider: \"#004d5a\",\n containerBackground: \"#0a1929\",\n },\n },\n },\n});\n\nexport const oceanLightTheme: ThemeOptions = createTheme({\n typography: {\n fontFamily: '\"Inter\", \"Roboto\", \"Helvetica\", \"Arial\", sans-serif',\n fontSize: 14,\n subtitle1: { color: 'inherit', fontWeight: 600 },\n subtitle2: { color: 'inherit', fontWeight: 600 },\n h6: { color: 'inherit', fontWeight: 600 },\n },\n shape: { borderRadius: 8 },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: { backgroundImage: 'none' },\n },\n },\n },\n palette: {\n mode: \"light\",\n primary: {\n main: \"#006064\", // Deep teal\n light: \"#33878a\",\n dark: \"#00424a\",\n },\n secondary: {\n main: \"#b2dfdb\", // Light teal\n light: \"#c4e9e5\",\n dark: \"#7c9c98\",\n },\n background: {\n default: \"#e0f2f1\", // Very light teal\n paper: \"#ffffff\",\n },\n text: {\n primary: \"#263238\",\n secondary: \"#37474f\",\n },\n divider: \"#b2dfdb\",\n chat: {\n shell: \"#ffffff\",\n input: \"#ffffff\",\n badge: \"#006064\",\n badgeHover: \"#00424a\",\n file: \"#b2dfdb\",\n fileIcon: \"#006064\",\n fileText: \"#263238\",\n caption: \"#37474f\",\n suggestion: {\n background: \"#ffffff\",\n text: \"#263238\",\n border: \"#b2dfdb\",\n hoverBackground: \"#b2dfdb\",\n hoverBorder: \"#006064\",\n },\n appBar: {\n background: \"linear-gradient(135deg, #e0f2f1 0%, #ffffff 100%)\",\n border: \"#b2dfdb\",\n icon: \"#006064\",\n iconHover: \"#00424a\",\n menuBackground: \"#ffffff\",\n menuText: \"#263238\",\n },\n response: {\n userBackground: \"#b2dfdb\",\n userText: \"#263238\",\n userBorder: \"#006064\",\n userBubble: \"#ffffff\",\n userAvatarBackground: \"#006064\",\n modelLabel: \"#37474f\",\n border: \"#b2dfdb\",\n aiBackground: \"#e0f2f1\",\n aiText: \"#263238\",\n aiBorder: \"#b2dfdb\",\n aiBubble: \"#ffffff\",\n memoryText: \"#37474f\",\n divider: \"#b2dfdb\",\n containerBackground: \"#e0f2f1\",\n },\n },\n },\n});\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-DF3D-6B964A\nconst __banditFingerprint_theme_neonThemets = 'BL-FP-8779EF-B7A1';\nconst __auditTrail_theme_neonThemets = 'BL-AU-MGOIKVW8-H00L';\n// File: neonTheme.ts | Path: src/theme/neonTheme.ts | Hash: df3db7a1\n\nimport { createTheme, ThemeOptions } from \"@mui/material/styles\";\n\nexport const neonDarkTheme: ThemeOptions = createTheme({\n typography: {\n fontFamily: '\"Orbitron\", \"Monaco\", \"Courier New\", monospace',\n fontSize: 14,\n subtitle1: { color: 'inherit', fontWeight: 600 },\n subtitle2: { color: 'inherit', fontWeight: 600 },\n h6: { color: 'inherit', fontWeight: 600 },\n },\n shape: { borderRadius: 8 },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: { backgroundImage: 'none' },\n },\n },\n },\n palette: {\n mode: \"dark\",\n primary: {\n main: \"#ff0080\", // Hot pink neon\n light: \"#ff4da1\",\n dark: \"#cc0066\",\n },\n secondary: {\n main: \"#00ffff\", // Cyan neon\n light: \"#33ffff\",\n dark: \"#00cccc\",\n },\n background: {\n default: \"#0d0d0d\", // Deep black\n paper: \"#1a1a1a\",\n },\n text: {\n primary: \"#ffffff\",\n secondary: \"#ff0080\",\n },\n divider: \"#333333\",\n chat: {\n shell: \"#1a1a1a\",\n input: \"#1a1a1a\",\n badge: \"#ff0080\",\n badgeHover: \"#ff4da1\",\n file: \"#333333\",\n fileIcon: \"#00ffff\",\n fileText: \"#ffffff\",\n caption: \"#ff0080\",\n suggestion: {\n background: \"#1a1a1a\",\n text: \"#ffffff\",\n border: \"#ff0080\",\n hoverBackground: \"#333333\",\n hoverBorder: \"#00ffff\",\n },\n appBar: {\n background: \"linear-gradient(135deg, #0d0d0d 0%, #1a1a1a 100%)\",\n border: \"#ff0080\",\n icon: \"#00ffff\",\n iconHover: \"#ff0080\",\n menuBackground: \"#1a1a1a\",\n menuText: \"#ffffff\",\n },\n response: {\n userBackground: \"#333333\",\n userText: \"#ffffff\",\n userBorder: \"#ff0080\",\n userBubble: \"#1a1a1a\",\n userAvatarBackground: \"#ff0080\",\n modelLabel: \"#ff0080\",\n border: \"#333333\",\n aiBackground: \"#0d0d0d\",\n aiText: \"#ffffff\",\n aiBorder: \"#333333\",\n aiBubble: \"#1a1a1a\",\n memoryText: \"#00ffff\",\n divider: \"#333333\",\n containerBackground: \"#0d0d0d\",\n },\n },\n },\n});\n\nexport const neonLightTheme: ThemeOptions = createTheme({\n typography: {\n fontFamily: '\"Orbitron\", \"Monaco\", \"Courier New\", monospace',\n fontSize: 14,\n subtitle1: { color: 'inherit', fontWeight: 600 },\n subtitle2: { color: 'inherit', fontWeight: 600 },\n h6: { color: 'inherit', fontWeight: 600 },\n },\n shape: { borderRadius: 8 },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: { backgroundImage: 'none' },\n },\n },\n },\n palette: {\n mode: \"light\",\n primary: {\n main: \"#e91e63\", // Vibrant pink\n light: \"#f06292\",\n dark: \"#ad1457\",\n },\n secondary: {\n main: \"#00acc1\", // Vibrant cyan\n light: \"#26c6da\",\n dark: \"#00838f\",\n },\n background: {\n default: \"#f8f8f8\",\n paper: \"#ffffff\",\n },\n text: {\n primary: \"#212121\",\n secondary: \"#e91e63\",\n },\n divider: \"#e0e0e0\",\n chat: {\n shell: \"#ffffff\",\n input: \"#ffffff\",\n badge: \"#e91e63\",\n badgeHover: \"#ad1457\",\n file: \"#e0e0e0\",\n fileIcon: \"#00acc1\",\n fileText: \"#212121\",\n caption: \"#e91e63\",\n suggestion: {\n background: \"#ffffff\",\n text: \"#212121\",\n border: \"#e91e63\",\n hoverBackground: \"#f8f8f8\",\n hoverBorder: \"#00acc1\",\n },\n appBar: {\n background: \"linear-gradient(135deg, #f8f8f8 0%, #ffffff 100%)\",\n border: \"#e91e63\",\n icon: \"#00acc1\",\n iconHover: \"#e91e63\",\n menuBackground: \"#ffffff\",\n menuText: \"#212121\",\n },\n response: {\n userBackground: \"#f8f8f8\",\n userText: \"#212121\",\n userBorder: \"#e91e63\",\n userBubble: \"#ffffff\",\n userAvatarBackground: \"#e91e63\",\n modelLabel: \"#e91e63\",\n border: \"#e0e0e0\",\n aiBackground: \"#f8f8f8\",\n aiText: \"#212121\",\n aiBorder: \"#e0e0e0\",\n aiBubble: \"#ffffff\",\n memoryText: \"#00acc1\",\n divider: \"#e0e0e0\",\n containerBackground: \"#f8f8f8\",\n },\n },\n },\n});\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-8607-A06051\nconst __banditFingerprint_theme_forestThemets = 'BL-FP-CD7FFA-4820';\nconst __auditTrail_theme_forestThemets = 'BL-AU-MGOIKVW7-EKGV';\n// File: forestTheme.ts | Path: src/theme/forestTheme.ts | Hash: 86074820\n\nimport { createTheme, ThemeOptions } from \"@mui/material/styles\";\n\nexport const forestDarkTheme: ThemeOptions = createTheme({\n typography: {\n fontFamily: '\"Source Sans Pro\", \"Roboto\", \"Helvetica\", \"Arial\", sans-serif',\n fontSize: 14,\n // Fix subtitle and heading variants for better contrast\n subtitle1: {\n color: 'inherit',\n fontWeight: 600,\n },\n subtitle2: {\n color: 'inherit',\n fontWeight: 600,\n },\n h6: {\n color: 'inherit',\n fontWeight: 600,\n },\n },\n shape: {\n borderRadius: 8,\n },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: {\n backgroundImage: 'none',\n },\n },\n },\n },\n palette: {\n mode: \"dark\",\n primary: {\n main: \"#4caf50\", // Forest green\n light: \"#6fbf73\",\n dark: \"#357a38\",\n },\n secondary: {\n main: \"#8bc34a\", // Light green\n light: \"#a2cf6e\",\n dark: \"#618833\",\n },\n background: {\n default: \"#1b2e20\", // Deep forest\n paper: \"#2c4332\",\n },\n text: {\n primary: \"#e8f5e8\",\n secondary: \"#c8e6c9\",\n },\n divider: \"#4caf50\",\n chat: {\n shell: \"#2c4332\",\n input: \"#2c4332\", \n badge: \"#4caf50\",\n badgeHover: \"#6fbf73\",\n file: \"#388e3c\",\n fileIcon: \"#8bc34a\",\n fileText: \"#e8f5e8\",\n caption: \"#c8e6c9\",\n suggestion: {\n background: \"#2c4332\",\n text: \"#e8f5e8\",\n border: \"#4caf50\",\n hoverBackground: \"#388e3c\",\n hoverBorder: \"#8bc34a\",\n },\n appBar: {\n background: \"linear-gradient(135deg, #1b2e20 0%, #2c4332 100%)\",\n border: \"#4caf50\",\n icon: \"#8bc34a\",\n iconHover: \"#4caf50\",\n menuBackground: \"#2c4332\",\n menuText: \"#e8f5e8\",\n },\n response: {\n userBackground: \"#388e3c\",\n userText: \"#e8f5e8\",\n userBorder: \"#4caf50\",\n userBubble: \"#2c4332\",\n userAvatarBackground: \"#4caf50\",\n modelLabel: \"#c8e6c9\",\n border: \"#388e3c\",\n aiBackground: \"#1b2e20\",\n aiText: \"#e8f5e8\",\n aiBorder: \"#388e3c\",\n aiBubble: \"#2c4332\",\n memoryText: \"#c8e6c9\",\n divider: \"#388e3c\",\n containerBackground: \"#1b2e20\",\n },\n },\n },\n});\n\nexport const forestLightTheme: ThemeOptions = createTheme({\n typography: {\n fontFamily: '\"Source Sans Pro\", \"Roboto\", \"Helvetica\", \"Arial\", sans-serif',\n fontSize: 14,\n // Fix subtitle and heading variants for better contrast\n subtitle1: {\n color: 'inherit',\n fontWeight: 600,\n },\n subtitle2: {\n color: 'inherit',\n fontWeight: 600,\n },\n h6: {\n color: 'inherit',\n fontWeight: 600,\n },\n },\n shape: {\n borderRadius: 8,\n },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: {\n backgroundImage: 'none',\n },\n },\n },\n },\n palette: {\n mode: \"light\",\n primary: {\n main: \"#2e7d32\", // Deep green\n light: \"#4caf50\",\n dark: \"#1b5e20\",\n },\n secondary: {\n main: \"#66bb6a\", // Medium green\n light: \"#81c784\",\n dark: \"#4caf50\",\n },\n background: {\n default: \"#f1f8e9\", // Very light green\n paper: \"#ffffff\",\n },\n text: {\n primary: \"#1b5e20\",\n secondary: \"#2e7d32\",\n },\n divider: \"#c8e6c9\",\n chat: {\n shell: \"#ffffff\",\n input: \"#ffffff\",\n badge: \"#2e7d32\",\n badgeHover: \"#1b5e20\",\n file: \"#c8e6c9\",\n fileIcon: \"#2e7d32\",\n fileText: \"#1b5e20\",\n caption: \"#2e7d32\",\n suggestion: {\n background: \"#ffffff\",\n text: \"#1b5e20\",\n border: \"#c8e6c9\",\n hoverBackground: \"#f1f8e9\",\n hoverBorder: \"#2e7d32\",\n },\n appBar: {\n background: \"linear-gradient(135deg, #f1f8e9 0%, #ffffff 100%)\",\n border: \"#c8e6c9\",\n icon: \"#2e7d32\",\n iconHover: \"#1b5e20\",\n menuBackground: \"#ffffff\",\n menuText: \"#1b5e20\",\n },\n response: {\n userBackground: \"#c8e6c9\",\n userText: \"#1b5e20\",\n userBorder: \"#2e7d32\",\n userBubble: \"#ffffff\",\n userAvatarBackground: \"#2e7d32\",\n modelLabel: \"#2e7d32\",\n border: \"#c8e6c9\",\n aiBackground: \"#f1f8e9\",\n aiText: \"#1b5e20\",\n aiBorder: \"#c8e6c9\",\n aiBubble: \"#ffffff\",\n memoryText: \"#2e7d32\",\n divider: \"#c8e6c9\",\n containerBackground: \"#f1f8e9\",\n },\n },\n },\n});\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-2FB5-9FBAFE\nconst __banditFingerprint_theme_sunsetThemets = 'BL-FP-24A802-D6E1';\nconst __auditTrail_theme_sunsetThemets = 'BL-AU-MGOIKVW8-OQ60';\n// File: sunsetTheme.ts | Path: src/theme/sunsetTheme.ts | Hash: 2fb5d6e1\n\nimport { createTheme, ThemeOptions } from \"@mui/material/styles\";\n\nexport const sunsetDarkTheme: ThemeOptions = createTheme({\n typography: {\n fontFamily: '\"Playfair Display\", \"Georgia\", \"Times New Roman\", serif',\n fontSize: 14,\n subtitle1: { color: 'inherit', fontWeight: 600 },\n subtitle2: { color: 'inherit', fontWeight: 600 },\n h6: { color: 'inherit', fontWeight: 600 },\n },\n shape: { borderRadius: 8 },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: { backgroundImage: 'none' },\n },\n },\n },\n palette: {\n mode: \"dark\",\n primary: {\n main: \"#ff6f00\", // Deep orange\n light: \"#ff8f33\",\n dark: \"#e65100\",\n },\n secondary: {\n main: \"#ff5722\", // Red orange\n light: \"#ff7043\",\n dark: \"#d84315\",\n },\n background: {\n default: \"#2a1c12\", // Lighter default background\n paper: \"#3d2b1e\", // Lighter paper background\n },\n text: {\n primary: \"#fff3e0\",\n secondary: \"#ffcc02\",\n },\n divider: \"#bf360c\",\n chat: {\n shell: \"#2d1b14\",\n input: \"#2d1b14\", // Changed from light text color to proper dark background\n badge: \"#ff6f00\",\n badgeHover: \"#ff8f33\",\n file: \"#bf360c\",\n fileIcon: \"#ffcc02\",\n fileText: \"#fff3e0\",\n caption: \"#ffcc02\",\n suggestion: {\n background: \"#3d2b1e\", // Lighter background for better readability\n text: \"#fff3e0\",\n border: \"#ff6f00\",\n hoverBackground: \"#4d3b2e\", // Even lighter on hover\n hoverBorder: \"#ffcc02\",\n },\n appBar: {\n background: \"linear-gradient(135deg, #2a1c12 0%, #3d2b1e 100%)\", // Lighter gradient\n border: \"#ff6f00\",\n icon: \"#ffcc02\",\n iconHover: \"#ff6f00\",\n menuBackground: \"#3d2b1e\", // Lighter menu background\n menuText: \"#fff3e0\",\n },\n response: {\n userBackground: \"#bf360c\",\n userText: \"#fff3e0\",\n userBorder: \"#ff6f00\",\n userBubble: \"#3d2b1e\", // Lighter bubble background\n userAvatarBackground: \"#ff6f00\",\n modelLabel: \"#ffcc02\",\n border: \"#bf360c\",\n aiBackground: \"#2a1c12\", // Slightly lighter AI background\n aiText: \"#fff3e0\",\n aiBorder: \"#bf360c\",\n aiBubble: \"#3d2b1e\", // Lighter bubble background\n memoryText: \"#ffcc02\",\n divider: \"#bf360c\",\n containerBackground: \"#2a1c12\", // Slightly lighter container background\n },\n },\n },\n});\n\nexport const sunsetLightTheme: ThemeOptions = createTheme({\n typography: {\n fontFamily: '\"Playfair Display\", \"Georgia\", \"Times New Roman\", serif',\n fontSize: 14,\n subtitle1: { color: 'inherit', fontWeight: 600 },\n subtitle2: { color: 'inherit', fontWeight: 600 },\n h6: { color: 'inherit', fontWeight: 600 },\n },\n shape: { borderRadius: 8 },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: { backgroundImage: 'none' },\n },\n },\n },\n palette: {\n mode: \"light\",\n primary: {\n main: \"#e65100\", // Orange\n light: \"#ff6f00\",\n dark: \"#bf360c\",\n },\n secondary: {\n main: \"#ff9800\", // Amber\n light: \"#ffa726\",\n dark: \"#f57c00\",\n },\n background: {\n default: \"#fff8f3\", // Very light orange\n paper: \"#ffffff\",\n },\n text: {\n primary: \"#bf360c\",\n secondary: \"#e65100\",\n },\n divider: \"#ffcc80\",\n chat: {\n shell: \"#ffffff\",\n input: \"#bf360c\",\n badge: \"#e65100\",\n badgeHover: \"#bf360c\",\n file: \"#ffcc80\",\n fileIcon: \"#e65100\",\n fileText: \"#bf360c\",\n caption: \"#e65100\",\n suggestion: {\n background: \"#ffffff\",\n text: \"#bf360c\",\n border: \"#ffcc80\",\n hoverBackground: \"#fff8f3\",\n hoverBorder: \"#e65100\",\n },\n appBar: {\n background: \"linear-gradient(135deg, #fff8f3 0%, #ffffff 100%)\",\n border: \"#ffcc80\",\n icon: \"#e65100\",\n iconHover: \"#bf360c\",\n menuBackground: \"#ffffff\",\n menuText: \"#bf360c\",\n },\n response: {\n userBackground: \"#ffcc80\",\n userText: \"#bf360c\",\n userBorder: \"#e65100\",\n userBubble: \"#ffffff\",\n userAvatarBackground: \"#e65100\",\n modelLabel: \"#e65100\",\n border: \"#ffcc80\",\n aiBackground: \"#fff8f3\",\n aiText: \"#bf360c\",\n aiBorder: \"#ffcc80\",\n aiBubble: \"#ffffff\",\n memoryText: \"#e65100\",\n divider: \"#ffcc80\",\n containerBackground: \"#fff8f3\",\n },\n },\n },\n});\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-A3A4-E272F3\nconst __banditFingerprint_theme_volcanicThemets = 'BL-FP-70BB83-F816';\nconst __auditTrail_theme_volcanicThemets = 'BL-AU-MGOIKVW9-OKGG';\n// File: volcanicTheme.ts | Path: src/theme/volcanicTheme.ts | Hash: a3a4f816\n\nimport { createTheme, ThemeOptions } from \"@mui/material/styles\";\n\nexport const volcanicDarkTheme: ThemeOptions = createTheme({\n typography: {\n fontFamily: '\"Rajdhani\", \"Roboto Condensed\", \"Arial\", sans-serif',\n fontSize: 14,\n subtitle1: { color: 'inherit', fontWeight: 600 },\n subtitle2: { color: 'inherit', fontWeight: 600 },\n h6: { color: 'inherit', fontWeight: 600 },\n },\n shape: { borderRadius: 8 },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: { backgroundImage: 'none' },\n },\n },\n },\n palette: {\n mode: \"dark\",\n primary: {\n main: \"#d32f2f\", // Lava red\n light: \"#f44336\",\n dark: \"#b71c1c\",\n },\n secondary: {\n main: \"#ff5722\", // Magma orange\n light: \"#ff7043\",\n dark: \"#e64a19\",\n },\n background: {\n default: \"#0f0f0f\", // Volcanic ash dark\n paper: \"#1c1c1c\",\n },\n text: {\n primary: \"#ffebee\",\n secondary: \"#ffcdd2\",\n },\n divider: \"#424242\",\n chat: {\n shell: \"#1c1c1c\",\n input: \"#1c1c1c\", \n badge: \"#d32f2f\",\n badgeHover: \"#f44336\",\n file: \"#424242\",\n fileIcon: \"#ff5722\",\n fileText: \"#ffebee\",\n caption: \"#ffcdd2\",\n suggestion: {\n background: \"#1c1c1c\",\n text: \"#ffebee\",\n border: \"#d32f2f\",\n hoverBackground: \"#424242\",\n hoverBorder: \"#ff5722\",\n },\n appBar: {\n background: \"linear-gradient(135deg, #0f0f0f 0%, #1c1c1c 100%)\",\n border: \"#d32f2f\",\n icon: \"#ff5722\",\n iconHover: \"#d32f2f\",\n menuBackground: \"#1c1c1c\",\n menuText: \"#ffebee\",\n },\n response: {\n userBackground: \"#424242\",\n userText: \"#ffebee\",\n userBorder: \"#d32f2f\",\n userBubble: \"#1c1c1c\",\n userAvatarBackground: \"#d32f2f\",\n modelLabel: \"#ffcdd2\",\n border: \"#424242\",\n aiBackground: \"#0f0f0f\",\n aiText: \"#ffebee\",\n aiBorder: \"#424242\",\n aiBubble: \"#1c1c1c\",\n memoryText: \"#ffcdd2\",\n divider: \"#424242\",\n containerBackground: \"#0f0f0f\",\n },\n },\n },\n});\n\nexport const volcanicLightTheme: ThemeOptions = createTheme({\n typography: {\n fontFamily: '\"Rajdhani\", \"Roboto Condensed\", \"Arial\", sans-serif',\n fontSize: 14,\n subtitle1: { color: 'inherit', fontWeight: 600 },\n subtitle2: { color: 'inherit', fontWeight: 600 },\n h6: { color: 'inherit', fontWeight: 600 },\n },\n shape: { borderRadius: 8 },\n components: {\n MuiPaper: {\n styleOverrides: {\n root: { backgroundImage: 'none' },\n },\n },\n },\n palette: {\n mode: \"light\",\n primary: {\n main: \"#c62828\", // Deep red\n light: \"#d32f2f\",\n dark: \"#b71c1c\",\n },\n secondary: {\n main: \"#e64a19\", // Orange red\n light: \"#ff5722\",\n dark: \"#d84315\",\n },\n background: {\n default: \"#fafafa\", // Light gray\n paper: \"#ffffff\",\n },\n text: {\n primary: \"#212121\",\n secondary: \"#424242\",\n },\n divider: \"#e0e0e0\",\n chat: {\n shell: \"#ffffff\",\n input: \"#ffffff\",\n badge: \"#c62828\",\n badgeHover: \"#b71c1c\",\n file: \"#e0e0e0\",\n fileIcon: \"#c62828\",\n fileText: \"#212121\",\n caption: \"#424242\",\n suggestion: {\n background: \"#ffffff\",\n text: \"#212121\",\n border: \"#e0e0e0\",\n hoverBackground: \"#fafafa\",\n hoverBorder: \"#c62828\",\n },\n appBar: {\n background: \"linear-gradient(135deg, #fafafa 0%, #ffffff 100%)\",\n border: \"#e0e0e0\",\n icon: \"#c62828\",\n iconHover: \"#b71c1c\",\n menuBackground: \"#ffffff\",\n menuText: \"#212121\",\n },\n response: {\n userBackground: \"#ffebee\",\n userText: \"#212121\",\n userBorder: \"#c62828\",\n userBubble: \"#ffffff\",\n userAvatarBackground: \"#c62828\",\n modelLabel: \"#424242\",\n border: \"#e0e0e0\",\n aiBackground: \"#fafafa\",\n aiText: \"#212121\",\n aiBorder: \"#e0e0e0\",\n aiBubble: \"#ffffff\",\n memoryText: \"#424242\",\n divider: \"#e0e0e0\",\n containerBackground: \"#fafafa\",\n },\n },\n },\n});\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-6375-0AA470\nconst __banditFingerprint_theme_themeMapts = 'BL-FP-6535FA-7567';\nconst __auditTrail_theme_themeMapts = 'BL-AU-MGOIKVW8-4O6Q';\n// File: themeMap.ts | Path: src/theme/themeMap.ts | Hash: 63757567\n\nimport { banditDarkTheme, banditLightTheme } from \"./banditTheme\";\nimport { corporateDarkTheme, corporateLightTheme } from \"./corporateTheme\";\nimport { neutralDarkTheme, neutralLightTheme } from \"./neutralTheme\";\nimport { cyberPunkDarkTheme, cyberPunkLightTheme } from \"./cyberPunkTheme\";\nimport { dawnDarkTheme, dawnLightTheme } from \"./dawnTheme\";\nimport { mistDarkTheme, mistLightTheme } from \"./mistTheme\";\nimport { sageDarkTheme, sageLightTheme } from \"./sageTheme\";\nimport { stoneDarkTheme, stoneLightTheme } from \"./stoneTheme\";\nimport { oceanDarkTheme, oceanLightTheme } from \"./oceanTheme\";\nimport { neonDarkTheme, neonLightTheme } from \"./neonTheme\";\nimport { forestDarkTheme, forestLightTheme } from \"./forestTheme\";\nimport { sunsetDarkTheme, sunsetLightTheme } from \"./sunsetTheme\";\nimport { volcanicDarkTheme, volcanicLightTheme } from \"./volcanicTheme\";\nimport { Theme } from \"@mui/material\";\n\ntype ThemeRegistry = Record<string, Theme>;\n\nconst themeMap: ThemeRegistry = {\n \"bandit-dark\": banditDarkTheme,\n \"bandit-light\": banditLightTheme,\n \"corporate-dark\": corporateDarkTheme,\n \"corporate-light\": corporateLightTheme,\n \"neutral-dark\": neutralDarkTheme,\n \"neutral-light\": neutralLightTheme,\n \"cyber-dark\": cyberPunkDarkTheme,\n \"cyber-light\": cyberPunkLightTheme,\n \"dawn-dark\": dawnDarkTheme,\n \"dawn-light\": dawnLightTheme,\n \"mist-dark\": mistDarkTheme,\n \"mist-light\": mistLightTheme,\n \"sage-dark\": sageDarkTheme,\n \"sage-light\": sageLightTheme,\n \"stone-dark\": stoneDarkTheme,\n \"stone-light\": stoneLightTheme,\n \"ocean-dark\": oceanDarkTheme,\n \"ocean-light\": oceanLightTheme,\n \"neon-dark\": neonDarkTheme,\n \"neon-light\": neonLightTheme,\n \"forest-dark\": forestDarkTheme,\n \"forest-light\": forestLightTheme,\n \"sunset-dark\": sunsetDarkTheme,\n \"sunset-light\": sunsetLightTheme,\n \"volcanic-dark\": volcanicDarkTheme,\n \"volcanic-light\": volcanicLightTheme,\n };\n\n export const predefinedThemes: Record<string, Theme & { name: string }> = {\n \"bandit-dark\": {\n name: \"bandit-dark\",\n ...banditDarkTheme,\n },\n \"bandit-light\": {\n name: \"bandit-light\",\n ...banditLightTheme,\n },\n \"corporate-dark\": {\n name: \"corporate-dark\",\n ...corporateDarkTheme,\n },\n \"corporate-light\": {\n name: \"corporate-light\",\n ...corporateLightTheme,\n },\n \"neutral-dark\": {\n name: \"neutral-dark\",\n ...neutralDarkTheme,\n },\n \"neutral-light\": {\n name: \"neutral-light\",\n ...neutralLightTheme,\n },\n \"cyber-dark\": {\n name: \"cyber-dark\",\n ...cyberPunkDarkTheme,\n },\n \"cyber-light\": {\n name: \"cyber-light\",\n ...cyberPunkLightTheme,\n },\n \"dawn-dark\": {\n name: \"dawn-dark\",\n ...dawnDarkTheme,\n },\n \"dawn-light\": {\n name: \"dawn-light\",\n ...dawnLightTheme,\n },\n \"mist-dark\": {\n name: \"mist-dark\",\n ...mistDarkTheme,\n },\n \"mist-light\": {\n name: \"mist-light\",\n ...mistLightTheme,\n },\n \"sage-dark\": {\n name: \"sage-dark\",\n ...sageDarkTheme,\n },\n \"sage-light\": {\n name: \"sage-light\",\n ...sageLightTheme,\n },\n \"stone-dark\": {\n name: \"stone-dark\",\n ...stoneDarkTheme,\n },\n \"stone-light\": {\n name: \"stone-light\",\n ...stoneLightTheme,\n },\n \"ocean-dark\": {\n name: \"ocean-dark\",\n ...oceanDarkTheme,\n },\n \"ocean-light\": {\n name: \"ocean-light\",\n ...oceanLightTheme,\n },\n \"neon-dark\": {\n name: \"neon-dark\",\n ...neonDarkTheme,\n },\n \"neon-light\": {\n name: \"neon-light\",\n ...neonLightTheme,\n },\n \"forest-dark\": {\n name: \"forest-dark\",\n ...forestDarkTheme,\n },\n \"forest-light\": {\n name: \"forest-light\",\n ...forestLightTheme,\n },\n \"sunset-dark\": {\n name: \"sunset-dark\",\n ...sunsetDarkTheme,\n },\n \"sunset-light\": {\n name: \"sunset-light\",\n ...sunsetLightTheme,\n },\n \"volcanic-dark\": {\n name: \"volcanic-dark\",\n ...volcanicDarkTheme,\n },\n \"volcanic-light\": {\n name: \"volcanic-light\",\n ...volcanicLightTheme,\n },\n };\n\n export default themeMap;\n","import { Box, Typography, useTheme } from \"@mui/material\";\nimport { useNavigate } from \"react-router-dom\";\n\nexport const UnderReview = () => {\n const theme = useTheme();\n const navigate = useNavigate();\n\n const handleSneakyLogout = () => {\n localStorage.removeItem('authToken');\n navigate('/login');\n };\n\n return (\n <Box\n sx={{\n minHeight: \"100vh\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n bgcolor: theme.palette.background.default,\n color: theme.palette.text.primary,\n textAlign: \"center\",\n px: 2,\n position: \"relative\",\n }}\n >\n {/* Sneaky logout button - small dot in top right corner */}\n <Box\n onClick={handleSneakyLogout}\n sx={{\n position: \"absolute\",\n top: 16,\n right: 16,\n width: 16,\n height: 16,\n borderRadius: \"50%\",\n bgcolor: theme.palette.background.paper,\n opacity: 0.6,\n cursor: \"pointer\",\n transition: \"all 0.2s ease\",\n border: `1px solid ${theme.palette.divider}`,\n \"&:hover\": {\n opacity: 1,\n transform: \"scale(1.3)\",\n bgcolor: theme.palette.error.main,\n border: `1px solid ${theme.palette.error.main}`,\n },\n }}\n title=\"Reset session\"\n />\n \n <Typography variant=\"h4\" sx={{ mb: 2, fontWeight: 700, color: theme.palette.error.main }}>\n Under Review\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: 2, color: theme.palette.text.secondary }}>\n Your request to use our services is currently being reviewed.<br />\n For more info, please contact {\" \"}\n <a href=\"mailto:team@burtson.ai\" style={{ color: theme.palette.primary.main, fontWeight: 600 }}>\n team@burtson.ai\n </a>\n </Typography>\n </Box>\n );\n};\n\nexport default UnderReview;","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-2EDD-8CF0D8\nconst __banditFingerprint_feedback_FeedbackButtontsx = 'BL-FP-CF95AD-701C';\nconst __auditTrail_feedback_FeedbackButtontsx = 'BL-AU-MGOIKVV9-IZZG';\n// File: FeedbackButton.tsx | Path: src/components/feedback/FeedbackButton.tsx | Hash: 2edd701c\n\nimport React, { useState } from 'react';\nimport {\n Fab,\n Tooltip,\n useTheme,\n Zoom,\n Button,\n IconButton,\n} from '@mui/material';\nimport {\n Feedback as FeedbackIcon,\n} from '@mui/icons-material';\nimport { FeedbackModal } from './index';\n\nexport interface FeedbackButtonProps {\n /** Whether the parent component is in fullscreen mode */\n fullScreen?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Z-index override */\n zIndex?: number;\n /** Custom feedback email (overrides package settings) */\n feedbackEmail?: string;\n /** Show as inline button instead of floating */\n inline?: boolean;\n /** Custom button text for inline mode */\n buttonText?: string;\n /** Custom size */\n size?: 'small' | 'medium' | 'large';\n /** Custom positioning */\n position?: {\n bottom?: number | string;\n right?: number | string;\n top?: number | string;\n left?: number | string;\n };\n /** Use absolute positioning instead of fixed (for modal contexts) */\n absolute?: boolean;\n}\n\nexport const FeedbackButton: React.FC<FeedbackButtonProps> = ({\n fullScreen = false,\n className,\n zIndex = 1400,\n feedbackEmail,\n inline = false,\n buttonText = \"Send Feedback\",\n size = 'small',\n position,\n absolute = false,\n}) => {\n const theme = useTheme();\n const [open, setOpen] = useState(false);\n\n const handleOpen = () => setOpen(true);\n const handleClose = () => setOpen(false);\n\n // If inline mode, render as a regular button\n if (inline) {\n return (\n <>\n {buttonText ? (\n <Button\n variant=\"outlined\"\n startIcon={<FeedbackIcon />}\n onClick={handleOpen}\n className={className}\n size={size}\n sx={{\n borderRadius: 2,\n textTransform: 'none',\n '&:hover': {\n transform: 'translateY(-1px)',\n boxShadow: theme.shadows[4],\n },\n }}\n >\n {buttonText}\n </Button>\n ) : (\n <Tooltip title=\"Send Feedback\" arrow>\n <IconButton\n onClick={handleOpen}\n className={className}\n size={size}\n sx={{\n color: theme.palette.primary.main,\n borderRadius: 2,\n transition: 'all 0.2s ease',\n '&:hover': {\n bgcolor: theme.palette.primary.main + '15',\n transform: 'translateY(-1px)',\n },\n }}\n >\n <FeedbackIcon />\n </IconButton>\n </Tooltip>\n )}\n\n <FeedbackModal \n open={open} \n onClose={handleClose}\n feedbackEmail={feedbackEmail}\n />\n </>\n );\n }\n\n // Floating FAB mode\n return (\n <>\n <Zoom in={true} timeout={300}>\n <Tooltip \n title=\"Send Feedback\" \n placement=\"left\"\n arrow\n >\n <Fab\n size={size}\n onClick={handleOpen}\n className={className}\n sx={{\n position: absolute ? 'absolute' : 'relative',\n ...(absolute && {\n bottom: position?.bottom ?? (fullScreen ? 16 : 20),\n right: position?.right ?? 16,\n top: position?.top,\n left: position?.left,\n }),\n zIndex,\n bgcolor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n boxShadow: theme.palette.mode === 'dark' \n ? '0 8px 32px rgba(0,0,0,0.4)' \n : '0 8px 32px rgba(0,0,0,0.15)',\n border: `1px solid ${theme.palette.divider}`,\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n '&:hover': {\n bgcolor: theme.palette.primary.dark,\n transform: 'scale(1.05) translateY(-2px)',\n boxShadow: theme.palette.mode === 'dark' \n ? '0 12px 40px rgba(0,0,0,0.5)' \n : '0 12px 40px rgba(0,0,0,0.2)',\n },\n '&:active': {\n transform: 'scale(0.98) translateY(0px)',\n },\n // Subtle pulsing animation\n animation: 'feedbackPulse 3s ease-in-out infinite',\n '@keyframes feedbackPulse': {\n '0%, 100%': {\n boxShadow: theme.palette.mode === 'dark' \n ? '0 8px 32px rgba(0,0,0,0.4)' \n : '0 8px 32px rgba(0,0,0,0.15)',\n },\n '50%': {\n boxShadow: theme.palette.mode === 'dark' \n ? `0 8px 32px ${theme.palette.primary.main}40` \n : `0 8px 32px ${theme.palette.primary.main}30`,\n },\n },\n }}\n >\n <FeedbackIcon />\n </Fab>\n </Tooltip>\n </Zoom>\n\n <FeedbackModal \n open={open} \n onClose={handleClose}\n feedbackEmail={feedbackEmail}\n />\n </>\n );\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-3604-B82856\nconst __banditFingerprint_hooks_useNotificationServicets = 'BL-FP-2EDB4B-6C09';\nconst __auditTrail_hooks_useNotificationServicets = 'BL-AU-MGOIKVVF-JFD2';\n// File: useNotificationService.ts | Path: src/hooks/useNotificationService.ts | Hash: 36046c09\n\nimport { useEffect } from 'react';\nimport { useNotification } from '../shared/components/NotificationProvider';\nimport { notificationService } from '../services/notification/notificationService';\n\n/**\n * Hook to initialize and use the notification service\n * This should be called once near the root of your component tree\n */\nexport const useNotificationService = () => {\n const notificationContext = useNotification();\n\n useEffect(() => {\n // Initialize the global notification service with the context\n notificationService.setContext(notificationContext);\n }, [notificationContext]);\n\n return {\n ...notificationContext,\n // Also expose the service methods for direct use\n handleHttpError: notificationService.handleHttpError.bind(notificationService),\n handleNetworkError: notificationService.handleNetworkError.bind(notificationService),\n handleValidationError: notificationService.handleValidationError.bind(notificationService),\n };\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-C86A-7D6AB0\nconst __banditFingerprint_components_NotificationProvidertsx = 'BL-FP-8FB104-1724';\nconst __auditTrail_components_NotificationProvidertsx = 'BL-AU-MGOIKVW2-2OVE';\n// File: NotificationProvider.tsx | Path: src/shared/components/NotificationProvider.tsx | Hash: c86a1724\n\nimport React, { createContext, useContext, useState, ReactNode } from 'react';\nimport { Snackbar, Alert, AlertColor } from '@mui/material';\n\nexport interface NotificationConfig {\n message: string;\n severity?: AlertColor;\n duration?: number;\n anchorOrigin?: {\n vertical: 'top' | 'bottom';\n horizontal: 'left' | 'center' | 'right';\n };\n}\n\nexport interface NotificationContextType {\n showNotification: (config: NotificationConfig | string) => void;\n showError: (message: string) => void;\n showSuccess: (message: string) => void;\n showWarning: (message: string) => void;\n showInfo: (message: string) => void;\n}\n\nconst NotificationContext = createContext<NotificationContextType | undefined>(undefined);\n\nexport const useNotification = () => {\n const context = useContext(NotificationContext);\n if (!context) {\n throw new Error('useNotification must be used within a NotificationProvider');\n }\n return context;\n};\n\nexport interface NotificationProviderProps {\n children: ReactNode;\n defaultDuration?: number;\n defaultPosition?: {\n vertical: 'top' | 'bottom';\n horizontal: 'left' | 'center' | 'right';\n };\n}\n\nexport const NotificationProvider: React.FC<NotificationProviderProps> = ({\n children,\n defaultDuration = 4000,\n defaultPosition = { vertical: 'bottom', horizontal: 'left' }\n}) => {\n const [notification, setNotification] = useState<{\n open: boolean;\n message: string;\n severity: AlertColor;\n duration: number;\n anchorOrigin: {\n vertical: 'top' | 'bottom';\n horizontal: 'left' | 'center' | 'right';\n };\n }>({\n open: false,\n message: '',\n severity: 'info',\n duration: defaultDuration,\n anchorOrigin: defaultPosition\n });\n\n const showNotification = (config: NotificationConfig | string) => {\n const notificationConfig = typeof config === 'string' \n ? { message: config, severity: 'info' as AlertColor }\n : config;\n\n setNotification({\n open: true,\n message: notificationConfig.message,\n severity: notificationConfig.severity || 'info',\n duration: notificationConfig.duration || defaultDuration,\n anchorOrigin: notificationConfig.anchorOrigin || defaultPosition\n });\n };\n\n const showError = (message: string) => {\n showNotification({ message, severity: 'error' });\n };\n\n const showSuccess = (message: string) => {\n showNotification({ message, severity: 'success' });\n };\n\n const showWarning = (message: string) => {\n showNotification({ message, severity: 'warning' });\n };\n\n const showInfo = (message: string) => {\n showNotification({ message, severity: 'info' });\n };\n\n const handleClose = () => {\n setNotification(prev => ({ ...prev, open: false }));\n };\n\n const contextValue: NotificationContextType = {\n showNotification,\n showError,\n showSuccess,\n showWarning,\n showInfo\n };\n\n return (\n <NotificationContext.Provider value={contextValue}>\n {children}\n <Snackbar\n open={notification.open}\n autoHideDuration={notification.duration}\n onClose={handleClose}\n anchorOrigin={notification.anchorOrigin}\n >\n <Alert\n onClose={handleClose}\n severity={notification.severity}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {notification.message}\n </Alert>\n </Snackbar>\n </NotificationContext.Provider>\n );\n};\n\nexport default NotificationProvider;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-6ED3-47FEC9\nconst __banditFingerprint_components_ConnectionStatustsx = 'BL-FP-C8A6D8-1324';\nconst __auditTrail_components_ConnectionStatustsx = 'BL-AU-MGOIKVV8-XF32';\n// File: ConnectionStatus.tsx | Path: src/components/ConnectionStatus.tsx | Hash: 6ed31324\n\nimport React from \"react\";\nimport { Box, Chip, useTheme } from \"@mui/material\";\nimport WifiIcon from \"@mui/icons-material/Wifi\";\nimport WifiOffIcon from \"@mui/icons-material/WifiOff\";\nimport SignalWifi2BarIcon from \"@mui/icons-material/SignalWifi2Bar\";\nimport { useNetworkStatus } from \"../hooks/useNetworkStatus\";\n\ninterface ConnectionStatusProps {\n showWhenGood?: boolean;\n position?: \"top\" | \"bottom\";\n}\n\nexport const ConnectionStatus: React.FC<ConnectionStatusProps> = ({\n showWhenGood = false,\n position = \"top\",\n}) => {\n const theme = useTheme();\n const { isOnline, connectionQuality, isSlowConnection } = useNetworkStatus();\n\n // Don't show if connection is good and showWhenGood is false\n if (connectionQuality === \"fast\" && !showWhenGood) {\n return null;\n }\n\n const getStatusConfig = () => {\n switch (connectionQuality) {\n case \"offline\":\n return {\n icon: <WifiOffIcon sx={{ fontSize: 16 }} />,\n label: \"Offline\",\n color: \"error\" as const,\n severity: \"high\" as const,\n };\n case \"slow\":\n return {\n icon: <SignalWifi2BarIcon sx={{ fontSize: 16 }} />,\n label: \"Slow connection\",\n color: \"warning\" as const,\n severity: \"medium\" as const,\n };\n case \"fast\":\n return {\n icon: <WifiIcon sx={{ fontSize: 16 }} />,\n label: \"Connected\",\n color: \"success\" as const,\n severity: \"low\" as const,\n };\n default:\n return {\n icon: <WifiIcon sx={{ fontSize: 16 }} />,\n label: \"Unknown\",\n color: \"default\" as const,\n severity: \"low\" as const,\n };\n }\n };\n\n const config = getStatusConfig();\n\n return (\n <Box\n sx={{\n position: \"fixed\",\n [position]: 10,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 1400,\n animation: config.severity === \"high\" ? \"pulse 2s ease-in-out infinite\" : \"none\",\n \"@keyframes pulse\": {\n \"0%\": { opacity: 1 },\n \"50%\": { opacity: 0.7 },\n \"100%\": { opacity: 1 },\n },\n }}\n >\n <Chip\n icon={config.icon}\n label={config.label}\n color={config.color}\n size=\"small\"\n sx={{\n bgcolor: theme.palette.mode === \"dark\" \n ? config.color === \"default\" \n ? \"rgba(156, 163, 175, 0.2)\"\n : `rgba(${config.color === \"error\" ? \"244, 67, 54\" : config.color === \"warning\" ? \"255, 152, 0\" : \"76, 175, 80\"}, 0.2)`\n : config.color === \"default\"\n ? \"rgba(156, 163, 175, 0.1)\"\n : `rgba(${config.color === \"error\" ? \"244, 67, 54\" : config.color === \"warning\" ? \"255, 152, 0\" : \"76, 175, 80\"}, 0.1)`,\n color: `${config.color}.main`,\n border: config.color === \"default\" \n ? \"1px solid rgba(156, 163, 175, 0.4)\"\n : `1px solid rgba(${config.color === \"error\" ? \"244, 67, 54\" : config.color === \"warning\" ? \"255, 152, 0\" : \"76, 175, 80\"}, 0.4)`,\n backdropFilter: \"blur(10px)\",\n fontWeight: 500,\n \"& .MuiChip-icon\": {\n color: `${config.color}.main`,\n },\n }}\n />\n </Box>\n );\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-667C-1D0BDF\nconst __banditFingerprint_hooks_useVoiceModets = 'BL-FP-AFC188-7088';\nconst __auditTrail_hooks_useVoiceModets = 'BL-AU-MGOIKVVG-VHRQ';\n// File: useVoiceMode.ts | Path: src/hooks/useVoiceMode.ts | Hash: 667c7088\n\nimport { useEffect, useRef } from \"react\";\nimport { STTClient } from \"../services/stt/stt-client\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport { useVoiceModeStore } from \"../store/voiceModeStore\";\n\nexport interface UseVoiceModeConfig {\n onTranscription: (text: string) => void;\n onInterrupt?: () => void;\n /**\n * Optional guard to temporarily block recording (for example while another request is pending).\n * Returning true prevents a new recording session from starting.\n */\n shouldHoldRecording?: () => boolean;\n /**\n * Invoked when a transcription attempt fails. Used for surfacing friendly messaging.\n */\n onError?: (message: string) => void;\n amplitudeThreshold?: number;\n minSpeechMs?: number;\n minSilenceMs?: number;\n}\n\ninterface AudioSession {\n stream: MediaStream;\n audioContext: AudioContext;\n analyser: AnalyserNode;\n dataArray: Uint8Array;\n}\n\nconst RMS_BASELINE = 128;\nconst RMS_NORMALIZER = 128;\n\nconst computeRms = (data: Uint8Array): number => {\n let sumSquares = 0;\n for (let i = 0; i < data.length; i += 1) {\n const sample = (data[i] - RMS_BASELINE) / RMS_NORMALIZER;\n sumSquares += sample * sample;\n }\n return Math.sqrt(sumSquares / data.length);\n};\n\n/**\n * Continuous voice mode controller that toggles microphone capture, performs lightweight\n * voice-activity detection, forwards audio to STT, and coordinates interruptions with TTS/streaming.\n */\nexport const useVoiceMode = (config: UseVoiceModeConfig) => {\n const enabled = useVoiceModeStore((state) => state.enabled);\n const setStatus = useVoiceModeStore((state) => state.setStatus);\n const setError = useVoiceModeStore((state) => state.setError);\n const resetTransientState = useVoiceModeStore((state) => state.resetTransientState);\n const setLastTranscript = useVoiceModeStore((state) => state.setLastTranscript);\n\n const configRef = useRef(config);\n useEffect(() => {\n configRef.current = config;\n }, [config]);\n\n useEffect(() => {\n if (!enabled) {\n return () => undefined;\n }\n\n let cancelled = false;\n let rafId: number | null = null;\n let recorder: MediaRecorder | null = null;\n let audioSession: AudioSession | null = null;\n let chunks: BlobPart[] = [];\n let speechStartAt = 0;\n let silenceStartAt = 0;\n const isRecordingRef = { current: false };\n const isProcessingRef = { current: false };\n\n const amplitudeThreshold = configRef.current.amplitudeThreshold ?? 0.025;\n const minSpeechMs = configRef.current.minSpeechMs ?? 180;\n const minSilenceMs = configRef.current.minSilenceMs ?? 720;\n\n const clearAudioSession = async () => {\n if (rafId) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n if (recorder && recorder.state !== \"inactive\") {\n try {\n recorder.stop();\n } catch (err) {\n debugLogger.warn(\"Voice mode recorder stop failed\", { error: err });\n }\n }\n recorder = null;\n chunks = [];\n if (audioSession) {\n const { stream, audioContext } = audioSession;\n stream.getTracks().forEach((track) => track.stop());\n try {\n await audioContext.close();\n } catch (err) {\n debugLogger.warn(\"Voice mode audio context close failed\", { error: err });\n }\n }\n audioSession = null;\n speechStartAt = 0;\n silenceStartAt = 0;\n isRecordingRef.current = false;\n isProcessingRef.current = false;\n };\n\n const processTranscript = async (blob: Blob) => {\n isProcessingRef.current = true;\n setStatus(\"processing\");\n\n try {\n const transcript = await STTClient.transcribe(blob);\n const trimmed = transcript.trim();\n setLastTranscript(trimmed || null);\n if (trimmed) {\n try {\n configRef.current.onTranscription(trimmed);\n } catch (handlerError) {\n debugLogger.error(\"Voice mode transcription handler failed\", { error: handlerError });\n }\n }\n if (!cancelled) {\n resetTransientState();\n }\n } catch (error) {\n debugLogger.error(\"Voice mode transcription failed\", {\n error: error instanceof Error ? error.message : String(error),\n });\n const message = \"Unable to transcribe speech. Please try again.\";\n setError(message);\n configRef.current.onError?.(message);\n } finally {\n isProcessingRef.current = false;\n }\n };\n\n const handleRecorderStop = () => {\n recorder?.removeEventListener(\"stop\", handleRecorderStop);\n const blobType = recorder?.mimeType || \"audio/webm\";\n const blob = new Blob(chunks, { type: blobType });\n chunks = [];\n\n if (blob.size < 1024) {\n // Treat ultra-short clips as noise.\n resetTransientState();\n return;\n }\n\n processTranscript(blob).catch((error) => {\n debugLogger.error(\"Voice mode transcript processing crashed\", {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n };\n\n const stopRecording = () => {\n if (!recorder || recorder.state === \"inactive\") {\n return;\n }\n isRecordingRef.current = false;\n isProcessingRef.current = true;\n setStatus(\"processing\");\n recorder.addEventListener(\"stop\", handleRecorderStop, { once: true });\n try {\n recorder.stop();\n } catch (error) {\n debugLogger.error(\"Voice mode recorder stop threw\", { error });\n recorder.removeEventListener(\"stop\", handleRecorderStop);\n resetTransientState();\n isProcessingRef.current = false;\n }\n };\n\n const startRecording = (stream: MediaStream) => {\n chunks = [];\n try {\n recorder = new MediaRecorder(stream);\n recorder.addEventListener(\"dataavailable\", (event) => {\n if (event.data && event.data.size > 0) {\n chunks.push(event.data);\n }\n });\n } catch (error) {\n debugLogger.error(\"Voice mode recorder init failed\", { error });\n setError(\"Microphone recorder unavailable\");\n useVoiceModeStore.getState().setEnabled(false);\n return;\n }\n\n try {\n configRef.current.onInterrupt?.();\n } catch (handlerError) {\n debugLogger.warn(\"Voice mode interrupt handler threw\", { error: handlerError });\n }\n\n setError(null);\n setStatus(\"recording\");\n isRecordingRef.current = true;\n\n try {\n recorder.start();\n } catch (error) {\n debugLogger.error(\"Voice mode recorder start failed\", { error });\n setError(\"Failed to start recording\");\n isRecordingRef.current = false;\n useVoiceModeStore.getState().setEnabled(false);\n }\n };\n\n const monitorAudio = () => {\n if (cancelled || !audioSession) {\n return;\n }\n\n const { analyser, dataArray, stream } = audioSession;\n analyser.getByteTimeDomainData(dataArray);\n const rms = computeRms(dataArray);\n const now = performance.now();\n\n if (!isRecordingRef.current && !isProcessingRef.current) {\n const holdRecording = configRef.current.shouldHoldRecording?.();\n if (!holdRecording) {\n if (rms > amplitudeThreshold) {\n if (!speechStartAt) {\n speechStartAt = now;\n } else if (now - speechStartAt >= minSpeechMs) {\n startRecording(stream);\n speechStartAt = 0;\n silenceStartAt = 0;\n }\n } else {\n speechStartAt = 0;\n }\n }\n } else if (isRecordingRef.current) {\n if (rms > amplitudeThreshold * 0.6) {\n silenceStartAt = 0;\n } else {\n if (!silenceStartAt) {\n silenceStartAt = now;\n } else if (now - silenceStartAt >= minSilenceMs) {\n stopRecording();\n speechStartAt = 0;\n silenceStartAt = 0;\n }\n }\n }\n\n rafId = requestAnimationFrame(monitorAudio);\n };\n\n const initAudioSession = async () => {\n setError(null);\n setStatus(\"initializing\");\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n if (cancelled) {\n stream.getTracks().forEach((track) => track.stop());\n return;\n }\n\n const win = window as Window & { webkitAudioContext?: typeof AudioContext };\n const AudioContextCtor = win.AudioContext || win.webkitAudioContext;\n if (!AudioContextCtor) {\n throw new Error(\"AudioContext is not supported in this browser\");\n }\n\n const audioContext = new AudioContextCtor();\n const source = audioContext.createMediaStreamSource(stream);\n const analyser = audioContext.createAnalyser();\n analyser.fftSize = 2048;\n source.connect(analyser);\n const dataArray = new Uint8Array(analyser.frequencyBinCount);\n\n audioSession = {\n stream,\n audioContext,\n analyser,\n dataArray,\n };\n\n resetTransientState();\n monitorAudio();\n } catch (error) {\n debugLogger.error(\"Voice mode failed to initialize microphone\", {\n error: error instanceof Error ? error.message : String(error),\n });\n const message =\n error instanceof DOMException && error.name === \"NotAllowedError\"\n ? \"Microphone permission denied\"\n : \"Microphone unavailable\";\n setError(message);\n configRef.current.onError?.(message);\n useVoiceModeStore.getState().setEnabled(false);\n }\n };\n\n initAudioSession();\n\n return () => {\n cancelled = true;\n clearAudioSession().catch((error) => {\n debugLogger.warn(\"Voice mode cleanup failed\", {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n resetTransientState();\n };\n }, [enabled, setStatus, setError, resetTransientState, setLastTranscript]);\n};\n"],"mappings":"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","names":["useCallback","useEffect","useRef","useState","css","Box","jsx","jsx","useEffect","useTheme","jsx","useTheme","useEffect","jsx","Box","React","useCallback","useEffect","useMemo","useRef","useState","useState","useEffect","Box","IconButton","useState","useCallback","create","create","storeConfigs","uuidv4","map","map","lastValueFrom","map","toArray","map","toArray","lastValueFrom","lastValueFrom","map","map","lastValueFrom","lastValueFrom","map","toArray","map","toArray","lastValueFrom","getCurrentDateTimeContext","create","DB_NAME","STORE_NAME","storeConfigs","create","useState","useEffect","useCallback","DB_NAME","STORE_NAME","storeConfigs","create","create","user","useContext","useEffect","useState","jsx","useState","useEffect","jsx","useContext","create","uuidv4","create","uuidv4","DB_NAME","STORE_NAME","DB_VERSION","storeConfigs","DB_NAME","STORE_NAME","DB_VERSION","storeConfigs","create","uuidv4","create","uuidv4","DB_NAME","STORE_NAME","DB_VERSION","storeConfigs","create","uuidv4","TOKEN_KEY","isRecord","uuidv4","create","useState","useCallback","useAIProviderStore","useEffect","results","DB_NAME","STORE_NAME","useKnowledgeStore","useState","storeConfigs","useCallback","uuidv4","useTheme","jsx","useTheme","useKnowledgeStore","useState","useEffect","jsx","Box","IconButton","useCallback","useEffect","useMemo","useState","IconButton","Typography","Box","Alert","Button","Tooltip","useTheme","useMediaQuery","DownloadIcon","CodeIcon","DescriptionIcon","PictureAsPdfIcon","DataObjectIcon","ArticleIcon","pdfjsLib","React","React","Fragment","jsx","jsxs","getFileTypeInfo","PictureAsPdfIcon","ArticleIcon","DescriptionIcon","CodeIcon","DataObjectIcon","useState","useTheme","useMediaQuery","useEffect","useMemo","useCallback","doc","error","jsxs","jsx","Box","Tooltip","Typography","Fragment","Button","IconButton","DownloadIcon","Alert","useTheme","Avatar","Box","IconButton","Tooltip","Typography","Paper","ContentCopyIcon","CheckIcon","CloseIcon","useState","useEffect","create","Observable","TTSState","Observable","create","useState","useEffect","useCallback","useRef","useMemo","useState","useRef","useMemo","useEffect","useCallback","Box","CircularProgress","IconButton","Tooltip","Fragment","jsx","jsxs","useState","useEffect","jsxs","Box","jsx","Tooltip","IconButton","Fragment","CircularProgress","Fragment","jsx","jsxs","banditHead","resolveAvatar","markdown","useState","useMemo","jsx","jsxs","Box","Tooltip","IconButton","CheckIcon","ContentCopyIcon","useEffect","React","useKnowledgeStore","useCallback","useRef","useTheme","Typography","Fragment","Paper","Avatar","CloseIcon","React","useEffect","useMemo","useRef","useState","Box","Tooltip","IconButton","ReactMarkdown","remarkGfm","rehypeRaw","rehypeSanitize","useTheme","alpha","CheckIcon","ContentCopyIcon","jsx","jsxs","useTheme","useRef","useMemo","normalizeTables","markdown","useEffect","alpha","jsx","Box","useState","jsxs","Tooltip","IconButton","CheckIcon","ContentCopyIcon","React","ReactMarkdown","remarkGfm","rehypeRaw","rehypeSanitize","jsx","jsxs","jsxs","Box","jsx","useEffect","useRef","useState","Box","TextField","IconButton","Tooltip","Avatar","Typography","CircularProgress","CloseIcon","useState","useRef","CheckIcon","CloseIcon","map","map","isRecord","CircularProgress","IconButton","useTheme","from","Subscription","switchMap","Fragment","jsx","jsxs","useTheme","useState","useRef","Subscription","switchMap","from","jsx","IconButton","jsxs","Fragment","CloseIcon","CheckIcon","CircularProgress","React","useState","useEffect","useTheme","alpha","Box","Typography","Modal","IconButton","Button","Tooltip","Dialog","Avatar","useMediaQuery","CloseIcon","DeleteIcon","Fragment","jsx","jsxs","useEffect","useState","useTheme","useMediaQuery","shell","jsxs","Box","alpha","jsx","Typography","Tooltip","Fragment","Button","IconButton","CloseIcon","React","Avatar","DeleteIcon","Dialog","Modal","useTheme","alpha","useState","useCallback","useRef","Dialog","DialogTitle","DialogContent","DialogActions","Button","TextField","FormControl","Box","Typography","IconButton","Chip","Alert","Paper","Avatar","CircularProgress","useMediaQuery","CloseIcon","DeleteIcon","useTheme","alpha","Fragment","jsx","jsxs","useTheme","useMediaQuery","useRef","useState","useCallback","jsxs","Fragment","jsx","Dialog","DialogTitle","Box","alpha","Typography","IconButton","CloseIcon","DialogContent","Alert","TextField","FormControl","Paper","theme","Avatar","DeleteIcon","Button","Chip","DialogActions","CircularProgress","create","create","Fragment","jsx","jsxs","useTheme","useState","useRef","alpha","useEffect","isCodeFile","name","mammoth","pdfjsLib","jsx","Tooltip","IconButton","Box","jsxs","Fragment","Avatar","Typography","CloseIcon","TextField","CircularProgress","useCallback","useRef","lastValueFrom","map","lastValueFrom","map","useState","useState","create","create","storeConfigs","useRef","useCallback","getCurrentDateTimeContext","replaceLastAnswer","normalize","addToCurrent","useRef","useEffect","useCallback","useRef","useCallback","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","Avatar","useRef","useState","Box","IconButton","Menu","MenuItem","Tooltip","useMediaQuery","useTheme","Dialog","DialogTitle","DialogContent","DialogActions","Typography","Button","AddIcon","CloudOffIcon","ErrorOutlineIcon","useState","useMemo","useEffect","useRef","useCallback","Box","Typography","IconButton","TextField","useMediaQuery","Collapse","Divider","Menu","MenuItem","ListItemIcon","ListItemText","Dialog","DialogTitle","DialogContent","DialogActions","Button","Avatar","alpha","CloseIcon","SearchIcon","FolderIcon","MoreVertIcon","InboxIcon","AddIcon","useTheme","useState","useEffect","useRef","Modal","Button","TextField","List","ListItem","IconButton","Box","Typography","Avatar","Chip","MenuItem","Alert","CircularProgress","SwipeableDrawer","useMediaQuery","DeleteIcon","CloseIcon","useTheme","alpha","Fragment","jsx","jsxs","DEFAULT_COLORS","useTheme","useMediaQuery","useState","useRef","useEffect","alpha","jsxs","Box","jsx","IconButton","Typography","CloseIcon","Alert","TextField","Button","List","ListItem","Avatar","Chip","Fragment","CircularProgress","MenuItem","DeleteIcon","SwipeableDrawer","Modal","useState","useEffect","Dialog","DialogTitle","DialogContent","DialogActions","Button","List","ListItem","Typography","Avatar","Radio","Box","Divider","FolderIcon","useTheme","jsx","jsxs","useTheme","useState","useEffect","jsxs","Dialog","DialogTitle","DialogContent","jsx","Typography","List","ListItem","Radio","Avatar","Divider","FolderIcon","Box","DialogActions","Button","useState","useRef","useEffect","Box","Typography","IconButton","Menu","MenuItem","ListItemIcon","ListItemText","useMediaQuery","TextField","Dialog","DialogTitle","DialogContent","DialogActions","Button","MoreVertIcon","EditIcon","DeleteIcon","useTheme","alpha","Fragment","jsx","jsxs","useTheme","useMediaQuery","useState","useRef","jsx","Box","alpha","useEffect","jsxs","Fragment","TextField","Typography","IconButton","MoreVertIcon","Menu","MenuItem","ListItemIcon","EditIcon","ListItemText","DeleteIcon","Dialog","DialogTitle","DialogContent","DialogActions","Button","useRef","useState","Box","Typography","IconButton","Avatar","Chip","Tooltip","TextField","alpha","ExpandMoreIcon","AddIcon","FolderIcon","InboxIcon","CloseIcon","CheckIcon","useTheme","jsx","jsxs","useTheme","useState","useRef","FolderIcon","jsxs","Box","alpha","jsx","Avatar","InboxIcon","TextField","Typography","Chip","Tooltip","IconButton","CloseIcon","CheckIcon","AddIcon","ExpandMoreIcon","Fragment","jsx","jsxs","first","useTheme","useMediaQuery","user","useState","useRef","useCallback","useMemo","useEffect","jsxs","Fragment","alpha","Box","jsx","IconButton","FolderIcon","MoreVertIcon","CloseIcon","TextField","SearchIcon","Typography","AddIcon","Divider","InboxIcon","Collapse","Avatar","Menu","MenuItem","ListItemIcon","ListItemText","Dialog","DialogTitle","DialogContent","DialogActions","Button","useState","useMemo","useEffect","useRef","useCallback","Box","IconButton","Modal","Typography","TextField","InputAdornment","Collapse","Divider","Menu","MenuItem","ListItemIcon","ListItemText","Dialog","DialogTitle","DialogContent","DialogActions","Button","AppBar","Toolbar","Avatar","CloseIcon","ClearIcon","SearchIcon","FolderIcon","MoreVertIcon","DeleteSweepIcon","InboxIcon","AddIcon","useTheme","alpha","Fragment","jsx","jsxs","BANDIT_AVATAR","coerceOptionalString","deriveInitials","first","useTheme","user","useState","useRef","useCallback","useMemo","useEffect","jsxs","Fragment","jsx","Modal","Box","AppBar","Toolbar","Typography","IconButton","FolderIcon","MoreVertIcon","CloseIcon","TextField","InputAdornment","SearchIcon","ClearIcon","alpha","AddIcon","Divider","InboxIcon","Collapse","Avatar","Menu","MenuItem","ListItemIcon","DeleteSweepIcon","ListItemText","Dialog","DialogTitle","DialogContent","DialogActions","Button","shallow","Fragment","jsx","jsxs","banditHead","modelAvatars","useTheme","useMediaQuery","useRef","useState","shallow","jsx","CloudOffIcon","ErrorOutlineIcon","jsxs","Fragment","Box","Tooltip","IconButton","AddIcon","Avatar","Menu","MenuItem","storeConfigs","Typography","Dialog","DialogTitle","DialogContent","DialogActions","Button","conversations","currentId","lastValueFrom","map","lastValueFrom","map","useEffect","useRef","useState","Box","useMediaQuery","useTheme","alpha","ReactMarkdown","remarkGfm","rehypeRaw","Fragment","jsx","jsx","useRef","useState","useTheme","useMediaQuery","theme","useEffect","Fragment","Box","alpha","ReactMarkdown","remarkGfm","rehypeRaw","createTheme","commonOptions","createTheme","createTheme","commonOptions","createTheme","createTheme","commonOptions","createTheme","createTheme","commonOptions","createTheme","createTheme","createTheme","createTheme","createTheme","createTheme","createTheme","createTheme","createTheme","createTheme","createTheme","createTheme","createTheme","createTheme","createTheme","createTheme","createTheme","Box","Typography","useTheme","useNavigate","jsx","jsxs","useState","Tooltip","useTheme","Button","IconButton","FeedbackIcon","Fragment","jsx","jsxs","useTheme","useState","jsxs","Fragment","jsx","Button","FeedbackIcon","Tooltip","IconButton","useEffect","createContext","useContext","useState","Snackbar","Alert","jsx","jsxs","createContext","useContext","useState","jsxs","jsx","Snackbar","Alert","useEffect","Box","Chip","useTheme","jsx","useTheme","jsx","Box","Chip","useEffect","useRef","useRef","useEffect","jsx","jsxs","notificationService","useState","useRef","useEffect","storeConfigs","packageSettings","useCallback","currentId","conversations","jsxs","jsx","Box"]}