@burtson-labs/bandit-engine 2.0.75 → 2.0.77

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/management/management.tsx","../src/management/components/PersonalitiesTab.tsx","../src/components/AvatarCropper.tsx","../src/management/components/PreferencesTab.tsx","../src/hooks/useGatewayQueries.ts","../src/management/components/BrandingTab.tsx","../src/components/LogoCropper.tsx","../src/management/components/KnowledgeHubTab.tsx","../src/management/components/KnowledgeTab.tsx","../src/components/shared/ProcessingOverlay.tsx","../src/hooks/useProcessingOverlay.ts","../src/management/components/SeedPacksTab.tsx","../src/services/seedPacks/seedPackService.ts","../src/management/components/StorageTab.tsx","../src/management/components/ProviderTab.tsx","../src/management/components/MCPToolsTabV2.tsx","../src/services/mcp/mcpControllerService.ts","../src/management/components/McpServersSection.tsx"],"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-FCFF-64ED2F\nconst __banditFingerprint_management_managementtsx = 'BL-FP-357F58-3D1B';\nconst __auditTrail_management_managementtsx = 'BL-AU-MGOIKVVL-LFF9';\n// File: management.tsx | Path: src/management/management.tsx | Hash: fcff3d1b\n\nconst preloadChatPage = () => import(\"../chat/chat\");\n\nimport React, { useState, useEffect, useCallback, useMemo } from \"react\";\nimport useMediaQuery from \"@mui/material/useMediaQuery\";\nimport { alpha, createTheme } from \"@mui/material/styles\";\nimport { useKnowledgeStore } from \"../chat/hooks/useKnowledgeStore\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport {\n Box,\n Button,\n Typography,\n ThemeProvider,\n CssBaseline,\n Fab,\n List,\n ListItemButton,\n ListItemIcon,\n ListItemText,\n Divider,\n SwipeableDrawer,\n} from \"@mui/material\";\nimport { useNavigate } from \"react-router-dom\";\nimport ChatModal from \"../modals/chat-modal/chat-modal\";\nimport PersonalitiesTab, { LocalModelState } from './components/PersonalitiesTab';\nimport PreferencesTab from './components/PreferencesTab';\nimport BrandingTab from './components/BrandingTab';\nimport KnowledgeHubTab from './components/KnowledgeHubTab';\nimport StorageTab from './components/StorageTab';\nimport { ProviderTab } from './components/ProviderTab';\nimport MCPToolsTabV2 from './components/MCPToolsTabV2';\n\nimport { BanditPersonality, useModelStore } from \"../store/modelStore\";\nimport { banditDarkTheme } from \"../theme/banditTheme\";\nimport { predefinedThemes } from \"../theme/themeMap\";\nimport { detectTransparency, fetchAndConvertToBase64 } from \"../util\";\nimport brandingService from \"../services/branding/brandingService\";\nimport { authenticationService } from \"../services/auth/authenticationService\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport { usePackageSettingsStore } from \"../store/packageSettingsStore\";\nimport { usePreferencesStore } from \"../store/preferencesStore\";\nimport { useAIProviderStore } from \"../store/aiProviderStore\";\nimport { useAuthenticationStore } from \"../store/authenticationStore\";\nimport { useNotificationService } from \"../hooks/useNotificationService\";\nimport { useFeatures, useFeatureVisibility } from \"../hooks/useFeatures\";\nimport {\n BrushIcon,\n BuildIcon,\n ChevronLeftIcon,\n CloudIcon,\n FaceRetouchingNaturalIcon,\n MenuBookIcon,\n StorageIcon,\n TuneIcon,\n} from \"../icons/lucide-icons\";\nimport { StoredBanditConfigRecord, StoredModelConfig } from \"../types/config\";\n\nconst buildCapabilitiesUrl = (gatewayApiUrl: string): string => {\n const trimmed = gatewayApiUrl.replace(/\\/$/, \"\");\n if (trimmed.endsWith(\"/api\")) {\n return `${trimmed}/capabilities`;\n }\n return `${trimmed}/api/capabilities`;\n};\n\nconst Management = () => {\n const navigate = useNavigate();\n\n const notificationService = useNotificationService();\n\n const isMobile = useMediaQuery(\"(max-width:900px)\");\n const [sidebarOpen, setSidebarOpen] = useState(false);\n\n const getOptimalFabLogo = async (): Promise<string> => {\n const banditHead = \"https://cdn.burtson.ai/images/bandit-head.png\";\n\n try {\n // First try subdomain favicon\n const subdomain = window.location.hostname.split('.')[0];\n const faviconUrl = `https://cdn.burtson.ai/favicons/${subdomain}/favicon.png`;\n\n const faviconExists = await new Promise<boolean>((resolve) => {\n const img = new Image();\n img.onload = () => resolve(true);\n img.onerror = () => resolve(false);\n img.src = faviconUrl;\n });\n\n if (faviconExists) {\n return faviconUrl;\n }\n\n // Fallback to branding logo\n const branding = await brandingService.getBranding();\n if (branding?.logoBase64) {\n return branding.logoBase64;\n }\n\n // Final fallback to Bandit head\n return banditHead;\n } catch (error) {\n debugLogger.error(\"Failed to get optimal FAB logo\", { error });\n return banditHead;\n }\n };\n const {\n name: modelName,\n setModelName,\n tagline,\n setTagline,\n systemPrompt,\n setSystemPrompt,\n availableModels,\n selectedModel,\n setSelectedModel,\n saveModel,\n resetModel,\n hasTransparentLogo,\n setHasTransparentLogo,\n } = useModelStore();\n\n const [modalOpen, setModalOpen] = useState(false);\n const banditHead = \"https://cdn.burtson.ai/images/bandit-head.png\";\n const [fabLogo, setFabLogo] = useState<string>(banditHead);\n\n const [tabIndex, setTabIndex] = useState(4);\n const [logoFile, setLogoFile] = useState<File | null>(null);\n const [logoBase64, setLogoBase64] = useState<string | null>(null);\n const [brandingText, setBrandingText] = useState(\"\");\n const [theme, setTheme] = useState(\"bandit-dark\"); // Use consistent default\n const [customAvatarBase64, setCustomAvatarBase64] = useState<string | null>(null);\n const [presetAvatar, setPresetAvatar] = useState<string | null>(null);\n\n \n const showSnackbarMessage = (message: string, severity: 'success' | 'error' = 'success') => {\n if (severity === 'success') {\n notificationService?.showSuccess(message);\n } else {\n notificationService?.showError(message);\n }\n };\n\n const [restoreDialogOpen, setRestoreDialogOpen] = useState(false);\n\n const [brandingLoaded, setBrandingLoaded] = useState(false);\n const [isLoadingBranding, setIsLoadingBranding] = useState(false);\n\n const { initModels } = useModelStore();\n const { settings: packageSettings } = usePackageSettingsStore();\n const authToken = useAuthenticationStore((state) => state.token);\n const { preferences, updatePreference } = usePreferencesStore();\n const { hasAdminDashboard, hasLimitedAdminDashboard, getCurrentTier, hasAdvancedSearch } = useFeatures();\n const { showAdminPanel, showLimitedAdminPanel } = useFeatureVisibility();\n const { provider: currentProvider, config: currentProviderConfig } = useAIProviderStore();\n\n const [seedPacksEnabled, setSeedPacksEnabled] = useState(false);\n\n const [localSelectedModel, setLocalSelectedModel] = useState<LocalModelState>({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n\n const {\n documents,\n addDocuments,\n removeDocument,\n loadDocuments,\n clearAllDocuments,\n } = useKnowledgeStore();\n\n useEffect(() => {\n if (selectedModel) {\n const selected = availableModels.find((m) => m.name === selectedModel);\n if (selected) {\n debugLogger.debug(\"Model hydration complete\", {\n selectedModel: selected.name,\n hasAvatar: !!selected?.avatarBase64\n });\n setLocalSelectedModel({\n name: selected.name,\n tagline: selected.tagline,\n systemPrompt: selected.systemPrompt as string,\n selectedModel: selected.name,\n });\n\n // Handle avatar restoration properly\n if (selected.avatarBase64) {\n setCustomAvatarBase64(selected.avatarBase64);\n setPresetAvatar(null); // Clear preset if we have custom\n } else {\n // Clear custom avatar if model doesn't have one\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n }\n }\n }\n }, [selectedModel, availableModels]);\n\n // Load branding/model config from IndexedDB on mount\n const loadBrandingConfig = useCallback(async () => {\n if (isLoadingBranding || brandingLoaded) {\n debugLogger.warn(\"Branding loading already in progress or completed, skipping\");\n return;\n }\n\n setIsLoadingBranding(true);\n\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n const data = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n\n const brandingConfig = data?.branding;\n const modelConfig = data?.model;\n\n debugLogger.info(\"Management branding load\", {\n hasData: !!data,\n hasBranding: !!brandingConfig,\n brandingKeys: brandingConfig ? Object.keys(brandingConfig) : [],\n userSaved: brandingConfig?.userSaved\n });\n\n const hasUserModifiedBranding = brandingConfig && (\n brandingConfig.userSaved === true ||\n (brandingConfig.brandingText && brandingConfig.brandingText.trim() !== \"\") ||\n (brandingConfig.logoBase64 && typeof brandingConfig.logoBase64 === \"string\" && brandingConfig.logoBase64.trim() !== \"\") ||\n (brandingConfig.theme && brandingConfig.theme !== \"bandit-dark\")\n );\n\n const hasCDNOnlyBranding = brandingConfig &&\n brandingConfig.userSaved === false &&\n !hasUserModifiedBranding;\n\n const shouldSkipCDNBranding = hasUserModifiedBranding;\n\n if (shouldSkipCDNBranding) {\n debugLogger.info(\"🚫 USER BRANDING PROTECTION - Skipping CDN branding (preserving user modifications)\", {\n hasUserModifiedBranding,\n userSaved: brandingConfig?.userSaved,\n hasCustomText: !!(brandingConfig?.brandingText && brandingConfig.brandingText.trim()),\n hasCustomLogo: !!(brandingConfig?.logoBase64 && brandingConfig.logoBase64.trim()),\n hasCustomTheme: !!(brandingConfig?.theme && brandingConfig.theme !== \"bandit-dark\")\n });\n\n setBrandingText(brandingConfig?.brandingText || \"\");\n setTheme(brandingConfig?.theme || \"bandit-dark\");\n setLogoBase64(brandingConfig?.logoBase64 || null);\n if (brandingConfig?.hasTransparentLogo !== undefined) {\n setHasTransparentLogo(brandingConfig.hasTransparentLogo);\n }\n } else {\n debugLogger.info(\"Loading branding and models from CDN config\", {\n hasData: !!data,\n hasCDNOnlyBranding,\n brandingKeys: brandingConfig ? Object.keys(brandingConfig) : []\n });\n\n const packageSettings = usePackageSettingsStore.getState().getSettings();\n let cdnConfig = null;\n\n if (packageSettings?.brandingConfigUrl) {\n try {\n const configResponse = await fetch(packageSettings.brandingConfigUrl);\n cdnConfig = await configResponse.json();\n } catch (err) {\n debugLogger.warn(\"Failed to load CDN config:\", { error: err });\n }\n }\n\n const cdnBranding = cdnConfig?.branding;\n if (cdnBranding) {\n debugLogger.info(\"Applying CDN branding\");\n setBrandingText(cdnBranding.brandingText || \"\");\n setTheme(cdnBranding.theme || \"bandit-dark\");\n setLogoBase64(cdnBranding.logoBase64 || null);\n if (cdnBranding.hasTransparentLogo !== undefined) {\n setHasTransparentLogo(cdnBranding.hasTransparentLogo);\n }\n\n if (!hasUserModifiedBranding) {\n debugLogger.info(\"Saving CDN branding to IndexedDB\");\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: \"main\",\n branding: {\n ...cdnBranding,\n userSaved: false,\n },\n }, storeConfigs);\n }\n } else {\n debugLogger.info(\"Using Bandit default branding\");\n setTheme(\"bandit-dark\");\n setHasTransparentLogo(true);\n }\n\n if (cdnConfig?.models && Array.isArray(cdnConfig.models)) {\n debugLogger.info(\"Loading models from CDN config\", {\n modelCount: cdnConfig.models.length\n });\n\n await initModels();\n }\n }\n\n if (modelConfig) {\n setModelName(modelConfig.name || \"\");\n setTagline(modelConfig.tagline || \"\");\n setSystemPrompt(modelConfig.systemPrompt || \"\");\n setSelectedModel(modelConfig.selectedModel || \"\");\n }\n\n setBrandingLoaded(true);\n } catch (e) {\n debugLogger.error(\"Failed to load config from IndexedDB\", { error: e });\n setTheme(\"bandit-dark\");\n setHasTransparentLogo(true);\n setBrandingLoaded(true);\n } finally {\n setIsLoadingBranding(false);\n }\n }, [\n brandingLoaded,\n initModels,\n isLoadingBranding,\n setBrandingLoaded,\n setHasTransparentLogo,\n setIsLoadingBranding,\n setModelName,\n setSelectedModel,\n setSystemPrompt,\n setTagline,\n setTheme,\n ]); // Only essential dependencies\n\n useEffect(() => {\n // Only load once on mount\n void loadBrandingConfig();\n }, [loadBrandingConfig]); // Empty dependency array to run only once on mount\n\n const handleOpenModal = () => setModalOpen(true);\n const handleCloseModal = () => setModalOpen(false);\n\n // Load branding logo for FAB\n useEffect(() => {\n getOptimalFabLogo().then(setFabLogo);\n }, []);\n\n // Update FAB logo when logoBase64 changes (when user uploads new logo)\n useEffect(() => {\n if (logoBase64) {\n setFabLogo(logoBase64);\n } else {\n getOptimalFabLogo().then(setFabLogo);\n }\n }, [logoBase64]);\n\n const handleSaveModel = async () => {\n debugLogger.info(\"STARTING handleSaveModel\", {\n modelName: localSelectedModel.name,\n selectedModel: localSelectedModel.selectedModel\n });\n\n // Validate required fields\n if (!localSelectedModel.name?.trim()) {\n showSnackbarMessage(\"Please enter a personality name before saving.\", 'error');\n return;\n }\n\n useModelStore.setState({ isInitializing: true });\n\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n\n // Save branding first (always save branding regardless of model type)\n debugLogger.info(\"Saving branding to IndexedDB\");\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", {\n id: \"main\",\n branding: {\n logoBase64,\n brandingText,\n theme,\n hasTransparentLogo,\n userSaved: true,\n },\n }, storeConfigs);\n\n // Prepare avatar\n let avatarBase64ToStore: string | null = null;\n if (customAvatarBase64) {\n avatarBase64ToStore = customAvatarBase64;\n } else if (presetAvatar) {\n avatarBase64ToStore = await fetchAndConvertToBase64(presetAvatar);\n }\n\n // Create model object\n const modelToSave: BanditPersonality = {\n name: localSelectedModel.name.trim(),\n tagline: localSelectedModel.tagline || \"\",\n systemPrompt: localSelectedModel.systemPrompt || \"\",\n avatarBase64: avatarBase64ToStore || \"\",\n commands: [],\n };\n\n debugLogger.info(\"Saving custom model\", { modelName: modelToSave.name });\n\n // Save to IndexedDB\n const modelEntry: StoredBanditConfigRecord = {\n id: modelToSave.name,\n name: modelToSave.name,\n tagline: modelToSave.tagline,\n systemPrompt: modelToSave.systemPrompt,\n avatarBase64: modelToSave.avatarBase64 || undefined,\n commands: modelToSave.commands,\n model: {\n name: modelToSave.name,\n tagline: modelToSave.tagline,\n systemPrompt: modelToSave.systemPrompt,\n avatarBase64: modelToSave.avatarBase64 || undefined,\n selectedModel: modelToSave.name,\n },\n };\n\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", modelEntry, storeConfigs);\n\n // Determine if this is editing an existing model (custom or Bandit) or creating a new one\n const isEditingExistingModel = localSelectedModel.selectedModel &&\n localSelectedModel.selectedModel !== \"\" &&\n availableModels.some(m => m.name === localSelectedModel.selectedModel);\n\n const isRenamingModel = isEditingExistingModel && localSelectedModel.selectedModel !== modelToSave.name;\n\n // Only remove old entry if we're actually renaming a model\n if (isRenamingModel) {\n debugLogger.info(\"Model renamed, removing old entry\", {\n oldName: localSelectedModel.selectedModel,\n newName: modelToSave.name\n });\n await indexedDBService.delete(\"banditConfig\", 1, \"config\", localSelectedModel.selectedModel, storeConfigs);\n }\n\n // Update Zustand store\n if (isEditingExistingModel) {\n // Update existing model (whether custom or Bandit)\n debugLogger.info(\"Updating existing model in store\", {\n modelName: localSelectedModel.selectedModel,\n newName: modelToSave.name\n });\n useModelStore.setState({\n availableModels: availableModels.map(model =>\n model.name === localSelectedModel.selectedModel ? modelToSave : model\n ),\n });\n } else {\n // Add new model\n debugLogger.info(\"Adding new model to store\", {\n modelName: modelToSave.name\n });\n useModelStore.setState({\n availableModels: [...availableModels, modelToSave],\n });\n }\n\n // Update selection and ensure UI state is synchronized\n setSelectedModel(modelToSave.name);\n setLocalSelectedModel({\n name: modelToSave.name,\n tagline: modelToSave.tagline,\n systemPrompt: modelToSave.systemPrompt,\n selectedModel: modelToSave.name,\n });\n\n debugLogger.info(\"✅ Model saved successfully\");\n\n // Show success message\n showSnackbarMessage(`Personality \"${modelToSave.name}\" saved successfully!`, 'success');\n\n // Dispatch theme change event\n window.dispatchEvent(new CustomEvent('bandit-theme-changed', { detail: { theme } }));\n\n } catch (e) {\n debugLogger.error(\"Failed to save\", { error: e });\n showSnackbarMessage(\"Failed to save personality. Please try again.\", 'error');\n } finally {\n useModelStore.setState({ isInitializing: false });\n }\n };\n\n // Save branding data only (separate from model saving)\n const handleSaveBranding = async () => {\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n\n debugLogger.info(\"Saving branding data to IndexedDB\");\n\n // Re-evaluate transparency at save time to avoid stale flags\n let finalHasTransparentLogo = hasTransparentLogo;\n if (logoBase64) {\n try {\n const detected = await detectTransparency(logoBase64);\n const isPng = logoBase64.startsWith(\"data:image/png\");\n finalHasTransparentLogo = detected || isPng;\n debugLogger.debug(\"SaveBranding transparency check\", { detected, isPng, finalHasTransparentLogo });\n } catch (err) {\n const isPng = logoBase64.startsWith(\"data:image/png\");\n finalHasTransparentLogo = finalHasTransparentLogo ?? isPng ?? true;\n debugLogger.warn(\"SaveBranding transparency check failed, using fallback\", { error: err, finalHasTransparentLogo });\n }\n }\n\n // Get current config to preserve other data\n const current = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n const currentConfig: StoredBanditConfigRecord = current ?? { id: \"main\" };\n\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", {\n ...currentConfig,\n id: \"main\",\n branding: {\n logoBase64,\n brandingText,\n theme,\n hasTransparentLogo: finalHasTransparentLogo,\n userSaved: true, // Mark as user-saved to protect from CDN overrides\n },\n }, storeConfigs);\n\n // Dispatch theme change event for other components to listen\n window.dispatchEvent(new CustomEvent('bandit-theme-changed', {\n detail: { theme }\n }));\n\n debugLogger.info(\"Branding saved successfully\");\n\n // Show success feedback\n showSnackbarMessage(\"Branding saved successfully!\", 'success');\n\n } catch (error) {\n debugLogger.error(\"Failed to save branding\", { error });\n showSnackbarMessage(\"Failed to save branding. Please try again.\", 'error');\n }\n };\n\n const handleSavePreferences = () => {\n // Preferences are now automatically saved by IndexedDB via preferencesStore\n // This function is kept for UI feedback if needed\n debugLogger.info(\"Preferences saved automatically by zustand store\");\n };\n\n const handleResetModel = () => {\n resetModel();\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setPresetAvatar(null);\n setCustomAvatarBase64(null);\n };\n\n // Remove handleTabChange and use setTabIndex directly\n\n const handleLogoUpload = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (event.target.files && event.target.files[0]) {\n const file = event.target.files[0];\n setLogoFile(file);\n const reader = new FileReader();\n reader.onload = async function (e) {\n const base64 = e.target?.result as string;\n setLogoBase64(base64);\n debugLogger.debug(\"Starting transparency detection for uploaded image\");\n try {\n const isPng = base64.startsWith(\"data:image/png\");\n const isTransparent = await detectTransparency(base64);\n // If detection fails to find alpha on PNGs, err on the side of transparency\n const finalTransparent = isTransparent || isPng;\n setHasTransparentLogo(finalTransparent);\n debugLogger.debug(\"Transparency detection result saved\", { isTransparent, finalTransparent });\n } catch (err) {\n debugLogger.error(\"Failed to detect transparency\", { error: err });\n }\n };\n reader.readAsDataURL(file);\n }\n };\n\n const handleExportConfig = async () => {\n const hasLogo = !!logoBase64;\n const exportData = {\n branding: {\n logoBase64: logoBase64 || \"\",\n brandingText: brandingText || \"\",\n theme,\n hasTransparentLogo: hasLogo ? await detectTransparency(logoBase64!) : false,\n },\n models: availableModels.map((model) => ({\n name: model.name,\n tagline: model.tagline,\n systemPrompt: model.systemPrompt,\n avatarBase64: model.avatarBase64,\n commands: model.commands,\n })),\n knowledgeDocs: documents,\n };\n const dataStr =\n \"data:text/json;charset=utf-8,\" +\n encodeURIComponent(JSON.stringify(exportData, null, 2));\n const downloadAnchorNode = document.createElement(\"a\");\n downloadAnchorNode.setAttribute(\"href\", dataStr);\n downloadAnchorNode.setAttribute(\"download\", \"bandit_config.json\");\n document.body.appendChild(downloadAnchorNode);\n downloadAnchorNode.click();\n document.body.removeChild(downloadAnchorNode);\n };\n\n const handleRestoreDefaults = async () => {\n debugLogger.info(\"Starting branding restore - attempting CDN defaults first\");\n \n // First try to load CDN defaults\n const packageSettings = usePackageSettingsStore.getState().getSettings();\n let cdnBranding = null;\n \n if (packageSettings?.brandingConfigUrl) {\n try {\n debugLogger.info(\"Attempting to load CDN branding config\", { url: packageSettings.brandingConfigUrl });\n const configResponse = await fetch(packageSettings.brandingConfigUrl);\n const cdnConfig = await configResponse.json();\n cdnBranding = cdnConfig?.branding;\n \n if (cdnBranding) {\n debugLogger.info(\"CDN branding found, applying CDN defaults\", { \n hasBrandingText: !!cdnBranding.brandingText,\n hasLogo: !!cdnBranding.logoBase64,\n theme: cdnBranding.theme\n });\n }\n } catch (err) {\n debugLogger.warn(\"Failed to load CDN branding config, will use Bandit defaults\", { error: err });\n }\n }\n\n // Apply CDN defaults if available, otherwise use Bandit defaults\n if (cdnBranding) {\n // Apply CDN branding\n setLogoBase64(cdnBranding.logoBase64 || null);\n setBrandingText(cdnBranding.brandingText || \"\");\n setTheme(cdnBranding.theme || \"bandit-dark\");\n if (cdnBranding.hasTransparentLogo !== undefined) {\n setHasTransparentLogo(cdnBranding.hasTransparentLogo);\n } else {\n setHasTransparentLogo(true);\n }\n debugLogger.info(\"Applied CDN branding defaults\");\n } else {\n // Fall back to Bandit defaults\n setLogoBase64(null);\n setBrandingText(\"\");\n setTheme(\"bandit-dark\");\n setHasTransparentLogo(true);\n debugLogger.info(\"Applied Bandit default branding\");\n }\n\n // Reset other local state\n setLogoFile(null);\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n getOptimalFabLogo().then(setFabLogo);\n\n // Save the restored defaults to IndexedDB to ensure persistence\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n const current = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n\n const brandingToSave = cdnBranding ? {\n ...cdnBranding,\n userSaved: false, // Mark as CDN-loaded, not user-saved\n } : {\n logoBase64: null,\n brandingText: \"\",\n theme: \"bandit-dark\",\n hasTransparentLogo: true,\n userSaved: false, // Mark as default, not user-saved\n };\n\n debugLogger.info(\"Saving restored branding to IndexedDB\", { \n source: cdnBranding ? 'CDN' : 'Bandit defaults',\n userSaved: brandingToSave.userSaved\n });\n \n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", {\n id: \"main\",\n branding: brandingToSave,\n model: current?.model ?? {},\n }, storeConfigs);\n\n // Dispatch theme change event for other components to listen\n const finalTheme = cdnBranding?.theme || \"bandit-dark\";\n window.dispatchEvent(new CustomEvent('bandit-theme-changed', {\n detail: { theme: finalTheme }\n }));\n\n debugLogger.info(\"Successfully restored and saved branding\", { theme: finalTheme });\n } catch (error) {\n debugLogger.error(\"Failed to save restored branding\", { error });\n }\n };\n\n // Restore default models: clear deletedModels and re-import from config\n const restoreDefaultModelsAndConfig = async () => {\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n\n debugLogger.info(\"Starting restore defaults - preserving critical data\");\n\n // Get current branding to preserve it if it's user-saved\n const currentMain = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n const preservedBranding = currentMain?.branding?.userSaved ? currentMain.branding : null;\n\n // Remove \"deletedModels\" entry to clear deleted model tracking\n await indexedDBService.delete('banditConfig', 1, 'config', 'deletedModels', storeConfigs);\n\n // Only clear custom models from IndexedDB, but keep \"main\", \"mcpTools\", and other system data\n const allKeys = await indexedDBService.getAllKeys(\"banditConfig\", 1, \"config\", storeConfigs);\n const systemKeys = [\"main\", \"deletedModels\", \"mcpTools\", \"preferences\", \"knowledgeDocs\"]; // Preserve system data\n\n for (const key of allKeys) {\n if (typeof key === \"string\" && !systemKeys.includes(key)) {\n // Only delete if it looks like a model entry\n const entry = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n key,\n storeConfigs\n );\n const hasModelData =\n Boolean(entry?.model) ||\n (typeof entry?.name === \"string\" && entry.name.trim().length > 0) ||\n (typeof entry?.tagline === \"string\" && entry.tagline.trim().length > 0) ||\n (typeof entry?.systemPrompt === \"string\" && entry.systemPrompt.trim().length > 0);\n if (hasModelData) {\n debugLogger.info(\"Deleting custom model:\", { key });\n await indexedDBService.delete(\"banditConfig\", 1, \"config\", key, storeConfigs);\n } else {\n debugLogger.info(\"Preserving non-model data:\", { key });\n }\n }\n }\n\n // Restore default models (this now handles config URL loading and persistence)\n if (typeof useModelStore.getState().restoreDefaultModels === \"function\") {\n await useModelStore.getState().restoreDefaultModels();\n }\n\n // Restore preserved branding if it existed and was user-saved\n if (preservedBranding) {\n debugLogger.info(\"Restoring preserved user branding after model restore\");\n const updatedMain = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n const restoredMain: StoredBanditConfigRecord = updatedMain ?? { id: \"main\" };\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", {\n ...restoredMain,\n id: \"main\",\n branding: preservedBranding, // Restore the preserved branding\n }, storeConfigs);\n }\n\n debugLogger.info(\"Restore defaults completed successfully\");\n } catch (err) {\n debugLogger.error(\"Failed to restore default models and config\", { error: err });\n }\n };\n\n // Restore deleted Bandit models only\n const restoreBanditModels = async () => {\n try {\n debugLogger.info(\"Restoring deleted Bandit models\");\n await useModelStore.getState().restoreDeletedBanditModels();\n debugLogger.info(\"✅ Bandit models restored successfully\");\n } catch (err) {\n debugLogger.error(\"Failed to restore Bandit models\", { error: err });\n }\n };\n\n const handleImportConfig = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (event.target.files && event.target.files[0]) {\n const file = event.target.files[0];\n const reader = new FileReader();\n reader.onload = async function (e) {\n try {\n const data = JSON.parse(e.target?.result as string);\n if (data.branding) {\n setBrandingText(data.branding.brandingText || \"\");\n setTheme(data.branding.theme || \"Dark\");\n setLogoBase64(data.branding.logoBase64 || null);\n setLogoFile(null);\n if (data.branding.hasTransparentLogo !== undefined) {\n setHasTransparentLogo(data.branding.hasTransparentLogo);\n }\n }\n // --- MODELS IMPORT LOGIC ---\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n // Persist each model separately by ID\n if (data.models && Array.isArray(data.models)) {\n for (const model of data.models) {\n if (!model || typeof model !== \"object\") {\n continue;\n }\n const parsedModel = model as Record<string, unknown>;\n const modelName = typeof parsedModel.name === \"string\" ? parsedModel.name : \"\";\n if (!modelName) {\n continue;\n }\n\n const sanitizedModel: StoredModelConfig = {\n name: modelName,\n tagline: typeof parsedModel.tagline === \"string\" ? parsedModel.tagline : undefined,\n systemPrompt: typeof parsedModel.systemPrompt === \"string\" ? parsedModel.systemPrompt : undefined,\n selectedModel: typeof parsedModel.selectedModel === \"string\" ? parsedModel.selectedModel : undefined,\n avatarBase64:\n typeof parsedModel.avatarBase64 === \"string\"\n ? parsedModel.avatarBase64\n : parsedModel.avatarBase64 === null\n ? undefined\n : undefined,\n };\n\n const entry: StoredBanditConfigRecord = {\n id: modelName,\n model: sanitizedModel,\n name: modelName,\n tagline: sanitizedModel.tagline,\n systemPrompt: sanitizedModel.systemPrompt,\n // Normalize to match StoredBanditConfigRecord (string | undefined)\n avatarBase64: sanitizedModel.avatarBase64 ?? undefined,\n };\n\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", entry, storeConfigs);\n }\n\n // Update Zustand with all imported models\n useModelStore.setState({\n availableModels: data.models,\n selectedModel: data.models[0]?.name || \"\",\n });\n setSelectedModel(data.models[0]?.name || \"\");\n setLocalSelectedModel({\n name: data.models[0]?.name || \"\",\n tagline: data.models[0]?.tagline || \"\",\n systemPrompt: data.models[0]?.systemPrompt || \"\",\n selectedModel: data.models[0]?.name || \"\",\n });\n setCustomAvatarBase64(data.models[0]?.avatarBase64 || null);\n setPresetAvatar(null);\n }\n\n // Save branding only to \"main\" entry - mark as user-saved to protect from CDN\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: \"main\",\n branding: {\n ...data.branding,\n userSaved: true, // Mark imported branding as user-saved to protect from CDN overrides\n },\n }, storeConfigs);\n\n // Handle knowledgeDocs import\n if (data.knowledgeDocs && Array.isArray(data.knowledgeDocs)) {\n await clearAllDocuments();\n for (const doc of data.knowledgeDocs) {\n const blob = new Blob([doc.content], { type: \"text/plain\" });\n const file = new File([blob], doc.name, { type: \"text/plain\" });\n await addDocuments([file]);\n }\n await loadDocuments();\n }\n\n // Rehydrate from IndexedDB\n if (typeof initModels === \"function\") {\n await initModels();\n }\n } catch (e) {\n debugLogger.error(\"Failed to import config\", { error: e });\n }\n };\n reader.readAsText(file);\n }\n };\n\n // Ensure dropdown renders updated options when availableModels changes\n useEffect(() => {\n // If selectedModel is not in availableModels, clear selection\n if (\n localSelectedModel.selectedModel &&\n !availableModels.some((m) => m.name === localSelectedModel.selectedModel)\n ) {\n setLocalSelectedModel((prev) => ({\n ...prev,\n selectedModel: \"\",\n }));\n }\n // Optionally, you could auto-select the newly added model here if desired\n }, [availableModels, localSelectedModel.selectedModel]);\n\n useEffect(() => {\n loadDocuments();\n }, [loadDocuments]);\n\n useEffect(() => {\n const gatewayApiUrl = packageSettings?.gatewayApiUrl;\n if (!gatewayApiUrl || gatewayApiUrl.toLowerCase().startsWith(\"playground://\")) {\n setSeedPacksEnabled(false);\n return;\n }\n\n let isActive = true;\n const loadCapabilities = async () => {\n try {\n const token = authToken ?? authenticationService.getToken();\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n const response = await fetch(buildCapabilitiesUrl(gatewayApiUrl), {\n method: \"GET\",\n headers,\n });\n if (!response.ok) {\n throw new Error(`Capabilities request failed: ${response.status}`);\n }\n const payload = (await response.json()) as Record<string, unknown> | null;\n if (!isActive) {\n return;\n }\n setSeedPacksEnabled(Boolean(payload?.seedPacksEnabled));\n } catch (error) {\n if (!isActive) {\n return;\n }\n setSeedPacksEnabled(false);\n debugLogger.warn(\"Management: failed to load capabilities\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n loadCapabilities();\n return () => {\n isActive = false;\n };\n }, [packageSettings?.gatewayApiUrl, authToken]);\n\n // AI Provider configuration handlers\n const currentTheme = useMemo(() => {\n const baseTheme = predefinedThemes[theme] || banditDarkTheme;\n return createTheme(baseTheme, {\n components: {\n MuiInputBase: {\n styleOverrides: {\n input: {\n outline: \"none\",\n boxShadow: \"none\",\n \"&:focus, &:focus-visible\": {\n outline: \"none\",\n boxShadow: \"none\",\n },\n },\n inputMultiline: {\n outline: \"none\",\n boxShadow: \"none\",\n \"&:focus, &:focus-visible\": {\n outline: \"none\",\n boxShadow: \"none\",\n },\n },\n },\n },\n },\n });\n }, [theme]);\n // Side navigation tab config\n const allNavTabs = [\n {\n label: \"Personalities\",\n icon: <FaceRetouchingNaturalIcon />,\n requiresFeature: 'limitedAdminDashboard', // Available to premium+\n },\n {\n label: \"Branding\",\n icon: <BrushIcon />,\n requiresFeature: 'limitedAdminDashboard', // Available to premium+\n },\n {\n label: \"Knowledge\",\n icon: <MenuBookIcon />,\n requiresFeature: 'limitedAdminDashboard', // Available to premium+\n },\n {\n label: \"Storage\",\n icon: <StorageIcon />,\n requiresFeature: 'limitedAdminDashboard', // Available to premium+ (changed from adminDashboardEnabled)\n },\n {\n label: \"Preferences\",\n icon: <TuneIcon />,\n requiresFeature: 'limitedAdminDashboard', // Available to premium+\n },\n {\n label: \"Provider\",\n icon: <CloudIcon />,\n requiresFeature: 'advancedSearch', // Pro/Team users with advanced features\n },\n {\n label: \"Tools\",\n icon: <BuildIcon />,\n requiresFeature: 'advancedSearch', // Pro/Team users with advanced features\n },\n ];\n\n // Filter tabs based on user's features\n const navTabs = allNavTabs.filter(tab => {\n if (tab.requiresFeature === 'limitedAdminDashboard') {\n return hasLimitedAdminDashboard() || hasAdminDashboard();\n }\n if (tab.requiresFeature === 'adminDashboardEnabled') {\n return hasAdminDashboard();\n }\n if (tab.requiresFeature === 'advancedSearch') {\n return hasAdvancedSearch(); // Pro/Team users\n }\n return true;\n });\n\n const preferredDefaultTabIndex = navTabs.findIndex((tab) => tab.label === \"Preferences\");\n const defaultTabIndex = preferredDefaultTabIndex >= 0 ? preferredDefaultTabIndex : 0;\n\n useEffect(() => {\n setTabIndex((current) => {\n if (current < 0 || current >= navTabs.length) {\n return defaultTabIndex;\n }\n return current;\n });\n }, [navTabs.length, defaultTabIndex]);\n\n const mobileQuickTabs = navTabs.slice(0, 5);\n const hasMobileOverflowTabs = navTabs.length > mobileQuickTabs.length;\n\n const navigationContent = (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n width: \"100%\",\n bgcolor: \"inherit\",\n }}\n >\n {isMobile && (\n <Box\n sx={{\n height: 6,\n width: 56,\n borderRadius: 999,\n bgcolor: (theme) => alpha(theme.palette.text.primary, 0.18),\n alignSelf: \"center\",\n mt: 1.25,\n mb: 0.75,\n }}\n />\n )}\n\n <Box sx={{ p: isMobile ? 2.5 : 3, pb: isMobile ? 1.5 : 2 }}>\n <Button\n onClick={() => {\n if (isMobile) setSidebarOpen(false);\n navigate(\"/chat\");\n }}\n onMouseEnter={preloadChatPage}\n startIcon={<ChevronLeftIcon sx={{ fontSize: 20 }} />}\n fullWidth\n variant=\"outlined\"\n sx={{\n height: 48,\n borderRadius: 3,\n fontWeight: 600,\n fontSize: \"1rem\",\n bgcolor: (theme) => theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.08)\"\n : \"rgba(25,118,210,0.06)\",\n border: (theme) => `1.5px solid ${theme.palette.primary.main}30`,\n color: (theme) => theme.palette.primary.main,\n textTransform: \"none\",\n boxShadow: \"0 2px 8px rgba(25,118,210,0.15)\",\n transition: \"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n \"&:hover\": {\n bgcolor: (theme) => theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.15)\"\n : \"rgba(25,118,210,0.12)\",\n borderColor: (theme) => theme.palette.primary.main,\n transform: \"translateY(-1px)\",\n boxShadow: \"0 4px 16px rgba(25,118,210,0.25)\",\n },\n \"&:active\": {\n transform: \"translateY(0px)\",\n },\n }}\n >\n Back to Chat\n </Button>\n </Box>\n\n <Divider sx={{ mx: isMobile ? 2 : 3, mb: 2, opacity: 0.6 }} />\n\n <Box sx={{ flex: 1, px: isMobile ? 1.5 : 2, pb: 3, overflowY: \"auto\" }}>\n <List sx={{ px: 0, py: 0 }}>\n {navTabs.map((tab, idx) => (\n <ListItemButton\n key={tab.label}\n selected={tabIndex === idx}\n onClick={() => {\n setTabIndex(idx);\n if (isMobile) setSidebarOpen(false);\n }}\n sx={{\n minHeight: 56,\n borderRadius: 3,\n mx: 1,\n my: 0.5,\n px: 2,\n py: 1.5,\n border: tabIndex === idx \n ? (theme) => `2px solid ${theme.palette.primary.main}40`\n : \"2px solid transparent\",\n bgcolor: tabIndex === idx\n ? (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.12)\"\n : \"rgba(25,118,210,0.08)\"\n : \"transparent\",\n color: tabIndex === idx ? \"primary.main\" : \"text.primary\",\n fontWeight: tabIndex === idx ? 700 : 500,\n transition: \"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n position: \"relative\",\n overflow: \"hidden\",\n \"&:before\": {\n content: '\"\"',\n position: \"absolute\",\n left: 0,\n top: 0,\n bottom: 0,\n width: 4,\n bgcolor: tabIndex === idx ? \"primary.main\" : \"transparent\",\n borderRadius: \"0 2px 2px 0\",\n transition: \"all 0.2s\",\n },\n \"&:hover\": {\n bgcolor: (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.15)\"\n : \"rgba(25,118,210,0.10)\",\n color: \"primary.main\",\n transform: \"translateX(4px)\",\n \"&:before\": {\n bgcolor: \"primary.main\",\n },\n },\n \"&:active\": {\n transform: \"translateX(2px) scale(0.98)\",\n },\n \"& .MuiListItemIcon-root\": {\n minWidth: 44,\n mr: 1.5,\n },\n }}\n >\n <ListItemIcon \n sx={{ \n color: tabIndex === idx ? \"primary.main\" : \"text.secondary\",\n fontSize: 24,\n transition: \"all 0.2s\",\n }}\n >\n {tab.icon}\n </ListItemIcon>\n <ListItemText\n primary={tab.label}\n primaryTypographyProps={{\n fontWeight: tabIndex === idx ? 700 : 600,\n fontSize: \"1rem\",\n letterSpacing: \"-0.01em\",\n }}\n />\n {tabIndex === idx && (\n <Box\n sx={{\n position: \"absolute\",\n right: -10,\n top: -10,\n width: 90,\n height: 90,\n bgcolor: (theme) => theme.palette.primary.main,\n filter: \"blur(45px)\",\n opacity: 0.35,\n pointerEvents: \"none\",\n }}\n />\n )}\n </ListItemButton>\n ))}\n </List>\n </Box>\n </Box>\n );\n\n if (!brandingLoaded) return null;\n\n return (\n <ThemeProvider theme={currentTheme}>\n <CssBaseline />\n <Box\n display=\"flex\"\n height=\"100vh\"\n sx={{\n bgcolor: \"background.default\",\n flexDirection: isMobile ? \"column\" : \"row\",\n width: \"100vw\",\n overflow: \"hidden\",\n position: \"relative\",\n }}\n >\n {/* Enhanced Mobile Header */}\n {isMobile && (\n <Box\n sx={{\n width: \"100%\",\n minHeight: 64,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n px: 3,\n py: 1.5,\n bgcolor: (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(24,28,40,0.95)\"\n : \"rgba(255,255,255,0.95)\",\n borderBottom: (theme) => `1px solid ${theme.palette.divider}`,\n backdropFilter: \"blur(12px)\",\n zIndex: 1201,\n position: \"sticky\",\n top: 0,\n boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n }}\n >\n {/* Enhanced Hamburger Menu */}\n <Button\n onClick={() => setSidebarOpen((o) => !o)}\n sx={{\n minWidth: 48,\n minHeight: 48,\n p: 1.5,\n borderRadius: 2,\n border: \"none\",\n bgcolor: sidebarOpen \n ? (theme) => theme.palette.primary.main\n : (theme) => theme.palette.mode === \"dark\"\n ? \"rgba(255,255,255,0.08)\"\n : \"rgba(0,0,0,0.04)\",\n color: sidebarOpen \n ? \"white\"\n : (theme) => theme.palette.primary.main,\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n transform: sidebarOpen ? \"rotate(90deg)\" : \"rotate(0deg)\",\n \"&:hover\": {\n bgcolor: sidebarOpen\n ? (theme) => theme.palette.primary.dark\n : (theme) => theme.palette.mode === \"dark\"\n ? \"rgba(255,255,255,0.12)\"\n : \"rgba(0,0,0,0.08)\",\n transform: \"scale(1.05)\",\n },\n \"&:active\": {\n transform: sidebarOpen ? \"rotate(90deg) scale(0.95)\" : \"scale(0.95)\",\n },\n }}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d={sidebarOpen \n ? \"M18 6L6 18M6 6L18 18\" \n : \"M3 12H21M3 6H21M3 18H21\"\n }\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </Button>\n\n {/* App Title */}\n <Typography \n variant=\"h6\" \n sx={{ \n fontWeight: 700, \n color: \"primary.main\",\n fontSize: \"1.1rem\",\n letterSpacing: \"-0.02em\"\n }}\n >\n Management\n </Typography>\n\n {/* Current Tab Indicator */}\n <Box sx={{\n px: 2,\n py: 0.5,\n borderRadius: 2,\n bgcolor: (theme) => theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.12)\"\n : \"rgba(25,118,210,0.08)\",\n border: (theme) => `1px solid ${theme.palette.primary.main}20`,\n }}>\n <Typography \n variant=\"caption\" \n sx={{ \n color: \"primary.main\", \n fontWeight: 600,\n fontSize: \"0.75rem\"\n }}\n >\n {navTabs[tabIndex]?.label}\n </Typography>\n </Box>\n </Box>\n )}\n\n {isMobile && (\n <Box\n sx={{\n width: \"100%\",\n display: \"flex\",\n gap: 1,\n px: 1.5,\n py: 1,\n overflowX: \"auto\",\n borderBottom: (theme) => `1px solid ${theme.palette.divider}`,\n bgcolor: (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(24,28,40,0.95)\"\n : \"rgba(255,255,255,0.95)\",\n backdropFilter: \"blur(12px)\",\n }}\n >\n {mobileQuickTabs.map((tab) => {\n const quickTabIndex = navTabs.findIndex((navTab) => navTab.label === tab.label);\n const selected = tabIndex === quickTabIndex;\n\n return (\n <Button\n key={tab.label}\n size=\"small\"\n onClick={() => setTabIndex(quickTabIndex)}\n sx={{\n flexShrink: 0,\n textTransform: \"none\",\n borderRadius: 999,\n px: 1.5,\n py: 0.6,\n minHeight: 32,\n fontSize: \"0.78rem\",\n fontWeight: selected ? 700 : 600,\n bgcolor: selected\n ? (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.2)\"\n : \"rgba(25,118,210,0.12)\"\n : \"transparent\",\n color: selected ? \"primary.main\" : \"text.secondary\",\n border: (theme) =>\n selected\n ? `1px solid ${theme.palette.primary.main}66`\n : `1px solid ${alpha(theme.palette.divider, 0.45)}`,\n \"&:hover\": {\n bgcolor: (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.16)\"\n : \"rgba(25,118,210,0.1)\",\n },\n }}\n >\n {tab.label}\n </Button>\n );\n })}\n {hasMobileOverflowTabs && (\n <Button\n size=\"small\"\n onClick={() => setSidebarOpen(true)}\n sx={{\n flexShrink: 0,\n textTransform: \"none\",\n borderRadius: 999,\n px: 1.5,\n py: 0.6,\n minHeight: 32,\n fontSize: \"0.78rem\",\n fontWeight: 600,\n color: \"text.secondary\",\n border: (theme) => `1px dashed ${alpha(theme.palette.divider, 0.6)}`,\n }}\n >\n More\n </Button>\n )}\n </Box>\n )}\n\n {/* Enhanced Side Navigation */}\n {isMobile ? (\n <SwipeableDrawer\n anchor=\"bottom\"\n open={sidebarOpen}\n onClose={() => setSidebarOpen(false)}\n onOpen={() => setSidebarOpen(true)}\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) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(16,20,28,0.98)\"\n : \"rgba(255,255,255,0.98)\",\n boxShadow: '0 12px 32px rgba(0,0,0,0.28)',\n backdropFilter: 'blur(18px)',\n },\n }}\n >\n {navigationContent}\n </SwipeableDrawer>\n ) : (\n <Box\n sx={{\n width: 280,\n minWidth: 280,\n maxWidth: 280,\n height: \"100vh\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"stretch\",\n bgcolor: (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(16,20,28,0.98)\"\n : \"rgba(255,255,255,0.98)\",\n borderRight: (theme) => `1px solid ${theme.palette.divider}`,\n boxShadow: (theme) => theme.palette.mode === \"dark\"\n ? \"2px 0 16px 0 rgba(0,0,0,0.25)\"\n : \"2px 0 16px 0 rgba(0,0,0,0.08)\",\n backdropFilter: \"blur(16px)\",\n zIndex: 1200,\n position: \"fixed\",\n left: 0,\n top: 0,\n overflow: \"hidden\",\n }}\n >\n {navigationContent}\n </Box>\n )}\n\n {/* Main content area */}\n <Box\n sx={{\n flex: 1,\n p: { xs: 1, sm: 3, md: 4 },\n overflowY: \"auto\",\n overflowX: \"hidden\",\n maxWidth: \"100vw\",\n minWidth: 0,\n minHeight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n bgcolor: \"background.default\",\n ml: isMobile ? 0 : \"280px\", // Fixed left margin only on desktop\n mt: 0,\n transition: \"margin-left 0.2s\",\n }}\n >\n {/* Tab Content */}\n {navTabs[tabIndex]?.label === \"Personalities\" && (\n <PersonalitiesTab\n availableModels={availableModels}\n selectedModel={selectedModel}\n setSelectedModel={setSelectedModel}\n localSelectedModel={localSelectedModel}\n setLocalSelectedModel={setLocalSelectedModel}\n customAvatarBase64={customAvatarBase64}\n setCustomAvatarBase64={setCustomAvatarBase64}\n presetAvatar={presetAvatar}\n setPresetAvatar={setPresetAvatar}\n handleSaveModel={handleSaveModel}\n handleResetModel={handleResetModel}\n restoreDefaultModelsAndConfig={restoreDefaultModelsAndConfig}\n restoreBanditModels={restoreBanditModels}\n showSnackbar={showSnackbarMessage}\n />\n )}\n {navTabs[tabIndex]?.label === \"Branding\" && (\n <BrandingTab\n logoFile={logoFile}\n logoBase64={logoBase64}\n brandingText={brandingText}\n setBrandingText={setBrandingText}\n theme={theme}\n setTheme={setTheme}\n predefinedThemes={predefinedThemes}\n handleLogoUpload={handleLogoUpload}\n handleRestoreDefaults={handleRestoreDefaults}\n handleExportConfig={handleExportConfig}\n handleImportConfig={handleImportConfig}\n handleSaveBranding={handleSaveBranding}\n setLogoFile={setLogoFile}\n setLogoBase64={setLogoBase64}\n />\n )}\n {navTabs[tabIndex]?.label === \"Knowledge\" && (\n <KnowledgeHubTab\n documents={documents}\n addDocuments={addDocuments}\n removeDocument={removeDocument}\n loadDocuments={loadDocuments}\n clearAllDocuments={clearAllDocuments}\n currentTheme={currentTheme}\n isLimitedAdmin={hasLimitedAdminDashboard() && !hasAdminDashboard()}\n seedPacksEnabled={seedPacksEnabled}\n />\n )}\n {navTabs[tabIndex]?.label === \"Storage\" && (\n <StorageTab currentTheme={currentTheme} />\n )}\n {navTabs[tabIndex]?.label === \"Preferences\" && (\n <PreferencesTab\n preferences={preferences}\n updatePreference={updatePreference}\n packageSettings={packageSettings}\n handleSavePreferences={handleSavePreferences}\n showSnackbar={showSnackbarMessage}\n />\n )}\n {navTabs[tabIndex]?.label === \"Provider\" && <ProviderTab />}\n {navTabs[tabIndex]?.label === \"Tools\" && <MCPToolsTabV2 />}\n </Box>\n\n <Fab\n aria-label=\"AI\"\n onClick={handleOpenModal}\n sx={(theme) => ({\n position: \"fixed\",\n bottom: 16,\n right: 16,\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n \"&:hover\": {\n backgroundColor: theme.palette.primary.dark,\n transform: \"scale(1.05)\",\n },\n \"&:active\": {\n transform: \"scale(0.95)\",\n },\n transition: \"all 0.2s ease-in-out\",\n boxShadow: theme.shadows[6],\n zIndex: 2000,\n })}\n >\n <img\n src={fabLogo}\n alt=\"AI Assistant Logo\"\n style={{\n width: 32,\n height: 32,\n objectFit: \"contain\",\n }}\n />\n </Fab>\n <ChatModal open={modalOpen} onClose={handleCloseModal} />\n </Box>\n\n </ThemeProvider>\n );\n};\n\nexport default Management;\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-FAB9-58E90B\nconst __banditFingerprint_components_PersonalitiesTabtsx = 'BL-FP-A5FD2B-5424';\nconst __auditTrail_components_PersonalitiesTabtsx = 'BL-AU-MGOIKVVJ-SL4R';\n// File: PersonalitiesTab.tsx | Path: src/management/components/PersonalitiesTab.tsx | Hash: fab95424\n\nimport React, { useState } from \"react\";\nimport {\n Box,\n TextField,\n Button,\n Typography,\n MenuItem,\n Avatar,\n Card,\n CardContent,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n Tabs,\n Tab,\n Alert,\n Chip,\n Collapse,\n GlobalStyles,\n} from \"@mui/material\";\nimport useMediaQuery from \"@mui/material/useMediaQuery\";\nimport { useTheme } from \"@mui/material/styles\";\nimport AvatarCropper from '../../components/AvatarCropper';\nimport { BanditPersonality, useModelStore } from \"../../store/modelStore\";\nimport { models as defaultModels } from \"../../models/models\";\nimport { resolveAvatar } from \"../../util\";\nimport indexedDBService from \"../../services/indexedDB/indexedDBService\";\nimport { debugLogger } from \"../../services/logging/debugLogger\";\nimport {\n AutoAwesomeIcon,\n EditNoteOutlinedIcon,\n ManageAccountsOutlinedIcon,\n PlayArrowRoundedIcon,\n RocketLaunchOutlinedIcon,\n ViewModuleOutlinedIcon,\n} from \"../../icons/lucide-icons\";\n\nexport interface LocalModelState {\n name: string;\n tagline: string;\n systemPrompt: string;\n selectedModel: string;\n}\n\ninterface PersonalitiesTabProps {\n availableModels: BanditPersonality[];\n selectedModel: string;\n setSelectedModel: (model: string) => void;\n localSelectedModel: LocalModelState;\n setLocalSelectedModel: (model: LocalModelState) => void;\n customAvatarBase64: string | null;\n setCustomAvatarBase64: (avatar: string | null) => void;\n presetAvatar: string | null;\n setPresetAvatar: (avatar: string | null) => void;\n handleSaveModel: () => Promise<void>;\n handleResetModel: () => void;\n restoreDefaultModelsAndConfig: () => Promise<void>;\n restoreBanditModels: () => Promise<void>;\n showSnackbar?: (message: string, severity: 'success' | 'error') => void;\n}const PersonalitiesTab: React.FC<PersonalitiesTabProps> = ({\n availableModels,\n selectedModel,\n setSelectedModel,\n localSelectedModel,\n setLocalSelectedModel,\n customAvatarBase64,\n setCustomAvatarBase64,\n presetAvatar,\n setPresetAvatar,\n handleSaveModel,\n handleResetModel,\n restoreDefaultModelsAndConfig,\n restoreBanditModels,\n showSnackbar,\n}) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n const [personalityTabIndex, setPersonalityTabIndex] = useState(0);\n const sectionGap = isMobile ? 2 : 3;\n const tabWrapperStyles = isMobile ? { flexDirection: 'column', gap: 0.35, fontSize: '0.78rem' } : { flexDirection: 'row', gap: 0.75, fontSize: '0.95rem' };\n const [restoreDialogOpen, setRestoreDialogOpen] = useState(false);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [personalityToDelete, setPersonalityToDelete] = useState<string | null>(null);\n const [clickedChips, setClickedChips] = useState<Set<string>>(new Set());\n const [showTemplateHelp, setShowTemplateHelp] = useState(false);\n const [cropperOpen, setCropperOpen] = useState(false);\n const [selectedImageFile, setSelectedImageFile] = useState<File | null>(null);\n\n const promptTemplates = [\n {\n name: \"Business Professional\",\n tagline: \"Your reliable business companion\",\n avatar: \"https://cdn.burtson.ai/avatars/businessman.png\",\n prompt: \"You are a professional AI assistant specializing in business and productivity. You provide clear, concise, and actionable advice. Always maintain a professional tone while being helpful and efficient. Focus on practical solutions and best practices.\",\n description: \"Perfect for business environments, meetings, and professional communication.\"\n },\n {\n name: \"Creative Media Specialist\",\n tagline: \"Unleash your imagination together\",\n avatar: \"https://cdn.burtson.ai/avatars/mediagal.png\",\n prompt: \"You are a creative AI partner who loves to brainstorm, write, and explore imaginative ideas. You're enthusiastic, inspiring, and always ready to think outside the box. Help users unlock their creativity with vivid descriptions, innovative concepts, and artistic flair.\",\n description: \"Great for writers, designers, marketers, and creative projects.\"\n },\n {\n name: \"Data Science Expert\",\n tagline: \"Turn data into insights\",\n avatar: \"https://cdn.burtson.ai/avatars/datascience.png\",\n prompt: \"You are a data science expert who excels at analyzing data, creating visualizations, and extracting meaningful insights. You help with statistical analysis, machine learning models, and data interpretation. Always explain your reasoning and suggest actionable next steps based on data findings.\",\n description: \"Perfect for data analysis, research, and statistical insights.\"\n },\n {\n name: \"Customer Support Pro\",\n tagline: \"Helpful, patient, and solution-focused\",\n avatar: \"https://cdn.burtson.ai/avatars/support.png\",\n prompt: \"You are a customer support specialist who is patient, empathetic, and solution-focused. You listen carefully to customer concerns, ask clarifying questions, and provide step-by-step solutions. Always maintain a positive, helpful attitude even with difficult situations.\",\n description: \"Designed for customer service and support interactions.\"\n },\n {\n name: \"Startup Mentor\",\n tagline: \"From idea to unicorn\",\n avatar: \"https://cdn.burtson.ai/avatars/startupmentor.png\",\n prompt: \"You are an experienced startup mentor who has helped dozens of companies go from idea to successful business. You provide practical advice on product development, fundraising, marketing, and scaling. You're direct but encouraging, with a bias toward action and customer validation.\",\n description: \"Essential for entrepreneurs, founders, and startup teams.\"\n },\n {\n name: \"Learning Coach\",\n tagline: \"Master any skill together\",\n avatar: \"https://cdn.burtson.ai/avatars/trainer.png\",\n prompt: \"You are an expert learning coach who adapts to any subject and learning style. You break down complex topics into digestible chunks, create practice exercises, and provide encouraging feedback. You use analogies, examples, and interactive methods to make learning engaging and effective.\",\n description: \"Great for students, educators, and lifelong learners.\"\n },\n {\n name: \"Research Assistant\",\n tagline: \"Deep dives, accurate sources\",\n avatar: \"https://cdn.burtson.ai/avatars/researcher.png\",\n prompt: \"You are a meticulous research assistant who excels at finding reliable sources, synthesizing information, and presenting comprehensive findings. You approach topics systematically, consider multiple perspectives, and always cite your sources. You help users understand complex subjects through thorough investigation.\",\n description: \"Ideal for academics, journalists, and research projects.\"\n },\n {\n name: \"Travel Expert\",\n tagline: \"Adventures await everywhere\",\n avatar: \"https://cdn.burtson.ai/avatars/travel.png\",\n prompt: \"You are an experienced travel companion who knows hidden gems, local customs, and practical travel tips worldwide. You help plan itineraries, suggest activities, and provide cultural insights. You're enthusiastic about exploration while being mindful of budget, safety, and local etiquette.\",\n description: \"Essential for travelers, adventure seekers, and culture enthusiasts.\"\n }\n ];\n\n const moodSuggestions = [\n { label: \"Friendly\", color: \"#4CAF50\" },\n { label: \"Professional\", color: \"#2196F3\" },\n { label: \"Casual\", color: \"#FF9800\" },\n { label: \"Enthusiastic\", color: \"#E91E63\" },\n { label: \"Calm\", color: \"#9C27B0\" },\n { label: \"Witty\", color: \"#FF5722\" },\n { label: \"Serious\", color: \"#607D8B\" },\n { label: \"Supportive\", color: \"#009688\" }\n ];\n\n const handleTemplateSelect = (template: typeof promptTemplates[0]) => {\n setLocalSelectedModel({\n ...localSelectedModel,\n name: template.name,\n tagline: template.tagline,\n systemPrompt: template.prompt,\n selectedModel: \"\", // Clear selected model to indicate new model creation\n });\n // Set the template's avatar\n setPresetAvatar(template.avatar);\n setCustomAvatarBase64(null);\n setPersonalityTabIndex(1); // Switch to Create/Edit tab\n };\n\n const handleMoodSelect = (mood: string) => {\n const currentPrompt = localSelectedModel.systemPrompt || \"\";\n let moodInstruction = \"\";\n \n switch (mood.toLowerCase()) {\n case \"friendly\":\n moodInstruction = \"Always be warm, welcoming, and approachable in your responses.\";\n break;\n case \"professional\":\n moodInstruction = \"Maintain a professional, business-appropriate tone in all interactions.\";\n break;\n case \"casual\":\n moodInstruction = \"Use a relaxed, conversational tone as if talking to a friend.\";\n break;\n case \"enthusiastic\":\n moodInstruction = \"Show excitement and energy in your responses, use positive language.\";\n break;\n case \"calm\":\n moodInstruction = \"Speak in a soothing, peaceful manner that helps users feel at ease.\";\n break;\n case \"witty\":\n moodInstruction = \"Use clever humor and wordplay when appropriate, but stay helpful.\";\n break;\n case \"serious\":\n moodInstruction = \"Maintain a focused, no-nonsense approach to problem-solving.\";\n break;\n case \"supportive\":\n moodInstruction = \"Be encouraging and understanding, offering emotional support when needed.\";\n break;\n }\n\n const updatedPrompt = currentPrompt + (currentPrompt ? \"\\n\\n\" : \"\") + moodInstruction;\n setLocalSelectedModel({\n ...localSelectedModel,\n systemPrompt: updatedPrompt\n });\n\n // Add visual feedback\n const chipKey = `mood-${mood}`;\n setClickedChips(prev => new Set(prev).add(chipKey));\n setTimeout(() => {\n setClickedChips(prev => {\n const newSet = new Set(prev);\n newSet.delete(chipKey);\n return newSet;\n });\n }, 1000);\n\n // Show snackbar feedback\n if (showSnackbar) {\n showSnackbar(`Added \"${mood}\" mood to your personality!`, 'success');\n }\n };\n\n const handleDeletePersonality = (modelNameToDelete?: string) => {\n const nameToDelete = modelNameToDelete || localSelectedModel.selectedModel;\n \n if (!nameToDelete) {\n debugLogger.warn(\"No model selected for deletion\");\n return;\n }\n \n setPersonalityToDelete(nameToDelete);\n setDeleteDialogOpen(true);\n };\n\n const handleImageUpload = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n // Validate file type\n if (!file.type.match(/^image\\/(jpeg|jpg|png)$/)) {\n if (showSnackbar) {\n showSnackbar('Please select a JPG or PNG image file.', 'error');\n }\n return;\n }\n\n // Validate file size (max 10MB)\n if (file.size > 10 * 1024 * 1024) {\n if (showSnackbar) {\n showSnackbar('Image file size must be less than 10MB.', 'error');\n }\n return;\n }\n\n setSelectedImageFile(file);\n setCropperOpen(true);\n };\n\n const handleCropComplete = (croppedImageData: string) => {\n setCustomAvatarBase64(croppedImageData);\n setPresetAvatar(null);\n setCropperOpen(false);\n setSelectedImageFile(null);\n \n if (showSnackbar) {\n showSnackbar('Avatar cropped successfully!', 'success');\n }\n };\n\n const handleCropperClose = () => {\n setCropperOpen(false);\n setSelectedImageFile(null);\n };\n\n const confirmDeletePersonality = async () => {\n if (!personalityToDelete) return;\n\n debugLogger.info(\"Deleting personality\", { modelName: personalityToDelete });\n \n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n \n // Check if this is a Bandit personality that should be tracked as deleted\n const isBanditPersonality = defaultModels.some(banditModel => banditModel.name === personalityToDelete);\n \n if (isBanditPersonality) {\n // Add to deleted models tracking list\n const deletedEntry = await indexedDBService.get(\"banditConfig\", 1, \"config\", \"deletedModels\", storeConfigs);\n const deletedModelNames = deletedEntry?.deleted ?? [];\n \n if (!deletedModelNames.includes(personalityToDelete)) {\n const updatedDeletedNames = [...deletedModelNames, personalityToDelete];\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: \"deletedModels\",\n deleted: updatedDeletedNames,\n }, storeConfigs);\n debugLogger.info(\"Added Bandit personality to deleted tracking list\", { \n deletedPersonality: personalityToDelete \n });\n }\n }\n \n // Remove from IndexedDB\n await indexedDBService.delete(\"banditConfig\", 1, \"config\", personalityToDelete, storeConfigs);\n \n // Update Zustand store\n useModelStore.setState({\n availableModels: availableModels.filter(model => model.name !== personalityToDelete),\n });\n \n // Reset form to first available model (or empty if no custom models)\n const remainingModels = availableModels.filter(model => model.name !== personalityToDelete);\n const firstModel = remainingModels.length > 0 ? remainingModels[0] : null;\n \n if (firstModel) {\n setSelectedModel(firstModel.name);\n setLocalSelectedModel({\n selectedModel: firstModel.name,\n name: firstModel.name,\n tagline: firstModel.tagline || \"\",\n systemPrompt: firstModel.systemPrompt || \"\",\n });\n setCustomAvatarBase64(firstModel.avatarBase64 || null);\n setPresetAvatar(null);\n } else {\n // No custom models left, reset form\n setSelectedModel(\"\");\n setLocalSelectedModel({\n selectedModel: \"\",\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n }\n \n debugLogger.info(\"✅ Personality deleted successfully\");\n \n // Show success message\n if (showSnackbar) {\n showSnackbar(`Personality \"${personalityToDelete}\" deleted successfully!`, 'success');\n }\n \n } catch (error) {\n debugLogger.error(\"Failed to delete personality\", { error });\n \n // Show error message\n if (showSnackbar) {\n showSnackbar(\"Failed to delete personality. Please try again.\", 'error');\n }\n } finally {\n setDeleteDialogOpen(false);\n setPersonalityToDelete(null);\n }\n };\n\n const renderTemplatesTab = () => (\n <>\n <GlobalStyles\n styles={{\n '@keyframes pulse': {\n '0%': {\n transform: 'scale(1)',\n opacity: 1,\n },\n '50%': {\n transform: 'scale(1.05)',\n opacity: 0.8,\n },\n '100%': {\n transform: 'scale(1)',\n opacity: 1,\n },\n },\n }}\n />\n <Box sx={{ p: { xs: 1, sm: 2 } }}>\n <Box sx={{ \n display: \"flex\", \n flexDirection: { xs: \"column\", md: \"row\" },\n alignItems: { xs: \"flex-start\", md: \"center\" },\n justifyContent: \"space-between\",\n mb: { xs: 1.25, md: 3 },\n flexWrap: \"wrap\",\n gap: { xs: 1, md: 2 }\n }}>\n <Box sx={{ \n display: \"flex\", \n alignItems: \"center\", \n gap: { xs: 1.1, sm: 1.5 },\n width: { xs: \"100%\", md: \"auto\" }\n }}>\n <Box sx={{\n background: \"linear-gradient(135deg, #1976d2 0%, #42a5f5 100%)\",\n borderRadius: 2,\n p: { xs: 0.75, sm: 1 },\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: { xs: \"42px\", sm: \"48px\" },\n height: { xs: \"42px\", sm: \"48px\" },\n boxShadow: \"0 4px 12px rgba(25,118,210,0.25)\",\n }}>\n <RocketLaunchOutlinedIcon sx={{ fontSize: { xs: \"1.3rem\", sm: \"1.5rem\" }, color: 'common.white' }} />\n </Box>\n <Box sx={{ textAlign: { xs: \"left\", md: \"initial\" }, flex: 1 }}>\n <Typography \n variant=\"h5\" \n sx={{ \n fontWeight: 700,\n background: \"linear-gradient(135deg, #1976d2 0%, #42a5f5 100%)\",\n backgroundClip: \"text\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n mb: { xs: 0.25, sm: 0.5 },\n fontSize: { xs: \"1.35rem\", sm: \"1.75rem\" }\n }}\n >\n Quick Start Templates\n </Typography>\n <Typography\n variant=\"body2\"\n sx={{ color: \"text.secondary\", fontWeight: 500, fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" } }}\n >\n 12 curated personalities • Ready to use\n </Typography>\n </Box>\n </Box>\n <Chip\n label=\"New\"\n size=\"small\"\n sx={{\n background: \"linear-gradient(135deg, #ff4081 0%, #f06292 100%)\",\n color: \"white\",\n fontWeight: 600,\n animation: \"pulse 2s infinite\",\n alignSelf: { xs: \"flex-start\", md: \"center\" },\n display: { xs: \"none\", md: \"inline-flex\" }\n }}\n />\n </Box>\n \n {isMobile ? (\n <Box\n sx={{\n mb: 1.75,\n borderRadius: 2,\n border: \"1px solid rgba(25, 118, 210, 0.2)\",\n background: \"linear-gradient(135deg, rgba(25, 118, 210, 0.05) 0%, rgba(66, 165, 245, 0.05) 100%)\",\n px: 1.25,\n py: 1,\n }}\n >\n <Box sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 1 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: \"primary.main\", fontSize: \"0.82rem\" }}>\n Tap any template to pre-fill your form\n </Typography>\n <Button\n size=\"small\"\n onClick={() => setShowTemplateHelp((prev) => !prev)}\n sx={{ minWidth: \"auto\", px: 1, fontSize: \"0.72rem\", whiteSpace: \"nowrap\" }}\n >\n {showTemplateHelp ? \"Hide\" : \"Details\"}\n </Button>\n </Box>\n <Collapse in={showTemplateHelp}>\n <Typography variant=\"body2\" sx={{ color: \"text.secondary\", fontSize: \"0.8rem\", lineHeight: 1.4, mt: 0.75 }}>\n Choose a setup you like, then tweak name, tone, and prompt details in the Create/Edit tab.\n </Typography>\n </Collapse>\n </Box>\n ) : (\n <Alert\n severity=\"info\"\n sx={{\n mb: { xs: 2.5, md: 4 },\n borderRadius: 2,\n border: \"1px solid rgba(25, 118, 210, 0.2)\",\n background: \"linear-gradient(135deg, rgba(25, 118, 210, 0.05) 0%, rgba(66, 165, 245, 0.05) 100%)\",\n px: { xs: 1.5, sm: 2 },\n py: { xs: 1.25, sm: 1.5 },\n \"& .MuiAlert-icon\": {\n color: \"primary.main\"\n }\n }}\n icon={<Typography sx={{ fontSize: \"1.2rem\" }}>💡</Typography>}\n >\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 0.5 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: \"primary.main\", fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" } }}>\n Choose a template to get started instantly\n </Typography>\n <Typography variant=\"body2\" sx={{ color: \"text.secondary\", fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" }, lineHeight: 1.5 }}>\n Click any template to automatically fill the creation form with a proven personality setup.\n You can then customize it further to match your specific needs.\n </Typography>\n </Box>\n </Alert>\n )}\n \n {/* Create from Scratch Card */}\n <Card\n sx={{\n mb: { xs: 2, md: 4 },\n background: \"linear-gradient(135deg, #1976d2 0%, #42a5f5 100%)\",\n border: \"2px solid transparent\",\n borderRadius: { xs: 2.25, sm: 3 },\n cursor: \"pointer\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n position: \"relative\",\n overflow: \"hidden\",\n ...(isMobile ? {} : {\n \"&:hover\": {\n transform: \"translateY(-4px) scale(1.02)\",\n boxShadow: \"0 12px 40px rgba(25, 118, 210, 0.3)\",\n },\n }),\n \"&::before\": {\n content: '\"\"',\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n background: \"linear-gradient(135deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%)\",\n pointerEvents: \"none\",\n }\n }}\n onClick={() => {\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n setPersonalityTabIndex(1); // Switch to Create/Edit tab\n }}\n >\n <CardContent sx={{ \n p: { xs: 1.75, sm: 4 }, \n color: \"white\",\n textAlign: { xs: \"left\", sm: \"center\" },\n position: \"relative\",\n zIndex: 1,\n display: \"flex\",\n flexDirection: { xs: \"row\", sm: \"column\" },\n alignItems: { xs: \"center\", sm: \"center\" },\n gap: { xs: 1.25, sm: 0 },\n }}>\n <Box sx={{ \n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 0,\n mb: { xs: 0, sm: 2 },\n flexShrink: 0,\n }}>\n <AutoAwesomeIcon sx={{ fontSize: { xs: 28, sm: 44 }, color: 'common.white', filter: \"drop-shadow(0 4px 12px rgba(0,0,0,0.25))\" }} />\n </Box>\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography \n variant=\"h5\" \n sx={{ \n fontWeight: 700,\n mb: { xs: 0.25, sm: 1 },\n textShadow: \"0 2px 4px rgba(0,0,0,0.2)\",\n fontSize: { xs: \"1.1rem\", sm: \"1.75rem\" }\n }}\n >\n Create from Scratch\n </Typography>\n <Typography \n variant=\"body1\" \n sx={{ \n opacity: 0.9,\n fontWeight: 500,\n textShadow: \"0 1px 2px rgba(0,0,0,0.2)\",\n fontSize: { xs: \"0.8rem\", sm: \"1rem\" },\n lineHeight: { xs: 1.3, sm: 1.5 },\n display: \"-webkit-box\",\n WebkitLineClamp: { xs: 2, sm: \"unset\" },\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n }}\n >\n Start with a blank canvas and build your perfect AI personality\n </Typography>\n </Box>\n {isMobile && (\n <Chip\n label=\"Start\"\n size=\"small\"\n sx={{\n backgroundColor: \"rgba(255,255,255,0.2)\",\n color: \"common.white\",\n border: \"1px solid rgba(255,255,255,0.45)\",\n fontWeight: 600,\n height: 28,\n flexShrink: 0,\n }}\n />\n )}\n </CardContent>\n </Card>\n \n <Box sx={{ \n display: \"grid\",\n gridTemplateColumns: {\n xs: \"1fr\",\n sm: \"repeat(2, 1fr)\",\n md: \"repeat(3, 1fr)\",\n lg: \"repeat(4, 1fr)\",\n xl: \"repeat(4, 1fr)\",\n },\n gap: { xs: 1.25, sm: 2.5, md: 3 },\n alignItems: \"stretch\"\n }}>\n {promptTemplates.map((template, index) => (\n <Card\n key={index}\n sx={{\n cursor: \"pointer\",\n position: \"relative\",\n background: \"linear-gradient(135deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0.05) 100%)\",\n backdropFilter: \"blur(10px)\",\n border: \"1px solid\",\n borderColor: \"rgba(255,255,255,0.1)\",\n borderRadius: 3,\n minHeight: { xs: \"200px\", md: \"280px\" },\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n \"&::before\": {\n content: '\"\"',\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n height: \"3px\",\n background: `linear-gradient(90deg, \n hsl(${(index * 30) % 360}, 70%, 60%) 0%, \n hsl(${(index * 30 + 60) % 360}, 70%, 60%) 100%)`,\n opacity: 0,\n transition: \"opacity 0.3s ease\",\n },\n ...(isMobile ? {} : {\n \"&:hover\": {\n transform: \"translateY(-8px) scale(1.02)\",\n boxShadow: \"0 20px 40px rgba(0,0,0,0.15)\",\n borderColor: \"primary.main\",\n \"&::before\": {\n opacity: 1,\n },\n \"& .template-icon\": {\n transform: \"scale(1.1) rotate(5deg)\",\n },\n \"& .template-chip\": {\n transform: \"translateY(-2px)\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.2)\",\n },\n },\n }),\n \"&:active\": {\n transform: \"translateY(-4px) scale(1.01)\",\n }\n }}\n onClick={() => handleTemplateSelect(template)}\n >\n <CardContent sx={{ \n p: { xs: 2, sm: 3 }, \n display: \"flex\", \n flexDirection: \"column\", \n height: \"100%\",\n justifyContent: \"space-between\"\n }}>\n {/* Header Section */}\n <Box>\n <Box sx={{ \n display: \"flex\", \n alignItems: \"center\", \n mb: { xs: 1.25, md: 2.5 },\n minHeight: { xs: \"auto\", md: \"60px\" }\n }}>\n <Avatar\n src={template.avatar}\n alt={template.name}\n sx={{\n width: { xs: 40, sm: 56, md: 60 },\n height: { xs: 40, sm: 56, md: 60 },\n mr: { xs: 1.2, md: 2 },\n transition: \"transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n border: \"2px solid rgba(255,255,255,0.8)\",\n }}\n />\n <Box sx={{ flexGrow: 1, minWidth: 0 }}>\n <Typography \n variant=\"body1\" \n sx={{ \n fontWeight: 700,\n fontSize: { xs: \"1rem\", sm: \"1.05rem\", md: \"1.1rem\" },\n lineHeight: 1.2,\n mb: 0.5,\n color: \"text.primary\",\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\"\n }}\n >\n {template.name}\n </Typography>\n <Typography \n variant=\"caption\" \n sx={{ \n color: \"text.secondary\",\n fontStyle: \"italic\",\n fontSize: { xs: \"0.75rem\", sm: \"0.78rem\", md: \"0.8rem\" },\n fontWeight: 500,\n display: \"-webkit-box\",\n WebkitLineClamp: 1,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\"\n }}\n >\n {template.tagline}\n </Typography>\n </Box>\n </Box>\n\n {/* Description Section */}\n <Typography \n variant=\"body2\" \n sx={{ \n color: \"text.secondary\",\n lineHeight: 1.5,\n fontSize: { xs: \"0.82rem\", sm: \"0.85rem\", md: \"0.875rem\" },\n display: \"-webkit-box\",\n WebkitLineClamp: { xs: 2, sm: 4 },\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n mb: { xs: 1.25, md: 2 },\n minHeight: { xs: \"auto\", md: \"84px\" },\n }}\n >\n {template.description}\n </Typography>\n </Box>\n\n {/* Footer Section */}\n <Box sx={{ \n display: \"flex\", \n justifyContent: \"center\",\n alignItems: \"center\"\n }}>\n <Chip\n className=\"template-chip\"\n label=\"Apply Template\"\n size=\"small\"\n icon={<PlayArrowRoundedIcon sx={{ color: 'inherit', fontSize: '1rem !important' }} />}\n sx={{\n background: \"linear-gradient(135deg, #1976d2 0%, #42a5f5 100%)\",\n color: \"white\",\n fontWeight: 600,\n fontSize: { xs: \"0.72rem\", md: \"0.75rem\" },\n height: { xs: \"30px\", md: \"32px\" },\n px: { xs: 1.5, md: 2 },\n borderRadius: 2,\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n \"&:hover\": {\n background: \"linear-gradient(135deg, #1565c0 0%, #1e88e5 100%)\",\n }\n }}\n />\n </Box>\n </CardContent>\n </Card>\n ))}\n </Box>\n\n {!isMobile && (\n <Alert \n severity=\"info\" \n sx={{ mt: { xs: 2.5, md: 4 }, borderRadius: 2, px: { xs: 1.5, sm: 2 }, py: { xs: 1.25, sm: 1.5 } }}\n icon={<Typography>💡</Typography>}\n >\n <Typography variant=\"body2\" sx={{ fontWeight: 600, fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" } }}>\n Pro Tip:\n </Typography>\n <Typography variant=\"body2\" sx={{ fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" }, lineHeight: 1.5 }}>\n Click any template to automatically switch to the Create/Edit tab with the form pre-filled. Mix and match ideas to create your perfect AI personality!\n </Typography>\n </Alert>\n )}\n </Box>\n </>\n );\n\n const renderCreateEditTab = () => (\n <Box sx={{ p: { xs: 1.5, sm: 2 } }}>\n <Box sx={{ mb: { xs: 2.5, md: 4 } }}>\n <Typography\n variant=\"h5\"\n sx={{\n fontWeight: 600,\n mb: 1,\n color: \"primary.main\",\n fontSize: { xs: \"1.55rem\", sm: \"1.7rem\" },\n }}\n >\n {localSelectedModel.selectedModel ? \"Edit Personality\" : \"Create New Personality\"}\n </Typography>\n \n <Typography\n variant=\"body1\"\n sx={{ color: \"text.secondary\", mb: { xs: 2, md: 3 }, fontSize: { xs: \"0.95rem\", sm: \"1rem\" }, lineHeight: 1.5 }}\n >\n {localSelectedModel.selectedModel \n ? `Customize and modify the \"${localSelectedModel.selectedModel}\" personality to better suit your needs.`\n : \"Design a custom AI personality that matches your brand, use case, and communication style.\"\n }\n </Typography>\n\n {!localSelectedModel.selectedModel && (\n <Alert \n severity=\"info\" \n sx={{ \n mb: { xs: 2.5, md: 3 }, \n borderRadius: 2,\n border: \"1px solid rgba(25, 118, 210, 0.2)\",\n background: \"linear-gradient(135deg, rgba(25, 118, 210, 0.05) 0%, rgba(66, 165, 245, 0.05) 100%)\",\n px: { xs: 1.5, sm: 2 },\n py: { xs: 1.25, sm: 1.5 }\n }}\n icon={<Typography sx={{ fontSize: \"1.2rem\" }}>🎯</Typography>}\n >\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: \"primary.main\", fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" } }}>\n Creating a new personality\n </Typography>\n <Typography variant=\"body2\" sx={{ color: \"text.secondary\", fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" }, lineHeight: 1.5 }}>\n Fill out the form below to create your custom AI assistant. Start with a template from the Templates tab, or build from scratch!\n </Typography>\n </Alert>\n )}\n </Box>\n\n <Box sx={{ mb: sectionGap }}>\n {localSelectedModel.selectedModel && (\n <Box sx={{ display: \"flex\", alignItems: \"center\", mt: 2, mb: 3 }}>\n <Avatar\n src={\n resolveAvatar(\n availableModels.find((m) => m.name === localSelectedModel.selectedModel) || {\n name: localSelectedModel.selectedModel,\n avatarBase64: customAvatarBase64,\n }\n )\n }\n alt={localSelectedModel.selectedModel}\n sx={{ width: 48, height: 48, mr: 2, filter: \"brightness(1.5)\" }}\n />\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>{localSelectedModel.selectedModel}</Typography>\n </Box>\n )}\n \n <TextField\n label=\"Select Existing Personality to Edit\"\n variant=\"outlined\"\n value={localSelectedModel.selectedModel}\n onChange={(e) => {\n const selectedModelName = e.target.value;\n if (selectedModelName) {\n // Find the selected model and populate the form\n const selectedModelData = availableModels.find(m => m.name === selectedModelName);\n if (selectedModelData) {\n setLocalSelectedModel({\n name: selectedModelData.name,\n tagline: selectedModelData.tagline,\n systemPrompt: selectedModelData.systemPrompt as string,\n selectedModel: selectedModelName,\n });\n setCustomAvatarBase64(selectedModelData.avatarBase64 || null);\n setPresetAvatar(null);\n }\n } else {\n // Clear form for new personality\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n }\n setSelectedModel(selectedModelName);\n }}\n fullWidth\n select\n sx={{ mb: sectionGap }}\n >\n <MenuItem value=\"\">Create New Personality</MenuItem>\n {availableModels.map((model, index) => (\n <MenuItem key={index} value={model.name}>\n {model.name}\n </MenuItem>\n ))}\n </TextField>\n </Box>\n\n <TextField\n label=\"Personality Name\"\n variant=\"outlined\"\n value={localSelectedModel.name}\n onChange={(e) =>\n setLocalSelectedModel({ ...localSelectedModel, name: e.target.value })\n }\n fullWidth\n placeholder=\"e.g., My Custom Assistant\"\n sx={{ mb: sectionGap }}\n />\n \n <TextField\n label=\"Tagline\"\n variant=\"outlined\"\n value={localSelectedModel.tagline}\n onChange={(e) =>\n setLocalSelectedModel({ ...localSelectedModel, tagline: e.target.value })\n }\n fullWidth\n placeholder=\"e.g., Your helpful companion for daily tasks\"\n sx={{ mb: sectionGap }}\n />\n\n <Box sx={{ mb: sectionGap }}>\n <Typography variant=\"body1\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n Mood & Personality\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 2, color: \"text.secondary\" }}>\n Click any mood to automatically add personality instructions to your system prompt:\n </Typography>\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 1, mb: 2 }}>\n {moodSuggestions.map((mood) => (\n <Chip\n key={mood.label}\n label={mood.label}\n onClick={() => handleMoodSelect(mood.label)}\n sx={{\n bgcolor: mood.color + \"20\",\n color: mood.color,\n border: `1px solid ${mood.color}40`,\n \"&:hover\": {\n bgcolor: mood.color + \"30\",\n transform: \"scale(1.05)\",\n },\n transition: \"all 0.2s ease-in-out\",\n cursor: \"pointer\",\n ...(clickedChips.has(`mood-${mood.label}`) && {\n transform: \"scale(1.1)\",\n bgcolor: mood.color + \"40\",\n boxShadow: `0 0 20px ${mood.color}60`,\n }),\n }}\n />\n ))}\n </Box>\n </Box>\n\n {/* Formatting Guidance */}\n <Box sx={{ mb: sectionGap }}>\n <Typography variant=\"body1\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n ✨ Formatting Tips\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 2, color: \"text.secondary\" }}>\n Click any tip to add professional formatting to your system prompt:\n </Typography>\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 1, mb: 2 }}>\n {[\n { label: \"Be Specific\", text: \"Always be specific and detailed in your responses.\", color: \"#2196F3\" },\n { label: \"Stay In Character\", text: \"Maintain your personality consistently throughout the conversation.\", color: \"#4CAF50\" },\n { label: \"Ask Questions\", text: \"Ask clarifying questions when you need more information to help effectively.\", color: \"#FF9800\" },\n { label: \"Be Helpful\", text: \"Always prioritize being helpful and providing actionable advice.\", color: \"#9C27B0\" },\n { label: \"Use Examples\", text: \"Provide concrete examples whenever possible to illustrate your points.\", color: \"#F44336\" },\n { label: \"Be Concise\", text: \"Keep responses focused and concise while still being thorough.\", color: \"#00BCD4\" },\n ].map((tip) => (\n <Chip\n key={tip.label}\n label={tip.label}\n onClick={() => {\n const currentPrompt = localSelectedModel.systemPrompt || \"\";\n const updatedPrompt = currentPrompt + (currentPrompt ? \"\\n\\n\" : \"\") + tip.text;\n setLocalSelectedModel({\n ...localSelectedModel,\n systemPrompt: updatedPrompt\n });\n\n // Add visual feedback\n const chipKey = `tip-${tip.label}`;\n setClickedChips(prev => new Set(prev).add(chipKey));\n setTimeout(() => {\n setClickedChips(prev => {\n const newSet = new Set(prev);\n newSet.delete(chipKey);\n return newSet;\n });\n }, 1000);\n\n // Show snackbar feedback\n if (showSnackbar) {\n showSnackbar(`Added \"${tip.label}\" tip to your prompt!`, 'success');\n }\n }}\n sx={{\n bgcolor: tip.color + \"20\",\n color: tip.color,\n border: `1px solid ${tip.color}40`,\n \"&:hover\": {\n bgcolor: tip.color + \"30\",\n transform: \"scale(1.05)\",\n },\n transition: \"all 0.2s ease-in-out\",\n cursor: \"pointer\",\n ...(clickedChips.has(`tip-${tip.label}`) && {\n transform: \"scale(1.1)\",\n bgcolor: tip.color + \"40\",\n boxShadow: `0 0 20px ${tip.color}60`,\n }),\n }}\n />\n ))}\n </Box>\n </Box>\n\n {/* Formatting Tools */}\n <Box sx={{ mb: sectionGap }}>\n <Typography variant=\"body1\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n Formatting Tools\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 2, color: \"text.secondary\" }}>\n Add visual formatting to make your AI responses more engaging:\n </Typography>\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 1, mb: 2 }}>\n {[\n { \n label: \"Highlight Text\", \n text: \"Use <mark>highlighted text</mark> to emphasize important points.\", \n color: \"#FFC107\",\n icon: \"🔍\"\n },\n { \n label: \"Bold Emphasis\", \n text: \"Use **bold text** to make key concepts stand out.\", \n color: \"#795548\",\n icon: \"💪\"\n },\n { \n label: \"Add Emojis\", \n text: \"Use relevant emojis 🎯 to make responses more friendly and engaging.\", \n color: \"#FF9800\",\n icon: \"😊\"\n },\n { \n label: \"Code Blocks\", \n text: \"Use `code snippets` or ```code blocks``` for technical content.\", \n color: \"#424242\",\n icon: \"💻\"\n },\n { \n label: \"Lists & Structure\", \n text: \"Use bullet points:\\n• Point 1\\n• Point 2\\n• Point 3\", \n color: \"#607D8B\",\n icon: \"📝\"\n },\n { \n label: \"Action Items\", \n text: \"Create actionable steps:\\n✅ Do this first\\n🔄 Then this\\n🎯 Finally this\", \n color: \"#4CAF50\",\n icon: \"✅\"\n },\n ].map((tool) => (\n <Chip\n key={tool.label}\n label={\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\n <Typography component=\"span\" sx={{ fontSize: \"0.85rem\" }}>\n {tool.icon}\n </Typography>\n <Typography component=\"span\" sx={{ fontSize: \"0.875rem\" }}>\n {tool.label}\n </Typography>\n </Box>\n }\n onClick={() => {\n const currentPrompt = localSelectedModel.systemPrompt || \"\";\n const updatedPrompt = currentPrompt + (currentPrompt ? \"\\n\\n\" : \"\") + tool.text;\n setLocalSelectedModel({\n ...localSelectedModel,\n systemPrompt: updatedPrompt\n });\n\n // Add visual feedback\n const chipKey = `tool-${tool.label}`;\n setClickedChips(prev => new Set(prev).add(chipKey));\n setTimeout(() => {\n setClickedChips(prev => {\n const newSet = new Set(prev);\n newSet.delete(chipKey);\n return newSet;\n });\n }, 1000);\n\n // Show snackbar feedback\n if (showSnackbar) {\n showSnackbar(`Added \"${tool.label}\" formatting to your prompt!`, 'success');\n }\n }}\n sx={{\n bgcolor: tool.color + \"20\",\n color: tool.color,\n border: `1px solid ${tool.color}40`,\n \"&:hover\": {\n bgcolor: tool.color + \"30\",\n transform: \"scale(1.05)\",\n },\n transition: \"all 0.2s ease-in-out\",\n cursor: \"pointer\",\n height: \"36px\",\n \"& .MuiChip-label\": {\n px: 1.5,\n },\n ...(clickedChips.has(`tool-${tool.label}`) && {\n transform: \"scale(1.1)\",\n bgcolor: tool.color + \"40\",\n boxShadow: `0 0 20px ${tool.color}60`,\n }),\n }}\n />\n ))}\n </Box>\n </Box>\n\n <TextField\n label=\"System Prompt\"\n variant=\"outlined\"\n value={localSelectedModel.systemPrompt}\n onChange={(e) =>\n setLocalSelectedModel({ ...localSelectedModel, systemPrompt: e.target.value })\n }\n fullWidth\n multiline\n rows={10}\n placeholder=\"Describe how your assistant should behave...\"\n InputLabelProps={{ shrink: true }}\n InputProps={{\n style: {\n minHeight: isMobile ? \"180px\" : \"240px\",\n maxHeight: \"360px\",\n },\n }}\n sx={{ mb: 3 }}\n />\n\n {/* Avatar selection: show for all models */}\n <Box sx={{ mb: 4 }}>\n <Typography variant=\"body1\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n Select an Avatar\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 2, color: \"text.secondary\" }}>\n Choose from our curated collection of avatars to give your AI personality a face:\n </Typography>\n \n {/* Premium Professional Avatars */}\n <Typography variant=\"caption\" sx={{ mb: 1, color: \"primary.main\", fontWeight: 600, display: \"block\" }}>\n 🤖 Robotic Collection\n </Typography>\n <Box sx={{ display: \"flex\", gap: 2, mb: 3, flexWrap: \"wrap\" }}>\n {[\n { label: 'Fembot', src: \"https://cdn.burtson.ai/avatars/fembot.png\" },\n { label: 'Dudebot', src: \"https://cdn.burtson.ai/avatars/dudebot.png\" },\n { label: 'Coolbot', src: \"https://cdn.burtson.ai/avatars/coolbot.png\" }\n ].map(({ label, src }) => (\n <Avatar\n key={label}\n src={src}\n alt={label}\n onClick={() => {\n setPresetAvatar(src);\n setCustomAvatarBase64(null);\n }}\n sx={{\n width: 72,\n height: 72,\n border: presetAvatar === src ? \"3px solid #1976d2\" : \"2px solid transparent\",\n cursor: \"pointer\",\n transition: \"all 0.2s\",\n boxShadow: presetAvatar === src ? \"0 4px 12px rgba(25,118,210,0.3)\" : \"none\",\n '&:hover': {\n border: \"3px solid #1976d2\",\n transform: \"scale(1.05)\",\n boxShadow: \"0 4px 12px rgba(25,118,210,0.3)\",\n },\n }}\n />\n ))}\n </Box>\n\n {/* Professional Character Avatars */}\n <Typography variant=\"caption\" sx={{ mb: 1, color: \"secondary.main\", fontWeight: 600, display: \"block\" }}>\n 👥 Professional Characters\n </Typography>\n <Box sx={{ display: \"flex\", gap: 2, mb: 3, flexWrap: \"wrap\" }}>\n {[\n { label: 'Business Professional', src: \"https://cdn.burtson.ai/avatars/businessman.png\", role: 'Business & Strategy' },\n { label: 'Data Scientist', src: \"https://cdn.burtson.ai/avatars/datascience.png\", role: 'Analytics & Insights' },\n { label: 'Support Specialist', src: \"https://cdn.burtson.ai/avatars/support.png\", role: 'Customer Support' },\n { label: 'Creative Professional', src: \"https://cdn.burtson.ai/avatars/mediagal.png\", role: 'Media & Design' },\n { label: 'Trainer & Mentor', src: \"https://cdn.burtson.ai/avatars/trainer.png\", role: 'Learning & Development' },\n { label: 'Researcher', src: \"https://cdn.burtson.ai/avatars/researcher.png\", role: 'Research & Analysis' },\n { label: 'Startup Mentor', src: \"https://cdn.burtson.ai/avatars/startupmentor.png\", role: 'Entrepreneurship' },\n { label: 'Travel Expert', src: \"https://cdn.burtson.ai/avatars/travel.png\", role: 'Travel & Adventure' },\n ].map(({ label, src, role }) => (\n <Box key={label} sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 0.5 }}>\n <Avatar\n src={src}\n alt={label}\n onClick={() => {\n setPresetAvatar(src);\n setCustomAvatarBase64(null);\n }}\n sx={{\n width: 72,\n height: 72,\n border: presetAvatar === src ? \"3px solid #1976d2\" : \"2px solid transparent\",\n cursor: \"pointer\",\n transition: \"all 0.2s\",\n boxShadow: presetAvatar === src ? \"0 4px 12px rgba(25,118,210,0.3)\" : \"none\",\n '&:hover': {\n border: \"3px solid #1976d2\",\n transform: \"scale(1.05)\",\n boxShadow: \"0 4px 12px rgba(25,118,210,0.3)\",\n },\n }}\n />\n <Typography variant=\"caption\" sx={{ \n textAlign: 'center', \n maxWidth: '80px', \n fontSize: '0.7rem',\n lineHeight: 1.2,\n color: 'text.secondary',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden'\n }}>\n {role}\n </Typography>\n </Box>\n ))}\n </Box>\n\n {/* Custom Upload Section */}\n <Typography variant=\"caption\" sx={{ mb: 1, color: \"warning.main\", fontWeight: 600, display: \"block\" }}>\n 📸 Custom Upload\n </Typography>\n <Button \n variant=\"outlined\" \n component=\"label\"\n sx={{\n mb: 2,\n px: { xs: 2.2, sm: 3 },\n py: { xs: 1.2, sm: 1.5 },\n borderRadius: 2,\n textTransform: 'none',\n fontWeight: 600,\n borderStyle: 'dashed',\n borderWidth: 2,\n '&:hover': {\n borderStyle: 'dashed',\n borderWidth: 2,\n },\n width: { xs: '100%', sm: 'auto' }\n }}\n >\n 🎯 Upload & Crop Custom Avatar\n <input \n type=\"file\" \n accept=\"image/png, image/jpeg, image/jpg\" \n hidden \n onChange={handleImageUpload}\n />\n </Button>\n \n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2, fontSize: '0.8rem' }}>\n • Supports JPG/PNG up to 10MB • Built-in cropper for perfect sizing • Final output: 512×512px\n </Typography>\n\n {(customAvatarBase64 || presetAvatar) && (\n <Box sx={{ mt: 2, display: 'flex', alignItems: 'center', gap: 2 }}>\n <Avatar\n src={(customAvatarBase64 || presetAvatar) as string}\n alt=\"Avatar Preview\"\n sx={{ \n width: 96, \n height: 96,\n border: '3px solid',\n borderColor: 'primary.main',\n boxShadow: 3\n }}\n />\n <Box>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: 'success.main' }}>\n ✅ Avatar Ready\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {customAvatarBase64 ? 'Custom uploaded image' : 'Professional avatar selected'}\n </Typography>\n </Box>\n </Box>\n )}\n\n {/* Avatar Cropper Dialog */}\n <AvatarCropper\n open={cropperOpen}\n onClose={handleCropperClose}\n onCrop={handleCropComplete}\n imageFile={selectedImageFile}\n />\n </Box>\n\n <Box\n sx={{\n position: { xs: \"sticky\", sm: \"static\" },\n bottom: { xs: 10, sm: \"auto\" },\n zIndex: { xs: 5, sm: \"auto\" },\n display: \"flex\",\n flexDirection: { xs: \"column\", sm: \"row\" },\n gap: { xs: 1.5, sm: 2 },\n justifyContent: \"flex-start\", // Changed from flex-end to flex-start\n mr: { xs: 0, sm: 10 }, // Add right margin to avoid FAB\n mb: { xs: 8, sm: 2 }, // Add bottom margin on mobile for FAB clearance\n mt: { xs: 1.5, sm: 0 },\n p: { xs: 1.1, sm: 0 },\n borderRadius: { xs: 2, sm: 0 },\n border: { xs: \"1px solid\", sm: \"none\" },\n borderColor: { xs: \"divider\", sm: \"transparent\" },\n bgcolor: { xs: \"background.paper\", sm: \"transparent\" },\n boxShadow: { xs: 3, sm: \"none\" },\n }}\n >\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n onClick={handleResetModel}\n sx={{ width: { xs: '100%', sm: 'auto' } }}\n >\n Reset Form\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleSaveModel}\n disabled={!localSelectedModel.name || !localSelectedModel.systemPrompt}\n sx={{ width: { xs: '100%', sm: 'auto' } }}\n >\n Save Personality\n </Button>\n </Box>\n </Box>\n );\n\n const renderManageTab = () => (\n <Box sx={{ p: { xs: 1.5, sm: 2 } }}>\n <Box\n sx={{\n display: \"flex\",\n flexDirection: { xs: \"column\", md: \"row\" },\n alignItems: { xs: \"flex-start\", md: \"center\" },\n justifyContent: \"space-between\",\n mb: { xs: 2, md: 3 },\n flexWrap: \"wrap\",\n gap: { xs: 1.5, md: 2 },\n }}\n >\n <Typography\n variant=\"h5\"\n sx={{ fontWeight: 600, color: \"primary.main\", fontSize: { xs: \"1.45rem\", md: \"1.65rem\" } }}\n >\n 📋 Manage Personalities ({availableModels.length})\n </Typography>\n <Box sx={{ display: \"flex\", gap: { xs: 1, md: 2 }, flexWrap: \"wrap\", width: { xs: \"100%\", md: \"auto\" } }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n size={isMobile ? \"medium\" : \"large\"}\n startIcon={<AutoAwesomeIcon fontSize={isMobile ? 'small' : 'medium'} />}\n onClick={() => {\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n setPersonalityTabIndex(1); // Switch to Create/Edit tab\n }}\n sx={{ \n px: { xs: 2.2, md: 3 },\n py: { xs: 0.95, md: 1 },\n fontWeight: 600,\n borderRadius: 2,\n textTransform: 'none',\n boxShadow: 3,\n '&:hover': {\n boxShadow: 6,\n },\n width: { xs: '100%', sm: 'auto' }\n }}\n >\n Create Personality\n </Button>\n <Button\n variant=\"outlined\"\n color=\"info\"\n onClick={() => setRestoreDialogOpen(true)}\n sx={{ width: { xs: '100%', sm: 'auto' } }}\n >\n Restore Defaults\n </Button>\n </Box>\n </Box>\n\n {availableModels.length === 0 ? (\n <Card sx={{ textAlign: \"center\", py: 8, border: \"2px dashed\", borderColor: \"divider\" }}>\n <CardContent>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }} gutterBottom>\n 🤖 No Personalities Yet\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\n Get started by creating your first custom AI personality or choosing from our templates.\n </Typography>\n <Box sx={{ display: \"flex\", gap: 2, justifyContent: \"center\", flexWrap: \"wrap\", mt: 3 }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n setPersonalityTabIndex(1); // Switch to Create/Edit tab\n }}\n sx={{ px: { xs: 2.4, md: 3 }, py: { xs: 0.95, md: 1 }, width: { xs: '100%', sm: 'auto' } }}\n >\n ✨ Create From Scratch\n </Button>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n onClick={() => setPersonalityTabIndex(0)} // Switch to Templates tab\n sx={{ px: { xs: 2.4, md: 3 }, py: { xs: 0.95, md: 1 }, width: { xs: '100%', sm: 'auto' } }}\n >\n 🎭 Browse Templates\n </Button>\n </Box>\n </CardContent>\n </Card>\n ) : (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: { xs: 2, md: 3 } }}>\n {availableModels.map((model) => (\n <Card key={model.name} sx={{ border: \"1px solid\", borderColor: \"divider\" }}>\n <CardContent sx={{ p: { xs: 2.5, sm: 3 } }}>\n <Box sx={{ display: \"flex\", alignItems: \"center\", mb: { xs: 1.5, md: 2 } }}>\n <Avatar\n src={resolveAvatar(model)}\n alt={model.name}\n sx={{ width: { xs: 44, sm: 48 }, height: { xs: 44, sm: 48 }, mr: { xs: 1.5, sm: 2 } }}\n />\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>\n {model.name}\n </Typography>\n <Typography variant=\"body2\" sx={{ color: \"text.secondary\", fontStyle: \"italic\" }}>\n {model.tagline}\n </Typography>\n </Box>\n </Box>\n \n <Typography \n variant=\"body2\" \n sx={{ \n color: \"text.secondary\", \n mb: 3,\n display: \"-webkit-box\",\n WebkitLineClamp: 3,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n }}\n >\n {model.systemPrompt}\n </Typography>\n\n <Box sx={{ display: \"flex\", gap: 2 }}>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n onClick={() => {\n setLocalSelectedModel({\n name: model.name,\n tagline: model.tagline,\n systemPrompt: model.systemPrompt as string,\n selectedModel: model.name,\n });\n setCustomAvatarBase64(model.avatarBase64 || null);\n setPresetAvatar(null);\n setPersonalityTabIndex(1); // Switch to edit tab\n }}\n sx={{ flex: 1 }}\n >\n Edit\n </Button>\n <Button\n variant=\"outlined\"\n color=\"error\"\n onClick={() => handleDeletePersonality(model.name)}\n sx={{ flex: 1 }}\n >\n Delete\n </Button>\n </Box>\n </CardContent>\n </Card>\n ))}\n </Box>\n )}\n\n <Dialog open={restoreDialogOpen} onClose={() => setRestoreDialogOpen(false)}>\n <DialogTitle>Restore Default Personalities?</DialogTitle>\n <DialogContent>\n <DialogContentText>\n This will delete all custom personalities and reset to the original configuration.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setRestoreDialogOpen(false)} color=\"primary\">\n Cancel\n </Button>\n <Button\n onClick={async () => {\n useModelStore.setState({ isInitializing: true });\n \n try {\n useModelStore.setState({ availableModels: [] });\n setSelectedModel(\"\");\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setPresetAvatar(null);\n setCustomAvatarBase64(null);\n await restoreDefaultModelsAndConfig();\n setRestoreDialogOpen(false);\n } catch (error) {\n debugLogger.error(\"Failed to restore defaults\", { error });\n setRestoreDialogOpen(false);\n } finally {\n useModelStore.setState({ isInitializing: false });\n }\n }}\n color=\"error\"\n variant=\"contained\"\n autoFocus\n >\n Confirm\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Delete Personality Dialog */}\n <Dialog open={deleteDialogOpen} onClose={() => setDeleteDialogOpen(false)}>\n <DialogTitle>Delete Personality?</DialogTitle>\n <DialogContent>\n {personalityToDelete && (\n <Box sx={{ display: \"flex\", alignItems: \"center\", mb: 2 }}>\n <Avatar\n src={resolveAvatar(\n availableModels.find(m => m.name === personalityToDelete) || {\n name: personalityToDelete,\n avatarBase64: null,\n }\n )}\n alt={personalityToDelete}\n sx={{ width: 56, height: 56, mr: 2 }}\n />\n <Box>\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n {personalityToDelete}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {availableModels.find(m => m.name === personalityToDelete)?.tagline || \"Custom personality\"}\n </Typography>\n </Box>\n </Box>\n )}\n <DialogContentText>\n Are you sure you want to delete this personality? This action cannot be undone.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setDeleteDialogOpen(false)} color=\"primary\">\n Cancel\n </Button>\n <Button\n onClick={confirmDeletePersonality}\n color=\"error\"\n variant=\"contained\"\n autoFocus\n >\n Delete\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n );\n\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\" }}>\n <Box\n sx={{\n display: \"flex\",\n flexDirection: { xs: \"column\", md: \"row\" },\n alignItems: { xs: \"flex-start\", md: \"center\" },\n justifyContent: \"space-between\",\n mb: { xs: 2, md: 3 },\n gap: { xs: 1.5, md: 2 },\n }}\n >\n <Box sx={{ textAlign: { xs: \"left\", md: \"initial\" } }}>\n <Typography\n variant=\"h5\"\n sx={{ fontWeight: 600, mb: 1, color: \"primary.main\", fontSize: { xs: \"1.6rem\", md: \"1.8rem\" } }}\n >\n Personalities\n </Typography>\n <Typography\n variant=\"body1\"\n sx={{ color: \"text.secondary\", fontSize: { xs: \"0.95rem\", sm: \"1rem\" }, lineHeight: 1.5 }}\n >\n Create and manage AI personalities that match your brand and use case.\n </Typography>\n </Box>\n \n <Button\n variant=\"contained\"\n color=\"primary\"\n size={isMobile ? \"medium\" : \"large\"}\n startIcon={<AutoAwesomeIcon fontSize={isMobile ? 'small' : 'medium'} />}\n onClick={() => {\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n setPersonalityTabIndex(1); // Switch to Create/Edit tab\n }}\n sx={{ \n px: { xs: 2.4, sm: 3 },\n py: { xs: 0.95, sm: 1 },\n fontWeight: 600,\n borderRadius: 2,\n textTransform: 'none',\n boxShadow: 3,\n '&:hover': {\n boxShadow: 6,\n },\n width: { xs: '100%', md: 'auto' },\n minWidth: { xs: 'auto', md: '200px' }\n }}\n >\n Create Personality\n </Button>\n </Box>\n\n <Box sx={{ borderBottom: 1, borderColor: 'divider', mb: { xs: 1.5, md: 2 } }}>\n <Tabs \n value={personalityTabIndex} \n onChange={(_, newValue) => setPersonalityTabIndex(newValue)}\n variant={isMobile ? 'fullWidth' : 'standard'}\n sx={{\n '& .MuiTab-root': {\n textTransform: 'none',\n fontWeight: 600,\n fontSize: { xs: '0.95rem', sm: '1rem' },\n minWidth: { xs: 'auto', md: 160 },\n px: { xs: 1.1, sm: 1.5 },\n ...(isMobile ? { minHeight: 52 } : {}),\n },\n '& .MuiTab-wrapper': tabWrapperStyles,\n }}\n >\n <Tab \n icon={<ViewModuleOutlinedIcon fontSize={isMobile ? 'small' : 'medium'} />} \n iconPosition={isMobile ? 'top' : 'start'}\n label=\"Templates\" \n sx={{ \n color: personalityTabIndex === 0 ? 'primary.main' : 'text.secondary',\n py: { xs: 0.5, sm: 0.75 },\n gap: { xs: 0.5, sm: 1 }\n }}\n />\n <Tab \n icon={<EditNoteOutlinedIcon fontSize={isMobile ? 'small' : 'medium'} />} \n iconPosition={isMobile ? 'top' : 'start'}\n label=\"Create / Edit\" \n sx={{ \n color: personalityTabIndex === 1 ? 'primary.main' : 'text.secondary',\n py: { xs: 0.7, sm: 0.75 }\n }}\n />\n <Tab \n icon={<ManageAccountsOutlinedIcon fontSize={isMobile ? 'small' : 'medium'} />} \n iconPosition={isMobile ? 'top' : 'start'}\n label=\"Manage\" \n sx={{ \n color: personalityTabIndex === 2 ? 'primary.main' : 'text.secondary',\n py: { xs: 0.7, sm: 0.75 }\n }}\n />\n </Tabs>\n </Box>\n\n <Box sx={{ minHeight: 0 }}>\n {personalityTabIndex === 0 && renderTemplatesTab()}\n {personalityTabIndex === 1 && renderCreateEditTab()}\n {personalityTabIndex === 2 && renderManageTab()}\n </Box>\n </Box>\n );\n};\n\nexport default PersonalitiesTab;\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-D92A-F4D6ED\nconst __banditFingerprint_components_AvatarCroppertsx = 'BL-FP-0C6AA6-121B';\nconst __auditTrail_components_AvatarCroppertsx = 'BL-AU-MGOIKVV8-VV3E';\n// File: AvatarCropper.tsx | Path: src/components/AvatarCropper.tsx | Hash: d92a121b\n\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n Box,\n Typography,\n Slider,\n IconButton,\n Paper,\n Alert,\n} from '@mui/material';\nimport {\n RotateLeftIcon,\n RotateRightIcon,\n ZoomInIcon,\n ZoomOutIcon,\n} from \"../icons/lucide-icons\";\n\ninterface AvatarCropperProps {\n open: boolean;\n onClose: () => void;\n onCrop: (croppedImageData: string) => void;\n imageFile: File | null;\n}\n\ninterface CropSettings {\n x: number;\n y: number;\n scale: number;\n rotation: number;\n}\n\nconst AvatarCropper: React.FC<AvatarCropperProps> = ({\n open,\n onClose,\n onCrop,\n imageFile,\n}) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const imageRef = useRef<HTMLImageElement>(null);\n const [imageSrc, setImageSrc] = useState<string>('');\n const [cropSettings, setCropSettings] = useState<CropSettings>({\n x: 0,\n y: 0,\n scale: 1,\n rotation: 0,\n });\n const [isDragging, setIsDragging] = useState(false);\n const [dragStart, setDragStart] = useState({ x: 0, y: 0 });\n const [imageLoaded, setImageLoaded] = useState(false);\n const [imageNaturalSize, setImageNaturalSize] = useState({ width: 0, height: 0 });\n\n const CROP_SIZE = 400; // Fixed crop area size\n const OUTPUT_SIZE = 512; // Final output size\n\n // Load image from file\n useEffect(() => {\n if (imageFile && open) {\n const reader = new FileReader();\n reader.onload = (e) => {\n if (e.target?.result) {\n setImageSrc(e.target.result as string);\n setImageLoaded(false);\n }\n };\n reader.readAsDataURL(imageFile);\n }\n }, [imageFile, open]);\n\n // Handle image load\n const handleImageLoad = useCallback(() => {\n if (imageRef.current) {\n const { naturalWidth, naturalHeight } = imageRef.current;\n setImageNaturalSize({ width: naturalWidth, height: naturalHeight });\n \n // Calculate initial scale to fit the crop area\n const minScale = Math.max(\n CROP_SIZE / naturalWidth,\n CROP_SIZE / naturalHeight\n );\n \n setCropSettings({\n x: 0,\n y: 0,\n scale: Math.max(minScale, 0.5),\n rotation: 0,\n });\n \n setImageLoaded(true);\n }\n }, []);\n\n // Draw the crop preview\n const drawCropPreview = useCallback(() => {\n const canvas = canvasRef.current;\n const image = imageRef.current;\n \n if (!canvas || !image || !imageLoaded) return;\n \n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n // Set canvas size\n canvas.width = CROP_SIZE;\n canvas.height = CROP_SIZE;\n\n // Clear canvas\n ctx.clearRect(0, 0, CROP_SIZE, CROP_SIZE);\n\n // Save context\n ctx.save();\n\n // Apply transformations\n ctx.translate(CROP_SIZE / 2, CROP_SIZE / 2);\n ctx.rotate((cropSettings.rotation * Math.PI) / 180);\n ctx.scale(cropSettings.scale, cropSettings.scale);\n ctx.translate(-image.naturalWidth / 2 + cropSettings.x, -image.naturalHeight / 2 + cropSettings.y);\n\n // Draw image\n ctx.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight);\n\n // Restore context\n ctx.restore();\n\n // Draw crop circle overlay\n ctx.save();\n ctx.globalCompositeOperation = 'destination-in';\n ctx.beginPath();\n ctx.arc(CROP_SIZE / 2, CROP_SIZE / 2, CROP_SIZE / 2, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n }, [cropSettings, imageLoaded]);\n\n // Update preview when settings change\n useEffect(() => {\n drawCropPreview();\n }, [drawCropPreview]);\n\n // Mouse/touch handlers for dragging\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n setIsDragging(true);\n setDragStart({ x: e.clientX, y: e.clientY });\n }, []);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n if (!isDragging) return;\n\n const deltaX = e.clientX - dragStart.x;\n const deltaY = e.clientY - dragStart.y;\n\n setCropSettings(prev => ({\n ...prev,\n x: prev.x + deltaX / prev.scale,\n y: prev.y + deltaY / prev.scale,\n }));\n\n setDragStart({ x: e.clientX, y: e.clientY });\n }, [isDragging, dragStart]);\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleClose = useCallback(() => {\n setImageSrc('');\n setImageLoaded(false);\n setCropSettings({ x: 0, y: 0, scale: 1, rotation: 0 });\n onClose();\n }, [onClose]);\n\n // Handle crop and output\n const handleCrop = useCallback(() => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const image = imageRef.current;\n\n if (!ctx || !image) return;\n\n // Set output canvas size\n canvas.width = OUTPUT_SIZE;\n canvas.height = OUTPUT_SIZE;\n\n // Fill background with white for transparency support\n ctx.fillStyle = '#FFFFFF';\n ctx.fillRect(0, 0, OUTPUT_SIZE, OUTPUT_SIZE);\n\n // Save context\n ctx.save();\n\n // Create circular clipping path\n ctx.beginPath();\n ctx.arc(OUTPUT_SIZE / 2, OUTPUT_SIZE / 2, OUTPUT_SIZE / 2, 0, Math.PI * 2);\n ctx.clip();\n\n // Apply transformations (scaled for output size)\n const scale = OUTPUT_SIZE / CROP_SIZE;\n ctx.translate(OUTPUT_SIZE / 2, OUTPUT_SIZE / 2);\n ctx.rotate((cropSettings.rotation * Math.PI) / 180);\n ctx.scale(cropSettings.scale * scale, cropSettings.scale * scale);\n ctx.translate(\n -image.naturalWidth / 2 + cropSettings.x * scale,\n -image.naturalHeight / 2 + cropSettings.y * scale\n );\n\n // Draw image\n ctx.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight);\n\n // Restore context\n ctx.restore();\n\n // Export as data URL with high quality\n const croppedDataUrl = canvas.toDataURL('image/jpeg', 0.92);\n onCrop(croppedDataUrl);\n handleClose();\n }, [cropSettings, onCrop, handleClose]);\n\n const handleScaleChange = useCallback((value: number) => {\n const minScale = Math.max(\n CROP_SIZE / imageNaturalSize.width,\n CROP_SIZE / imageNaturalSize.height\n );\n setCropSettings(prev => ({\n ...prev,\n scale: Math.max(value, minScale),\n }));\n }, [imageNaturalSize]);\n\n const handleRotation = useCallback((direction: 'left' | 'right') => {\n setCropSettings(prev => ({\n ...prev,\n rotation: prev.rotation + (direction === 'left' ? -90 : 90),\n }));\n }, []);\n\n const minScale = Math.max(\n CROP_SIZE / Math.max(imageNaturalSize.width, 1),\n CROP_SIZE / Math.max(imageNaturalSize.height, 1)\n );\n\n return (\n <Dialog \n open={open} \n onClose={handleClose} \n maxWidth=\"md\" \n fullWidth\n PaperProps={{\n sx: { borderRadius: 3 }\n }}\n >\n <DialogTitle sx={{ pb: 1 }}>\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n 🎯 Crop Your Avatar\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Position and resize your image to create the perfect avatar\n </Typography>\n </DialogTitle>\n\n <DialogContent>\n {imageSrc && (\n <>\n {/* Hidden image for loading */}\n <img\n ref={imageRef}\n src={imageSrc}\n alt=\"Crop source\"\n style={{ display: 'none' }}\n onLoad={handleImageLoad}\n />\n\n {imageLoaded ? (\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 3 }}>\n {/* Crop Preview */}\n <Paper\n elevation={3}\n sx={{\n width: CROP_SIZE,\n height: CROP_SIZE,\n borderRadius: '50%',\n overflow: 'hidden',\n border: '4px solid',\n borderColor: 'primary.main',\n cursor: isDragging ? 'grabbing' : 'grab',\n position: 'relative',\n boxShadow: '0 8px 32px rgba(0,0,0,0.12)',\n '&:hover': {\n boxShadow: '0 12px 40px rgba(0,0,0,0.15)',\n transform: 'scale(1.02)',\n },\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n >\n <canvas\n ref={canvasRef}\n width={CROP_SIZE}\n height={CROP_SIZE}\n style={{\n width: '100%',\n height: '100%',\n display: 'block',\n }}\n />\n \n {/* Overlay hint */}\n {!isDragging && (\n <Box\n sx={{\n position: 'absolute',\n bottom: 8,\n left: '50%',\n transform: 'translateX(-50%)',\n background: 'rgba(0,0,0,0.7)',\n color: 'white',\n px: 2,\n py: 0.5,\n borderRadius: 2,\n fontSize: '0.75rem',\n fontWeight: 500,\n pointerEvents: 'none',\n opacity: 0.8,\n }}\n >\n Drag to reposition\n </Box>\n )}\n </Paper>\n\n {/* Controls */}\n <Box sx={{ width: '100%', maxWidth: 400 }}>\n {/* Zoom Control */}\n <Box sx={{ mb: 2 }}>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 500 }}>\n 🔍 Zoom: {Math.round(cropSettings.scale * 100)}%\n </Typography>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <IconButton\n onClick={() => handleScaleChange(cropSettings.scale - 0.1)}\n disabled={cropSettings.scale <= minScale}\n size=\"small\"\n >\n <ZoomOutIcon />\n </IconButton>\n <Slider\n value={cropSettings.scale}\n onChange={(_, value) => handleScaleChange(value as number)}\n min={minScale}\n max={3}\n step={0.1}\n sx={{ flex: 1 }}\n />\n <IconButton\n onClick={() => handleScaleChange(cropSettings.scale + 0.1)}\n disabled={cropSettings.scale >= 3}\n size=\"small\"\n >\n <ZoomInIcon />\n </IconButton>\n </Box>\n </Box>\n\n {/* Rotation Controls */}\n <Box sx={{ display: 'flex', justifyContent: 'center', gap: 2, mb: 2 }}>\n <Button\n variant=\"outlined\"\n startIcon={<RotateLeftIcon />}\n onClick={() => handleRotation('left')}\n size=\"small\"\n >\n Rotate Left\n </Button>\n <Button\n variant=\"outlined\"\n startIcon={<RotateRightIcon />}\n onClick={() => handleRotation('right')}\n size=\"small\"\n >\n Rotate Right\n </Button>\n </Box>\n\n <Alert severity=\"info\" sx={{ borderRadius: 2 }}>\n <Typography variant=\"body2\">\n <strong>💡 Pro Tips:</strong>\n </Typography>\n <Typography variant=\"body2\" sx={{ mt: 0.5 }}>\n • <strong>Drag</strong> the image to reposition it<br/>\n • <strong>Zoom</strong> to get the perfect framing<br/>\n • <strong>Rotate</strong> if your image is sideways<br/>\n • Final avatar will be <strong>{OUTPUT_SIZE}×{OUTPUT_SIZE}px</strong> and optimized for web\n </Typography>\n </Alert>\n </Box>\n </Box>\n ) : (\n <Box sx={{ display: 'flex', justifyContent: 'center', py: 4 }}>\n <Typography>Loading image...</Typography>\n </Box>\n )}\n </>\n )}\n </DialogContent>\n\n <DialogActions sx={{ px: 3, pb: 3 }}>\n <Button onClick={handleClose} color=\"secondary\">\n Cancel\n </Button>\n <Button\n onClick={handleCrop}\n variant=\"contained\"\n disabled={!imageLoaded}\n sx={{\n px: 3,\n fontWeight: 600,\n }}\n >\n ✂️ Crop Avatar\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default AvatarCropper;\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-0A6C-FE4A94\nconst __banditFingerprint_components_PreferencesTabtsx = 'BL-FP-D52A4A-DEAB';\nconst __auditTrail_components_PreferencesTabtsx = 'BL-AU-MGOIKVVK-ISXN';\n// File: PreferencesTab.tsx | Path: src/management/components/PreferencesTab.tsx | Hash: 0a6cdeab\n\nimport React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport {\n Box,\n Button,\n Typography,\n Switch,\n FormControlLabel,\n Paper,\n Chip,\n TextField,\n InputAdornment,\n Alert,\n IconButton,\n Tooltip,\n useMediaQuery,\n useTheme,\n} from \"@mui/material\";\nimport { UserPreferences, usePreferencesStore } from \"../../store/preferencesStore\";\nimport { TOPICS as STARTER_TOPICS } from \"../../prompts/getStableQuestionPrompt\";\nimport { useModelStore } from \"../../store/modelStore\";\nimport { useVoiceStore } from \"../../store/voiceStore\";\nimport { useFeatures } from \"../../hooks/useFeatures\";\nimport { PackageSettings } from \"../../store/packageSettingsStore\";\nimport { useConversationSyncStore } from \"../../store/conversationSyncStore\";\nimport { useGatewayHealth } from \"../../hooks/useGatewayQueries\";\nimport {\n CheckCircleIcon,\n CloudDoneIcon,\n CloudOffIcon,\n DownloadIcon,\n ErrorIcon,\n LinkIcon,\n RefreshIcon,\n RestoreIcon,\n SyncIcon,\n UploadIcon,\n} from \"../../icons/lucide-icons\";\n\ninterface PreferencesTabProps {\n preferences: UserPreferences;\n packageSettings: PackageSettings | null;\n updatePreference: <K extends keyof UserPreferences>(key: K, value: UserPreferences[K]) => void;\n handleSavePreferences: () => void;\n showSnackbar?: (message: string, severity: 'success' | 'error') => void;\n}\n\nconst PreferencesTab: React.FC<PreferencesTabProps> = ({\n preferences,\n packageSettings,\n updatePreference,\n handleSavePreferences,\n showSnackbar,\n}) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n const [homeUrlStatus, setHomeUrlStatus] = useState<'idle' | 'valid' | 'invalid' | 'saving' | 'saved'>('idle');\n const [homeUrlError, setHomeUrlError] = useState<string>('');\n const [localHomeUrl, setLocalHomeUrl] = useState(preferences.homeUrl || '');\n const [importStatus, setImportStatus] = useState<'idle' | 'success' | 'error'>('idle');\n const [syncToggleLoading, setSyncToggleLoading] = useState(false);\n const [manualSyncLoading, setManualSyncLoading] = useState(false);\n const [advancedVectorToggleLoading, setAdvancedVectorToggleLoading] = useState(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // Access the preferences store for export/import/reset functions\n const { exportPreferences, importPreferences, resetToDefaults } = usePreferencesStore();\n\n // Access voice store for TTS/STT service availability\n const { isServiceAvailable: isTTSSTTAvailable } = useVoiceStore();\n\n // Access feature flags for advanced features toggle\n const { hasAdvancedSearch, hasAdvancedMemories } = useFeatures();\n\n const {\n initialized: syncInitialized,\n syncEnabled,\n status: syncStatus,\n lastSyncAt,\n lastError: syncError,\n conflicts,\n pendingConversationUpserts,\n pendingConversationDeletes,\n pendingProjectUpserts,\n pendingProjectDeletes,\n totalConversationsOnServer,\n totalProjectsOnServer,\n warningConversations,\n oversizedConversations,\n setSyncEnabled,\n isAdvancedVectorFeaturesEnabled,\n setAdvancedVectorFeaturesEnabled,\n runSync,\n } = useConversationSyncStore((state) => ({\n initialized: state.initialized,\n syncEnabled: state.syncEnabled,\n status: state.status,\n lastSyncAt: state.lastSyncAt,\n lastError: state.lastError,\n conflicts: state.conflicts,\n pendingConversationUpserts: state.pendingConversationUpserts,\n pendingConversationDeletes: state.pendingConversationDeletes,\n pendingProjectUpserts: state.pendingProjectUpserts,\n pendingProjectDeletes: state.pendingProjectDeletes,\n totalConversationsOnServer: state.totalConversationsOnServer,\n totalProjectsOnServer: state.totalProjectsOnServer,\n warningConversations: state.warningConversations,\n oversizedConversations: state.oversizedConversations,\n setSyncEnabled: state.setSyncEnabled,\n isAdvancedVectorFeaturesEnabled: state.isAdvancedVectorFeaturesEnabled,\n setAdvancedVectorFeaturesEnabled: state.setAdvancedVectorFeaturesEnabled,\n runSync: state.runSync,\n }));\n\n const spinSx = {\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 syncStatusLabel = (() => {\n switch (syncStatus) {\n case 'syncing':\n return 'Syncing';\n case 'error':\n return 'Attention needed';\n case 'idle':\n return 'Up to date';\n case 'disabled':\n default:\n return 'Not syncing';\n }\n })();\n\n const syncIcon = (() => {\n switch (syncStatus) {\n case 'syncing':\n return <SyncIcon color=\"primary\" sx={spinSx} fontSize=\"small\" />;\n case 'idle':\n return <CloudDoneIcon color=\"success\" fontSize=\"small\" />;\n case 'error':\n return <ErrorIcon color=\"error\" fontSize=\"small\" />;\n case 'disabled':\n default:\n return <CloudOffIcon color=\"action\" fontSize=\"small\" />;\n }\n })();\n\n const pendingCount =\n pendingConversationUpserts.size +\n pendingConversationDeletes.size +\n pendingProjectUpserts.size +\n pendingProjectDeletes.size;\n\n const conflictCount =\n (conflicts?.conversationConflicts.length ?? 0) +\n (conflicts?.projectConflicts.length ?? 0);\n\n const lastSyncDisplay = lastSyncAt ? new Date(lastSyncAt).toLocaleString() : 'Never';\n\n const MAX_CONVERSATION_MB = 12;\n const WARN_CONVERSATION_MB = 10;\n const formatBytesToMB = (bytes: number) => `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n const renderNoticeList = (notices: typeof warningConversations) => (\n <Box component=\"ul\" sx={{ pl: 2, mb: 0 }}>\n {notices.map((notice) => (\n <Box component=\"li\" key={notice.id} sx={{ mb: 0.5 }}>\n <Typography component=\"span\" variant=\"body2\" color=\"text.primary\">\n {(notice.name && notice.name.trim()) || 'Untitled conversation'}\n </Typography>\n <Typography component=\"span\" variant=\"body2\" color=\"text.secondary\">\n {` — ${formatBytesToMB(notice.sizeBytes)} / ${MAX_CONVERSATION_MB} MB`}\n </Typography>\n </Box>\n ))}\n </Box>\n );\n\n const gatewayConfigured = Boolean(packageSettings?.gatewayApiUrl);\n\n const {\n data: gatewayHealth,\n error: gatewayHealthError,\n isLoading: gatewayHealthLoading,\n isFetching: gatewayHealthFetching,\n refetch: refetchGatewayHealth,\n } = useGatewayHealth({\n enabled: gatewayConfigured,\n refetchOnWindowFocus: false,\n staleTime: 60_000,\n });\n\n const isGatewayLoading = gatewayHealthLoading || gatewayHealthFetching;\n\n const gatewayChipLabel = gatewayConfigured\n ? isGatewayLoading\n ? 'Checking…'\n : gatewayHealthError\n ? 'Offline'\n : gatewayHealth\n ? (gatewayHealth.status?.toLowerCase() === 'healthy')\n ? 'Online'\n : 'Offline'\n : 'Unknown'\n : 'Not Configured';\n\n const gatewayChipColor: 'default' | 'error' | 'success' | 'warning' = (() => {\n if (!gatewayConfigured) return 'default';\n if (gatewayHealthError) return 'error';\n if (isGatewayLoading) return 'default';\n if (!gatewayHealth) return 'warning';\n return (gatewayHealth.status?.toLowerCase() === 'healthy') ? 'success' : 'error';\n })();\n\n const handleGatewayStatusRefresh = useCallback(() => {\n if (!gatewayConfigured) {\n return;\n }\n refetchGatewayHealth();\n }, [gatewayConfigured, refetchGatewayHealth]);\n\n const handleSyncToggleChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const enabled = event.target.checked;\n setSyncToggleLoading(true);\n try {\n await setSyncEnabled(enabled);\n if (showSnackbar) {\n showSnackbar(\n enabled ? 'Cloud sync enabled. We will keep this device in parity with Bandit Cloud.' : 'Cloud sync disabled.',\n 'success'\n );\n }\n } catch (error) {\n if (showSnackbar) {\n showSnackbar('Failed to update sync preference.', 'error');\n }\n } finally {\n setSyncToggleLoading(false);\n }\n };\n\n const handleManualSync = async () => {\n setManualSyncLoading(true);\n await runSync({ force: true });\n const statusAfter = useConversationSyncStore.getState().status;\n const message = statusAfter === 'idle'\n ? 'Sync completed successfully.'\n : 'Sync did not complete. Check status details.';\n const severity = statusAfter === 'idle' ? 'success' : 'error';\n if (showSnackbar) {\n showSnackbar(message, severity);\n }\n setManualSyncLoading(false);\n };\n\n const handleAdvancedVectorToggleChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const enabled = event.target.checked;\n setAdvancedVectorToggleLoading(true);\n try {\n await setAdvancedVectorFeaturesEnabled(enabled);\n if (showSnackbar) {\n showSnackbar(\n enabled\n ? 'Advanced knowledge sync enabled for this account.'\n : 'Advanced knowledge sync disabled.',\n 'success'\n );\n }\n } catch (error) {\n if (showSnackbar) {\n showSnackbar('Failed to update advanced vector setting.', 'error');\n }\n } finally {\n setAdvancedVectorToggleLoading(false);\n }\n };\n\n // URL validation regex - more comprehensive\n const urlRegex = /^https?:\\/\\/(?:[-\\w.])+(?:\\:[0-9]+)?(?:\\/(?:[\\w\\/_.])*(?:\\?(?:[\\w&=%.]*))?(?:\\#(?:\\w*))?)?$/;\n\n // Get effective home URL (user preference overrides package setting)\n const getEffectiveHomeUrl = () => {\n if (preferences.homeUrl && preferences.homeUrl.trim()) {\n return preferences.homeUrl;\n }\n return packageSettings?.homeUrl || '';\n };\n\n // Sync local state with preferences when they change externally\n useEffect(() => {\n setLocalHomeUrl(preferences.homeUrl || '');\n }, [preferences.homeUrl]);\n\n const validateAndSaveHomeUrl = async (url: string) => {\n if (!url.trim()) {\n // Empty URL is valid (will use default)\n setHomeUrlStatus('valid');\n setHomeUrlError('');\n updatePreference('homeUrl', '');\n setHomeUrlStatus('saving');\n try {\n await handleSavePreferences();\n setHomeUrlStatus('saved');\n setTimeout(() => setHomeUrlStatus('idle'), 2000);\n } catch (error) {\n setHomeUrlStatus('invalid');\n setHomeUrlError('Failed to save. Please try again.');\n }\n return;\n }\n\n if (urlRegex.test(url)) {\n setHomeUrlStatus('valid');\n setHomeUrlError('');\n updatePreference('homeUrl', url);\n setHomeUrlStatus('saving');\n try {\n await handleSavePreferences();\n setHomeUrlStatus('saved');\n setTimeout(() => setHomeUrlStatus('idle'), 2000);\n } catch (error) {\n setHomeUrlStatus('invalid');\n setHomeUrlError('Failed to save. Please try again.');\n }\n } else {\n setHomeUrlStatus('invalid');\n setHomeUrlError('Please enter a valid URL (e.g., https://example.com)');\n }\n };\n\n const handleHomeUrlChange = (value: string) => {\n setLocalHomeUrl(value);\n setHomeUrlStatus('idle'); // Reset status while typing\n \n // Clear existing timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n \n // Set new timeout for validation and auto-save\n timeoutRef.current = setTimeout(() => {\n validateAndSaveHomeUrl(value);\n }, 1500); // Increased to 1.5 seconds for better UX\n };\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n // Export/Import/Reset functions\n const handleExportPreferences = () => {\n const jsonData = exportPreferences();\n const blob = new Blob([jsonData], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `bandit-preferences-${new Date().toISOString().split('T')[0]}.json`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n };\n\n const handleImportPreferences = () => {\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (!file) return;\n\n try {\n const text = await file.text();\n const success = await importPreferences(text);\n \n if (success) {\n setImportStatus('success');\n // Refresh the local state\n setLocalHomeUrl(preferences.homeUrl || '');\n setTimeout(() => setImportStatus('idle'), 3000);\n } else {\n setImportStatus('error');\n setTimeout(() => setImportStatus('idle'), 3000);\n }\n } catch (error) {\n setImportStatus('error');\n setTimeout(() => setImportStatus('idle'), 3000);\n }\n\n // Reset file input\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n const handleResetToDefaults = async () => {\n if (confirm('Are you sure you want to reset all preferences to their default values? This action cannot be undone.')) {\n await resetToDefaults();\n setLocalHomeUrl('');\n setHomeUrlStatus('idle');\n }\n };\n\n const getHomeUrlFieldProps = () => {\n const baseProps = {\n size: \"small\" as const,\n variant: \"outlined\" as const,\n fullWidth: true,\n };\n\n const getHelperText = () => {\n if (homeUrlStatus === 'saving') return \"Saving...\";\n if (homeUrlStatus === 'invalid') return homeUrlError;\n if (homeUrlStatus === 'valid') return \"Valid URL format\";\n \n // Default helper text based on current state\n if (localHomeUrl) {\n return `Will navigate to: ${localHomeUrl}`;\n } else if (packageSettings?.homeUrl) {\n return `Will use package default: ${packageSettings.homeUrl}`;\n } else {\n return \"Enter a URL for the home button\";\n }\n };\n\n switch (homeUrlStatus) {\n case 'valid':\n return {\n ...baseProps,\n color: \"success\" as const,\n helperText: getHelperText(),\n };\n case 'invalid':\n return {\n ...baseProps,\n color: \"error\" as const,\n error: true,\n helperText: getHelperText(),\n };\n case 'saving':\n return {\n ...baseProps,\n color: \"primary\" as const,\n helperText: getHelperText(),\n disabled: true,\n };\n case 'saved':\n return {\n ...baseProps,\n color: \"success\" as const,\n helperText: \"✓ Saved successfully\",\n };\n default:\n return {\n ...baseProps,\n helperText: getHelperText(),\n };\n }\n };\n\n const getEndAdornment = () => {\n switch (homeUrlStatus) {\n case 'valid':\n case 'saved':\n return (\n <InputAdornment position=\"end\">\n <CheckCircleIcon color=\"success\" fontSize=\"small\" />\n </InputAdornment>\n );\n case 'invalid':\n return (\n <InputAdornment position=\"end\">\n <ErrorIcon color=\"error\" fontSize=\"small\" />\n </InputAdornment>\n );\n case 'saving':\n return (\n <InputAdornment position=\"end\">\n <Box sx={{ \n width: 16, \n height: 16, \n border: '2px solid #1976d2',\n borderTop: '2px solid transparent',\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n '@keyframes spin': {\n '0%': { transform: 'rotate(0deg)' },\n '100%': { transform: 'rotate(360deg)' }\n }\n }} />\n </InputAdornment>\n );\n default:\n return (\n <InputAdornment position=\"end\">\n <LinkIcon color=\"action\" fontSize=\"small\" />\n </InputAdornment>\n );\n }\n };\n\n return (\n <Box sx={{ p: { xs: 1.5, sm: 3, md: 4 } }}>\n <Box sx={{ mb: { xs: 2.5, md: 3 } }}>\n <Typography\n variant=\"h5\"\n color=\"text.primary\"\n sx={{ mb: 1, fontWeight: 600, fontSize: { xs: '1.6rem', md: '1.8rem' } }}\n >\n Preferences\n </Typography>\n <Typography\n variant=\"body1\"\n color=\"text.secondary\"\n paragraph\n sx={{ opacity: 0.9, fontSize: { xs: '0.95rem', sm: '1rem' }, lineHeight: 1.5 }}\n >\n Control which AI features are enabled to optimize performance for your device. Disabling features can help\n reduce resource usage on machines with limited capabilities.\n </Typography>\n\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 }, mb: { xs: 2, md: 3 } }}>\n <Box>\n <Typography variant=\"h6\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Conversation Starters</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Personalize the suggested prompts on your home screen. Pick the topics you care about — starters lean toward\n them (blended with fresh ones each time) instead of generic blanket questions.\n </Typography>\n </Box>\n <Box sx={{ mt: 2, display: 'flex', flexWrap: 'wrap', gap: 1 }}>\n {STARTER_TOPICS.map((topic) => {\n const selected = (preferences.interests ?? []).includes(topic);\n return (\n <Chip\n key={topic}\n label={topic}\n size=\"small\"\n color={selected ? 'primary' : 'default'}\n variant={selected ? 'filled' : 'outlined'}\n onClick={() => {\n const current = preferences.interests ?? [];\n const next = selected\n ? current.filter((t) => t !== topic)\n : [...current, topic];\n updatePreference('interests', next);\n }}\n sx={{ textTransform: 'capitalize' }}\n />\n );\n })}\n </Box>\n <Box sx={{ mt: 2.5 }}>\n <FormControlLabel\n control={\n <Switch\n checked={!!preferences.useKnowledgeForStarters}\n onChange={(e) => updatePreference('useKnowledgeForStarters', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box textAlign=\"left\">\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>\n Use my knowledge documents\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Let some starters reference the documents in your library.\n </Typography>\n </Box>\n }\n sx={{ alignSelf: 'flex-start', ml: 0 }}\n />\n </Box>\n </Paper>\n\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 }, mb: { xs: 2, md: 3 } }}>\n <Box sx={{ display: 'flex', flexDirection: { xs: 'column', sm: 'row' }, justifyContent: 'space-between', gap: 2 }}>\n <Box>\n <Typography variant=\"h6\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Conversation & Project Sync</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Mirror conversations and projects to Bandit Cloud so you can resume work on any device. Images stay on this\n machine until a dedicated media pipeline is ready.\n </Typography>\n </Box>\n <FormControlLabel\n control={\n <Switch\n checked={syncEnabled}\n onChange={handleSyncToggleChange}\n color=\"primary\"\n disabled={!syncInitialized || syncToggleLoading}\n />\n }\n label={\n <Box textAlign=\"left\">\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>\n {syncEnabled ? 'Sync enabled' : 'Sync disabled'}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {syncInitialized ? 'Toggle at any time from the management panel.' : 'Loading preference…'}\n </Typography>\n </Box>\n }\n sx={{ alignSelf: { xs: 'flex-start', sm: 'center' }, ml: { xs: 0, sm: 2 } }}\n />\n </Box>\n\n <Box sx={{ mt: 2, display: 'flex', flexDirection: { xs: 'column', sm: 'row' }, alignItems: { sm: 'center' }, gap: 1.5 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n {syncIcon}\n <Typography variant=\"body2\" color=\"text.primary\">{syncStatusLabel}</Typography>\n </Box>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Last sync: {lastSyncDisplay}\n </Typography>\n {syncEnabled && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Server totals: {totalConversationsOnServer ?? 0} conversations · {totalProjectsOnServer ?? 0} projects\n </Typography>\n )}\n {pendingCount > 0 && (\n <Chip\n label={`${pendingCount} change${pendingCount === 1 ? '' : 's'} pending upload`}\n color=\"warning\"\n size=\"small\"\n />\n )}\n {conflictCount > 0 && (\n <Chip\n label={`${conflictCount} conflict${conflictCount === 1 ? '' : 's'} to review`}\n color=\"error\"\n size=\"small\"\n />\n )}\n </Box>\n\n {(hasAdvancedSearch() || hasAdvancedMemories()) && (\n <Box sx={{ mt: 2 }}>\n <FormControlLabel\n control={\n <Switch\n checked={isAdvancedVectorFeaturesEnabled}\n onChange={handleAdvancedVectorToggleChange}\n color=\"primary\"\n disabled={!syncInitialized || advancedVectorToggleLoading}\n />\n }\n label={\n <Box textAlign=\"left\">\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>\n Advanced knowledge sync\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Keep richer search, saved memories, and context in sync across devices\n </Typography>\n </Box>\n }\n sx={{ alignSelf: { xs: 'flex-start', sm: 'center' } }}\n />\n </Box>\n )}\n\n {syncError && (\n <Alert severity=\"error\" sx={{ mt: 2 }}>\n {syncError}\n </Alert>\n )}\n\n {oversizedConversations.length > 0 && (\n <Alert severity=\"error\" sx={{ mt: 2 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, mb: 0.5 }}>\n Start a new conversation to keep syncing with Bandit Cloud.\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n These threads exceeded the {MAX_CONVERSATION_MB} MB limit and are skipped until they are shortened:\n </Typography>\n {renderNoticeList(oversizedConversations)}\n </Alert>\n )}\n\n {warningConversations.length > 0 && oversizedConversations.length === 0 && (\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, mb: 0.5 }}>\n You are nearing the Bandit Cloud size limit.\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Consider starting a fresh conversation once these reach about {WARN_CONVERSATION_MB} MB:\n </Typography>\n {renderNoticeList(warningConversations)}\n </Alert>\n )}\n\n <Box sx={{ mt: 2, display: 'flex', flexWrap: 'wrap', gap: 1.5 }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleManualSync}\n disabled={!syncEnabled || syncStatus === 'syncing' || manualSyncLoading}\n startIcon={syncStatus === 'syncing' || manualSyncLoading ? <SyncIcon sx={spinSx} /> : <CloudDoneIcon />}\n >\n {syncStatus === 'syncing' || manualSyncLoading ? 'Syncing…' : 'Sync now'}\n </Button>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ display: 'flex', alignItems: 'center' }}>\n Need media support? Images and large files stay local until retention rules are finalized.\n </Typography>\n </Box>\n </Paper>\n\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 }, mb: { xs: 2, md: 3 } }}>\n <Typography variant=\"h6\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>Feature Controls</Typography>\n \n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600, color: \"text.primary\", display: 'flex', alignItems: 'center', gap: 1 }}>\n <LinkIcon fontSize=\"small\" color=\"primary\" />\n Home Button URL\n </Typography>\n <TextField\n label=\"Custom Home URL (optional)\"\n value={localHomeUrl}\n onChange={(e) => handleHomeUrlChange(e.target.value)}\n placeholder=\"https://example.com\"\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <LinkIcon color=\"action\" fontSize=\"small\" />\n </InputAdornment>\n ),\n endAdornment: getEndAdornment(),\n }}\n {...getHomeUrlFieldProps()}\n />\n </Box>\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.memoryEnabled}\n onChange={(e) => updatePreference('memoryEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Memory</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Enable automatic conversation memory and context retention\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.knowledgeDocsEnabled}\n onChange={(e) => updatePreference('knowledgeDocsEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Knowledge Documents</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Use uploaded documents to enhance AI responses\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.moodEnabled}\n onChange={(e) => updatePreference('moodEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Mood Adaptation</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Allow AI personality to adapt based on conversation tone\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.chatSuggestionsEnabled}\n onChange={(e) => updatePreference('chatSuggestionsEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Chat Suggestions</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Show suggested prompts and conversation starters\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.ttsEnabled}\n onChange={(e) => updatePreference('ttsEnabled', e.target.checked)}\n color=\"primary\"\n disabled={!isTTSSTTAvailable}\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Text-to-Speech (TTS)</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {isTTSSTTAvailable \n ? \"Enable AI voice responses\"\n : packageSettings?.gatewayApiUrl \n ? \"TTS service is currently unavailable\"\n : \"TTS service not configured - contact administrator\"\n }\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.sttEnabled}\n onChange={(e) => updatePreference('sttEnabled', e.target.checked)}\n color=\"primary\"\n disabled={!isTTSSTTAvailable}\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Speech-to-Text (STT)</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {isTTSSTTAvailable \n ? \"Enable voice input and transcription\"\n : packageSettings?.gatewayApiUrl \n ? \"STT service is currently unavailable\"\n : \"STT service not configured - contact administrator\"\n }\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.banditModelsEnabled}\n onChange={(e) => updatePreference('banditModelsEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Include Bandit Personalities</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Include default Bandit personalities alongside CDN models\n </Typography>\n </Box>\n }\n />\n\n {preferences.banditModelsEnabled && (\n <Box sx={{ mt: 2, ml: 4 }}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<RestoreIcon />}\n onClick={async () => {\n try {\n const result = await useModelStore.getState().restoreDeletedBanditModels();\n if (showSnackbar) {\n if (result.hadNothingToRestore) {\n showSnackbar(\"No deleted Bandit personalities found to restore.\", 'success');\n } else if (result.restored.length > 0) {\n showSnackbar(`Restored ${result.restored.length} Bandit personalit${result.restored.length === 1 ? 'y' : 'ies'}: ${result.restored.join(', ')}`, 'success');\n } else {\n showSnackbar(\"Bandit personalities restored from deleted list (enable Bandit personalities to see them).\", 'success');\n }\n }\n } catch (error) {\n if (showSnackbar) {\n showSnackbar(\"Failed to restore Bandit personalities. Please try again.\", 'error');\n }\n }\n }}\n sx={{ textTransform: 'none' }}\n >\n Restore Deleted Bandit Personalities\n </Button>\n <Typography variant=\"caption\" display=\"block\" color=\"text.secondary\" sx={{ mt: 0.5 }}>\n Restores any Bandit default personalities you may have deleted\n </Typography>\n </Box>\n )}\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.feedbackEnabled}\n onChange={(e) => updatePreference('feedbackEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Feedback Button</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Show feedback button in chat interface and other components\n </Typography>\n </Box>\n }\n />\n </Box>\n </Paper>\n\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 }, mb: { xs: 2, md: 3 } }}>\n <Typography variant=\"h6\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>Backup & Restore</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\n Export your preferences to save your settings, or import previously saved preferences. You can also reset to default values.\n </Typography>\n \n <Box sx={{ display: 'flex', flexDirection: { xs: 'column', sm: 'row' }, gap: 2, alignItems: 'center' }}>\n <Button\n variant=\"outlined\"\n startIcon={<DownloadIcon />}\n onClick={handleExportPreferences}\n sx={{ minWidth: { xs: '100%', sm: '160px' } }}\n >\n Export\n </Button>\n \n <Button\n variant=\"outlined\"\n startIcon={<UploadIcon />}\n onClick={handleImportPreferences}\n color={importStatus === 'success' ? 'success' : importStatus === 'error' ? 'error' : 'primary'}\n sx={{ minWidth: { xs: '100%', sm: '160px' } }}\n >\n {importStatus === 'success' ? '✓ Imported' : importStatus === 'error' ? '✗ Failed' : 'Import'}\n </Button>\n \n <Button\n variant=\"outlined\"\n startIcon={<RestoreIcon />}\n onClick={handleResetToDefaults}\n color=\"warning\"\n sx={{ minWidth: { xs: '100%', sm: '160px' } }}\n >\n Reset\n </Button>\n </Box>\n\n <input\n type=\"file\"\n ref={fileInputRef}\n onChange={handleFileChange}\n accept=\".json\"\n style={{ display: 'none' }}\n />\n </Paper>\n\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 } }}>\n <Typography variant=\"h6\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>Service Status</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\n The following services are configured for this deployment. Contact your administrator for more information about enabling or configuring these services.\n </Typography>\n \n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1.5 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Text-to-Speech (TTS)</Typography>\n <Chip\n label={isTTSSTTAvailable ? \"Available\" : packageSettings?.gatewayApiUrl ? \"Unavailable\" : \"Not Configured\"}\n color={isTTSSTTAvailable ? \"success\" : packageSettings?.gatewayApiUrl ? \"warning\" : \"default\"}\n size=\"small\"\n />\n </Box>\n\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Speech-to-Text (STT)</Typography>\n <Chip\n label={isTTSSTTAvailable ? \"Available\" : packageSettings?.gatewayApiUrl ? \"Unavailable\" : \"Not Configured\"}\n color={isTTSSTTAvailable ? \"success\" : packageSettings?.gatewayApiUrl ? \"warning\" : \"default\"}\n size=\"small\"\n />\n </Box>\n\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap', gap: 1 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Gateway/MCP</Typography>\n {gatewayConfigured && (\n <Tooltip title=\"Refresh gateway status\" placement=\"top\">\n <span>\n <IconButton\n size=\"small\"\n onClick={handleGatewayStatusRefresh}\n disabled={isGatewayLoading}\n sx={{ p: 0.25 }}\n >\n <RefreshIcon fontSize=\"small\" sx={isGatewayLoading ? spinSx : undefined} />\n </IconButton>\n </span>\n </Tooltip>\n )}\n </Box>\n <Chip\n label={gatewayChipLabel}\n color={gatewayChipColor}\n size=\"small\"\n />\n </Box>\n\n {gatewayConfigured && gatewayHealthError && (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.75, pl: { xs: 0, sm: 0.5 } }}>\n <Typography variant=\"caption\" color=\"error\">\n {gatewayHealthError.message}\n </Typography>\n </Box>\n )}\n </Box>\n </Paper>\n </Box>\n </Box>\n );\n};\n\nexport default PreferencesTab;\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-3096-F9AF1C\nconst __banditFingerprint_hooks_useGatewayQueriests = 'BL-FP-52A0D3-0867';\nconst __auditTrail_hooks_useGatewayQueriests = 'BL-AU-MGOIKVVE-4U8X';\n// File: useGatewayQueries.ts | Path: src/hooks/useGatewayQueries.ts | Hash: 30960867\n\nimport { useMemo } from \"react\";\nimport { lastValueFrom } from \"rxjs\";\nimport { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { usePackageSettingsStore } from \"../store/packageSettingsStore\";\nimport { GatewayService } from \"../services/gateway/gateway.service\";\nimport { authenticationService } from \"../services/auth/authenticationService\";\nimport {\n GatewayHealthResponse,\n GatewayMemoryResponse,\n GatewayModel\n} from \"../services/gateway/interfaces\";\n\nexport type GatewayQueryOptions<TData> = Omit<UseQueryOptions<TData, Error>, \"queryKey\" | \"queryFn\">;\n\nconst useGatewayClient = () => {\n const settings = usePackageSettingsStore((state) => state.settings);\n const gatewayUrl = settings?.gatewayApiUrl;\n const feedbackEmail = settings?.feedbackEmail;\n\n const service = useMemo<GatewayService | null>(() => {\n if (!gatewayUrl) {\n return null;\n }\n\n return new GatewayService(\n gatewayUrl,\n () => authenticationService.getToken(),\n feedbackEmail\n );\n }, [gatewayUrl, feedbackEmail]);\n\n return { service, gatewayUrl };\n};\n\nexport const useGatewayHealth = (\n options?: GatewayQueryOptions<GatewayHealthResponse>\n) => {\n const { service, gatewayUrl } = useGatewayClient();\n const enabled = Boolean(service && gatewayUrl) && (options?.enabled ?? true);\n\n return useQuery<GatewayHealthResponse, Error>({\n ...options,\n queryKey: [\"gateway\", \"health\", gatewayUrl],\n queryFn: async () => {\n if (!service) {\n throw new Error(\"Gateway service is not configured\");\n }\n return lastValueFrom(service.getHealth());\n },\n enabled\n });\n};\n\nexport const useGatewayModels = (\n options?: GatewayQueryOptions<GatewayModel[]>\n) => {\n const { service, gatewayUrl } = useGatewayClient();\n const enabled = Boolean(service && gatewayUrl) && (options?.enabled ?? true);\n\n return useQuery<GatewayModel[], Error>({\n ...options,\n queryKey: [\"gateway\", \"models\", gatewayUrl],\n queryFn: async () => {\n if (!service) {\n throw new Error(\"Gateway service is not configured\");\n }\n return lastValueFrom(service.listModels());\n },\n enabled\n });\n};\n\nexport const useGatewayMemory = (\n options?: GatewayQueryOptions<GatewayMemoryResponse>\n) => {\n const { service, gatewayUrl } = useGatewayClient();\n const enabled = Boolean(service && gatewayUrl) && (options?.enabled ?? true);\n\n return useQuery<GatewayMemoryResponse, Error>({\n ...options,\n queryKey: [\"gateway\", \"memory\", gatewayUrl],\n queryFn: async () => {\n if (!service) {\n throw new Error(\"Gateway service is not configured\");\n }\n return lastValueFrom(service.getMemory());\n },\n enabled\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-10D4-7CC05E\nconst __banditFingerprint_components_BrandingTabtsx = 'BL-FP-9A095E-D769';\nconst __auditTrail_components_BrandingTabtsx = 'BL-AU-MGOIKVVH-B385';\n// File: BrandingTab.tsx | Path: src/management/components/BrandingTab.tsx | Hash: 10d4d769\n\nimport React, { useState, useRef } from 'react';\nimport {\n Box,\n Typography,\n Button,\n TextField,\n Card,\n CardContent,\n Paper,\n Chip,\n Alert,\n Fade,\n Skeleton,\n Stack,\n Snackbar,\n useTheme,\n useMediaQuery,\n} from '@mui/material';\nimport LogoCropper from '../../components/LogoCropper';\nimport {\n DeleteIcon,\n DownloadIcon,\n FileUploadIcon,\n PreviewIcon,\n RestoreIcon,\n SaveIcon,\n UploadIcon,\n} from \"../../icons/lucide-icons\";\n\n// Default logos from CDN\nconst banditAiLogo = \"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 BrandingTabProps {\n logoFile: File | null;\n logoBase64: string | null;\n brandingText: string;\n setBrandingText: (text: string) => void;\n theme: string;\n setTheme: (theme: string) => void;\n predefinedThemes: Record<string, ThemeOptions & { name: string }>;\n handleLogoUpload: (event: React.ChangeEvent<HTMLInputElement>) => void;\n handleRestoreDefaults: () => void;\n handleExportConfig: () => void;\n handleImportConfig: (event: React.ChangeEvent<HTMLInputElement>) => void;\n handleSaveBranding: () => void;\n setLogoFile?: (file: File | null) => void;\n setLogoBase64?: (base64: string | null) => void;\n}\n\nconst BrandingTab: React.FC<BrandingTabProps> = ({\n logoFile,\n logoBase64,\n brandingText,\n setBrandingText,\n theme,\n setTheme,\n predefinedThemes,\n handleLogoUpload,\n handleRestoreDefaults,\n handleExportConfig,\n handleImportConfig,\n handleSaveBranding,\n setLogoFile,\n setLogoBase64,\n}) => {\n const muiTheme = useTheme();\n const isMobile = useMediaQuery(muiTheme.breakpoints.down('sm'));\n const [dragOver, setDragOver] = useState(false);\n const [saveStatus, setSaveStatus] = useState<'idle' | 'saving' | 'saved' | 'error'>('idle');\n const [snackbarMessage, setSnackbarMessage] = useState('');\n const [showSnackbar, setShowSnackbar] = useState(false);\n const [snackbarSeverity, setSnackbarSeverity] = useState<'success' | 'error'>('success');\n const [cropperOpen, setCropperOpen] = useState(false);\n const [selectedImageFile, setSelectedImageFile] = useState<File | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const importInputRef = useRef<HTMLInputElement>(null);\n\n // Helper function to get the appropriate default logo based on theme mode\n const getDefaultLogo = () => {\n // Use Material-UI theme mode for better accuracy\n return muiTheme.palette.mode === 'light' ? lightLogo : banditAiLogo;\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(true);\n };\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(false);\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(false);\n const files = e.dataTransfer.files;\n if (files.length > 0 && (files[0].type === 'image/png' || files[0].type === 'image/jpeg' || files[0].type === 'image/jpg')) {\n handleImageUpload(files[0]);\n }\n };\n\n const handleImageUpload = (file: File) => {\n // Validate file type\n if (!file.type.match(/^image\\/(jpeg|jpg|png)$/)) {\n setSnackbarMessage('Please select a JPG or PNG image file.');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n return;\n }\n\n // Validate file size (max 10MB)\n if (file.size > 10 * 1024 * 1024) {\n setSnackbarMessage('Image file size must be less than 10MB.');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n return;\n }\n\n setSelectedImageFile(file);\n setCropperOpen(true);\n };\n\n const handleFileInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) {\n handleImageUpload(file);\n }\n };\n\n const handleCropComplete = (croppedImageData: string) => {\n // Create a fake event to work with existing handleLogoUpload\n const fakeEvent = {\n target: {\n files: null,\n value: ''\n }\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n\n // Set the base64 directly if we have setters\n if (setLogoBase64 && setLogoFile) {\n setLogoBase64(croppedImageData);\n setLogoFile(null);\n } else {\n // Fallback to existing handler\n handleLogoUpload(fakeEvent);\n }\n\n setCropperOpen(false);\n setSelectedImageFile(null);\n\n setSnackbarMessage('Logo cropped and applied successfully!');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n };\n\n const handleCropperClose = () => {\n setCropperOpen(false);\n setSelectedImageFile(null);\n };\n\n const handleSaveWithFeedback = async () => {\n setSaveStatus('saving');\n try {\n await handleSaveBranding();\n setSaveStatus('saved');\n setTimeout(() => setSaveStatus('idle'), 2000);\n } catch (error) {\n setSaveStatus('error');\n setTimeout(() => setSaveStatus('idle'), 3000);\n }\n };\n\n const handleExportWithFeedback = async () => {\n try {\n await handleExportConfig();\n setSnackbarMessage('Branding configuration exported successfully');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n } catch (error) {\n setSnackbarMessage('Failed to export branding configuration');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n };\n\n const handleImportWithFeedback = async (event: React.ChangeEvent<HTMLInputElement>) => {\n try {\n await handleImportConfig(event);\n setSnackbarMessage('Branding configuration imported successfully');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n } catch (error) {\n setSnackbarMessage('Failed to import branding configuration');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n };\n\n const handleResetWithFeedback = async () => {\n try {\n await handleRestoreDefaults();\n setSnackbarMessage('Branding settings reset to defaults');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n } catch (error) {\n setSnackbarMessage('Failed to reset branding settings');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n };\n\n const handleDeleteLogo = () => {\n // Reset the file input value\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n\n // Use direct state setters if available, otherwise try the upload handler\n if (setLogoFile && setLogoBase64) {\n setLogoFile(null);\n setLogoBase64(null);\n } else {\n // Fallback to the upload handler approach\n const fakeEvent = {\n target: {\n files: null,\n value: ''\n }\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n handleLogoUpload(fakeEvent);\n }\n };\n\n return (\n <Box sx={{ height: \"100%\", display: 'flex', flexDirection: 'column', p: { xs: 1.5, sm: 2 } }}>\n {/* Header Section */}\n <Box sx={{ mb: { xs: 2, md: 3 }, flex: '0 0 auto', display: 'flex', flexDirection: 'column', gap: 1 }}>\n <Typography\n variant=\"h5\"\n sx={{ fontWeight: 600, color: \"primary.main\", fontSize: { xs: '1.55rem', md: '1.8rem' } }}\n >\n Branding & Themes\n </Typography>\n <Typography\n variant=\"body1\"\n sx={{ color: \"text.secondary\", fontSize: { xs: '0.95rem', sm: '1rem' }, lineHeight: 1.5 }}\n >\n Customize your brand identity and visual appearance.\n </Typography>\n\n <Alert severity=\"info\" sx={{ borderRadius: 2, px: { xs: 1.5, sm: 2 }, py: { xs: 1.25, sm: 1.5 } }}>\n <Typography variant=\"body2\" sx={{ fontSize: { xs: '0.82rem', sm: '0.88rem' }, lineHeight: 1.6 }}>\n <strong>Logo requirements:</strong> JPG or PNG up to 10MB. Uploads open a built-in cropper to help you\n finalize the perfect size. Leave any fields blank to fall back to Bandit defaults.\n </Typography>\n </Alert>\n </Box>\n\n {/* Main Content Section */}\n <Paper\n sx={{\n p: { xs: 1.5, sm: 2 },\n borderRadius: 2,\n flex: 1,\n display: 'flex',\n flexDirection: { xs: 'column', md: 'row' },\n gap: { xs: 1.5, md: 2.5 },\n mb: { xs: 2, md: 3 },\n }}\n >\n {/* Logo Upload and Branding Text Section */}\n <Box\n sx={{\n width: { xs: '100%', md: '26%' },\n display: 'flex',\n flexDirection: 'column',\n height: { xs: 'auto', md: 320 },\n gap: { xs: 2, md: 0 },\n }}\n >\n {/* Logo Upload Section - Fixed height to match preview */}\n <Box sx={{ flex: '1 1 auto', display: 'flex', flexDirection: 'column' }}>\n <Typography variant=\"h6\" sx={{ mb: 1.5, fontWeight: 600, display: 'flex', alignItems: 'center', gap: 1, fontSize: '1rem', color: \"text.primary\" }}>\n <UploadIcon color=\"primary\" fontSize=\"small\" />\n Logo Upload\n </Typography>\n\n <Box\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n sx={{\n border: '2px dashed',\n borderColor: dragOver ? 'primary.main' : logoBase64 ? 'success.main' : 'info.main',\n borderRadius: 2,\n p: 2,\n textAlign: 'center',\n cursor: 'pointer',\n bgcolor: dragOver ? 'action.hover' : logoBase64 ? 'success.50' : 'info.50',\n transition: 'all 0.3s ease',\n position: 'relative',\n flex: '1 1 auto',\n minHeight: 160,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n '&:hover': {\n borderColor: 'primary.main',\n bgcolor: 'action.hover',\n '& .upload-icon': {\n color: 'primary.main',\n }\n }\n }}\n >\n {logoBase64 || getDefaultLogo() ? (\n <Fade in={true}>\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 1 }}>\n <img\n src={logoBase64 || getDefaultLogo()}\n alt=\"Logo Preview\"\n style={{\n maxWidth: '140px',\n maxHeight: '140px',\n borderRadius: '8px',\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\n imageRendering: 'auto' as const,\n objectFit: 'contain',\n filter: 'contrast(1.1) saturate(1.05)',\n }}\n />\n <Typography variant=\"body2\" color={logoBase64 ? \"success.main\" : \"info.main\"} sx={{ fontWeight: 600, fontSize: '0.85rem' }}>\n {logoBase64 ? \"✓ Custom Logo\" : \"Default Logo\"}\n </Typography>\n {!logoBase64 && (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ fontSize: '0.75rem', textAlign: 'center' }}>\n 🎯 Click to upload & crop your logo\n </Typography>\n )}\n </Box>\n </Fade>\n ) : (\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 1 }}>\n <UploadIcon\n className=\"upload-icon\"\n sx={{\n fontSize: 56,\n color: 'text.secondary',\n transition: 'color 0.3s ease'\n }}\n />\n <Typography variant=\"body2\" color=\"text.primary\" sx={{ fontSize: '1rem' }}>\n {dragOver ? 'Drop here' : '🎯 Upload & Crop Logo'}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ fontSize: '0.82rem', textAlign: 'center' }}>\n JPG/PNG • Drag & drop or tap to upload • Built-in cropper\n </Typography>\n </Box>\n )}\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/jpg\"\n hidden\n onChange={handleFileInputChange}\n />\n </Box>\n\n {logoBase64 && (\n <Box sx={{ display: 'flex', gap: 1, mt: 1.5 }}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<UploadIcon />}\n onClick={() => fileInputRef.current?.click()}\n sx={{ flex: 1, fontSize: '0.8rem', py: 0.75 }}\n >\n Replace\n </Button>\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"error\"\n startIcon={<DeleteIcon />}\n onClick={handleDeleteLogo}\n sx={{ flex: 1, fontSize: '0.8rem', py: 0.75 }}\n >\n Remove\n </Button>\n </Box>\n )}\n </Box>\n {/* Branding Text Section - Fixed at bottom */}\n <Box sx={{ mt: 2, flex: '0 0 auto' }}>\n <TextField\n label=\"Custom Branding Text\"\n variant=\"outlined\"\n value={brandingText}\n onChange={(e) => setBrandingText(e.target.value)}\n fullWidth\n placeholder=\"e.g., Powered by YourCompany\"\n size=\"small\"\n sx={{\n '& .MuiInputBase-root': { fontSize: '0.85rem' },\n '& .MuiFormHelperText-root': { fontSize: '0.7rem' }\n }}\n />\n </Box>\n </Box>\n {/* Live Preview Section */}\n <Box sx={{ flex: 1, width: '100%' }}>\n <Typography variant=\"h6\" sx={{ mb: 1.5, fontWeight: 600, display: 'flex', alignItems: 'center', gap: 1, fontSize: '1rem', color: \"text.primary\" }}>\n <PreviewIcon color=\"primary\" fontSize=\"small\" />\n Live Preview\n </Typography>\n {/* New Chat Preview - closer to real chat page */}\n <Box\n sx={{\n height: { xs: 260, md: 320 },\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n bgcolor: 'background.default',\n borderRadius: 2,\n overflow: 'hidden',\n px: 2,\n py: 3,\n }}\n >\n {/* Centered Logo - Top section */}\n <Box sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n flex: '1 1 auto',\n minHeight: 0\n }}>\n {logoBase64 || getDefaultLogo() ? (\n <img\n src={logoBase64 || getDefaultLogo()}\n alt=\"Logo Preview\"\n style={{\n maxWidth: '320px',\n height: 'auto',\n imageRendering: 'auto' as const,\n objectFit: 'contain',\n filter: 'contrast(1.1) saturate(1.05)',\n }}\n />\n ) : (\n <Box sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 0.5\n }}>\n <Skeleton\n variant=\"rectangular\"\n width={160}\n height={40}\n sx={{\n borderRadius: 2,\n bgcolor: (theme) => theme.palette.mode === 'dark' ? 'rgba(255,255,255,0.08)' : 'rgba(0,0,0,0.08)'\n }}\n />\n <Typography variant=\"caption\" color=\"text.disabled\" sx={{ fontSize: '0.7rem' }}>\n Logo preview\n </Typography>\n </Box>\n )}\n </Box>\n\n {/* Chat Interface - Bottom section */}\n <Box sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: '100%',\n flex: '0 0 auto',\n gap: 1,\n }}>\n {/* Conversation Starters */}\n <Stack direction=\"row\" spacing={1} justifyContent=\"center\" sx={{ flexWrap: 'wrap', gap: 1 }}>\n {[1, 2, 3].map((i) => (\n <Skeleton\n key={i}\n variant=\"rectangular\"\n width={80}\n height={24}\n sx={{\n borderRadius: 2,\n bgcolor: (theme) => theme.palette.mode === 'dark' ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.05)'\n }}\n />\n ))}\n </Stack>\n\n {/* Chat Input */}\n <Paper elevation={3} sx={{ px: 2, py: 1.5, borderRadius: 2, width: '100%', maxWidth: 500 }}>\n <Typography variant=\"body1\" sx={{ color: 'text.secondary' }}>\n What's on your mind?\n </Typography>\n </Paper>\n\n {/* Branding Footer */}\n <Typography variant=\"caption\" sx={{ textAlign: 'center', color: 'text.secondary', mt: 1 }}>\n {brandingText ? `${brandingText} • ` : 'Bandit AI • '}may be wrong — double-check important info.\n </Typography>\n </Box>\n </Box>\n </Box>\n </Paper>\n\n {/* Theme Selection - Compact */}\n <Paper sx={{ p: 2, borderRadius: 2, flex: '0 0 auto', mb: 2 }}>\n <Typography variant=\"h6\" sx={{ mb: 1.5, fontWeight: 600, fontSize: '1rem', color: \"text.primary\" }}>\n Theme Selection\n </Typography>\n\n <Box\n sx={{\n display: \"grid\",\n gap: 1.5,\n gridTemplateColumns: {\n xs: \"repeat(4, 1fr)\",\n sm: \"repeat(6, 1fr)\",\n md: \"repeat(8, 1fr)\",\n lg: \"repeat(10, 1fr)\",\n xl: \"repeat(12, 1fr)\",\n },\n }}\n >\n {Object.values(predefinedThemes).map((themeOption) => {\n const isSelected = themeOption.name === theme;\n return (\n <Card\n key={themeOption.name}\n onClick={() => setTheme(themeOption.name)}\n sx={{\n cursor: \"pointer\",\n border: isSelected ? \"2px solid\" : \"1px solid\",\n borderColor: isSelected ? \"primary.main\" : \"divider\",\n borderRadius: 1.5,\n transition: \"all 0.2s ease\",\n position: 'relative',\n overflow: 'visible',\n \"&:hover\": {\n transform: 'scale(1.05)',\n boxShadow: 2,\n borderColor: \"primary.main\",\n },\n }}\n elevation={isSelected ? 2 : 0}\n >\n {isSelected && (\n <Chip\n label=\"Selected\"\n size=\"small\"\n color=\"primary\"\n sx={{\n position: 'absolute',\n top: -6,\n right: -6,\n zIndex: 1,\n fontSize: '0.6rem',\n height: 16,\n }}\n />\n )}\n <CardContent sx={{ p: 1 }}>\n <Box\n sx={{\n height: 40,\n backgroundColor: themeOption.palette?.background?.default,\n borderRadius: 1,\n position: \"relative\",\n border: \"1px solid\",\n borderColor: \"divider\",\n mb: 0.5,\n }}\n >\n <Box\n sx={{\n position: \"absolute\",\n top: 4,\n left: 4,\n width: 12,\n height: 12,\n backgroundColor: themeOption.palette?.primary?.main,\n borderRadius: \"50%\",\n }}\n />\n <Box\n sx={{\n position: \"absolute\",\n top: 4,\n right: 4,\n width: 12,\n height: 12,\n backgroundColor: themeOption.palette?.secondary?.main,\n borderRadius: \"50%\",\n }}\n />\n <Box\n sx={{\n position: \"absolute\",\n bottom: 4,\n left: 4,\n right: 4,\n height: 2,\n backgroundColor: themeOption.palette?.primary?.main,\n borderRadius: 1,\n opacity: 0.7,\n }}\n />\n </Box>\n <Typography\n variant=\"caption\"\n sx={{\n textAlign: \"center\",\n color: \"text.primary\",\n fontWeight: 600,\n fontSize: \"0.65rem\",\n display: 'block',\n lineHeight: 1.2,\n }}\n >\n {themeOption.name}\n </Typography>\n </CardContent>\n </Card>\n );\n })}\n </Box>\n </Paper>\n\n {/* Action Buttons - Compact */}\n <Paper sx={{ p: 2, borderRadius: 2, flex: '0 0 auto' }}>\n <Typography variant=\"h6\" sx={{ mb: 1.5, fontWeight: 600, fontSize: '1rem', color: \"text.primary\" }}>\n Actions\n </Typography>\n\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1.5 }}>\n <Box sx={{ flexBasis: { xs: 'calc(50% - 6px)', sm: 'calc(25% - 9px)' } }}>\n <Button\n variant=\"outlined\"\n fullWidth\n startIcon={<SaveIcon />}\n onClick={handleSaveWithFeedback}\n disabled={saveStatus === 'saving'}\n color={saveStatus === 'saved' ? 'success' : saveStatus === 'error' ? 'error' : 'primary'}\n sx={{ height: 36, fontSize: '0.8rem' }}\n >\n {saveStatus === 'saving' ? 'Saving...' :\n saveStatus === 'saved' ? '✓ Saved' :\n saveStatus === 'error' ? '✗ Error' : 'Save'}\n </Button>\n </Box>\n\n <Box sx={{ flexBasis: { xs: 'calc(50% - 6px)', sm: 'calc(25% - 9px)' } }}>\n <Button\n variant=\"outlined\"\n fullWidth\n startIcon={<DownloadIcon />}\n onClick={handleExportWithFeedback}\n sx={{ height: 36, fontSize: '0.8rem' }}\n >\n Export\n </Button>\n </Box>\n\n <Box sx={{ flexBasis: { xs: 'calc(50% - 6px)', sm: 'calc(25% - 9px)' } }}>\n <Button\n variant=\"outlined\"\n fullWidth\n startIcon={<FileUploadIcon />}\n onClick={() => importInputRef.current?.click()}\n sx={{ height: 36, fontSize: '0.8rem' }}\n >\n Import\n </Button>\n <input\n ref={importInputRef}\n type=\"file\"\n accept=\"application/json\"\n hidden\n onChange={handleImportWithFeedback}\n />\n </Box>\n\n <Box sx={{ flexBasis: { xs: 'calc(50% - 6px)', sm: 'calc(25% - 9px)' } }}>\n <Button\n variant=\"outlined\"\n fullWidth\n color=\"warning\"\n startIcon={<RestoreIcon />}\n onClick={handleResetWithFeedback}\n sx={{ height: 36, fontSize: '0.8rem' }}\n >\n Reset\n </Button>\n </Box>\n </Box>\n </Paper>\n\n {/* Snackbar */}\n <Snackbar\n open={showSnackbar}\n autoHideDuration={4000}\n onClose={() => setShowSnackbar(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Alert\n onClose={() => setShowSnackbar(false)}\n severity={snackbarSeverity}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {snackbarMessage}\n </Alert>\n </Snackbar>\n\n {/* Logo Cropper Dialog */}\n <LogoCropper\n open={cropperOpen}\n onClose={handleCropperClose}\n onCrop={handleCropComplete}\n imageFile={selectedImageFile}\n />\n </Box>\n );\n};\n\nexport default BrandingTab;\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-FCA3-C93D1A\nconst __banditFingerprint_components_LogoCroppertsx = 'BL-FP-8A6FB7-D540';\nconst __auditTrail_components_LogoCroppertsx = 'BL-AU-MGOIKVV8-FTQA';\n// File: LogoCropper.tsx | Path: src/components/LogoCropper.tsx | Hash: fca3d540\n\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n Box,\n Typography,\n Slider,\n IconButton,\n Paper,\n Alert,\n ToggleButtonGroup,\n ToggleButton,\n Chip,\n} from '@mui/material';\nimport {\n Crop169Icon,\n CropPortraitIcon,\n CropSquareIcon,\n RotateLeftIcon,\n RotateRightIcon,\n ZoomInIcon,\n ZoomOutIcon,\n} from \"../icons/lucide-icons\";\n\ninterface LogoCropperProps {\n open: boolean;\n onClose: () => void;\n onCrop: (croppedImageData: string) => void;\n imageFile: File | null;\n}\n\ninterface CropSettings {\n x: number;\n y: number;\n scale: number;\n rotation: number;\n}\n\ntype AspectRatio = 'free' | 'square' | 'landscape' | 'portrait';\n\nconst LOGO_OUTPUT_SIZES = {\n small: 256,\n medium: 512,\n large: 1024,\n} as const;\n\nconst LogoCropper: React.FC<LogoCropperProps> = ({\n open,\n onClose,\n onCrop,\n imageFile,\n}) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const previewCanvasRef = useRef<HTMLCanvasElement>(null);\n const imageRef = useRef<HTMLImageElement>(null);\n const [imageSrc, setImageSrc] = useState<string>('');\n const [cropSettings, setCropSettings] = useState<CropSettings>({\n x: 0,\n y: 0,\n scale: 1,\n rotation: 0,\n });\n const [isDragging, setIsDragging] = useState(false);\n const [dragStart, setDragStart] = useState({ x: 0, y: 0 });\n const [imageLoaded, setImageLoaded] = useState(false);\n const [imageNaturalSize, setImageNaturalSize] = useState({ width: 0, height: 0 });\n const [aspectRatio, setAspectRatio] = useState<AspectRatio>('square');\n const [cropArea, setCropArea] = useState({ width: 400, height: 400 });\n\n const CANVAS_SIZE = 500; // Fixed canvas size for editing\n const [outputSize, setOutputSize] = useState<keyof typeof LOGO_OUTPUT_SIZES>('large');\n\n // Calculate crop dimensions based on aspect ratio\n const getCropDimensions = useCallback(() => {\n const maxSize = 380; // Leave some padding in the canvas\n switch (aspectRatio) {\n case 'square':\n return { width: maxSize, height: maxSize };\n case 'landscape':\n return { width: maxSize, height: maxSize * 0.6 }; // 16:9-ish\n case 'portrait':\n return { width: maxSize * 0.6, height: maxSize };\n case 'free':\n default:\n return cropArea;\n }\n }, [aspectRatio, cropArea]);\n\n // Load image from file\n useEffect(() => {\n if (imageFile && open) {\n const reader = new FileReader();\n reader.onload = (e) => {\n if (e.target?.result) {\n setImageSrc(e.target.result as string);\n setImageLoaded(false);\n }\n };\n reader.readAsDataURL(imageFile);\n }\n }, [imageFile, open]);\n\n // Handle image load\n const handleImageLoad = useCallback(() => {\n if (imageRef.current) {\n const { naturalWidth, naturalHeight } = imageRef.current;\n setImageNaturalSize({ width: naturalWidth, height: naturalHeight });\n \n // Calculate initial scale to fit the crop area\n const cropDims = getCropDimensions();\n const minScale = Math.max(\n cropDims.width / naturalWidth,\n cropDims.height / naturalHeight\n );\n \n setCropSettings({\n x: 0,\n y: 0,\n scale: Math.max(minScale, 0.3),\n rotation: 0,\n });\n \n setImageLoaded(true);\n }\n }, [getCropDimensions]);\n\n // Update crop area when aspect ratio changes\n useEffect(() => {\n if (imageLoaded) {\n const cropDims = getCropDimensions();\n setCropArea(cropDims);\n \n // Recalculate minimum scale\n const minScale = Math.max(\n cropDims.width / imageNaturalSize.width,\n cropDims.height / imageNaturalSize.height\n );\n \n setCropSettings(prev => ({\n ...prev,\n scale: Math.max(prev.scale, minScale)\n }));\n }\n }, [aspectRatio, imageLoaded, imageNaturalSize, getCropDimensions]);\n\n const updatePreview = useCallback((cropX: number, cropY: number, cropDims: { width: number; height: number }) => {\n const previewCanvas = previewCanvasRef.current;\n const mainCanvas = canvasRef.current;\n \n if (!previewCanvas || !mainCanvas) return;\n \n const previewCtx = previewCanvas.getContext('2d');\n if (!previewCtx) return;\n\n previewCanvas.width = 120;\n previewCanvas.height = 120;\n\n // Clear preview\n previewCtx.clearRect(0, 0, 120, 120);\n\n // Calculate scale to fit preview\n const scale = Math.min(120 / cropDims.width, 120 / cropDims.height);\n const scaledWidth = cropDims.width * scale;\n const scaledHeight = cropDims.height * scale;\n const offsetX = (120 - scaledWidth) / 2;\n const offsetY = (120 - scaledHeight) / 2;\n\n // Draw scaled crop area\n previewCtx.drawImage(\n mainCanvas,\n cropX, cropY, cropDims.width, cropDims.height,\n offsetX, offsetY, scaledWidth, scaledHeight\n );\n\n // Add border\n previewCtx.strokeStyle = '#1976d2';\n previewCtx.lineWidth = 2;\n previewCtx.strokeRect(offsetX, offsetY, scaledWidth, scaledHeight);\n }, []);\n\n // Draw the crop preview\n const drawCropPreview = useCallback(() => {\n const canvas = canvasRef.current;\n const image = imageRef.current;\n \n if (!canvas || !image || !imageLoaded) return;\n \n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const cropDims = getCropDimensions();\n\n // Set canvas size\n canvas.width = CANVAS_SIZE;\n canvas.height = CANVAS_SIZE;\n\n // Clear canvas with transparent background\n ctx.clearRect(0, 0, CANVAS_SIZE, CANVAS_SIZE);\n\n // Draw background pattern for transparency visibility\n const patternSize = 20;\n ctx.fillStyle = '#f0f0f0';\n for (let x = 0; x < CANVAS_SIZE; x += patternSize) {\n for (let y = 0; y < CANVAS_SIZE; y += patternSize) {\n if ((x / patternSize + y / patternSize) % 2 === 0) {\n ctx.fillRect(x, y, patternSize, patternSize);\n }\n }\n }\n\n // Save context\n ctx.save();\n\n // Create crop rectangle clipping path\n const cropX = (CANVAS_SIZE - cropDims.width) / 2;\n const cropY = (CANVAS_SIZE - cropDims.height) / 2;\n \n ctx.beginPath();\n ctx.rect(cropX, cropY, cropDims.width, cropDims.height);\n ctx.clip();\n\n // Apply transformations\n ctx.translate(CANVAS_SIZE / 2, CANVAS_SIZE / 2);\n ctx.rotate((cropSettings.rotation * Math.PI) / 180);\n ctx.scale(cropSettings.scale, cropSettings.scale);\n ctx.translate(-image.naturalWidth / 2 + cropSettings.x, -image.naturalHeight / 2 + cropSettings.y);\n\n // Draw image\n ctx.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight);\n\n // Restore context\n ctx.restore();\n\n // Draw crop area border\n ctx.strokeStyle = '#1976d2';\n ctx.lineWidth = 3;\n ctx.strokeRect(cropX, cropY, cropDims.width, cropDims.height);\n\n // Draw corner indicators\n const cornerSize = 20;\n ctx.fillStyle = '#1976d2';\n // Top-left\n ctx.fillRect(cropX - 1, cropY - 1, cornerSize, 3);\n ctx.fillRect(cropX - 1, cropY - 1, 3, cornerSize);\n // Top-right\n ctx.fillRect(cropX + cropDims.width - cornerSize + 1, cropY - 1, cornerSize, 3);\n ctx.fillRect(cropX + cropDims.width - 1, cropY - 1, 3, cornerSize);\n // Bottom-left\n ctx.fillRect(cropX - 1, cropY + cropDims.height - 2, cornerSize, 3);\n ctx.fillRect(cropX - 1, cropY + cropDims.height - cornerSize + 1, 3, cornerSize);\n // Bottom-right\n ctx.fillRect(cropX + cropDims.width - cornerSize + 1, cropY + cropDims.height - 2, cornerSize, 3);\n ctx.fillRect(cropX + cropDims.width - 1, cropY + cropDims.height - cornerSize + 1, 3, cornerSize);\n\n // Update preview canvas\n updatePreview(cropX, cropY, cropDims);\n }, [cropSettings, imageLoaded, getCropDimensions, updatePreview]);\n\n // Update preview when settings change\n useEffect(() => {\n drawCropPreview();\n }, [drawCropPreview]);\n\n // Mouse/touch handlers for dragging\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n setIsDragging(true);\n setDragStart({ x: e.clientX, y: e.clientY });\n }, []);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n if (!isDragging) return;\n\n const deltaX = e.clientX - dragStart.x;\n const deltaY = e.clientY - dragStart.y;\n\n setCropSettings(prev => ({\n ...prev,\n x: prev.x + deltaX / prev.scale,\n y: prev.y + deltaY / prev.scale,\n }));\n\n setDragStart({ x: e.clientX, y: e.clientY });\n }, [isDragging, dragStart]);\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleClose = useCallback(() => {\n setImageSrc('');\n setImageLoaded(false);\n setCropSettings({ x: 0, y: 0, scale: 1, rotation: 0 });\n setAspectRatio('square');\n onClose();\n }, [onClose]);\n\n // Handle crop and output\n const handleCrop = useCallback(() => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const image = imageRef.current;\n\n if (!ctx || !image) return;\n\n const cropDims = getCropDimensions();\n const finalSize = LOGO_OUTPUT_SIZES[outputSize];\n \n // Set output canvas size maintaining aspect ratio\n const aspectRatioValue = cropDims.width / cropDims.height;\n let outputWidth = finalSize;\n let outputHeight = finalSize;\n \n if (aspectRatio !== 'square') {\n if (aspectRatioValue > 1) {\n // Landscape\n outputHeight = finalSize / aspectRatioValue;\n } else {\n // Portrait\n outputWidth = finalSize * aspectRatioValue;\n }\n }\n\n canvas.width = outputWidth;\n canvas.height = outputHeight;\n\n // Save context\n ctx.save();\n\n // Ensure fully transparent canvas before drawing\n ctx.clearRect(0, 0, outputWidth, outputHeight);\n\n // Apply transformations (scaled for output size)\n const scaleX = outputWidth / cropDims.width;\n const scaleY = outputHeight / cropDims.height;\n \n ctx.translate(outputWidth / 2, outputHeight / 2);\n ctx.rotate((cropSettings.rotation * Math.PI) / 180);\n ctx.scale(cropSettings.scale * scaleX, cropSettings.scale * scaleY);\n ctx.translate(\n -image.naturalWidth / 2 + cropSettings.x * scaleX,\n -image.naturalHeight / 2 + cropSettings.y * scaleY\n );\n\n // Draw image\n ctx.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight);\n\n // Restore context\n ctx.restore();\n\n // Export as PNG to preserve transparency\n const croppedDataUrl = canvas.toDataURL('image/png', 1.0);\n onCrop(croppedDataUrl);\n \n // Reset state and close\n setImageSrc('');\n setImageLoaded(false);\n setCropSettings({ x: 0, y: 0, scale: 1, rotation: 0 });\n setAspectRatio('square');\n onClose();\n }, [cropSettings, onCrop, getCropDimensions, outputSize, aspectRatio, onClose]);\n\n const handleScaleChange = useCallback((value: number) => {\n const cropDims = getCropDimensions();\n const minScale = Math.max(\n cropDims.width / imageNaturalSize.width,\n cropDims.height / imageNaturalSize.height\n );\n setCropSettings(prev => ({\n ...prev,\n scale: Math.max(value, minScale),\n }));\n }, [imageNaturalSize, getCropDimensions]);\n\n const handleRotation = useCallback((direction: 'left' | 'right') => {\n setCropSettings(prev => ({\n ...prev,\n rotation: prev.rotation + (direction === 'left' ? -90 : 90),\n }));\n }, []);\n\n const minScale = Math.max(\n getCropDimensions().width / Math.max(imageNaturalSize.width, 1),\n getCropDimensions().height / Math.max(imageNaturalSize.height, 1)\n );\n\n return (\n <Dialog \n open={open} \n onClose={handleClose} \n maxWidth=\"lg\" \n fullWidth\n PaperProps={{\n sx: { borderRadius: 3 }\n }}\n >\n <DialogTitle sx={{ pb: 1 }}>\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n 🎨 Crop Your Logo\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Position, resize, and format your logo for perfect branding\n </Typography>\n </DialogTitle>\n\n <DialogContent>\n {imageSrc && (\n <>\n {/* Hidden image for loading */}\n <img\n ref={imageRef}\n src={imageSrc}\n alt=\"Crop source\"\n style={{ display: 'none' }}\n onLoad={handleImageLoad}\n />\n\n {imageLoaded ? (\n <Box sx={{ display: 'flex', gap: 3 }}>\n {/* Main Crop Area */}\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 2 }}>\n <Paper\n elevation={3}\n sx={{\n width: CANVAS_SIZE,\n height: CANVAS_SIZE,\n overflow: 'hidden',\n border: '2px solid',\n borderColor: 'divider',\n borderRadius: 2,\n cursor: isDragging ? 'grabbing' : 'grab',\n position: 'relative',\n background: 'repeating-conic-gradient(#f0f0f0 0% 25%, transparent 0% 50%) 50% / 20px 20px',\n }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n >\n <canvas\n ref={canvasRef}\n width={CANVAS_SIZE}\n height={CANVAS_SIZE}\n style={{\n width: '100%',\n height: '100%',\n display: 'block',\n }}\n />\n \n {/* Overlay hint */}\n {!isDragging && (\n <Box\n sx={{\n position: 'absolute',\n top: 8,\n left: 8,\n background: 'rgba(0,0,0,0.8)',\n color: 'white',\n px: 2,\n py: 0.5,\n borderRadius: 2,\n fontSize: '0.75rem',\n fontWeight: 500,\n pointerEvents: 'none',\n opacity: 0.9,\n }}\n >\n Drag to reposition • Blue area will be exported\n </Box>\n )}\n </Paper>\n </Box>\n\n {/* Controls Panel */}\n <Box sx={{ width: 300, display: 'flex', flexDirection: 'column', gap: 3 }}>\n {/* Preview */}\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600 }}>\n 📋 Preview ({LOGO_OUTPUT_SIZES[outputSize]}px)\n </Typography>\n <Paper elevation={2} sx={{ p: 1, borderRadius: 2, background: 'repeating-conic-gradient(#f0f0f0 0% 25%, transparent 0% 50%) 50% / 10px 10px' }}>\n <canvas\n ref={previewCanvasRef}\n width={120}\n height={120}\n style={{\n width: '120px',\n height: '120px',\n display: 'block',\n borderRadius: '4px',\n }}\n />\n </Paper>\n </Box>\n\n {/* Aspect Ratio */}\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600 }}>\n 📐 Aspect Ratio\n </Typography>\n <ToggleButtonGroup\n value={aspectRatio}\n exclusive\n onChange={(_, newRatio) => newRatio && setAspectRatio(newRatio)}\n size=\"small\"\n fullWidth\n >\n <ToggleButton value=\"square\">\n <CropSquareIcon fontSize=\"small\" />\n <Typography variant=\"caption\" sx={{ ml: 0.5 }}>Square</Typography>\n </ToggleButton>\n <ToggleButton value=\"landscape\">\n <Crop169Icon fontSize=\"small\" />\n <Typography variant=\"caption\" sx={{ ml: 0.5 }}>Wide</Typography>\n </ToggleButton>\n <ToggleButton value=\"portrait\">\n <CropPortraitIcon fontSize=\"small\" />\n <Typography variant=\"caption\" sx={{ ml: 0.5 }}>Tall</Typography>\n </ToggleButton>\n </ToggleButtonGroup>\n </Box>\n\n {/* Output Size */}\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600 }}>\n 📏 Output Size\n </Typography>\n <ToggleButtonGroup\n value={outputSize}\n exclusive\n onChange={(_, newSize) => newSize && setOutputSize(newSize)}\n size=\"small\"\n fullWidth\n >\n <ToggleButton value=\"small\">256px</ToggleButton>\n <ToggleButton value=\"medium\">512px</ToggleButton>\n <ToggleButton value=\"large\">1024px</ToggleButton>\n </ToggleButtonGroup>\n </Box>\n\n {/* Zoom Control */}\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600 }}>\n 🔍 Zoom: {Math.round(cropSettings.scale * 100)}%\n </Typography>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <IconButton\n onClick={() => handleScaleChange(cropSettings.scale - 0.1)}\n disabled={cropSettings.scale <= minScale}\n size=\"small\"\n >\n <ZoomOutIcon />\n </IconButton>\n <Slider\n value={cropSettings.scale}\n onChange={(_, value) => handleScaleChange(value as number)}\n min={minScale}\n max={4}\n step={0.1}\n sx={{ flex: 1 }}\n />\n <IconButton\n onClick={() => handleScaleChange(cropSettings.scale + 0.1)}\n disabled={cropSettings.scale >= 4}\n size=\"small\"\n >\n <ZoomInIcon />\n </IconButton>\n </Box>\n </Box>\n\n {/* Rotation Controls */}\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600 }}>\n 🔄 Rotation\n </Typography>\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Button\n variant=\"outlined\"\n startIcon={<RotateLeftIcon />}\n onClick={() => handleRotation('left')}\n size=\"small\"\n fullWidth\n >\n Rotate Left\n </Button>\n <Button\n variant=\"outlined\"\n startIcon={<RotateRightIcon />}\n onClick={() => handleRotation('right')}\n size=\"small\"\n fullWidth\n >\n Rotate Right\n </Button>\n </Box>\n {cropSettings.rotation !== 0 && (\n <Chip \n label={`${cropSettings.rotation}°`} \n size=\"small\" \n color=\"primary\" \n sx={{ mt: 1 }}\n />\n )}\n </Box>\n\n <Alert severity=\"success\" sx={{ borderRadius: 2 }}>\n <Typography variant=\"body2\">\n <strong>✨ Logo Features:</strong>\n </Typography>\n <Typography variant=\"body2\" sx={{ mt: 0.5, fontSize: '0.8rem' }}>\n • <strong>Transparency preserved</strong> for clean logos<br/>\n • <strong>High quality PNG</strong> output<br/>\n • <strong>Multiple sizes</strong> for different uses<br/>\n • <strong>Perfect for branding</strong> across platforms\n </Typography>\n </Alert>\n </Box>\n </Box>\n ) : (\n <Box sx={{ display: 'flex', justifyContent: 'center', py: 4 }}>\n <Typography>Loading image...</Typography>\n </Box>\n )}\n </>\n )}\n </DialogContent>\n\n <DialogActions sx={{ px: 3, pb: 3 }}>\n <Button onClick={handleClose} color=\"secondary\">\n Cancel\n </Button>\n <Button\n onClick={handleCrop}\n variant=\"contained\"\n disabled={!imageLoaded}\n sx={{\n px: 3,\n fontWeight: 600,\n }}\n >\n ✂️ Crop Logo\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default LogoCropper;\n","/*\n (c) 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-6B2D-4F1A09\nconst __banditFingerprint_components_KnowledgeHubTabtsx = \"BL-FP-83E1A4-7C2B\";\nconst __auditTrail_components_KnowledgeHubTabtsx = \"BL-AU-MGOIKVWZ-RU6M\";\n// File: KnowledgeHubTab.tsx | Path: src/management/components/KnowledgeHubTab.tsx | Hash: 6b2d7c2b\n\nimport React, { useEffect, useState } from \"react\";\nimport { Box, Tab, Tabs, useMediaQuery, useTheme } from \"@mui/material\";\nimport KnowledgeTab from \"./KnowledgeTab\";\nimport SeedPacksTab from \"./SeedPacksTab\";\nimport { AutoStoriesIcon, DescriptionIcon } from \"../../icons/lucide-icons\";\n\ntype KnowledgeHubTabProps = React.ComponentProps<typeof KnowledgeTab> & {\n seedPacksEnabled?: boolean;\n};\n\nconst KnowledgeHubTab: React.FC<KnowledgeHubTabProps> = (props) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down(\"sm\"));\n const { seedPacksEnabled = false } = props;\n const [tabIndex, setTabIndex] = useState(0);\n const effectiveTabIndex = seedPacksEnabled ? tabIndex : 0;\n\n useEffect(() => {\n if (!seedPacksEnabled && tabIndex !== 0) {\n setTabIndex(0);\n }\n }, [seedPacksEnabled, tabIndex]);\n\n return (\n <Box>\n <Box sx={{ px: { xs: 1.5, sm: 3, md: 4 }, pt: { xs: 1.5, md: 2 } }}>\n <Tabs\n value={effectiveTabIndex}\n onChange={(_, newValue) => setTabIndex(newValue)}\n variant={isMobile ? \"fullWidth\" : \"standard\"}\n sx={{\n borderBottom: 1,\n borderColor: \"divider\",\n \"& .MuiTab-root\": {\n textTransform: \"none\",\n fontWeight: 600,\n fontSize: { xs: \"0.95rem\", sm: \"1rem\" },\n minWidth: { xs: \"auto\", md: 160 },\n px: { xs: 1.2, sm: 1.5 },\n },\n }}\n >\n <Tab\n icon={<DescriptionIcon fontSize={isMobile ? \"small\" : \"medium\"} />}\n iconPosition={isMobile ? \"top\" : \"start\"}\n label=\"Documents\"\n />\n {seedPacksEnabled && (\n <Tab\n icon={<AutoStoriesIcon fontSize={isMobile ? \"small\" : \"medium\"} />}\n iconPosition={isMobile ? \"top\" : \"start\"}\n label=\"Seed Packs\"\n />\n )}\n </Tabs>\n </Box>\n <Box sx={{ display: effectiveTabIndex === 0 ? \"block\" : \"none\" }}>\n <KnowledgeTab {...props} />\n </Box>\n {seedPacksEnabled && (\n <Box sx={{ display: effectiveTabIndex === 1 ? \"block\" : \"none\" }}>\n <SeedPacksTab />\n </Box>\n )}\n </Box>\n );\n};\n\nexport default KnowledgeHubTab;\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-70C7-7E0961\nconst __banditFingerprint_components_KnowledgeTabtsx = 'BL-FP-17186C-247F';\nconst __auditTrail_components_KnowledgeTabtsx = 'BL-AU-MGOIKVVI-8Q43';\n// File: KnowledgeTab.tsx | Path: src/management/components/KnowledgeTab.tsx | Hash: 70c7247f\n\nimport React, { useState, useMemo, useCallback, useEffect } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n Box,\n Typography,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n TextField,\n InputAdornment,\n Chip,\n LinearProgress,\n Card,\n CardContent,\n IconButton,\n Alert,\n Stack,\n MenuItem,\n Snackbar,\n Switch,\n useMediaQuery,\n useTheme,\n ThemeOptions,\n} from '@mui/material';\nimport { KnowledgeDoc } from '../../chat/hooks/useKnowledgeStore';\nimport KnowledgeFileModal from '../../modals/knowlege/knowledge-file-modal';\nimport DocumentCard from '../../shared/DocumentCard';\nimport { useVectorStore } from '../../hooks/useVectorStore';\nimport { useAuthenticationStore } from '../../store/authenticationStore';\nimport { useFeatures } from '../../hooks/useFeatures';\nimport ProcessingOverlay from '../../components/shared/ProcessingOverlay';\nimport { useProcessingOverlay } from '../../hooks/useProcessingOverlay';\nimport { useConversationSyncStore } from '../../store/conversationSyncStore';\nimport {\n ArticleIcon,\n CheckCircleIcon,\n CheckIcon,\n CodeIcon,\n DataObjectIcon,\n DeleteIcon,\n DescriptionIcon,\n DownloadIcon,\n ErrorIcon,\n FolderIcon,\n GroupIcon,\n LockIcon,\n PersonIcon,\n PictureAsPdfIcon,\n PublicIcon,\n SearchIcon,\n UploadFileIcon,\n ViewListIcon,\n ViewModuleIcon,\n} from \"../../icons/lucide-icons\";\n\n// File type detection and categorization with language detection\nconst getFileTypeInfo = (filename: string) => {\n const ext = filename.split('.').pop()?.toLowerCase() || '';\n \n // Programming languages with specific colors and labels\n type FileTypeMeta = { icon: React.ElementType; color: string; category: string; language?: string };\n const languageMap: Record<string, FileTypeMeta> = {\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: 'React' },\n 'ts': { icon: CodeIcon, color: '#3178c6', category: 'Code', language: 'TypeScript' },\n 'tsx': { icon: CodeIcon, color: '#61dafb', category: 'Code', language: 'React TS' },\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\n// File size formatting\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\n// Content source badge information with proper vector detection\nconst getContentSourceInfo = (doc: KnowledgeDoc, isVectorMode: boolean) => {\n // Check if this is a vector document - simplified logic focusing on s3Url\n const isVectorDocument = isVectorMode && !!doc.s3Url;\n \n if (isVectorDocument) {\n // Vector documents from S3/private cloud - use teamSid to determine team vs personal\n const teamSid = doc.teamSid;\n if (teamSid) {\n return {\n label: 'Team',\n icon: GroupIcon,\n color: '#388e3c', // Green\n bgColor: '#388e3c20'\n };\n } else {\n return {\n label: 'Personal',\n icon: PersonIcon,\n color: '#1976d2', // Blue \n bgColor: '#1976d220'\n };\n }\n }\n \n // For legacy content source classification\n if (doc.contentSource) {\n if (doc.contentSource === 'user') {\n return {\n label: 'Personal',\n icon: PersonIcon,\n color: '#1976d2', // Blue\n bgColor: '#1976d220'\n };\n } else if (doc.contentSource === 'team') {\n return {\n label: 'Team',\n icon: GroupIcon,\n color: '#388e3c', // Green\n bgColor: '#388e3c20'\n };\n }\n }\n \n // For local IndexedDB documents\n return {\n label: 'Local',\n icon: LockIcon,\n color: '#757575', // Gray\n bgColor: '#75757520'\n };\n};\n\n// Document upload status\ninterface UploadStatus {\n filename: string;\n progress: number;\n status: 'uploading' | 'success' | 'error';\n error?: string;\n}\n\n// View modes\ntype ViewMode = 'grid' | 'list';\ntype SortBy = 'name' | 'date' | 'size' | 'type';\n\ninterface KnowledgeTabProps {\n documents: KnowledgeDoc[];\n addDocuments: (files: File[]) => Promise<void>;\n removeDocument: (id: string) => void;\n loadDocuments: () => Promise<void>;\n clearAllDocuments: () => Promise<void>;\n currentTheme: ThemeOptions;\n isLimitedAdmin?: boolean; // For premium users with limited admin access\n}\n\nconst KnowledgeTab: React.FC<KnowledgeTabProps> = ({\n documents,\n addDocuments,\n removeDocument,\n loadDocuments,\n clearAllDocuments,\n currentTheme,\n isLimitedAdmin = false,\n}) => {\n const muiTheme = useTheme();\n const isMobile = useMediaQuery(muiTheme.breakpoints.down('sm'));\n // Vector store integration for seamless advanced search\n const authStore = useAuthenticationStore();\n const features = useFeatures();\n const isAdvancedVectorFeaturesEnabled = useConversationSyncStore(\n (state) => state.isAdvancedVectorFeaturesEnabled\n );\n \n const {\n isVectorEnabled,\n uploadDocument: uploadToVector,\n searchDocuments: searchVectorDocuments,\n getUserDocuments,\n downloadVectorFile,\n getFilePreview,\n refreshCompatibilityCheck,\n initializeVectorService\n } = useVectorStore();\n\n // Processing overlay for vector operations\n const { showProcessing, hideProcessing, updateProgress, processingState } = useProcessingOverlay();\n\n // Allow access for admins, pro tier users, and team tier users\n const shouldUseVector =\n (features.isAdmin() || features.hasAdvancedSearch() || features.hasAdvancedMemories()) &&\n isAdvancedVectorFeaturesEnabled &&\n isVectorEnabled;\n\n const [clearDocsDialogOpen, setClearDocsDialogOpen] = useState(false);\n const [selectedDoc, setSelectedDoc] = useState<KnowledgeDoc | null>(null);\n const [vectorDocuments, setVectorDocuments] = useState<KnowledgeDoc[]>([]);\n const [loadingVectorDocs, setLoadingVectorDocs] = useState(false);\n \n // Enhanced state management for better UX\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<string>('all');\n const [contentSourceFilter, setContentSourceFilter] = useState<'all' | 'personal' | 'team'>('all');\n const [viewMode, setViewMode] = useState<ViewMode>('grid');\n const [sortBy, setSortBy] = useState<SortBy>('date');\n const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('desc');\n const [selectedDocuments, setSelectedDocuments] = useState<string[]>([]);\n const [showFilters, setShowFilters] = useState(false);\n const [uploadStatuses, setUploadStatuses] = useState<UploadStatus[]>([]);\n const [filterMenuAnchor, setFilterMenuAnchor] = useState<null | HTMLElement>(null);\n const [snackbarMessage, setSnackbarMessage] = useState<string>('');\n const [showSnackbar, setShowSnackbar] = useState(false);\n const [snackbarSeverity, setSnackbarSeverity] = useState<'success' | 'error' | 'warning'>('success');\n const [deletingDocuments, setDeletingDocuments] = useState<Set<string>>(new Set());\n // Check if user has a team (teamSid or teamId in JWT)\n const hasTeam = !!(authStore.user?.teamSid || authStore.user?.teamId);\n \n const [shareWithTeam, setShareWithTeam] = useState<boolean>(false); // Default to personal (off) for safety\n const [dragActive, setDragActive] = useState(false);\n\n // Convert vector database files to KnowledgeDoc format\n type RawVectorDocument = {\n id?: string;\n fileId?: string;\n _id?: string;\n name?: string;\n filename?: string;\n content?: string;\n preview?: string;\n mimeType?: string;\n type?: string;\n uploadedAt?: string;\n createdAt?: string;\n embedding?: number[];\n size?: number;\n uploadedBy?: string;\n userId?: string;\n userEmail?: string;\n bucket?: string;\n key?: string;\n teamSid?: string;\n };\n\n const mapVectorDocsToKnowledgeDocs = useCallback((vectorDocs: RawVectorDocument[]): KnowledgeDoc[] => {\n return vectorDocs.map((doc) => {\n const primaryId = doc.id ?? doc.fileId ?? doc._id;\n const docId = typeof primaryId === 'string'\n ? primaryId\n : primaryId\n ? JSON.stringify(primaryId)\n : uuidv4();\n\n const filename = doc.filename || doc.name || 'Unknown Document';\n const uploadedAt = doc.uploadedAt || doc.createdAt || new Date().toISOString();\n const mimeType = doc.mimeType || doc.type || 'application/octet-stream';\n const isTeamDocument = Boolean(doc.teamSid);\n\n return {\n id: docId,\n name: filename,\n content: doc.preview ?? doc.content ?? '',\n s3Url: docId,\n type: mimeType,\n addedDate: new Date(uploadedAt),\n embedding: doc.embedding,\n size: doc.size ?? 0,\n uploadedBy: doc.uploadedBy || doc.userId || '',\n userEmail: doc.userEmail || '',\n bucket: doc.bucket || '',\n key: doc.key || docId,\n isUserContent: !isTeamDocument,\n isTeamContent: isTeamDocument,\n contentSource: isTeamDocument ? 'team' : 'user',\n ...(isTeamDocument ? { teamSid: doc.teamSid } : {}),\n };\n });\n }, []);\n\n // Load vector documents when vector storage is enabled\n const loadVectorDocuments = useCallback(async () => {\n if (!shouldUseVector) {\n return;\n }\n \n setLoadingVectorDocs(true);\n try {\n const docs = await getUserDocuments(0, 100); // Load first 100 documents\n const mappedDocs = mapVectorDocsToKnowledgeDocs(docs);\n setVectorDocuments(mappedDocs);\n } catch (error) {\n console.error('Failed to load vector documents:', error);\n } finally {\n setLoadingVectorDocs(false);\n }\n }, [shouldUseVector, getUserDocuments, mapVectorDocsToKnowledgeDocs]);\n\n // Load documents on mount and when vector storage availability changes\n useEffect(() => {\n if (shouldUseVector) {\n loadVectorDocuments();\n }\n }, [shouldUseVector, loadVectorDocuments]);\n\n // Enhanced filtering and sorting\n const filteredAndSortedDocuments = useMemo(() => {\n // Use vector documents when vector storage is enabled, otherwise use local documents\n const sourceDocuments = shouldUseVector ? vectorDocuments : documents;\n let filtered = sourceDocuments;\n \n // Search filter - use vector search when available\n if (searchQuery) {\n if (shouldUseVector) {\n // For vector search, we'll need to implement async search\n // For now, fall back to regular search to maintain UI responsiveness\n filtered = filtered.filter(doc => \n doc.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n doc.content.toLowerCase().includes(searchQuery.toLowerCase())\n );\n } else {\n filtered = filtered.filter(doc => \n doc.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n doc.content.toLowerCase().includes(searchQuery.toLowerCase())\n );\n }\n }\n\n // Category filter\n if (selectedCategory !== 'all') {\n filtered = filtered.filter(doc => \n getFileTypeInfo(doc.name).category === selectedCategory\n );\n }\n\n // Content source filter\n if (contentSourceFilter !== 'all') {\n filtered = filtered.filter(doc => {\n const sourceInfo = getContentSourceInfo(doc, shouldUseVector);\n \n if (contentSourceFilter === 'personal') {\n return sourceInfo.label === 'Personal' || sourceInfo.label === 'Local';\n } else if (contentSourceFilter === 'team') {\n return sourceInfo.label === 'Team';\n }\n return true;\n });\n }\n\n // Sort\n filtered.sort((a, b) => {\n let comparison = 0;\n switch (sortBy) {\n case 'name':\n comparison = a.name.localeCompare(b.name);\n break;\n case 'date':\n // Use document order as fallback since we don't have upload date\n comparison = documents.indexOf(a) - documents.indexOf(b);\n break;\n case 'size':\n comparison = (a.content.length || 0) - (b.content.length || 0);\n break;\n case 'type':\n comparison = getFileTypeInfo(a.name).category.localeCompare(getFileTypeInfo(b.name).category);\n break;\n }\n return sortOrder === 'asc' ? comparison : -comparison;\n });\n\n return filtered;\n }, [documents, vectorDocuments, shouldUseVector, searchQuery, selectedCategory, contentSourceFilter, sortBy, sortOrder]);\n\n // Get unique categories - use active document source\n const categories = useMemo(() => {\n const sourceDocuments = shouldUseVector ? vectorDocuments : documents;\n const cats = new Set(sourceDocuments.map(doc => getFileTypeInfo(doc.name).category));\n return Array.from(cats).sort();\n }, [documents, vectorDocuments, shouldUseVector]);\n\n // Calculate statistics - use active document source\n const statistics = useMemo(() => {\n const sourceDocuments = shouldUseVector ? vectorDocuments : documents;\n \n // Calculate total size - for vector docs use actual size, for local docs estimate from content\n const totalSize = sourceDocuments.reduce((sum, doc) => {\n if (shouldUseVector && doc.size) {\n return sum + doc.size; // Use actual file size from vector storage\n } else {\n return sum + (doc.content?.length || 0) * 2; // Estimate from content length\n }\n }, 0);\n \n const categoryCounts = sourceDocuments.reduce((acc, doc) => {\n const category = getFileTypeInfo(doc.name).category;\n acc[category] = (acc[category] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n\n return {\n totalDocuments: sourceDocuments.length,\n totalSize: formatFileSize(totalSize),\n categoryCounts,\n };\n }, [documents, vectorDocuments, shouldUseVector]);\n\n const getFileIcon = (filename: string): 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 // Enhanced file upload with progress tracking\n // Wrapper function to handle vector store integration\n const handleDocumentUpload = async (files: File[]): Promise<{ success: boolean; error?: string; usedVector: boolean }> => {\n if (shouldUseVector) {\n // Show processing overlay for vector uploads\n showProcessing(\n 'Uploading to Secure Workspace',\n [\n \"🥷 Keeping your documents private while we prepare them...\",\n \"🤖 Reading the content so answers stay accurate...\", \n \"⚡ Turning pages into a searchable index...\",\n \"🧠 Remembering highlights for quick recall...\",\n \"🔮 Organizing everything so search feels instant...\",\n \"🚀 Optimizing for fast, consistent responses...\",\n \"💫 Transforming documents into trusted knowledge...\",\n \"🎯 Focusing on the details that matter most...\"\n ]\n );\n \n try {\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n \n // Update progress for each file\n updateProgress('upload', (i / files.length) * 25); // 25% for upload phase\n \n // Step 1: Upload to S3 - use shareWithTeam only if user has a team\n const shouldShareWithTeam = hasTeam ? shareWithTeam : false;\n const result = await uploadToVector(file, shouldShareWithTeam);\n \n // Step 2: AI Analysis and Embedding\n updateProgress('analyze', 25 + (i / files.length) * 50); // 25-75% for analysis\n \n if (!result.success) {\n throw new Error(result.error || 'Vector upload failed');\n }\n }\n \n // Step 3: Optimizing search\n updateProgress('optimize', 90);\n \n // Final step: Complete\n updateProgress('optimize', 100);\n \n // Reload vector documents to show the newly uploaded files\n await loadVectorDocuments();\n \n return { success: true, usedVector: true };\n } catch (error) {\n console.error('Error uploading to vector database:', error);\n hideProcessing();\n // Fallback to regular local upload only if vector fails\n try {\n await addDocuments(files);\n return { \n success: true, \n usedVector: false, \n error: `Vector upload failed: ${error instanceof Error ? error.message : String(error)}. Saved locally instead.` \n };\n } catch (localError) {\n return { \n success: false, \n usedVector: false, \n error: `Both vector and local upload failed: ${localError instanceof Error ? localError.message : String(localError)}` \n };\n }\n } finally {\n // Hide overlay after a brief delay to show completion\n setTimeout(() => {\n hideProcessing();\n }, 1500);\n }\n } else {\n // Use local IndexedDB storage for non-vector users\n try {\n await addDocuments(files);\n return { success: true, usedVector: false };\n } catch (error) {\n return { \n success: false, \n usedVector: false, \n error: error instanceof Error ? error.message : String(error) \n };\n }\n }\n };\n\n const handleFileUpload = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n if (files.length === 0) return;\n\n // Initialize upload statuses\n const initialStatuses: UploadStatus[] = files.map(file => ({\n filename: file.name,\n progress: 0,\n status: 'uploading'\n }));\n setUploadStatuses(initialStatuses);\n\n try {\n // Update progress to show processing\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n progress: 50\n })));\n\n // Add documents and wait for completion\n const result = await handleDocumentUpload(files);\n \n if (result.success) {\n // Complete progress\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n progress: 100,\n status: 'success' as const\n })));\n\n // Show appropriate success message based on upload method\n const message = result.usedVector \n ? `Successfully uploaded ${files.length} document(s) to your secure workspace`\n : result.error \n ? `Upload completed with warnings: ${result.error}`\n : `Successfully uploaded ${files.length} document(s)`;\n \n setSnackbarMessage(message);\n setSnackbarSeverity(result.error ? 'warning' : 'success');\n setShowSnackbar(true);\n\n // Clear upload statuses after delay\n setTimeout(() => setUploadStatuses([]), 2000);\n\n // Force reload documents to ensure they appear\n setTimeout(async () => {\n try {\n await loadDocuments();\n } catch (loadError) {\n console.error(\"Failed to reload documents after upload\", loadError);\n }\n }, 100);\n } else {\n // Upload failed completely\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n status: 'error' as const,\n error: 'Upload failed'\n })));\n \n setSnackbarMessage(`Failed to upload documents: ${result.error || 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n\n } catch (err) {\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n status: 'error' as const,\n error: 'Upload failed'\n })));\n \n setSnackbarMessage(`Failed to upload documents: ${err instanceof Error ? err.message : 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n \n console.error(\"Failed to add documents\", err);\n } finally {\n // Reset file input\n if (e.target) {\n e.target.value = '';\n }\n }\n };\n\n const handleFileDrop = async (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setDragActive(false);\n const files = Array.from(e.dataTransfer.files);\n \n if (files.length === 0) return;\n\n // Initialize upload statuses\n const initialStatuses: UploadStatus[] = files.map(file => ({\n filename: file.name,\n progress: 0,\n status: 'uploading'\n }));\n setUploadStatuses(initialStatuses);\n\n try {\n // Update progress to show processing\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n progress: 50\n })));\n\n // Add documents and wait for completion\n const result = await handleDocumentUpload(files);\n \n if (result.success) {\n // Complete progress\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n progress: 100,\n status: 'success' as const\n })));\n\n // Show appropriate success message based on upload method\n const message = result.usedVector \n ? `Successfully uploaded ${files.length} document(s) to your secure workspace`\n : result.error \n ? `Upload completed with warnings: ${result.error}`\n : `Successfully uploaded ${files.length} document(s)`;\n \n setSnackbarMessage(message);\n setSnackbarSeverity(result.error ? 'warning' : 'success');\n setShowSnackbar(true);\n\n // Clear upload statuses after delay\n setTimeout(() => setUploadStatuses([]), 2000);\n\n // Force reload documents to ensure they appear\n setTimeout(async () => {\n try {\n await loadDocuments();\n } catch (loadError) {\n console.error(\"Failed to reload documents after drop\", loadError);\n }\n }, 100);\n } else {\n // Upload failed completely\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n status: 'error' as const,\n error: 'Upload failed'\n })));\n \n setSnackbarMessage(`Failed to upload documents: ${result.error || 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n\n } catch (err) {\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n status: 'error' as const,\n error: 'Upload failed'\n })));\n \n setSnackbarMessage(`Failed to upload documents: ${err instanceof Error ? err.message : 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n \n console.error(\"Drag/drop failed\", err);\n }\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setDragActive(true);\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setDragActive(false);\n };\n\n const handleDownloadDocument = async (e: React.MouseEvent, doc: KnowledgeDoc) => {\n e.stopPropagation();\n \n try {\n if (shouldUseVector && doc.id) {\n // Vector database file - download using MongoDB ObjectId\n await downloadVectorFile(doc.id, doc.name);\n \n setSnackbarMessage(`Downloaded ${doc.name}`);\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n } else {\n // Local file - download from memory\n const blob = new Blob([doc.content], { type: \"text/plain;charset=utf-8\" });\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 } catch (error) {\n console.error('Download failed:', error);\n setSnackbarMessage(`Failed to download ${doc.name}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n };\n\n const handleDocumentClick = async (doc: KnowledgeDoc) => {\n if (shouldUseVector && doc.id && !doc.content) {\n // Vector file without content - try to get preview using MongoDB ObjectId\n \n try {\n const preview = await getFilePreview(doc.id);\n if (preview) {\n // Create a temporary doc with preview content\n const previewDoc: KnowledgeDoc = {\n ...doc,\n content: preview.content,\n type: preview.mimeType\n };\n setSelectedDoc(previewDoc);\n } else {\n // No preview available - show info dialog instead\n setSnackbarMessage(`Preview not available for ${doc.name}. Use download to get the full file.`);\n setSnackbarSeverity('warning');\n setShowSnackbar(true);\n }\n } catch (error) {\n console.error('Failed to get preview:', error);\n setSnackbarMessage(`Failed to preview ${doc.name}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n } else {\n // Local file or vector file with content\n setSelectedDoc(doc);\n }\n };\n\n const handleRemoveDocument = async (e: React.MouseEvent | null, docId: string) => {\n e?.stopPropagation();\n\n // Add to deleting set to trigger animation\n setDeletingDocuments((prev) => new Set(prev).add(docId));\n\n // Wait for animation to complete\n setTimeout(async () => {\n await removeDocument(docId);\n\n // Remove from deleting set\n setDeletingDocuments((prev) => {\n const newSet = new Set(prev);\n newSet.delete(docId);\n return newSet;\n });\n\n // Refetch vector documents to update the list\n if (shouldUseVector) {\n await loadVectorDocuments();\n }\n\n setSnackbarMessage('Document removed');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n }, 300); // 300ms for animation\n };\n\n const handleClearAllDocuments = async () => {\n await clearAllDocuments();\n \n // Refetch vector documents to update the list\n if (shouldUseVector) {\n await loadVectorDocuments();\n }\n \n setClearDocsDialogOpen(false);\n setSnackbarMessage('All documents cleared');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n };\n\n const handleBulkDelete = async () => {\n // Add all selected documents to deleting set to trigger animation\n setDeletingDocuments(prev => new Set([...prev, ...selectedDocuments]));\n \n // Wait for animation to complete\n setTimeout(async () => {\n const deletePromises = selectedDocuments.map(id => removeDocument(id));\n await Promise.all(deletePromises);\n \n // Remove all from deleting set\n setDeletingDocuments(prev => {\n const newSet = new Set(prev);\n selectedDocuments.forEach(id => newSet.delete(id));\n return newSet;\n });\n \n // Refetch vector documents to update the list\n if (shouldUseVector) {\n await loadVectorDocuments();\n }\n \n setSelectedDocuments([]);\n setSnackbarMessage(`Removed ${selectedDocuments.length} documents`);\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n }, 300); // 300ms for animation\n };\n\n const toggleDocumentSelection = (docId: string) => {\n setSelectedDocuments(prev => \n prev.includes(docId) \n ? prev.filter(id => id !== docId)\n : [...prev, docId]\n );\n };\n\n const selectAllDocuments = () => {\n setSelectedDocuments(filteredAndSortedDocuments.map(doc => doc.id));\n };\n\n const clearSelection = () => {\n setSelectedDocuments([]);\n };\n\n return (\n <Box sx={{ p: { xs: 1.5, sm: 3, md: 4 } }}>\n <Box sx={{ pt: { xs: 1, md: 2 }, pb: { xs: 3, md: 4 } }}>\n {/* Enhanced Header with Statistics */}\n <Box sx={{ mb: { xs: 2.5, md: 4 } }}>\n <Box\n sx={{\n display: 'flex',\n flexDirection: { xs: 'column', md: 'row' },\n gap: { xs: 1.5, md: 2 },\n justifyContent: 'space-between',\n alignItems: { xs: 'flex-start', md: 'center' },\n mb: { xs: 1.5, md: 2 },\n }}\n >\n <Box sx={{ textAlign: { xs: 'left', md: 'initial' } }}>\n <Typography\n variant=\"h5\"\n color=\"text.primary\"\n sx={{ mb: 1, fontWeight: 600, fontSize: { xs: '1.55rem', md: '1.8rem' } }}\n >\n Document Knowledge Base\n {shouldUseVector && (\n <Chip \n label=\"Synced\" \n color=\"primary\" \n size=\"small\" \n sx={{ ml: 1 }} \n />\n )}\n </Typography>\n <Typography\n variant=\"body1\"\n color=\"text.secondary\"\n sx={{ fontSize: { xs: '0.95rem', sm: '1rem' }, lineHeight: 1.5 }}\n >\n Add documents to your private knowledge base. Files are securely stored {shouldUseVector ? 'in your private workspace' : 'locally in your browser'}.\n </Typography>\n </Box>\n <Box sx={{ display: 'flex', gap: { xs: 1, sm: 1.5 }, alignItems: 'center', flexWrap: 'wrap', width: { xs: '100%', md: 'auto' } }}>\n {shouldUseVector && (\n <Button\n variant=\"outlined\"\n size={isMobile ? 'small' : 'medium'}\n onClick={loadVectorDocuments}\n disabled={loadingVectorDocs}\n sx={{ mr: { xs: 0, md: 1 }, width: { xs: '100%', md: 'auto' } }}\n >\n {loadingVectorDocs ? 'Loading...' : 'Refresh'}\n </Button>\n )}\n {documents.length > 0 && (\n <Button\n variant=\"outlined\"\n color=\"error\"\n size={isMobile ? 'small' : 'medium'}\n startIcon={<DeleteIcon />}\n onClick={() => setClearDocsDialogOpen(true)}\n sx={{ ml: { xs: 0, md: 2 }, width: { xs: '100%', md: 'auto' } }}\n >\n Clear All\n </Button>\n )}\n </Box>\n </Box>\n \n {/* Statistics Cards */}\n {documents.length > 0 && (\n <Box sx={{ display: 'flex', gap: { xs: 1.5, md: 2 }, flexWrap: 'wrap', mb: { xs: 2, md: 3 } }}>\n <Card sx={{ minWidth: 120 }}>\n <CardContent sx={{ py: 1.5, px: 2, '&:last-child': { pb: 1.5 } }}>\n <Typography variant=\"h6\" color=\"primary\">\n {statistics.totalDocuments}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n Documents\n </Typography>\n </CardContent>\n </Card>\n <Card sx={{ minWidth: 120 }}>\n <CardContent sx={{ py: 1.5, px: 2, '&:last-child': { pb: 1.5 } }}>\n <Typography variant=\"h6\" color=\"primary\">\n {statistics.totalSize}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n Total Size\n </Typography>\n </CardContent>\n </Card>\n {Object.entries(statistics.categoryCounts).map(([category, count]) => (\n <Card key={category} sx={{ minWidth: 100 }}>\n <CardContent sx={{ py: 1.5, px: 2, '&:last-child': { pb: 1.5 } }}>\n <Typography variant=\"h6\" color=\"primary\">\n {count as number}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {category}\n </Typography>\n </CardContent>\n </Card>\n ))}\n </Box>\n )}\n\n </Box>\n\n {/* Enhanced Upload Area */}\n <Card \n sx={{ \n mb: 3,\n border: dragActive ? `2px dashed ${currentTheme.palette?.primary?.main}` : `1px dashed ${currentTheme.palette?.divider}`,\n bgcolor: dragActive ? `${currentTheme.palette?.primary?.main}08` : 'transparent',\n transition: 'all 0.2s ease-in-out',\n cursor: 'pointer',\n '&:hover': {\n bgcolor: `${currentTheme.palette?.primary?.main}04`,\n borderColor: currentTheme.palette?.primary?.main,\n }\n }}\n onDrop={handleFileDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onClick={() => document.getElementById('file-upload')?.click()}\n >\n <CardContent sx={{ textAlign: 'center', py: { xs: 3, md: 4 }, px: { xs: 2, md: 3 } }}>\n <UploadFileIcon \n sx={{ \n fontSize: 48, \n color: dragActive ? 'primary.main' : 'text.secondary',\n mb: 2 \n }} \n />\n <Typography variant=\"h6\" color={dragActive ? 'primary' : 'text.primary'} gutterBottom>\n {dragActive ? 'Drop files here' : 'Upload Documents'}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\n Drag and drop files here or click to browse\n </Typography>\n \n {/* Team Sharing Control for Vector Documents - only show if user has a team */}\n {shouldUseVector && hasTeam && (\n <Box \n sx={{ \n mb: 2, \n p: 2, \n bgcolor: 'background.paper', \n borderRadius: 1,\n border: '1px solid',\n borderColor: 'divider'\n }}\n onClick={(e) => e.stopPropagation()} // Prevent triggering file upload\n >\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 1 }}>\n <Switch\n checked={shareWithTeam}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setShareWithTeam(e.target.checked)}\n color=\"primary\"\n size=\"small\"\n />\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n {shareWithTeam ? (\n <>\n <GroupIcon sx={{ fontSize: '1rem', color: 'success.main' }} />\n <Typography variant=\"body2\" color=\"success.main\" fontWeight={500}>\n Share with team\n </Typography>\n </>\n ) : (\n <>\n <PersonIcon sx={{ fontSize: '1rem', color: 'text.secondary' }} />\n <Typography variant=\"body2\" color=\"text.secondary\" fontWeight={500}>\n Personal only\n </Typography>\n </>\n )}\n </Box>\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', textAlign: 'center', mt: 0.5 }}>\n {shareWithTeam \n ? 'Team members can search and access these documents' \n : 'Documents will be private to your account only'\n }\n </Typography>\n </Box>\n )}\n \n {/* Message for users without teams */}\n {shouldUseVector && !hasTeam && (\n <Box \n sx={{ \n mb: 2, \n p: 1.5, \n bgcolor: 'info.main' + '10', \n borderRadius: 1,\n border: '1px solid',\n borderColor: 'info.main' + '30'\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 1 }}>\n <PersonIcon sx={{ fontSize: '1rem', color: 'info.main' }} />\n <Typography variant=\"body2\" color=\"info.main\" fontWeight={500}>\n Personal Documents Only\n </Typography>\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', textAlign: 'center', mt: 0.5 }}>\n Documents will be stored privately in your personal account\n </Typography>\n </Box>\n )}\n \n <Typography variant=\"caption\" color=\"text.secondary\">\n Supported: PDF, DOC, TXT, MD, Code files, and more\n </Typography>\n <input\n id=\"file-upload\"\n type=\"file\"\n multiple\n onChange={handleFileUpload}\n style={{ display: 'none' }}\n accept=\".pdf,.doc,.docx,.txt,.md,.js,.ts,.tsx,.jsx,.py,.java,.cpp,.c,.cs,.html,.css,.json,.xml,.yaml,.yml,.csv,.php,.rb,.go,.rs,.kt,.swift,.scala,.sh,.bat,.ps1\"\n />\n </CardContent>\n </Card>\n\n {/* Upload Progress */}\n {uploadStatuses.length > 0 && (\n <Box sx={{ mb: 3 }}>\n {uploadStatuses.map((status, index) => (\n <Card key={index} sx={{ mb: 1 }}>\n <CardContent sx={{ py: 1.5, px: 2, '&:last-child': { pb: 1.5 } }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n {status.status === 'success' ? (\n <CheckCircleIcon color=\"success\" />\n ) : status.status === 'error' ? (\n <ErrorIcon color=\"error\" />\n ) : (\n <Box sx={{ width: 20, height: 20 }}>\n <LinearProgress \n variant=\"determinate\" \n value={status.progress}\n sx={{ height: 4, borderRadius: 2 }}\n />\n </Box>\n )}\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"body2\" color=\"text.primary\">\n {status.filename}\n </Typography>\n {status.error && (\n <Typography variant=\"caption\" color=\"error\">\n {status.error}\n </Typography>\n )}\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {status.progress}%\n </Typography>\n </Box>\n </CardContent>\n </Card>\n ))}\n </Box>\n )}\n\n {/* Enhanced Search and Filter Bar */}\n {documents.length > 0 && (\n <Card sx={{ mb: 3 }}>\n <CardContent sx={{ py: 2 }}>\n <Box sx={{ display: 'flex', gap: 2, alignItems: 'center', flexWrap: 'wrap' }}>\n {/* Search Field */}\n <TextField\n placeholder=\"Search documents...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n }}\n sx={{ minWidth: 250 }}\n size=\"small\"\n />\n\n {/* Active Filters Status */}\n {(searchQuery || contentSourceFilter !== 'all' || selectedCategory !== 'all') && (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Chip \n label={`${[searchQuery && 'search', contentSourceFilter !== 'all' && 'source', selectedCategory !== 'all' && 'category'].filter(Boolean).length} active filter${[searchQuery && 'search', contentSourceFilter !== 'all' && 'source', selectedCategory !== 'all' && 'category'].filter(Boolean).length !== 1 ? 's' : ''}`}\n size=\"small\"\n color=\"primary\"\n variant=\"outlined\"\n sx={{ fontWeight: 500 }}\n />\n {contentSourceFilter !== 'all' && (\n <Chip \n label={contentSourceFilter === 'personal' ? 'Personal Only' : 'Team Only'}\n size=\"small\"\n color={contentSourceFilter === 'personal' ? 'info' : 'success'}\n variant=\"filled\"\n icon={contentSourceFilter === 'personal' ? <PersonIcon /> : <GroupIcon />}\n />\n )}\n </Box>\n )}\n\n {/* Category Filter */}\n <TextField\n select\n label=\"Category\"\n value={selectedCategory}\n onChange={(e) => setSelectedCategory(e.target.value)}\n size=\"small\"\n sx={{ minWidth: 120 }}\n >\n <MenuItem value=\"all\">All Types</MenuItem>\n {categories.map(category => (\n <MenuItem key={category} value={category}>\n {category}\n </MenuItem>\n ))}\n </TextField>\n\n {/* Content Source Filter - Always visible for better UX */}\n <TextField\n select\n label=\"Source\"\n value={contentSourceFilter}\n onChange={(e) => setContentSourceFilter(e.target.value as 'all' | 'personal' | 'team')}\n size=\"small\"\n sx={{ \n minWidth: 140,\n '& .MuiOutlinedInput-root': {\n bgcolor: contentSourceFilter !== 'all' ? 'primary.main' + '10' : 'transparent',\n }\n }}\n >\n <MenuItem value=\"all\">\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <PublicIcon sx={{ fontSize: 16 }} />\n All Sources\n </Box>\n </MenuItem>\n <MenuItem value=\"personal\">\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <PersonIcon sx={{ fontSize: 16, color: '#1976d2' }} />\n <Typography>Personal Only</Typography>\n </Box>\n </MenuItem>\n <MenuItem value=\"team\">\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <GroupIcon sx={{ fontSize: 16, color: '#388e3c' }} />\n <Typography>Team Only</Typography>\n </Box>\n </MenuItem>\n </TextField>\n\n {/* Sort Controls */}\n <TextField\n select\n label=\"Sort by\"\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value as SortBy)}\n size=\"small\"\n sx={{ minWidth: 100 }}\n >\n <MenuItem value=\"name\">Name</MenuItem>\n <MenuItem value=\"date\">Date</MenuItem>\n <MenuItem value=\"size\">Size</MenuItem>\n <MenuItem value=\"type\">Type</MenuItem>\n </TextField>\n\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={() => setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc')}\n >\n {sortOrder === 'asc' ? '↑' : '↓'}\n </Button>\n\n {/* View Mode Toggle */}\n <Box sx={{ display: 'flex', ml: 'auto' }}>\n <IconButton\n onClick={() => setViewMode('grid')}\n color={viewMode === 'grid' ? 'primary' : 'default'}\n size=\"small\"\n >\n <ViewModuleIcon />\n </IconButton>\n <IconButton\n onClick={() => setViewMode('list')}\n color={viewMode === 'list' ? 'primary' : 'default'}\n size=\"small\"\n >\n <ViewListIcon />\n </IconButton>\n </Box>\n </Box>\n\n {/* Selection Controls */}\n {selectedDocuments.length > 0 && (\n <Box sx={{ mt: 2, pt: 2, borderTop: 1, borderColor: 'divider' }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {selectedDocuments.length} selected\n </Typography>\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"error\"\n startIcon={<DeleteIcon />}\n onClick={handleBulkDelete}\n >\n Delete Selected\n </Button>\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={clearSelection}\n >\n Clear Selection\n </Button>\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={selectAllDocuments}\n >\n Select All\n </Button>\n </Box>\n </Box>\n )}\n </CardContent>\n </Card>\n )}\n \n {/* Enhanced Document Grid/List */}\n {filteredAndSortedDocuments.length === 0 ? (\n <Card sx={{ textAlign: 'center', py: 8 }}>\n <CardContent>\n <FolderIcon sx={{ fontSize: 64, color: 'text.secondary', mb: 2 }} />\n <Typography variant=\"h6\" color=\"text.secondary\" gutterBottom>\n No Documents Yet\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {shouldUseVector ? \n 'Upload and embed your first document to get started with advanced search' :\n 'Upload your first document to get started'\n }\n </Typography>\n </CardContent>\n </Card>\n ) : (\n <Box>\n {/* Results Summary */}\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Showing {filteredAndSortedDocuments.length} of {shouldUseVector ? vectorDocuments.length : documents.length} documents\n {searchQuery && ` for \"${searchQuery}\"`}\n {shouldUseVector && ` (Synced workspace)`}\n </Typography>\n\n {/* Document Grid/List View */}\n {viewMode === 'grid' ? (\n <Box\n sx={{\n display: \"grid\",\n gridTemplateColumns: {\n xs: \"repeat(2, 1fr)\",\n sm: \"repeat(3, 1fr)\",\n md: \"repeat(4, 1fr)\",\n lg: \"repeat(6, 1fr)\",\n },\n gap: 2,\n }}\n >\n {filteredAndSortedDocuments.map((doc: KnowledgeDoc) => {\n const isSelected = selectedDocuments.includes(doc.id);\n const isDeleting = deletingDocuments.has(doc.id);\n \n return (\n <DocumentCard\n key={doc.id}\n doc={doc}\n onView={() => handleDocumentClick(doc)}\n onDelete={(id) => handleRemoveDocument(null, id)}\n onSelect={(id) => toggleDocumentSelection(id)}\n isSelected={isSelected}\n isDeleting={isDeleting}\n variant=\"full\"\n showSelection={true}\n showDelete={true}\n showPreview={true}\n />\n );\n })}\n </Box>\n ) : (\n /* List View */\n <Stack spacing={1}>\n {filteredAndSortedDocuments.map((doc: KnowledgeDoc) => {\n const fileInfo = getFileTypeInfo(doc.name);\n const IconComponent = fileInfo.icon;\n const isSelected = selectedDocuments.includes(doc.id);\n const isDeleting = deletingDocuments.has(doc.id);\n \n return (\n <Card\n key={doc.id}\n sx={{\n cursor: \"pointer\",\n transition: \"all 0.3s ease-in-out\",\n border: isSelected ? `2px solid ${currentTheme.palette?.primary?.main}` : `1px solid ${currentTheme.palette?.divider}`,\n \"&:hover\": {\n boxShadow: 4,\n },\n bgcolor: isSelected ? `${currentTheme.palette?.primary?.main}08` : 'background.paper',\n opacity: isDeleting ? 0.3 : 1,\n transform: isDeleting ? 'scale(0.95)' : 'scale(1)',\n }}\n onClick={(e) => {\n if (e.ctrlKey || e.metaKey) {\n toggleDocumentSelection(doc.id);\n } else {\n handleDocumentClick(doc);\n }\n }}\n >\n <CardContent sx={{ py: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <IconComponent sx={{ fontSize: 32, color: fileInfo.color }} />\n \n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography\n variant=\"subtitle1\"\n sx={{\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n color: 'text.primary',\n }}\n >\n {doc.name}\n </Typography>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n mt: 0.5,\n }}\n >\n {doc.content.substring(0, 200)}...\n </Typography>\n <Box sx={{ display: 'flex', gap: 1, mt: 1 }}>\n <Chip \n label={fileInfo.category} \n size=\"small\" \n sx={{ \n bgcolor: fileInfo.color + '20',\n color: fileInfo.color,\n fontWeight: 600,\n }}\n />\n {(() => {\n const sourceInfo = getContentSourceInfo(doc, shouldUseVector);\n return (\n <Chip\n icon={<sourceInfo.icon sx={{ fontSize: '0.8rem' }} />}\n label={sourceInfo.label}\n size=\"small\"\n sx={{\n bgcolor: sourceInfo.bgColor,\n color: sourceInfo.color,\n fontWeight: 500,\n fontSize: '0.75rem',\n '& .MuiChip-icon': {\n color: sourceInfo.color,\n }\n }}\n />\n );\n })()}\n <Chip \n label={formatFileSize(doc.content.length * 2)} \n size=\"small\" \n variant=\"outlined\"\n />\n </Box>\n </Box>\n\n <Box sx={{ display: 'flex', gap: 1, alignItems: 'center' }}>\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n toggleDocumentSelection(doc.id);\n }}\n sx={{ \n width: 32,\n height: 32,\n bgcolor: isSelected ? 'primary.main' : 'transparent',\n color: isSelected ? 'primary.contrastText' : 'text.secondary',\n border: isSelected ? 'none' : '2px solid',\n borderColor: 'text.secondary',\n borderRadius: '50%',\n '&:hover': {\n bgcolor: isSelected ? 'primary.dark' : 'action.hover',\n borderColor: isSelected ? 'primary.dark' : 'primary.main',\n }\n }}\n >\n {isSelected ? (\n <CheckIcon sx={{ fontSize: 16 }} />\n ) : (\n <Box sx={{ \n width: 12, \n height: 12, \n borderRadius: '50%',\n bgcolor: 'transparent'\n }} />\n )}\n </IconButton>\n \n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n handleDownloadDocument(e, doc);\n }}\n sx={{ \n textTransform: 'none',\n height: { xs: 32, sm: 36, md: 40 }, // Responsive height matching grid view\n minWidth: { xs: 90, sm: 100, md: 110 }, // Consistent width\n borderWidth: 2,\n fontSize: { xs: '0.75rem', sm: '0.8rem', md: '0.875rem' }, // Responsive font\n fontWeight: 600,\n px: { xs: 1, sm: 1.5 }, // Responsive padding\n '&:hover': {\n borderWidth: 2,\n bgcolor: 'primary.main',\n color: 'primary.contrastText',\n transform: 'translateY(-1px)',\n boxShadow: 2,\n },\n }}\n startIcon={<DownloadIcon sx={{ fontSize: { xs: '1rem', sm: '1.1rem' } }} />}\n >\n Download\n </Button>\n \n <IconButton\n onClick={(e) => handleRemoveDocument(e, doc.id)}\n color=\"error\"\n >\n <DeleteIcon />\n </IconButton>\n </Box>\n </Box>\n </CardContent>\n </Card>\n );\n })}\n </Stack>\n )}\n\n {/* No Results */}\n {filteredAndSortedDocuments.length === 0 && (\n <Card sx={{ textAlign: 'center', py: 6 }}>\n <CardContent>\n <SearchIcon sx={{ fontSize: 48, color: 'text.secondary', mb: 2 }} />\n <Typography variant=\"h6\" color=\"text.secondary\" gutterBottom>\n No documents found\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Try adjusting your search or filter criteria\n </Typography>\n <Button\n variant=\"text\"\n onClick={() => {\n setSearchQuery('');\n setSelectedCategory('all');\n }}\n sx={{ mt: 2 }}\n >\n Clear Filters\n </Button>\n </CardContent>\n </Card>\n )}\n </Box>\n )}\n\n {/* Remove old upload area and document grid - they're replaced by the enhanced versions above */}\n\n {/* Enhanced Clear All Documents Dialog */}\n <Dialog open={clearDocsDialogOpen} onClose={() => setClearDocsDialogOpen(false)}>\n <DialogTitle>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <ErrorIcon color=\"error\" />\n Clear All Documents?\n </Box>\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n This will permanently delete all {documents.length} documents from your local browser storage. \n This action cannot be undone.\n </DialogContentText>\n {documents.length > 0 && (\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n You will lose {statistics.totalSize} of document content\n </Alert>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setClearDocsDialogOpen(false)}>\n Cancel\n </Button>\n <Button\n onClick={handleClearAllDocuments}\n color=\"error\"\n variant=\"contained\"\n startIcon={<DeleteIcon />}\n >\n Delete All Documents\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Knowledge File Modal */}\n <KnowledgeFileModal \n open={!!selectedDoc} \n onClose={() => setSelectedDoc(null)} \n doc={selectedDoc}\n isVectorDocument={shouldUseVector && !!selectedDoc}\n />\n\n {/* Success/Error Snackbar */}\n <Snackbar\n open={showSnackbar}\n autoHideDuration={4000}\n onClose={() => setShowSnackbar(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Alert\n onClose={() => setShowSnackbar(false)}\n severity={snackbarSeverity}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {snackbarMessage}\n </Alert>\n </Snackbar>\n\n {/* Quick Actions Panel (when documents are selected) */}\n {selectedDocuments.length > 0 && (\n <Box\n sx={{\n position: 'fixed',\n bottom: 24,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 1000,\n bgcolor: 'background.paper',\n border: 1,\n borderColor: 'divider',\n borderRadius: 2,\n boxShadow: 4,\n p: 2,\n display: 'flex',\n gap: 1,\n alignItems: 'center',\n }}\n >\n <Typography variant=\"body2\" sx={{ mr: 2 }}>\n {selectedDocuments.length} selected\n </Typography>\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"error\"\n startIcon={<DeleteIcon />}\n onClick={handleBulkDelete}\n >\n Delete\n </Button>\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={clearSelection}\n >\n Clear\n </Button>\n </Box>\n )}\n\n {/* Vector Processing Overlay */}\n <ProcessingOverlay\n open={processingState.isVisible}\n currentStep={processingState.step}\n progress={processingState.progress}\n title={processingState.title}\n customMessages={processingState.customMessages}\n />\n </Box>\n </Box>\n );\n};\n\nexport default KnowledgeTab;\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-E790-227D12\nconst __banditFingerprint_shared_ProcessingOverlaytsx = 'BL-FP-218129-2B82';\nconst __auditTrail_shared_ProcessingOverlaytsx = 'BL-AU-MGOIKVVB-O349';\n// File: ProcessingOverlay.tsx | Path: src/components/shared/ProcessingOverlay.tsx | Hash: e7902b82\n\nimport React, { useState, useEffect } from 'react';\nimport {\n Dialog,\n DialogContent,\n Box,\n Typography,\n LinearProgress,\n Fade,\n Zoom,\n useTheme,\n alpha,\n keyframes,\n} from '@mui/material';\nimport { CloudUpload, Brain as Psychology, Cpu as Memory, Sparkles as AutoAwesome, Bot as SmartToy, Zap as Bolt } from 'lucide-react';\n\n// Ninja animation keyframes\nconst ninjaFloat = keyframes`\n 0%, 100% { transform: translateY(0px) rotate(0deg); }\n 25% { transform: translateY(-10px) rotate(2deg); }\n 50% { transform: translateY(-5px) rotate(0deg); }\n 75% { transform: translateY(-15px) rotate(-2deg); }\n`;\n\nconst sparkle = keyframes`\n 0%, 100% { opacity: 0; transform: scale(0); }\n 50% { opacity: 1; transform: scale(1); }\n`;\n\nconst pulse = keyframes`\n 0%, 100% { transform: scale(1); opacity: 0.7; }\n 50% { transform: scale(1.1); opacity: 1; }\n`;\n\nconst rotate = keyframes`\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n`;\n\ninterface ProcessingStep {\n id: string;\n title: string;\n description: string;\n icon: React.ReactNode;\n duration?: number; // rough estimate in seconds\n}\n\ninterface ProcessingOverlayProps {\n open: boolean;\n currentStep?: string;\n progress?: number; // 0-100\n title?: string;\n onCancel?: () => void;\n steps?: ProcessingStep[];\n customMessages?: string[];\n}\n\nconst defaultSteps: ProcessingStep[] = [\n {\n id: 'upload',\n title: 'Uploading to Cloud',\n description: 'Our digital ninjas are securely transferring your file...',\n icon: <CloudUpload />,\n duration: 5\n },\n {\n id: 'analyze',\n title: 'AI Analysis',\n description: 'Advanced AI robots are reading and understanding your content...',\n icon: <Psychology />,\n duration: 15\n },\n {\n id: 'embed',\n title: 'Making It Searchable',\n description: 'We turn the content into a private, searchable index...',\n icon: <Memory />,\n duration: 10\n },\n {\n id: 'optimize',\n title: 'Optimizing Search',\n description: 'Organizing everything for quick, reliable answers...',\n icon: <AutoAwesome />,\n duration: 8\n }\n];\n\nconst cleverMessages = [\n \"🥷 Keeping your content safe while we set things up...\",\n \"🤖 Getting everything ready for fast answers...\",\n \"⚡ Tidying the data so responses stay consistent...\",\n \"🧠 Remembering the important parts for you...\",\n \"🔒 Locking in privacy before we share results...\",\n \"🚀 Optimizing for quick, reliable lookups...\",\n \"💫 Turning this into searchable knowledge...\",\n \"🎯 Focusing on the details that matter to you...\",\n \"🌟 Making sure it stays available when you need it...\"\n];\n\nexport const ProcessingOverlay: React.FC<ProcessingOverlayProps> = ({\n open,\n currentStep,\n progress = 0,\n title = \"Processing Your Request\",\n onCancel,\n steps = defaultSteps,\n customMessages\n}) => {\n const theme = useTheme();\n const [messageIndex, setMessageIndex] = useState(0);\n const [sparkles, setSparkles] = useState<Array<{ id: number; x: number; y: number }>>([]);\n\n const messages = customMessages || cleverMessages;\n\n // Rotate clever messages\n useEffect(() => {\n if (!open) return;\n \n const interval = setInterval(() => {\n setMessageIndex((prev) => (prev + 1) % messages.length);\n }, 3000);\n\n return () => clearInterval(interval);\n }, [open, messages.length]);\n\n // Generate random sparkles\n useEffect(() => {\n if (!open) return;\n\n const generateSparkles = () => {\n const newSparkles = Array.from({ length: 5 }, (_, i) => ({\n id: Date.now() + i,\n x: Math.random() * 100,\n y: Math.random() * 100\n }));\n setSparkles(newSparkles);\n };\n\n generateSparkles();\n const interval = setInterval(generateSparkles, 2000);\n\n return () => clearInterval(interval);\n }, [open]);\n\n const currentStepData = steps.find(step => step.id === currentStep) || steps[0];\n const currentStepIndex = steps.findIndex(step => step.id === currentStep);\n const stepProgress = currentStepIndex >= 0 ? ((currentStepIndex + 1) / steps.length) * 100 : progress;\n\n return (\n <Dialog\n open={open}\n maxWidth=\"sm\"\n fullWidth\n PaperProps={{\n sx: {\n borderRadius: 3,\n background: `linear-gradient(135deg, \n ${alpha(theme.palette.primary.main, 0.1)} 0%, \n ${alpha(theme.palette.secondary.main, 0.1)} 100%)`,\n backdropFilter: 'blur(10px)',\n border: `1px solid ${alpha(theme.palette.primary.main, 0.2)}`,\n position: 'relative',\n overflow: 'hidden'\n }\n }}\n BackdropProps={{\n sx: {\n backgroundColor: alpha(theme.palette.background.default, 0.8),\n backdropFilter: 'blur(4px)'\n }\n }}\n >\n {/* Animated sparkles */}\n {sparkles.map((sparkle) => (\n <Box\n key={sparkle.id}\n sx={{\n position: 'absolute',\n left: `${sparkle.x}%`,\n top: `${sparkle.y}%`,\n width: 8,\n height: 8,\n borderRadius: '50%',\n background: theme.palette.primary.main,\n animation: `${sparkle} 2s ease-in-out infinite`,\n zIndex: 1\n }}\n />\n ))}\n\n <DialogContent sx={{ textAlign: 'center', py: 4, position: 'relative', zIndex: 2 }}>\n {/* Main Animation Area */}\n <Box sx={{ mb: 3, position: 'relative', height: 120 }}>\n {/* Primary Icon with Ninja Float Animation */}\n <Zoom in={open} timeout={500}>\n <Box\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 80,\n height: 80,\n borderRadius: '50%',\n background: `linear-gradient(45deg, \n ${theme.palette.primary.main}, \n ${theme.palette.secondary.main})`,\n color: 'white',\n fontSize: '2rem',\n animation: `${ninjaFloat} 4s ease-in-out infinite`,\n boxShadow: `0 8px 32px ${alpha(theme.palette.primary.main, 0.3)}`,\n position: 'relative'\n }}\n >\n {currentStepData.icon}\n \n {/* Rotating ring around icon */}\n <Box\n sx={{\n position: 'absolute',\n width: 100,\n height: 100,\n borderRadius: '50%',\n border: `2px solid ${alpha(theme.palette.primary.main, 0.3)}`,\n borderTopColor: theme.palette.primary.main,\n animation: `${rotate} 2s linear infinite`,\n top: -10,\n left: -10\n }}\n />\n </Box>\n </Zoom>\n\n {/* Floating secondary icons */}\n <Box\n sx={{\n position: 'absolute',\n top: 10,\n right: 20,\n animation: `${pulse} 3s ease-in-out infinite`,\n color: theme.palette.secondary.main\n }}\n >\n <SmartToy />\n </Box>\n \n <Box\n sx={{\n position: 'absolute',\n bottom: 10,\n left: 20,\n animation: `${pulse} 2.5s ease-in-out infinite`,\n color: theme.palette.primary.main,\n animationDelay: '1s'\n }}\n >\n <Bolt />\n </Box>\n </Box>\n\n {/* Title */}\n <Typography variant=\"h5\" gutterBottom sx={{ fontWeight: 600 }}>\n {title}\n </Typography>\n\n {/* Current Step */}\n <Fade in={true} key={currentStepData.id}>\n <Typography \n variant=\"h6\" \n color=\"primary\" \n gutterBottom\n sx={{ minHeight: 32 }}\n >\n {currentStepData.title}\n </Typography>\n </Fade>\n\n {/* Step Description */}\n <Fade in={true} key={currentStepData.description}>\n <Typography \n variant=\"body2\" \n color=\"text.secondary\" \n sx={{ mb: 3, minHeight: 20 }}\n >\n {currentStepData.description}\n </Typography>\n </Fade>\n\n {/* Clever Message Rotation */}\n <Box sx={{ height: 24, mb: 3, overflow: 'hidden' }}>\n <Fade in={true} key={messageIndex} timeout={500}>\n <Typography\n variant=\"body2\"\n sx={{\n fontStyle: 'italic',\n color: theme.palette.text.secondary,\n opacity: 0.8\n }}\n >\n {messages[messageIndex]}\n </Typography>\n </Fade>\n </Box>\n\n {/* Progress Bar */}\n <Box sx={{ mb: 3 }}>\n <LinearProgress\n variant=\"determinate\"\n value={stepProgress}\n sx={{\n height: 8,\n borderRadius: 4,\n backgroundColor: alpha(theme.palette.primary.main, 0.1),\n '& .MuiLinearProgress-bar': {\n borderRadius: 4,\n background: `linear-gradient(90deg, \n ${theme.palette.primary.main}, \n ${theme.palette.secondary.main})`\n }\n }}\n />\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mt: 1 }}>\n {Math.round(stepProgress)}% Complete\n </Typography>\n </Box>\n\n {/* Step Indicators */}\n <Box sx={{ display: 'flex', justifyContent: 'center', gap: 1, mb: 2 }}>\n {steps.map((step, index) => (\n <Box\n key={step.id}\n sx={{\n width: 12,\n height: 12,\n borderRadius: '50%',\n backgroundColor: index <= currentStepIndex \n ? theme.palette.primary.main \n : alpha(theme.palette.primary.main, 0.2),\n transition: 'all 0.3s ease',\n transform: index === currentStepIndex ? 'scale(1.2)' : 'scale(1)'\n }}\n />\n ))}\n </Box>\n\n {/* Estimated Time */}\n {currentStepData.duration && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n Estimated time: ~{currentStepData.duration} seconds\n </Typography>\n )}\n </DialogContent>\n </Dialog>\n );\n};\n\nexport default ProcessingOverlay;\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-2A55-B75390\nconst __banditFingerprint_hooks_useProcessingOverlayts = 'BL-FP-E47E99-C634';\nconst __auditTrail_hooks_useProcessingOverlayts = 'BL-AU-MGOIKVVF-JUZS';\n// File: useProcessingOverlay.ts | Path: src/hooks/useProcessingOverlay.ts | Hash: 2a55c634\n\nimport { useState, useCallback } from 'react';\n\ninterface ProcessingState {\n isVisible: boolean;\n step: string;\n progress: number;\n title: string;\n customMessages?: string[];\n}\n\ninterface UseProcessingOverlayReturn {\n showProcessing: (title?: string, messages?: string[]) => void;\n hideProcessing: () => void;\n updateProgress: (step: string, progress: number) => void;\n processingState: ProcessingState;\n}\n\n/**\n * Hook for managing processing overlay state across components\n * Provides a clean API for showing/hiding loading states with progress\n */\nexport const useProcessingOverlay = (): UseProcessingOverlayReturn => {\n const [processingState, setProcessingState] = useState<ProcessingState>({\n isVisible: false,\n step: 'upload',\n progress: 0,\n title: 'Processing...',\n customMessages: undefined\n });\n\n const showProcessing = useCallback((\n title: string = 'Processing...',\n messages?: string[]\n ) => {\n setProcessingState({\n isVisible: true,\n step: 'upload',\n progress: 0,\n title,\n customMessages: messages\n });\n }, []);\n\n const hideProcessing = useCallback(() => {\n setProcessingState(prev => ({\n ...prev,\n isVisible: false\n }));\n }, []);\n\n const updateProgress = useCallback((step: string, progress: number) => {\n setProcessingState(prev => ({\n ...prev,\n step,\n progress: Math.min(100, Math.max(0, progress))\n }));\n }, []);\n\n return {\n showProcessing,\n hideProcessing,\n updateProgress,\n processingState\n };\n};\n\nexport default useProcessingOverlay;\n","/*\n (c) 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-1F3C-7D9A12\nconst __banditFingerprint_components_SeedPacksTabtsx = \"BL-FP-5A7C2E-4C11\";\nconst __auditTrail_components_SeedPacksTabtsx = \"BL-AU-MGOIKVWY-KL2N\";\n// File: SeedPacksTab.tsx | Path: src/management/components/SeedPacksTab.tsx | Hash: 1f3c4c11\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Alert,\n Box,\n Button,\n Card,\n CardContent,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n Divider,\n IconButton,\n LinearProgress,\n List,\n ListItemButton,\n Snackbar,\n Stack,\n TextField,\n Tooltip,\n Typography,\n} from \"@mui/material\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { useAuthenticationStore } from \"../../store/authenticationStore\";\nimport StreamingMarkdown from \"../../components/StreamingMarkdown\";\nimport { debugLogger } from \"../../services/logging/debugLogger\";\nimport {\n archiveSeedPack,\n createSeedPack,\n deleteSeedPack,\n getSeedPack,\n listSeedPacks,\n publishSeedPack,\n updateSeedPack,\n type SeedPack,\n type SeedPackDraft,\n type SeedPackStatus,\n} from \"../../services/seedPacks/seedPackService\";\nimport {\n AddIcon,\n ArchiveIcon,\n DeleteIcon,\n DescriptionIcon,\n FolderOpenIcon,\n GroupIcon,\n PersonIcon,\n PublishIcon,\n RefreshIcon,\n SaveIcon,\n SearchIcon,\n UploadFileIcon,\n} from \"../../icons/lucide-icons\";\n\ntype SnackbarSeverity = \"success\" | \"error\" | \"info\" | \"warning\";\ntype ImportSource = \"local\" | \"azure-wiki\";\n\ninterface SeedPackFormState {\n name: string;\n description: string;\n content: string;\n}\n\ninterface ImportedMarkdownFile {\n id: string;\n name: string;\n size: number;\n content: string;\n lastModified: number;\n relativePath?: string;\n source: ImportSource;\n}\n\nconst parseTags = (value: string): string[] =>\n value\n .split(\",\")\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0);\n\nconst normalizeTags = (tags?: string[]): string[] =>\n (tags ?? [])\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0);\n\nconst areArraysEqual = (a: string[], b: string[]): boolean => {\n if (a.length !== b.length) {\n return false;\n }\n return a.every((value, index) => value === b[index]);\n};\n\nconst formatTimestamp = (value?: string): string => {\n if (!value) {\n return \"Not set\";\n }\n const parsed = Date.parse(value);\n if (Number.isNaN(parsed)) {\n return value;\n }\n return new Date(parsed).toLocaleString();\n};\n\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 getPreviewSnippet = (content: string): string => {\n const trimmed = content.trim();\n if (!trimmed) {\n return \"No preview available\";\n }\n return trimmed.length > 120 ? `${trimmed.slice(0, 120)}...` : trimmed;\n};\n\nconst getImportedFileKey = (file: Pick<ImportedMarkdownFile, \"name\" | \"relativePath\">): string =>\n (file.relativePath ?? file.name).toLowerCase();\n\nconst isMarkdownFileName = (name: string): boolean => {\n const lower = name.toLowerCase();\n return lower.endsWith(\".md\") || lower.endsWith(\".markdown\");\n};\n\nconst getWebkitRelativePath = (file: File): string | undefined => {\n const relativePath = (file as File & { webkitRelativePath?: string }).webkitRelativePath;\n if (!relativePath) {\n return undefined;\n }\n const trimmed = relativePath.trim().replace(/^\\/+/, \"\");\n return trimmed.length > 0 ? trimmed : undefined;\n};\n\nconst mergeMarkdownFiles = (\n existing: ImportedMarkdownFile[],\n incoming: ImportedMarkdownFile[]\n): ImportedMarkdownFile[] => {\n const next = [...existing];\n incoming.forEach((file) => {\n const index = next.findIndex((item) => getImportedFileKey(item) === getImportedFileKey(file));\n if (index >= 0) {\n next[index] = file;\n } else {\n next.push(file);\n }\n });\n return next;\n};\n\nconst buildMarkdownContent = (files: ImportedMarkdownFile[]): string => {\n return files\n .map((file) => file.content.trim())\n .filter((content) => content.length > 0)\n .join(\"\\n\\n---\\n\\n\");\n};\n\nconst readMarkdownFiles = async (\n files: FileList | File[],\n source: ImportSource = \"local\"\n): Promise<{ imported: ImportedMarkdownFile[]; skipped: number }> => {\n const list = Array.from(files);\n const markdownFiles = list.filter((file) => isMarkdownFileName(file.name));\n const imported = await Promise.all(\n markdownFiles.map(async (file) => {\n const relativePath = getWebkitRelativePath(file);\n return {\n id: `${source}-${relativePath ?? file.name}-${file.lastModified}-${file.size}`,\n name: file.name,\n size: file.size,\n content: await file.text(),\n lastModified: file.lastModified,\n relativePath,\n source,\n };\n })\n );\n return { imported, skipped: list.length - markdownFiles.length };\n};\n\nconst getStatusChip = (status: SeedPackStatus) => {\n switch (status) {\n case \"published\":\n return { label: \"Published\", color: \"success\" as const };\n case \"archived\":\n return { label: \"Archived\", color: \"default\" as const };\n case \"draft\":\n default:\n return { label: \"Draft\", color: \"warning\" as const };\n }\n};\n\nconst getSeedPackTimestamp = (pack: SeedPack): number => {\n const candidate = pack.updatedAt ?? pack.publishedAt ?? pack.createdAt;\n if (!candidate) {\n return 0;\n }\n const parsed = Date.parse(candidate);\n return Number.isNaN(parsed) ? 0 : parsed;\n};\n\nconst SeedPackFileCard: React.FC<{\n file: ImportedMarkdownFile;\n onPreview: () => void;\n onRemove: () => void;\n isReadOnly: boolean;\n}> = ({ file, onPreview, onRemove, isReadOnly }) => (\n <Card\n sx={{\n position: \"relative\",\n height: { xs: 240, sm: 260, md: 280 },\n cursor: \"pointer\",\n transition: \"all 0.3s ease-in-out\",\n border: \"1px solid\",\n borderColor: \"divider\",\n bgcolor: \"background.paper\",\n display: \"flex\",\n flexDirection: \"column\",\n \"&:hover\": {\n boxShadow: 6,\n transform: \"translateY(-2px)\",\n },\n }}\n onClick={onPreview}\n >\n <CardContent\n sx={{\n p: { xs: 1.5, sm: 2 },\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n mb: 1,\n height: 32,\n }}\n >\n <DescriptionIcon sx={{ fontSize: 32, color: \"#388e3c\", flexShrink: 0 }} />\n {!isReadOnly && (\n <IconButton\n size=\"small\"\n color=\"error\"\n onClick={(event) => {\n event.stopPropagation();\n onRemove();\n }}\n sx={{ width: 24, height: 24 }}\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n\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 <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 {getPreviewSnippet(file.content)}\n </Typography>\n </Box>\n\n <Tooltip title={file.relativePath ?? file.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 {file.name}\n </Typography>\n </Tooltip>\n {file.relativePath && file.relativePath !== file.name && (\n <Tooltip title={file.relativePath} arrow>\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{\n display: \"block\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n mb: 1,\n }}\n >\n {file.relativePath}\n </Typography>\n </Tooltip>\n )}\n\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n mb: 1,\n minHeight: 40,\n }}\n >\n <Box sx={{ display: \"flex\", gap: 0.5, flexWrap: \"wrap\", flex: 1, mr: 1 }}>\n <Chip\n icon={<PersonIcon sx={{ fontSize: \"0.9rem !important\" }} />}\n label={file.source === \"azure-wiki\" ? \"Azure Wiki\" : \"Local\"}\n size=\"small\"\n sx={{\n bgcolor: \"#388e3c20\",\n color: \"#388e3c\",\n fontWeight: 700,\n fontSize: \"0.75rem\",\n border: \"2px solid #388e3c60\",\n \"& .MuiChip-icon\": {\n color: \"#388e3c !important\",\n },\n boxShadow: \"0 2px 4px #388e3c20\",\n }}\n />\n <Chip\n icon={<DescriptionIcon sx={{ fontSize: \"0.85rem !important\" }} />}\n label=\"Markdown\"\n size=\"small\"\n sx={{\n bgcolor: \"#388e3c15\",\n color: \"#388e3c\",\n fontWeight: 500,\n fontSize: \"0.65rem\",\n }}\n />\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ flexShrink: 0 }}>\n {formatFileSize(file.size)}\n </Typography>\n </Box>\n\n <Box sx={{ mt: \"auto\" }}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n fullWidth\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\": {\n borderWidth: 2,\n bgcolor: \"primary.main\",\n color: \"primary.contrastText\",\n transform: \"translateY(-1px)\",\n boxShadow: 2,\n },\n }}\n onClick={(event) => {\n event.stopPropagation();\n onPreview();\n }}\n startIcon={<SearchIcon sx={{ fontSize: { xs: \"1rem\", sm: \"1.1rem\" } }} />}\n >\n Preview\n </Button>\n </Box>\n </CardContent>\n </Card>\n);\n\nconst SeedPacksTab: React.FC = () => {\n const { settings } = usePackageSettingsStore();\n const authStore = useAuthenticationStore();\n\n const gatewayConfigured = Boolean(settings?.gatewayApiUrl);\n const isTeamScope = Boolean(authStore.user?.teamSid);\n const seedPackAdminRoles = new Set([\"admin\", \"super-user\", \"team_admin\", \"team_owner\"]);\n const userRoles = authStore.user?.roles ?? [];\n const canManage = userRoles.some((role) => seedPackAdminRoles.has(role));\n\n const [seedPacks, setSeedPacks] = useState<SeedPack[]>([]);\n const [selectedSid, setSelectedSid] = useState<string | null>(null);\n const [selectedSeedPack, setSelectedSeedPack] = useState<SeedPack | null>(null);\n const [draft, setDraft] = useState<SeedPackFormState>({\n name: \"\",\n description: \"\",\n content: \"\",\n });\n const [tagsInput, setTagsInput] = useState(\"\");\n const [importedFiles, setImportedFiles] = useState<ImportedMarkdownFile[]>([]);\n const [createImportedFiles, setCreateImportedFiles] = useState<ImportedMarkdownFile[]>([]);\n const [previewFile, setPreviewFile] = useState<ImportedMarkdownFile | null>(null);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n const wikiFolderInputRef = useRef<HTMLInputElement | null>(null);\n const createFileInputRef = useRef<HTMLInputElement | null>(null);\n const createWikiFolderInputRef = useRef<HTMLInputElement | null>(null);\n\n const [isLoadingList, setIsLoadingList] = useState(false);\n const [isLoadingDetail, setIsLoadingDetail] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n const [isPublishing, setIsPublishing] = useState(false);\n const [isArchiving, setIsArchiving] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n const [isCreating, setIsCreating] = useState(false);\n\n const [createDialogOpen, setCreateDialogOpen] = useState(false);\n const [publishDialogOpen, setPublishDialogOpen] = useState(false);\n const [archiveDialogOpen, setArchiveDialogOpen] = useState(false);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n\n const [newPackName, setNewPackName] = useState(\"\");\n const [newPackDescription, setNewPackDescription] = useState(\"\");\n const [newPackTags, setNewPackTags] = useState(\"\");\n\n const [snackbarOpen, setSnackbarOpen] = useState(false);\n const [snackbarMessage, setSnackbarMessage] = useState(\"\");\n const [snackbarSeverity, setSnackbarSeverity] = useState<SnackbarSeverity>(\"success\");\n\n const parsedTags = useMemo(() => parseTags(tagsInput), [tagsInput]);\n const normalizedSelectedTags = useMemo(\n () => normalizeTags(selectedSeedPack?.tags),\n [selectedSeedPack?.tags]\n );\n\n const isDirty = useMemo(() => {\n if (!selectedSeedPack) {\n return false;\n }\n const nameChanged = draft.name.trim() !== (selectedSeedPack.name ?? \"\").trim();\n const descriptionChanged =\n draft.description.trim() !== (selectedSeedPack.description ?? \"\").trim();\n const contentChanged = draft.content !== (selectedSeedPack.content ?? \"\");\n const tagsChanged = !areArraysEqual(parsedTags, normalizedSelectedTags);\n return nameChanged || descriptionChanged || contentChanged || tagsChanged;\n }, [draft, parsedTags, normalizedSelectedTags, selectedSeedPack]);\n\n const isReadOnly = !canManage || selectedSeedPack?.status === \"archived\";\n\n const sortedSeedPacks = useMemo(() => {\n return [...seedPacks].sort((a, b) => getSeedPackTimestamp(b) - getSeedPackTimestamp(a));\n }, [seedPacks]);\n\n const scopeLabel = isTeamScope ? \"Team scope\" : \"Personal scope\";\n const scopeDescription = isTeamScope\n ? \"Applies to all members of your team.\"\n : \"Applies only to your account.\";\n\n const showSnackbar = useCallback((message: string, severity: SnackbarSeverity) => {\n setSnackbarMessage(message);\n setSnackbarSeverity(severity);\n setSnackbarOpen(true);\n }, []);\n\n const hydrateDraft = useCallback((pack: SeedPack) => {\n setDraft({\n name: pack.name ?? \"\",\n description: pack.description ?? \"\",\n content: pack.content ?? \"\",\n });\n setTagsInput((pack.tags ?? []).join(\", \"));\n setImportedFiles([]);\n setPreviewFile(null);\n }, []);\n\n const resetCreateDialog = useCallback(() => {\n setCreateDialogOpen(false);\n setNewPackName(\"\");\n setNewPackDescription(\"\");\n setNewPackTags(\"\");\n setCreateImportedFiles([]);\n }, []);\n\n const refreshSeedPacks = useCallback(\n async (nextSelectedSid?: string) => {\n if (!gatewayConfigured) {\n return;\n }\n setIsLoadingList(true);\n try {\n const packs = await listSeedPacks();\n setSeedPacks(packs);\n\n const activeSid = nextSelectedSid ?? selectedSid;\n if (activeSid && !packs.some((pack) => pack.sid === activeSid)) {\n setSelectedSid(null);\n setSelectedSeedPack(null);\n }\n } catch (error) {\n showSnackbar(\"Failed to load seed packs.\", \"error\");\n debugLogger.error(\"SeedPacksTab: failed to load seed packs\", {\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n setIsLoadingList(false);\n }\n },\n [gatewayConfigured, selectedSid, showSnackbar]\n );\n\n const loadSeedPackDetail = useCallback(\n async (sid: string) => {\n if (!gatewayConfigured) {\n return;\n }\n setIsLoadingDetail(true);\n try {\n const pack = await getSeedPack(sid);\n setSelectedSeedPack(pack);\n hydrateDraft(pack);\n } catch (error) {\n showSnackbar(\"Failed to load seed pack details.\", \"error\");\n debugLogger.error(\"SeedPacksTab: failed to load seed pack details\", {\n sid,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n setIsLoadingDetail(false);\n }\n },\n [gatewayConfigured, hydrateDraft, showSnackbar]\n );\n\n useEffect(() => {\n void refreshSeedPacks();\n }, [refreshSeedPacks, authStore.token]);\n\n useEffect(() => {\n if (selectedSid) {\n void loadSeedPackDetail(selectedSid);\n }\n }, [selectedSid, loadSeedPackDetail]);\n\n useEffect(() => {\n const setDirectoryUploadAttributes = (input: HTMLInputElement | null) => {\n if (!input) {\n return;\n }\n input.setAttribute(\"webkitdirectory\", \"\");\n input.setAttribute(\"directory\", \"\");\n };\n\n setDirectoryUploadAttributes(wikiFolderInputRef.current);\n setDirectoryUploadAttributes(createWikiFolderInputRef.current);\n }, [selectedSeedPack, createDialogOpen]);\n\n const handleSelectPack = (pack: SeedPack) => {\n setSelectedSid(pack.sid);\n setSelectedSeedPack(pack);\n hydrateDraft(pack);\n };\n\n const handleImportFiles = useCallback(\n async (files: FileList | null, source: ImportSource = \"local\") => {\n if (!files || files.length === 0) {\n return;\n }\n\n const { imported, skipped } = await readMarkdownFiles(files, source);\n if (skipped > 0) {\n showSnackbar(\"Only .md and .markdown files are supported for seed packs.\", \"error\");\n }\n\n if (imported.length === 0) {\n return;\n }\n\n try {\n const newlyAdded = imported.filter(\n (file) =>\n !importedFiles.some((existing) => getImportedFileKey(existing) === getImportedFileKey(file))\n );\n setImportedFiles((prev) => mergeMarkdownFiles(prev, imported));\n\n const combined = buildMarkdownContent(newlyAdded);\n if (combined.length > 0) {\n setDraft((prev) => {\n const current = prev.content.trim();\n const nextContent = current ? `${current}\\n\\n---\\n\\n${combined}` : combined;\n return { ...prev, content: nextContent };\n });\n }\n const importLabel =\n source === \"azure-wiki\" ? \"from Azure DevOps wiki folder into the editor\" : \"into the editor\";\n showSnackbar(\n `Imported ${imported.length} markdown file${imported.length === 1 ? \"\" : \"s\"} ${importLabel}.`,\n \"success\"\n );\n } catch (error) {\n showSnackbar(\"Failed to import markdown files.\", \"error\");\n debugLogger.error(\"SeedPacksTab: failed to import markdown files\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n },\n [importedFiles, showSnackbar]\n );\n\n const handleFileInputChange = useCallback(\n async (event: React.ChangeEvent<HTMLInputElement>) => {\n await handleImportFiles(event.target.files, \"local\");\n event.target.value = \"\";\n },\n [handleImportFiles]\n );\n\n const handleWikiFolderInputChange = useCallback(\n async (event: React.ChangeEvent<HTMLInputElement>) => {\n await handleImportFiles(event.target.files, \"azure-wiki\");\n event.target.value = \"\";\n },\n [handleImportFiles]\n );\n\n const handleRemoveImportedFile = useCallback((id: string) => {\n setImportedFiles((prev) => prev.filter((file) => file.id !== id));\n }, []);\n\n const handleCreateImportFiles = useCallback(\n async (files: FileList | null, source: ImportSource = \"local\") => {\n if (!files || files.length === 0) {\n return;\n }\n\n const { imported, skipped } = await readMarkdownFiles(files, source);\n if (skipped > 0) {\n showSnackbar(\"Only .md and .markdown files are supported for seed packs.\", \"error\");\n }\n if (imported.length === 0) {\n return;\n }\n\n setCreateImportedFiles((prev) => mergeMarkdownFiles(prev, imported));\n const importLabel =\n source === \"azure-wiki\" ? \"from Azure DevOps wiki folder for this seed pack\" : \"for this seed pack\";\n showSnackbar(\n `Imported ${imported.length} markdown file${imported.length === 1 ? \"\" : \"s\"} ${importLabel}.`,\n \"success\"\n );\n },\n [showSnackbar]\n );\n\n const handleCreateFileInputChange = useCallback(\n async (event: React.ChangeEvent<HTMLInputElement>) => {\n await handleCreateImportFiles(event.target.files, \"local\");\n event.target.value = \"\";\n },\n [handleCreateImportFiles]\n );\n\n const handleCreateWikiFolderInputChange = useCallback(\n async (event: React.ChangeEvent<HTMLInputElement>) => {\n await handleCreateImportFiles(event.target.files, \"azure-wiki\");\n event.target.value = \"\";\n },\n [handleCreateImportFiles]\n );\n\n const handleRemoveCreateImportedFile = useCallback((id: string) => {\n setCreateImportedFiles((prev) => prev.filter((file) => file.id !== id));\n }, []);\n\n const buildDraftPayload = useCallback((): SeedPackDraft | null => {\n const name = draft.name.trim();\n if (!name) {\n showSnackbar(\"Seed pack name is required.\", \"error\");\n return null;\n }\n return {\n name,\n description: draft.description.trim(),\n content: draft.content,\n tags: parsedTags,\n contentType: \"markdown\",\n };\n }, [draft, parsedTags, showSnackbar]);\n\n const saveDraft = useCallback(async (): Promise<SeedPack | null> => {\n if (!selectedSeedPack) {\n return null;\n }\n const payload = buildDraftPayload();\n if (!payload) {\n return null;\n }\n setIsSaving(true);\n try {\n const updated = await updateSeedPack(selectedSeedPack.sid, payload);\n setSelectedSeedPack(updated);\n hydrateDraft(updated);\n await refreshSeedPacks(updated.sid);\n return updated;\n } catch (error) {\n showSnackbar(\"Failed to save seed pack.\", \"error\");\n debugLogger.error(\"SeedPacksTab: failed to save seed pack\", {\n sid: selectedSeedPack.sid,\n error: error instanceof Error ? error.message : String(error),\n });\n return null;\n } finally {\n setIsSaving(false);\n }\n }, [selectedSeedPack, buildDraftPayload, hydrateDraft, refreshSeedPacks, showSnackbar]);\n\n const handleSaveDraft = async () => {\n const updated = await saveDraft();\n if (updated) {\n showSnackbar(\"Seed pack saved.\", \"success\");\n }\n };\n\n const handleResetDraft = () => {\n if (selectedSeedPack) {\n hydrateDraft(selectedSeedPack);\n }\n };\n\n const handleCreateSeedPack = async () => {\n const name = newPackName.trim();\n if (!name) {\n showSnackbar(\"Seed pack name is required.\", \"error\");\n return;\n }\n\n const importedContent = buildMarkdownContent(createImportedFiles);\n const payload: SeedPackDraft = {\n name,\n description: newPackDescription.trim(),\n tags: parseTags(newPackTags),\n content: importedContent,\n contentType: \"markdown\",\n };\n\n setIsCreating(true);\n try {\n const created = await createSeedPack(payload);\n resetCreateDialog();\n await refreshSeedPacks(created.sid);\n setSelectedSid(created.sid);\n setSelectedSeedPack(created);\n hydrateDraft(created);\n if (createImportedFiles.length > 0) {\n setImportedFiles(createImportedFiles);\n }\n setCreateImportedFiles([]);\n showSnackbar(\"Seed pack created.\", \"success\");\n } catch (error) {\n showSnackbar(\"Failed to create seed pack.\", \"error\");\n debugLogger.error(\"SeedPacksTab: failed to create seed pack\", {\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n setIsCreating(false);\n }\n };\n\n const handlePublish = async () => {\n if (!selectedSeedPack) {\n return;\n }\n setPublishDialogOpen(false);\n setIsPublishing(true);\n try {\n if (isDirty) {\n const saved = await saveDraft();\n if (!saved) {\n return;\n }\n }\n const published = await publishSeedPack(selectedSeedPack.sid);\n setSelectedSeedPack(published);\n hydrateDraft(published);\n await refreshSeedPacks(published.sid);\n showSnackbar(\"Seed pack published.\", \"success\");\n } catch (error) {\n showSnackbar(\"Failed to publish seed pack.\", \"error\");\n debugLogger.error(\"SeedPacksTab: failed to publish seed pack\", {\n sid: selectedSeedPack.sid,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n setIsPublishing(false);\n }\n };\n\n const handleArchive = async () => {\n if (!selectedSeedPack) {\n return;\n }\n setArchiveDialogOpen(false);\n setIsArchiving(true);\n try {\n const archived = await archiveSeedPack(selectedSeedPack.sid);\n setSelectedSeedPack(archived);\n hydrateDraft(archived);\n await refreshSeedPacks(archived.sid);\n showSnackbar(\"Seed pack archived.\", \"success\");\n } catch (error) {\n showSnackbar(\"Failed to archive seed pack.\", \"error\");\n debugLogger.error(\"SeedPacksTab: failed to archive seed pack\", {\n sid: selectedSeedPack.sid,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n setIsArchiving(false);\n }\n };\n\n const handleDelete = async () => {\n if (!selectedSeedPack) {\n return;\n }\n const deletingSid = selectedSeedPack.sid;\n const deletingName = selectedSeedPack.name;\n setDeleteDialogOpen(false);\n setIsDeleting(true);\n try {\n await deleteSeedPack(deletingSid);\n setSelectedSid(null);\n setSelectedSeedPack(null);\n setDraft({ name: \"\", description: \"\", content: \"\" });\n setTagsInput(\"\");\n setImportedFiles([]);\n setPreviewFile(null);\n await refreshSeedPacks();\n showSnackbar(`Deleted seed pack \"${deletingName}\".`, \"success\");\n } catch (error) {\n showSnackbar(\"Failed to delete seed pack.\", \"error\");\n debugLogger.error(\"SeedPacksTab: failed to delete seed pack\", {\n sid: deletingSid,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n setIsDeleting(false);\n }\n };\n\n const previewContent =\n draft.content.trim().length > 0\n ? draft.content\n : \"Preview will appear here as you type.\";\n\n const selectedStatus = selectedSeedPack?.status ?? \"draft\";\n const statusChip = getStatusChip(selectedStatus);\n\n return (\n <Box sx={{ p: { xs: 1.5, sm: 3, md: 4 } }}>\n <Box sx={{ mb: { xs: 2.5, md: 3 } }}>\n <Stack\n direction={{ xs: \"column\", md: \"row\" }}\n spacing={{ xs: 1.5, md: 2 }}\n alignItems={{ xs: \"flex-start\", md: \"center\" }}\n justifyContent=\"space-between\"\n >\n <Box>\n <Typography\n variant=\"h5\"\n color=\"text.primary\"\n sx={{ mb: 1, fontWeight: 600, fontSize: { xs: \"1.55rem\", md: \"1.8rem\" } }}\n >\n Seed Packs\n </Typography>\n <Typography variant=\"body1\" color=\"text.secondary\">\n Curated internal knowledge that is always available to assistants, without showing up as\n visible sources.\n </Typography>\n </Box>\n <Stack direction=\"row\" spacing={1} flexWrap=\"wrap\">\n <Chip\n icon={isTeamScope ? <GroupIcon /> : <PersonIcon />}\n label={scopeLabel}\n color=\"info\"\n variant=\"outlined\"\n />\n </Stack>\n </Stack>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {scopeDescription}\n </Typography>\n </Box>\n\n {!gatewayConfigured && (\n <Alert severity=\"warning\" sx={{ mb: 2 }}>\n Gateway API is not configured. Seed packs require a gateway URL in package settings.\n </Alert>\n )}\n\n {gatewayConfigured && !canManage && (\n <Alert severity=\"info\" sx={{ mb: 2 }}>\n You have view-only access. Admin rights are required to create, publish, or archive team seed\n packs.\n </Alert>\n )}\n\n <Box\n sx={{\n display: \"grid\",\n gridTemplateColumns: { xs: \"1fr\", md: \"320px 1fr\" },\n gap: { xs: 2, md: 3 },\n }}\n >\n <Card sx={{ height: \"fit-content\" }}>\n <CardContent sx={{ pb: 1.5 }}>\n <Stack direction=\"row\" spacing={1} alignItems=\"center\" justifyContent=\"space-between\">\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n Packs\n </Typography>\n <Stack direction=\"row\" spacing={1}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n onClick={() => refreshSeedPacks()}\n startIcon={<RefreshIcon />}\n disabled={!gatewayConfigured || isLoadingList}\n >\n Refresh\n </Button>\n {canManage && (\n <Button\n size=\"small\"\n variant=\"contained\"\n startIcon={<AddIcon />}\n onClick={() => setCreateDialogOpen(true)}\n disabled={!gatewayConfigured}\n >\n New\n </Button>\n )}\n </Stack>\n </Stack>\n </CardContent>\n <Divider />\n <Box sx={{ px: 2, pb: 2 }}>\n {isLoadingList && <LinearProgress sx={{ mb: 2 }} />}\n {sortedSeedPacks.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No seed packs yet. Create one to start sharing internal knowledge.\n </Typography>\n ) : (\n <List sx={{ px: 0 }}>\n {sortedSeedPacks.map((pack) => {\n const status = getStatusChip(pack.status);\n const tags = normalizeTags(pack.tags);\n return (\n <ListItemButton\n key={pack.sid}\n selected={pack.sid === selectedSid}\n onClick={() => handleSelectPack(pack)}\n sx={{\n mb: 1,\n borderRadius: 2,\n alignItems: \"flex-start\",\n border: pack.sid === selectedSid ? \"1px solid\" : \"1px solid transparent\",\n borderColor: pack.sid === selectedSid ? \"primary.main\" : \"transparent\",\n }}\n >\n <Box sx={{ flex: 1 }}>\n <Stack direction=\"row\" spacing={1} alignItems=\"center\" sx={{ mb: 0.5 }}>\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 600 }}>\n {pack.name}\n </Typography>\n <Chip size=\"small\" label={status.label} color={status.color} />\n </Stack>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {pack.version ? `v${pack.version}` : \"v0\"} | Last published:{\" \"}\n {formatTimestamp(pack.publishedAt)}\n </Typography>\n {tags.length > 0 && (\n <Stack direction=\"row\" spacing={0.5} flexWrap=\"wrap\" sx={{ mt: 1 }}>\n {tags.map((tag) => (\n <Chip key={tag} size=\"small\" label={tag} variant=\"outlined\" />\n ))}\n </Stack>\n )}\n </Box>\n </ListItemButton>\n );\n })}\n </List>\n )}\n </Box>\n </Card>\n\n <Card>\n <CardContent>\n <Stack direction=\"row\" spacing={1} alignItems=\"center\" justifyContent=\"space-between\">\n <Box>\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n {selectedSeedPack ? \"Seed Pack Editor\" : \"Seed Pack Details\"}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Draft content stays internal and is never shown as user-facing sources.\n </Typography>\n </Box>\n {selectedSeedPack && (\n <Stack direction=\"row\" spacing={1} flexWrap=\"wrap\">\n {isDirty && <Chip size=\"small\" label=\"Unsaved changes\" color=\"warning\" />}\n <Chip size=\"small\" label={statusChip.label} color={statusChip.color} />\n </Stack>\n )}\n </Stack>\n\n <Divider sx={{ my: 2 }} />\n\n {!selectedSeedPack && (\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Select a seed pack from the list or create a new one to begin editing.\n </Typography>\n {canManage && (\n <Button\n variant=\"contained\"\n startIcon={<AddIcon />}\n onClick={() => setCreateDialogOpen(true)}\n disabled={!gatewayConfigured}\n >\n Create seed pack\n </Button>\n )}\n </Box>\n )}\n\n {selectedSeedPack && (\n <Stack spacing={2}>\n {isLoadingDetail && <LinearProgress />}\n\n <TextField\n label=\"Name\"\n value={draft.name}\n onChange={(event) => setDraft((prev) => ({ ...prev, name: event.target.value }))}\n fullWidth\n disabled={isReadOnly}\n />\n\n <TextField\n label=\"Description\"\n value={draft.description}\n onChange={(event) =>\n setDraft((prev) => ({ ...prev, description: event.target.value }))\n }\n fullWidth\n multiline\n minRows={2}\n disabled={isReadOnly}\n />\n\n <TextField\n label=\"Tags (comma separated)\"\n value={tagsInput}\n onChange={(event) => setTagsInput(event.target.value)}\n fullWidth\n disabled={isReadOnly}\n />\n\n <Stack direction=\"row\" spacing={1} flexWrap=\"wrap\">\n <Chip size=\"small\" label={scopeLabel} icon={isTeamScope ? <GroupIcon /> : <PersonIcon />} />\n {selectedSeedPack.version && (\n <Chip size=\"small\" label={`Version ${selectedSeedPack.version}`} variant=\"outlined\" />\n )}\n {selectedSeedPack.updatedAt && (\n <Chip size=\"small\" label={`Updated ${formatTimestamp(selectedSeedPack.updatedAt)}`} variant=\"outlined\" />\n )}\n </Stack>\n\n <Alert severity=\"info\">\n Treat seed pack content as internal knowledge. Do not include instructions that override\n system or developer messages.\n </Alert>\n\n <Box\n sx={{\n display: \"grid\",\n gridTemplateColumns: { xs: \"1fr\", md: \"1fr 1fr\" },\n gap: 2,\n alignItems: \"start\",\n }}\n >\n <Box>\n <Stack\n direction={{ xs: \"column\", sm: \"row\" }}\n spacing={1}\n alignItems={{ xs: \"flex-start\", sm: \"center\" }}\n justifyContent=\"space-between\"\n sx={{ mb: 1 }}\n >\n <Typography variant=\"subtitle2\">Markdown content</Typography>\n <Stack direction={{ xs: \"column\", sm: \"row\" }} spacing={1}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n startIcon={<UploadFileIcon />}\n onClick={() => fileInputRef.current?.click()}\n disabled={isReadOnly}\n >\n Import .md\n </Button>\n <Button\n size=\"small\"\n variant=\"outlined\"\n startIcon={<FolderOpenIcon />}\n onClick={() => wikiFolderInputRef.current?.click()}\n disabled={isReadOnly}\n >\n Import wiki folder\n </Button>\n </Stack>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".md,.markdown,text/markdown\"\n multiple\n onChange={handleFileInputChange}\n style={{ display: \"none\" }}\n />\n <input\n ref={wikiFolderInputRef}\n type=\"file\"\n accept=\".md,.markdown,text/markdown\"\n multiple\n onChange={handleWikiFolderInputChange}\n style={{ display: \"none\" }}\n />\n </Stack>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mb: 1, display: \"block\" }}>\n Paste or import markdown files. Use folder import for Azure DevOps wiki clones.\n </Typography>\n <TextField\n label=\"Content\"\n value={draft.content}\n onChange={(event) =>\n setDraft((prev) => ({ ...prev, content: event.target.value }))\n }\n fullWidth\n multiline\n minRows={12}\n disabled={isReadOnly}\n />\n {importedFiles.length > 0 && (\n <Box sx={{ mt: 2 }}>\n <Typography variant=\"subtitle2\" sx={{ mb: 1 }}>\n Imported markdown files\n </Typography>\n <Box\n sx={{\n display: \"grid\",\n gridTemplateColumns: {\n xs: \"1fr\",\n sm: \"repeat(2, minmax(0, 1fr))\",\n md: \"repeat(3, minmax(0, 1fr))\",\n },\n gap: 2,\n }}\n >\n {importedFiles.map((file) => (\n <SeedPackFileCard\n key={file.id}\n file={file}\n isReadOnly={isReadOnly}\n onPreview={() => setPreviewFile(file)}\n onRemove={() => handleRemoveImportedFile(file.id)}\n />\n ))}\n </Box>\n </Box>\n )}\n </Box>\n <Card variant=\"outlined\">\n <CardContent>\n <Typography variant=\"subtitle2\" sx={{ mb: 1 }}>\n Preview\n </Typography>\n <StreamingMarkdown content={previewContent} />\n </CardContent>\n </Card>\n </Box>\n\n {selectedSeedPack.summary && (\n <TextField\n label=\"Summary (auto-generated)\"\n value={selectedSeedPack.summary}\n fullWidth\n multiline\n minRows={3}\n InputProps={{ readOnly: true }}\n />\n )}\n\n {canManage && (\n <Stack direction={{ xs: \"column\", sm: \"row\" }} spacing={1} flexWrap=\"wrap\">\n <Button\n variant=\"outlined\"\n startIcon={<SaveIcon />}\n onClick={handleSaveDraft}\n disabled={isReadOnly || !isDirty || isSaving}\n >\n {isSaving ? \"Saving...\" : \"Save draft\"}\n </Button>\n <Button\n variant=\"outlined\"\n onClick={handleResetDraft}\n disabled={!isDirty || isReadOnly}\n >\n Reset changes\n </Button>\n <Button\n variant=\"contained\"\n startIcon={<PublishIcon />}\n onClick={() => setPublishDialogOpen(true)}\n disabled={isReadOnly || isPublishing}\n >\n {isPublishing ? \"Publishing...\" : \"Publish\"}\n </Button>\n <Button\n variant=\"text\"\n color=\"error\"\n startIcon={<ArchiveIcon />}\n onClick={() => setArchiveDialogOpen(true)}\n disabled={isReadOnly || isArchiving}\n >\n {isArchiving ? \"Archiving...\" : \"Archive\"}\n </Button>\n <Button\n variant=\"text\"\n color=\"error\"\n startIcon={<DeleteIcon />}\n onClick={() => setDeleteDialogOpen(true)}\n disabled={isDeleting}\n >\n {isDeleting ? \"Deleting...\" : \"Delete\"}\n </Button>\n </Stack>\n )}\n </Stack>\n )}\n </CardContent>\n </Card>\n </Box>\n\n <Dialog open={createDialogOpen} onClose={resetCreateDialog} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Create seed pack</DialogTitle>\n <DialogContent>\n <DialogContentText sx={{ mb: 2 }}>\n Seed packs are scoped automatically based on your sign-in. {scopeLabel} - {scopeDescription}\n </DialogContentText>\n <Stack spacing={2}>\n <TextField\n label=\"Name\"\n value={newPackName}\n onChange={(event) => setNewPackName(event.target.value)}\n fullWidth\n autoFocus\n />\n <TextField\n label=\"Description\"\n value={newPackDescription}\n onChange={(event) => setNewPackDescription(event.target.value)}\n fullWidth\n multiline\n minRows={2}\n />\n <TextField\n label=\"Tags (comma separated)\"\n value={newPackTags}\n onChange={(event) => setNewPackTags(event.target.value)}\n fullWidth\n />\n <Divider />\n <Stack direction={{ xs: \"column\", sm: \"row\" }} spacing={1} alignItems=\"center\">\n <Stack direction={{ xs: \"column\", sm: \"row\" }} spacing={1}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n startIcon={<UploadFileIcon />}\n onClick={() => createFileInputRef.current?.click()}\n disabled={!canManage}\n >\n Import .md files\n </Button>\n <Button\n size=\"small\"\n variant=\"outlined\"\n startIcon={<FolderOpenIcon />}\n onClick={() => createWikiFolderInputRef.current?.click()}\n disabled={!canManage}\n >\n Import wiki folder\n </Button>\n </Stack>\n <Typography variant=\"caption\" color=\"text.secondary\">\n Optional. Local files or cloned Azure DevOps wiki folders are merged into draft content.\n </Typography>\n <input\n ref={createFileInputRef}\n type=\"file\"\n accept=\".md,.markdown,text/markdown\"\n multiple\n onChange={handleCreateFileInputChange}\n style={{ display: \"none\" }}\n />\n <input\n ref={createWikiFolderInputRef}\n type=\"file\"\n accept=\".md,.markdown,text/markdown\"\n multiple\n onChange={handleCreateWikiFolderInputChange}\n style={{ display: \"none\" }}\n />\n </Stack>\n {createImportedFiles.length > 0 && (\n <Box>\n <Typography variant=\"subtitle2\" sx={{ mb: 1 }}>\n Imported markdown files\n </Typography>\n <Box\n sx={{\n display: \"grid\",\n gridTemplateColumns: {\n xs: \"1fr\",\n sm: \"repeat(2, minmax(0, 1fr))\",\n },\n gap: 2,\n }}\n >\n {createImportedFiles.map((file) => (\n <SeedPackFileCard\n key={file.id}\n file={file}\n isReadOnly={!canManage}\n onPreview={() => setPreviewFile(file)}\n onRemove={() => handleRemoveCreateImportedFile(file.id)}\n />\n ))}\n </Box>\n </Box>\n )}\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button onClick={resetCreateDialog}>Cancel</Button>\n <Button\n variant=\"contained\"\n onClick={handleCreateSeedPack}\n disabled={!gatewayConfigured || isCreating}\n >\n {isCreating ? \"Creating...\" : \"Create\"}\n </Button>\n </DialogActions>\n </Dialog>\n\n <Dialog open={publishDialogOpen} onClose={() => setPublishDialogOpen(false)} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Publish seed pack</DialogTitle>\n <DialogContent>\n <DialogContentText>\n Publishing locks a new version and makes it available for internal retrieval. This content is\n never shown as a user-facing source.\n </DialogContentText>\n {isDirty && (\n <Alert severity=\"info\" sx={{ mt: 2 }}>\n You have unsaved changes. They will be included in the published version.\n </Alert>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setPublishDialogOpen(false)}>Cancel</Button>\n <Button variant=\"contained\" onClick={handlePublish} disabled={isPublishing}>\n {isPublishing ? \"Publishing...\" : \"Publish\"}\n </Button>\n </DialogActions>\n </Dialog>\n\n <Dialog open={archiveDialogOpen} onClose={() => setArchiveDialogOpen(false)} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Archive seed pack</DialogTitle>\n <DialogContent>\n <DialogContentText>\n Archiving stops this seed pack from being used in new conversations. You can keep it for\n reference or audit history.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setArchiveDialogOpen(false)}>Cancel</Button>\n <Button variant=\"contained\" color=\"error\" onClick={handleArchive} disabled={isArchiving}>\n {isArchiving ? \"Archiving...\" : \"Archive\"}\n </Button>\n </DialogActions>\n </Dialog>\n\n <Dialog open={deleteDialogOpen} onClose={() => setDeleteDialogOpen(false)} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Delete seed pack</DialogTitle>\n <DialogContent>\n <DialogContentText>\n Delete \"{selectedSeedPack?.name ?? \"this seed pack\"}\" permanently from this scope.\n Published versions and draft content will no longer be available.\n </DialogContentText>\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n This action cannot be undone.\n </Alert>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setDeleteDialogOpen(false)}>Cancel</Button>\n <Button variant=\"contained\" color=\"error\" onClick={handleDelete} disabled={isDeleting}>\n {isDeleting ? \"Deleting...\" : \"Delete\"}\n </Button>\n </DialogActions>\n </Dialog>\n\n <Dialog\n open={Boolean(previewFile)}\n onClose={() => setPreviewFile(null)}\n maxWidth=\"md\"\n fullWidth\n >\n <DialogTitle>{previewFile?.name ?? \"Markdown preview\"}</DialogTitle>\n <DialogContent dividers>\n <StreamingMarkdown content={previewFile?.content ?? \"\"} />\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setPreviewFile(null)}>Close</Button>\n </DialogActions>\n </Dialog>\n\n <Snackbar\n open={snackbarOpen}\n autoHideDuration={4000}\n onClose={() => setSnackbarOpen(false)}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"center\" }}\n >\n <Alert onClose={() => setSnackbarOpen(false)} severity={snackbarSeverity} sx={{ width: \"100%\" }}>\n {snackbarMessage}\n </Alert>\n </Snackbar>\n </Box>\n );\n};\n\nexport default SeedPacksTab;\n","/*\n (c) 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-2A4F-9C7E31\nconst __banditFingerprint_services_seedPacks_seedPackServicets = 'BL-FP-64B2F0-3F9D';\nconst __auditTrail_services_seedPacks_seedPackServicets = 'BL-AU-MGOIKVWX-RH8T';\n// File: seedPackService.ts | Path: src/services/seedPacks/seedPackService.ts | Hash: 2a4f3f9d\n\nimport { authenticationService } from \"../auth/authenticationService\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\nexport type SeedPackStatus = \"draft\" | \"published\" | \"archived\";\nexport type SeedPackScope = \"team\" | \"user\";\n\nexport interface SeedPack {\n sid: string;\n name: string;\n description?: string;\n status: SeedPackStatus;\n version?: number;\n contentType?: \"markdown\" | \"files\";\n content?: string;\n summary?: string;\n tags?: string[];\n scopeType?: SeedPackScope;\n scopeSid?: string;\n createdBySid?: string;\n updatedBySid?: string;\n publishedBySid?: string;\n createdAt?: string;\n updatedAt?: string;\n publishedAt?: string;\n}\n\nexport interface SeedPackDraft {\n name: string;\n description?: string;\n content?: string;\n tags?: string[];\n contentType?: \"markdown\" | \"files\";\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\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\nconst getNumber = (record: Record<string, unknown>, key: string): number | undefined => {\n const value = record[key];\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n const parsed = Number(value);\n if (!Number.isNaN(parsed)) {\n return parsed;\n }\n }\n return undefined;\n};\n\nconst getStringArray = (record: Record<string, unknown>, key: string): string[] | undefined => {\n const value = record[key];\n if (Array.isArray(value)) {\n return value.filter((item): item is string => typeof item === \"string\");\n }\n if (typeof value === \"string\") {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n }\n return undefined;\n};\n\nconst toSeedPackStatus = (value?: string): SeedPackStatus => {\n if (value === \"draft\" || value === \"published\" || value === \"archived\") {\n return value;\n }\n return \"draft\";\n};\n\nconst toSeedPackScope = (value?: string): SeedPackScope | undefined => {\n if (value === \"team\" || value === \"user\") {\n return value;\n }\n return undefined;\n};\n\nconst normalizeSeedPack = (record: Record<string, unknown>): SeedPack => {\n const sid = getString(record, \"sid\") ?? getString(record, \"id\") ?? \"\";\n return {\n sid,\n name: getString(record, \"name\") ?? \"Untitled Seed Pack\",\n description: getString(record, \"description\"),\n status: toSeedPackStatus(getString(record, \"status\")),\n version: getNumber(record, \"version\"),\n contentType: (getString(record, \"contentType\") as \"markdown\" | \"files\" | undefined) ?? \"markdown\",\n content: getString(record, \"content\"),\n summary: getString(record, \"summary\"),\n tags: getStringArray(record, \"tags\"),\n scopeType: toSeedPackScope(getString(record, \"scopeType\")),\n scopeSid: getString(record, \"scopeSid\"),\n createdBySid: getString(record, \"createdBySid\"),\n updatedBySid: getString(record, \"updatedBySid\"),\n publishedBySid: getString(record, \"publishedBySid\"),\n createdAt: getString(record, \"createdAt\"),\n updatedAt: getString(record, \"updatedAt\"),\n publishedAt: getString(record, \"publishedAt\"),\n };\n};\n\nconst extractSeedPack = (payload: unknown): SeedPack | null => {\n if (!isRecord(payload)) {\n return null;\n }\n\n const candidate =\n (isRecord(payload.seedPack) && payload.seedPack) ||\n (isRecord(payload.data) && payload.data) ||\n payload;\n\n if (!isRecord(candidate)) {\n return null;\n }\n\n const pack = normalizeSeedPack(candidate);\n if (!pack.sid) {\n return null;\n }\n return pack;\n};\n\nconst extractSeedPackList = (payload: unknown): SeedPack[] => {\n if (Array.isArray(payload)) {\n return payload\n .map((item) => (isRecord(item) ? normalizeSeedPack(item) : null))\n .filter((item): item is SeedPack => Boolean(item?.sid));\n }\n\n if (!isRecord(payload)) {\n return [];\n }\n\n const candidates = [\n payload.seedPacks,\n payload.items,\n payload.results,\n payload.data\n ];\n\n const list = candidates.find(Array.isArray);\n if (!Array.isArray(list)) {\n return [];\n }\n\n return list\n .map((item) => (isRecord(item) ? normalizeSeedPack(item) : null))\n .filter((item): item is SeedPack => Boolean(item?.sid));\n};\n\nconst buildUrl = (path: string): string => {\n const base = usePackageSettingsStore.getState().settings?.gatewayApiUrl?.replace(/\\/$/, \"\");\n if (!base) {\n throw new Error(\"Gateway API is not configured\");\n }\n const normalized = path.startsWith(\"/\") ? path : `/${path}`;\n return `${base}${normalized}`;\n};\n\nconst buildHeaders = (): HeadersInit => {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n const token = authenticationService.getToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n return headers;\n};\n\nconst handleJsonResponse = async <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(\"seedPackService: 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\nconst buildDraftPayload = (draft: SeedPackDraft): Record<string, unknown> => {\n const payload: Record<string, unknown> = {\n name: draft.name,\n contentType: draft.contentType ?? \"markdown\",\n };\n\n if (draft.description !== undefined) {\n payload.description = draft.description;\n }\n\n if (draft.content !== undefined) {\n payload.content = draft.content;\n }\n\n if (draft.tags) {\n payload.tags = draft.tags;\n }\n\n return payload;\n};\n\nexport const listSeedPacks = async (): Promise<SeedPack[]> => {\n const url = buildUrl(\"/seed-packs\");\n try {\n const response = await fetch(url, { method: \"GET\", headers: buildHeaders() });\n const payload = await handleJsonResponse<unknown>(response, \"Failed to load seed packs\");\n return extractSeedPackList(payload);\n } catch (error) {\n debugLogger.error(\"seedPackService: failed to list seed packs\", {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n};\n\nexport const getSeedPack = async (sid: string): Promise<SeedPack> => {\n const url = buildUrl(`/seed-packs/${encodeURIComponent(sid)}`);\n try {\n const response = await fetch(url, { method: \"GET\", headers: buildHeaders() });\n const payload = await handleJsonResponse<unknown>(response, \"Failed to load seed pack\");\n const pack = extractSeedPack(payload);\n if (!pack) {\n throw new Error(\"Seed pack response was empty\");\n }\n return pack;\n } catch (error) {\n debugLogger.error(\"seedPackService: failed to load seed pack\", {\n sid,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n};\n\nexport const createSeedPack = async (draft: SeedPackDraft): Promise<SeedPack> => {\n const url = buildUrl(\"/seed-packs\");\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify(buildDraftPayload(draft)),\n });\n const payload = await handleJsonResponse<unknown>(response, \"Failed to create seed pack\");\n const pack = extractSeedPack(payload);\n if (!pack) {\n throw new Error(\"Seed pack response was empty\");\n }\n return pack;\n } catch (error) {\n debugLogger.error(\"seedPackService: failed to create seed pack\", {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n};\n\nexport const updateSeedPack = async (sid: string, draft: SeedPackDraft): Promise<SeedPack> => {\n const url = buildUrl(`/seed-packs/${encodeURIComponent(sid)}`);\n try {\n const response = await fetch(url, {\n method: \"PUT\",\n headers: buildHeaders(),\n body: JSON.stringify(buildDraftPayload(draft)),\n });\n const payload = await handleJsonResponse<unknown>(response, \"Failed to update seed pack\");\n const pack = extractSeedPack(payload);\n if (!pack) {\n throw new Error(\"Seed pack response was empty\");\n }\n return pack;\n } catch (error) {\n debugLogger.error(\"seedPackService: failed to update seed pack\", {\n sid,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n};\n\nexport const publishSeedPack = async (sid: string): Promise<SeedPack> => {\n const url = buildUrl(`/seed-packs/${encodeURIComponent(sid)}/publish`);\n try {\n const response = await fetch(url, { method: \"POST\", headers: buildHeaders() });\n const payload = await handleJsonResponse<unknown>(response, \"Failed to publish seed pack\");\n const pack = extractSeedPack(payload);\n if (!pack) {\n throw new Error(\"Seed pack response was empty\");\n }\n return pack;\n } catch (error) {\n debugLogger.error(\"seedPackService: failed to publish seed pack\", {\n sid,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n};\n\nexport const archiveSeedPack = async (sid: string): Promise<SeedPack> => {\n const url = buildUrl(`/seed-packs/${encodeURIComponent(sid)}/archive`);\n try {\n const response = await fetch(url, { method: \"POST\", headers: buildHeaders() });\n const payload = await handleJsonResponse<unknown>(response, \"Failed to archive seed pack\");\n const pack = extractSeedPack(payload);\n if (!pack) {\n throw new Error(\"Seed pack response was empty\");\n }\n return pack;\n } catch (error) {\n debugLogger.error(\"seedPackService: failed to archive seed pack\", {\n sid,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n};\n\nexport const deleteSeedPack = async (sid: string): Promise<void> => {\n const url = buildUrl(`/seed-packs/${encodeURIComponent(sid)}`);\n try {\n const response = await fetch(url, { method: \"DELETE\", headers: buildHeaders() });\n if (response.status === 204) {\n return;\n }\n await handleJsonResponse<unknown>(response, \"Failed to delete seed pack\");\n } catch (error) {\n debugLogger.error(\"seedPackService: failed to delete seed pack\", {\n sid,\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-9903-36654D\nconst __banditFingerprint_components_StorageTabtsx = 'BL-FP-53E9DF-19E2';\nconst __auditTrail_components_StorageTabtsx = 'BL-AU-MGOIKVVK-EY8O';\n// File: StorageTab.tsx | Path: src/management/components/StorageTab.tsx | Hash: 990319e2\n\nimport React, { useState, useEffect, useMemo } from 'react';\nimport {\n Box,\n Typography,\n Button,\n Card,\n CardContent,\n LinearProgress,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n Alert,\n Stack,\n Chip,\n Accordion,\n AccordionSummary,\n AccordionDetails,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n CircularProgress,\n Snackbar,\n useTheme,\n ThemeOptions,\n} from '@mui/material';\nimport { debugLogger } from '../../services/logging/debugLogger';\nimport indexedDBService from '../../services/indexedDB/indexedDBService';\nimport { useConversationSyncStore } from '../../store/conversationSyncStore';\nimport {\n ChatIcon,\n CheckCircleIcon,\n CleaningServicesIcon,\n DeleteIcon,\n DescriptionIcon,\n ErrorIcon,\n ExpandMoreIcon,\n InfoIcon,\n PersonIcon,\n RefreshIcon,\n SettingsIcon,\n StorageIcon,\n WarningIcon,\n} from \"../../icons/lucide-icons\";\n\n// Storage category types\ninterface StorageCategory {\n name: string;\n icon: React.ElementType;\n color: string;\n size: number;\n itemCount: number;\n description: string;\n stores: string[];\n canClear: boolean;\n clearWarning?: string;\n}\n\ninterface StorageTabProps {\n currentTheme: ThemeOptions;\n}\n\ninterface StorageQuotaState {\n used: number;\n quota: number;\n available: number;\n browserQuotaEstimate: number;\n}\n\nconst DEFAULT_DISPLAY_QUOTA_BYTES = 1024 * 1024 * 1024; // Default 1 GB cap when the browser doesn't report a quota\nconst MAX_DISPLAY_QUOTA_BYTES = 5 * 1024 * 1024 * 1024; // Clamp giant device-wide quotas to 5 GB for display clarity\n\n// Utility functions for storage management\nconst formatBytes = (bytes: number): string => {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n};\n\nconst getStorageQuota = async (): Promise<{ used: number; quota: number }> => {\n try {\n if ('storage' in navigator && 'estimate' in navigator.storage) {\n const estimate = await navigator.storage.estimate();\n return {\n used: estimate.usage || 0,\n quota: estimate.quota || 0,\n };\n }\n } catch (error) {\n debugLogger.warn('Could not get storage estimate', { error });\n }\n return { used: 0, quota: 0 };\n};\n\nconst getIndexedDBSize = async (): Promise<StorageCategory[]> => {\n const categories: StorageCategory[] = [];\n \n try {\n debugLogger.info('Starting IndexedDB size estimation');\n \n // List all available databases for debugging\n try {\n const databases = await indexedDB.databases();\n debugLogger.info('Available IndexedDB databases:', { \n databases: databases.map(db => ({ name: db.name, version: db.version })) \n });\n } catch (error) {\n debugLogger.warn('Could not list databases', { error });\n }\n \n // Process each category individually to prevent one timeout from breaking everything\n \n // Try multiple possible database names for conversations\n const conversationDbNames = ['bandit-conversations', 'banditConversations', 'conversations'];\n let chatSize = { size: 0, count: 0 };\n let foundConversationDb = '';\n \n for (const dbName of conversationDbNames) {\n try {\n const result = await estimateStoreSize(dbName, 'conversations');\n if (result.count > 0) {\n chatSize = result;\n foundConversationDb = dbName;\n debugLogger.info(`Found conversations in database: ${dbName}`);\n break;\n }\n } catch (error) {\n debugLogger.warn(`Failed to check conversations in ${dbName}`, { error });\n }\n }\n \n categories.push({\n name: 'Chat History',\n icon: ChatIcon,\n color: '#4caf50',\n size: chatSize.size,\n itemCount: chatSize.count,\n description: 'Conversation history and messages',\n stores: foundConversationDb ? [`${foundConversationDb}.conversations`] : [],\n canClear: chatSize.count > 0,\n clearWarning: 'This will permanently delete all your chat conversations and message history.'\n });\n \n debugLogger.info(`Chat History category created:`, { \n itemCount: chatSize.count, \n size: chatSize.size, \n canClear: chatSize.count > 0,\n foundDb: foundConversationDb \n });\n\n // Try multiple possible database names for knowledge\n const knowledgeDbNames = ['bandit-knowledge', 'banditKnowledge', 'knowledge'];\n let knowledgeSize = { size: 0, count: 0 };\n let foundKnowledgeDb = '';\n \n for (const dbName of knowledgeDbNames) {\n try {\n const result = await estimateStoreSize(dbName, 'documents');\n debugLogger.info(`Knowledge database ${dbName} check result:`, { \n size: result.size, \n count: result.count, \n sizeFormatted: `${(result.size / 1024).toFixed(2)} KB` \n });\n if (result.count > 0) {\n knowledgeSize = result;\n foundKnowledgeDb = dbName;\n debugLogger.info(`Found knowledge documents in database: ${dbName}`, { \n totalSize: result.size, \n itemCount: result.count \n });\n break;\n }\n } catch (error) {\n debugLogger.warn(`Failed to check knowledge in ${dbName}`, { error });\n }\n }\n \n categories.push({\n name: 'Knowledge Documents',\n icon: DescriptionIcon,\n color: '#2196f3',\n size: knowledgeSize.size,\n itemCount: knowledgeSize.count,\n description: 'Uploaded documents and their embeddings',\n stores: foundKnowledgeDb ? [`${foundKnowledgeDb}.documents`] : [],\n canClear: knowledgeSize.count > 0,\n clearWarning: 'This will remove all uploaded documents and their AI embeddings. You will need to re-upload documents.'\n });\n\n debugLogger.info(`Knowledge Documents category created:`, { \n itemCount: knowledgeSize.count, \n size: knowledgeSize.size, \n sizeFormatted: `${(knowledgeSize.size / 1024).toFixed(2)} KB`,\n canClear: knowledgeSize.count > 0,\n foundDb: foundKnowledgeDb \n });\n\n // Try multiple possible database names for memory (with timeout protection)\n const memoryDbNames = ['bandit-memory-db', 'banditMemories', 'bandit-memories'];\n let memorySize = { size: 0, count: 0 };\n let foundMemoryDb = '';\n \n for (const dbName of memoryDbNames) {\n try {\n const result = await estimateStoreSize(dbName, 'memories');\n if (result.count > 0) {\n memorySize = result;\n foundMemoryDb = dbName;\n debugLogger.info(`Found memories in database: ${dbName}`);\n break;\n }\n } catch (error) {\n debugLogger.warn(`Failed to check memories in ${dbName}`, { error });\n }\n }\n \n categories.push({\n name: 'AI Memories',\n icon: PersonIcon,\n color: '#ff9800',\n size: memorySize.size,\n itemCount: memorySize.count,\n description: 'AI memory entries and learned patterns',\n stores: foundMemoryDb ? [`${foundMemoryDb}.memories`] : [],\n canClear: memorySize.count > 0,\n clearWarning: 'This will delete all AI memory entries and learned conversation patterns.'\n });\n\n // Try multiple possible database names for config\n const configDbNames = ['banditConfig', 'bandit-config'];\n let configSize = { size: 0, count: 0 };\n let foundConfigDb = '';\n \n for (const dbName of configDbNames) {\n try {\n const result = await estimateStoreSize(dbName, 'config');\n if (result.count > 0) {\n configSize = result;\n foundConfigDb = dbName;\n debugLogger.info(`Found config in database: ${dbName}`);\n break;\n }\n } catch (error) {\n debugLogger.warn(`Failed to check config in ${dbName}`, { error });\n }\n }\n \n categories.push({\n name: 'App Settings & Models',\n icon: SettingsIcon,\n color: '#9c27b0',\n size: configSize.size,\n itemCount: configSize.count,\n description: 'Custom models, app settings, and user preferences',\n stores: foundConfigDb ? [`${foundConfigDb}.config`] : [],\n canClear: configSize.count > 0,\n clearWarning: 'This will delete all custom AI models, app settings, themes, and preferences. The app will reset to defaults.'\n });\n\n // Check for AI Query databases (with timeout protection)\n const queryDbNames = ['banditAIQuery', 'ai-query-db'];\n let querySize = { size: 0, count: 0 };\n let foundQueryDb = '';\n \n for (const dbName of queryDbNames) {\n try {\n const result = await estimateStoreSize(dbName, 'queries');\n if (result.count > 0) {\n querySize = result;\n foundQueryDb = dbName;\n debugLogger.info(`Found AI queries in database: ${dbName}`);\n break;\n }\n } catch (error) {\n debugLogger.warn(`Failed to check queries in ${dbName}`, { error });\n }\n }\n \n if (querySize.count > 0) {\n categories.push({\n name: 'AI Query Cache',\n icon: PersonIcon,\n color: '#ff5722',\n size: querySize.size,\n itemCount: querySize.count,\n description: 'Cached AI query results and responses',\n stores: [`${foundQueryDb}.queries`],\n canClear: true,\n clearWarning: 'This will delete all cached AI query results.'\n });\n }\n \n debugLogger.info('Categories created:', { \n totalCategories: categories.length,\n categories: categories.map(cat => ({ \n name: cat.name, \n itemCount: cat.itemCount, \n canClear: cat.canClear,\n storesLength: cat.stores.length \n }))\n });\n \n return categories;\n\n } catch (error) {\n debugLogger.error('Error estimating IndexedDB size', { error });\n // Return empty categories on error so UI doesn't hang\n return [];\n }\n};\n\nconst estimateStoreSize = async (dbName: string, storeName: string): Promise<{ size: number; count: number }> => {\n try {\n debugLogger.info(`Attempting to estimate size for ${dbName}.${storeName}`);\n \n // Add a timeout for individual store estimation to prevent hanging\n const timeoutPromise = new Promise<{ size: number; count: number }>((_, reject) => {\n setTimeout(() => reject(new Error(`Store estimation timeout for ${dbName}.${storeName}`)), 3000);\n });\n \n const estimationPromise = (async () => {\n // Try to access the database directly instead of checking if it exists first\n const storeConfigs = [{ name: storeName, keyPath: \"id\" }];\n \n try {\n const items = await indexedDBService.getAll(dbName, 1, storeName, storeConfigs);\n const rawItems: unknown[] = Array.isArray(items) ? items : [];\n debugLogger.info(`Retrieved ${rawItems.length} items from ${dbName}.${storeName}`);\n \n if (rawItems.length === 0) {\n debugLogger.info(`No items found in ${dbName}.${storeName}`);\n return { size: 0, count: 0 };\n }\n \n // Estimate size by converting to JSON and measuring length\n const totalSize = rawItems.reduce<number>((acc, item) => {\n try {\n return acc + JSON.stringify(item ?? '').length * 2; // Rough estimate (UTF-16)\n } catch {\n return acc + 1000; // Fallback estimate for non-serializable items\n }\n }, 0);\n const itemCount = rawItems.length;\n \n debugLogger.info(`Estimated size for ${dbName}.${storeName}: ${totalSize} bytes, ${itemCount} items`);\n return { size: totalSize, count: itemCount };\n } catch (dbError) {\n debugLogger.info(`Database ${dbName} or store ${storeName} does not exist or is inaccessible`, { error: dbError });\n return { size: 0, count: 0 };\n }\n })();\n \n // Race between estimation and timeout\n return await Promise.race([estimationPromise, timeoutPromise]);\n } catch (error) {\n debugLogger.warn(`Failed to estimate size for ${dbName}.${storeName}`, { error });\n return { size: 0, count: 0 };\n }\n};\n\nconst clearStorageCategory = async (category: StorageCategory): Promise<void> => {\n debugLogger.info(`Clearing storage category: ${category.name}`);\n \n for (const storeSpec of category.stores) {\n try {\n const [dbName, storeName] = storeSpec.split('.');\n debugLogger.info(`Clearing store: ${dbName}.${storeName}`);\n \n // Skip if either part is undefined\n if (!dbName || !storeName) {\n debugLogger.warn(`Invalid store specification: ${storeSpec}`);\n continue;\n }\n \n // Get all items first\n const storeConfigs = [{ name: storeName, keyPath: \"id\" }];\n const items = await indexedDBService.getAll(dbName, 1, storeName, storeConfigs);\n\n const records: unknown[] = Array.isArray(items) ? items : [];\n\n if (records.length > 0) {\n // Delete each item by its key\n for (const rawItem of records) {\n if (rawItem && typeof rawItem === 'object') {\n const record = rawItem as Record<string, unknown>;\n const candidate = record['id'] ?? record['key'] ?? record['name'];\n if (typeof candidate === 'string' && candidate.length > 0) {\n await indexedDBService.delete(dbName, 1, storeName, candidate, storeConfigs);\n }\n }\n }\n debugLogger.info(`Cleared ${records.length} items from ${dbName}.${storeName}`);\n } else {\n debugLogger.info(`No items found in ${dbName}.${storeName}`);\n }\n } catch (error) {\n debugLogger.error(`Failed to clear store: ${storeSpec}`, { error });\n // Don't throw error, continue with other stores\n }\n }\n};\n\n// Function to completely clear a database\nconst clearEntireDatabase = async (dbName: string): Promise<void> => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n \n deleteRequest.onsuccess = () => {\n debugLogger.info(`Successfully deleted database: ${dbName}`);\n resolve();\n };\n \n deleteRequest.onerror = () => {\n debugLogger.error(`Failed to delete database: ${dbName}`, { error: deleteRequest.error });\n reject(deleteRequest.error);\n };\n \n deleteRequest.onblocked = () => {\n debugLogger.warn(`Database deletion blocked: ${dbName}. Close all tabs using this database.`);\n // Still resolve as the deletion will complete when other tabs are closed\n resolve();\n };\n });\n};\n\nconst StorageTab: React.FC<StorageTabProps> = ({ currentTheme }) => {\n const theme = useTheme();\n const [storageQuota, setStorageQuota] = useState<StorageQuotaState>({\n used: 0,\n quota: 0,\n available: 0,\n browserQuotaEstimate: 0,\n });\n const [storageCategories, setStorageCategories] = useState<StorageCategory[]>([]);\n const [loading, setLoading] = useState(true);\n const [clearAllDialogOpen, setClearAllDialogOpen] = useState(false);\n const [clearCategoryDialog, setClearCategoryDialog] = useState<StorageCategory | null>(null);\n const [clearing, setClearing] = useState(false);\n const [snackbarMessage, setSnackbarMessage] = useState('');\n const [showSnackbar, setShowSnackbar] = useState(false);\n const [snackbarSeverity, setSnackbarSeverity] = useState<'success' | 'error'>('success');\n\n const { syncEnabled, isAdvancedVectorFeaturesEnabled } = useConversationSyncStore((state) => ({\n syncEnabled: state.syncEnabled,\n isAdvancedVectorFeaturesEnabled: state.isAdvancedVectorFeaturesEnabled,\n }));\n const syncFeaturesActive = syncEnabled || isAdvancedVectorFeaturesEnabled;\n const usageSummaryMessage = syncFeaturesActive\n ? 'IndexedDB/local storage is shown below. Conversation sync or advanced vector storage may copy items to your configured gateway.'\n : 'IndexedDB/local storage lives entirely in this browser when sync features are disabled.';\n const storageStatusPrimary = syncFeaturesActive ? 'IndexedDB/local storage (sync features enabled)' : 'IndexedDB/local storage only';\n\n\n // Load storage data\n const loadStorageData = async () => {\n setLoading(true);\n try {\n debugLogger.info('Loading storage data...');\n \n const [quotaEstimate, categories] = await Promise.all([\n getStorageQuota(),\n getIndexedDBSize()\n ]);\n\n const calculatedUsed = categories.reduce((sum, cat) => sum + cat.size, 0);\n const browserQuota = quotaEstimate.quota && quotaEstimate.quota > 0 ? quotaEstimate.quota : 0;\n const normalizedQuota = browserQuota > 0\n ? Math.min(Math.max(browserQuota, calculatedUsed || DEFAULT_DISPLAY_QUOTA_BYTES), MAX_DISPLAY_QUOTA_BYTES)\n : Math.max(DEFAULT_DISPLAY_QUOTA_BYTES, calculatedUsed);\n\n const available = Math.max(normalizedQuota - calculatedUsed, 0);\n\n debugLogger.info('Storage data loaded successfully', { \n browserQuota,\n browserUsageEstimate: quotaEstimate.used,\n normalizedQuota,\n calculatedUsed,\n available,\n categoriesCount: categories.length,\n categories: categories.map(cat => ({ \n name: cat.name, \n itemCount: cat.itemCount, \n size: cat.size,\n canClear: cat.canClear \n }))\n });\n\n setStorageQuota({\n used: calculatedUsed,\n quota: normalizedQuota,\n available,\n browserQuotaEstimate: browserQuota,\n });\n setStorageCategories(categories);\n } catch (error) {\n debugLogger.error('Failed to load storage data', { error });\n setSnackbarMessage('Failed to load storage data. Please try refreshing.');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n // Set empty data so UI doesn't break\n setStorageCategories([]);\n setStorageQuota({ used: 0, quota: DEFAULT_DISPLAY_QUOTA_BYTES, available: DEFAULT_DISPLAY_QUOTA_BYTES, browserQuotaEstimate: 0 });\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n loadStorageData();\n }, []);\n\n // Calculate totals\n const totalUsed = useMemo(() => {\n return storageCategories.reduce((sum, cat) => sum + cat.size, 0);\n }, [storageCategories]);\n\n\n const usagePercentage = useMemo(() => {\n if (storageQuota.quota === 0) return 0;\n const percentage = Math.min((storageQuota.used / storageQuota.quota) * 100, 100);\n // Show at least 0.1% if there's any usage to make it visible\n return percentage > 0 && percentage < 0.1 ? 0.1 : percentage;\n }, [storageQuota]);\n\n const clearableCategories = useMemo(() => {\n return storageCategories.filter(cat => cat.canClear);\n }, [storageCategories]);\n\n // Handle category clearing\n const handleClearCategory = async (category: StorageCategory) => {\n setClearing(true);\n try {\n await clearStorageCategory(category);\n setSnackbarMessage(`Successfully cleared ${category.name}`);\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n setClearCategoryDialog(null);\n await loadStorageData(); // Refresh data\n } catch (error) {\n setSnackbarMessage(`Failed to clear ${category.name}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n debugLogger.error('Failed to clear category', { category: category.name, error });\n } finally {\n setClearing(false);\n }\n };\n\n // Handle clear all\n const handleClearAll = async () => {\n setClearing(true);\n try {\n for (const category of clearableCategories) {\n await clearStorageCategory(category);\n }\n setSnackbarMessage('Successfully cleared all storage data');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n setClearAllDialogOpen(false);\n await loadStorageData(); // Refresh data\n } catch (error) {\n setSnackbarMessage('Failed to clear all storage data');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n debugLogger.error('Failed to clear all storage', { error });\n } finally {\n setClearing(false);\n }\n };\n\n // Handle nuclear clear (completely delete all databases)\n const handleNuclearClear = async () => {\n if (!window.confirm('⚠️ NUCLEAR CLEAR WARNING ⚠️\\n\\nThis will PERMANENTLY DELETE ALL DATABASES and cannot be undone!\\n\\nDifference from \"Clear All Data\":\\n• Clear All Data: Deletes items but keeps database structure\\n• Nuclear Clear: Completely destroys databases and reloads app\\n\\nThis includes:\\n- All chat history\\n- All knowledge documents\\n- All custom models\\n- All app settings\\n- Everything!\\n\\nAre you absolutely sure?')) {\n return;\n }\n \n if (!window.confirm('This is your FINAL WARNING!\\n\\nClick OK to permanently delete EVERYTHING or Cancel to abort.')) {\n return;\n }\n \n setClearing(true);\n try {\n // Include ALL databases seen in the user's system\n const databases = [\n // Current databases\n 'banditConfig', 'bandit-knowledge', 'bandit-conversations', 'bandit-memory-db',\n // Legacy/duplicate databases\n 'banditConversations', 'banditKnowledge', 'banditMemories', 'banditAIQuery',\n 'ai-query-db', 'knowledge'\n ];\n \n for (const dbName of databases) {\n await clearEntireDatabase(dbName);\n }\n \n // Also clear localStorage and sessionStorage\n localStorage.clear();\n sessionStorage.clear();\n \n setSnackbarMessage('Nuclear clear completed! All data has been permanently deleted.');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n \n // Reload the page after a delay to reset everything\n setTimeout(() => {\n window.location.reload();\n }, 2000);\n \n } catch (error) {\n setSnackbarMessage('Nuclear clear failed - some data may remain');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n debugLogger.error('Nuclear clear failed', { error });\n } finally {\n setClearing(false);\n }\n };\n\n if (loading) {\n return (\n <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', py: 8 }}>\n <CircularProgress />\n <Typography variant=\"body1\" color=\"text.secondary\" sx={{ ml: 2 }}>\n Analyzing storage usage...\n </Typography>\n </Box>\n );\n }\n\n return (\n <Box>\n <Box sx={{ px: { xs: 2, sm: 4, md: 6 }, pt: 3, pb: 5 }}>\n {/* Header */}\n <Box sx={{ mb: 4 }}>\n <Box sx={{ \n display: 'flex', \n flexDirection: { xs: 'column', sm: 'row' },\n justifyContent: 'space-between', \n alignItems: { xs: 'stretch', sm: 'flex-start' }, \n gap: { xs: 2, sm: 0 },\n mb: 2 \n }}>\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"h5\" color=\"text.primary\" sx={{ mb: 1, fontWeight: 600 }}>\n Storage Management\n </Typography>\n <Typography variant=\"body1\" color=\"text.secondary\">\n Monitor and manage your local browser storage usage\n </Typography>\n </Box>\n <Box sx={{ \n display: 'flex', \n gap: 1, \n flexWrap: { xs: 'wrap', sm: 'nowrap' },\n justifyContent: { xs: 'stretch', sm: 'flex-end' },\n width: { xs: '100%', sm: 'auto' }\n }}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={loadStorageData}\n disabled={loading}\n sx={{ \n minWidth: { xs: 'auto', sm: 'fit-content' },\n flex: { xs: '1', sm: '0 0 auto' },\n minHeight: 36\n }}\n >\n <Box sx={{ display: { xs: 'none', sm: 'flex' }, alignItems: 'center', gap: 1 }}>\n <RefreshIcon fontSize=\"medium\" />\n Refresh\n </Box>\n <Box sx={{ display: { xs: 'flex', sm: 'none' }, alignItems: 'center', justifyContent: 'center' }}>\n <RefreshIcon fontSize=\"medium\" />\n </Box>\n </Button>\n {clearableCategories.length > 0 && (\n <>\n <Button\n variant=\"outlined\"\n color=\"error\"\n size=\"small\"\n startIcon={<CleaningServicesIcon sx={{ display: { xs: 'none', sm: 'inline-flex' } }} />}\n onClick={() => setClearAllDialogOpen(true)}\n sx={{\n minWidth: { xs: 'auto', sm: 'fit-content' },\n flex: { xs: '1', sm: '0 0 auto' },\n px: { xs: 1, sm: 2 }\n }}\n >\n <Box sx={{ display: { xs: 'none', sm: 'inline' } }}>Clear All Data</Box>\n <Box sx={{ display: { xs: 'inline', sm: 'none' } }}>Clear All</Box>\n </Button>\n <Button\n variant=\"outlined\"\n color=\"error\"\n size=\"small\"\n startIcon={<DeleteIcon sx={{ display: { xs: 'none', sm: 'inline-flex' } }} />}\n onClick={() => handleNuclearClear()}\n sx={{ \n minWidth: { xs: 'auto', sm: 'fit-content' },\n flex: { xs: '1', sm: '0 0 auto' },\n px: { xs: 1, sm: 2 }\n }}\n >\n <Box sx={{ display: { xs: 'none', sm: 'inline' } }}>Nuclear Clear</Box>\n <Box sx={{ display: { xs: 'inline', sm: 'none' } }}>Nuclear</Box>\n </Button>\n </>\n )}\n </Box>\n </Box>\n </Box>\n\n {/* Storage Overview */}\n <Box sx={{ mb: 4 }}>\n {/* Storage Quota - Full width on mobile */}\n <Card sx={{ mb: 3 }}>\n <CardContent sx={{ \n display: 'flex', \n flexDirection: 'column',\n minHeight: 180 \n }}>\n <Typography variant=\"h6\" gutterBottom sx={{ fontWeight: 600, color: \"text.primary\" }}>\n <StorageIcon sx={{ mr: 1, verticalAlign: 'middle' }} />\n Storage Quota\n </Typography>\n <Box sx={{ mb: 2, flex: 1 }}>\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1, mb: 2 }}>\n <Chip \n label={`${formatBytes(storageQuota.used)} Used`} \n color=\"warning\" \n size=\"small\" \n variant=\"outlined\"\n />\n <Chip \n label={`${formatBytes(storageQuota.available)} Available`} \n color=\"success\" \n size=\"small\" \n variant=\"outlined\"\n />\n <Chip \n label={`${formatBytes(storageQuota.quota)} Total`} \n color=\"info\" \n size=\"small\" \n variant=\"outlined\"\n />\n {storageQuota.browserQuotaEstimate > 0 &&\n storageQuota.quota > 0 &&\n Math.abs(storageQuota.browserQuotaEstimate - storageQuota.quota) > storageQuota.quota * 0.05 && (\n <Chip\n label={`≈${formatBytes(storageQuota.browserQuotaEstimate)} Browser Estimate`}\n color=\"default\"\n size=\"small\"\n variant=\"outlined\"\n />\n )}\n </Box>\n <LinearProgress\n variant=\"determinate\"\n value={usagePercentage}\n sx={{\n height: 8,\n borderRadius: 4,\n bgcolor: 'action.hover',\n '& .MuiLinearProgress-bar': {\n borderRadius: 4,\n bgcolor: usagePercentage > 80 ? 'error.main' : usagePercentage > 60 ? 'warning.main' : 'success.main',\n }\n }}\n />\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mt: 0.5, display: 'block' }}>\n {usagePercentage.toFixed(1)}% used\n </Typography>\n </Box>\n {usagePercentage > 80 && (\n <Alert severity=\"warning\" sx={{ mt: 'auto' }}>\n Storage usage is high. Consider clearing unused data.\n </Alert>\n )}\n </CardContent>\n </Card>\n\n {/* Usage Summary - Full width on mobile */}\n <Card>\n <CardContent sx={{ \n display: 'flex', \n flexDirection: 'column',\n minHeight: 140 \n }}>\n <Typography variant=\"h6\" gutterBottom sx={{ fontWeight: 600, color: \"text.primary\" }}>\n Usage Summary\n </Typography>\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1, mb: 2 }}>\n <Chip \n label={`${storageCategories.length} Categories`} \n color=\"primary\" \n size=\"small\" \n />\n <Chip \n label={`${storageCategories.reduce((sum, cat) => sum + cat.itemCount, 0)} Items`} \n color=\"secondary\" \n size=\"small\" \n />\n <Chip \n label={`${formatBytes(totalUsed)} Used`} \n color=\"info\" \n size=\"small\" \n />\n </Box>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 'auto' }}>\n {usageSummaryMessage}\n </Typography>\n </CardContent>\n </Card>\n </Box>\n\n {/* Storage Categories */}\n <Typography variant=\"h6\" gutterBottom sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n Storage Categories\n </Typography>\n\n <Box>\n {storageCategories.length === 0 ? (\n <Alert severity=\"info\" sx={{ mt: 2 }}>\n <Typography variant=\"body2\">\n No storage data found. This could mean:\n </Typography>\n <Typography variant=\"body2\" component=\"ul\" sx={{ mt: 1, pl: 2 }}>\n <li>All databases are empty</li>\n <li>Data is stored under different names</li>\n <li>There was an error accessing the databases</li>\n </Typography>\n <Typography variant=\"body2\" sx={{ mt: 1 }}>\n Try clicking \"Refresh\" or check the browser console for more details.\n </Typography>\n </Alert>\n ) : (\n <Stack spacing={2}>\n {storageCategories.map((category) => {\n const IconComponent = category.icon;\n // Calculate percentage relative to total storage quota for more meaningful display\n const categoryPercentage = storageQuota.quota > 0 ? (category.size / storageQuota.quota) * 100 : 0;\n // Also calculate percentage relative to total used storage\n const categoryRelativePercentage = totalUsed > 0 ? (category.size / totalUsed) * 100 : 0;\n \n debugLogger.info(`Category ${category.name} percentage calculation:`, {\n categorySize: category.size,\n totalUsed,\n storageQuota: storageQuota.quota,\n categoryPercentage: categoryPercentage.toFixed(2),\n categoryRelativePercentage: categoryRelativePercentage.toFixed(2)\n });\n \n return (\n <Accordion key={category.name} sx={{ bgcolor: 'background.paper' }}>\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls={`${category.name}-content`}\n id={`${category.name}-header`}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', width: '100%', pr: 2 }}>\n <IconComponent sx={{ color: category.color, mr: 2 }} />\n <Box sx={{ flex: 1 }}>\n <Typography \n variant=\"body1\" \n style={{ \n fontWeight: 600,\n color: theme.palette.mode === 'dark' ? '#ffffff' : theme.palette.text.primary\n }}\n >\n {category.name}\n </Typography>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2, mt: 0.5 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {formatBytes(category.size)}\n </Typography>\n <Chip \n label={`${category.itemCount} items`} \n size=\"small\" \n variant=\"outlined\"\n />\n <Box sx={{ flex: 1, mx: 2 }}>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(categoryRelativePercentage, 100)} // Use relative percentage for visual bar\n sx={{\n height: 4,\n borderRadius: 2,\n bgcolor: 'action.hover',\n '& .MuiLinearProgress-bar': {\n borderRadius: 2,\n bgcolor: category.color,\n }\n }}\n />\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {categoryRelativePercentage.toFixed(1)}%\n </Typography>\n </Box>\n </Box>\n </Box>\n </AccordionSummary>\n <AccordionDetails>\n <Box sx={{ pl: 5 }}>\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\n {category.description}\n </Typography>\n \n <Typography variant=\"subtitle2\" gutterBottom>\n Storage Locations:\n </Typography>\n <List dense>\n {category.stores.map((store) => (\n <ListItem key={store} sx={{ py: 0.5 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <StorageIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary={store}\n primaryTypographyProps={{ variant: 'body2', fontFamily: 'monospace' }}\n />\n </ListItem>\n ))}\n </List>\n\n {category.canClear ? (\n <Box sx={{ mt: 2, pt: 2, borderTop: 1, borderColor: 'divider' }}>\n <Button\n variant=\"outlined\"\n color=\"error\"\n size=\"small\"\n startIcon={<DeleteIcon />}\n onClick={() => setClearCategoryDialog(category)}\n disabled={clearing}\n >\n Clear {category.name}\n </Button>\n {category.clearWarning && (\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n <Typography variant=\"caption\">\n {category.clearWarning}\n </Typography>\n </Alert>\n )}\n </Box>\n ) : (\n <Alert severity=\"info\" sx={{ mt: 2 }}>\n <Typography variant=\"caption\">\n {category.itemCount === 0 ? 'This category is empty.' : 'This category cannot be cleared automatically.'}\n </Typography>\n </Alert>\n )}\n </Box>\n </AccordionDetails>\n </Accordion>\n );\n })}\n </Stack>\n )}\n </Box>\n\n {/* Storage Tips */}\n <Card sx={{ mt: 4 }}>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom sx={{ fontWeight: 600, color: \"text.primary\" }}>\n <InfoIcon sx={{ mr: 1, verticalAlign: 'middle' }} />\n Storage Tips & Clear Options\n </Typography>\n <List>\n <ListItem>\n <ListItemIcon>\n <CheckCircleIcon\n sx={{\n color: syncFeaturesActive\n ? theme.palette.warning.main\n : theme.palette.success.main,\n }}\n />\n </ListItemIcon>\n <ListItemText \n primary={storageStatusPrimary}\n secondary={\n syncFeaturesActive\n ? 'Some features (conversation sync or advanced vector storage) can sync items to your configured gateway storage.'\n : 'With conversation sync and advanced vector storage turned off, everything stays in this browser.'\n }\n />\n </ListItem>\n <ListItem>\n <ListItemIcon>\n <CleaningServicesIcon color=\"info\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Clear All Data (Safe)\"\n secondary=\"Deletes all items but keeps database structure intact. App continues working normally.\"\n />\n </ListItem>\n <ListItem>\n <ListItemIcon>\n <DeleteIcon color=\"error\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Nuclear Clear (Complete Reset)\"\n secondary=\"Completely destroys all databases and forces app reload. Use only for complete reset.\"\n />\n </ListItem>\n <ListItem>\n <ListItemIcon>\n <WarningIcon color=\"warning\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Backup important data\"\n secondary=\"Export custom models and important documents before clearing storage\"\n />\n </ListItem>\n </List>\n </CardContent>\n </Card>\n\n {/* Clear Category Dialog */}\n <Dialog \n open={!!clearCategoryDialog} \n onClose={() => setClearCategoryDialog(null)}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <WarningIcon color=\"warning\" />\n Clear {clearCategoryDialog?.name}?\n </Box>\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n This will permanently delete all data in the \"{clearCategoryDialog?.name}\" category.\n </DialogContentText>\n {clearCategoryDialog?.clearWarning && (\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n {clearCategoryDialog.clearWarning}\n </Alert>\n )}\n {clearCategoryDialog && (\n <Box sx={{ mt: 2, p: 2, bgcolor: 'action.hover', borderRadius: 1 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n <strong>Will clear:</strong>\n </Typography>\n <Typography variant=\"body2\" sx={{ fontFamily: 'monospace', mt: 1 }}>\n • {clearCategoryDialog.itemCount} items<br/>\n • {formatBytes(clearCategoryDialog.size)} of data<br/>\n • {clearCategoryDialog.stores.length} storage location{clearCategoryDialog.stores.length !== 1 ? 's' : ''}\n </Typography>\n </Box>\n )}\n </DialogContent>\n <DialogActions>\n <Button \n onClick={() => setClearCategoryDialog(null)}\n disabled={clearing}\n >\n Cancel\n </Button>\n <Button\n onClick={() => clearCategoryDialog && handleClearCategory(clearCategoryDialog)}\n color=\"error\"\n variant=\"contained\"\n startIcon={clearing ? <CircularProgress size={16} /> : <DeleteIcon />}\n disabled={clearing}\n >\n {clearing ? 'Clearing...' : 'Clear Data'}\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Clear All Dialog */}\n <Dialog \n open={clearAllDialogOpen} \n onClose={() => setClearAllDialogOpen(false)}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <ErrorIcon color=\"error\" />\n Clear All Storage Data?\n </Box>\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n This will permanently delete ALL your local data including:\n </DialogContentText>\n <List dense sx={{ mt: 1 }}>\n {clearableCategories.map((category) => (\n <ListItem key={category.name}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <category.icon fontSize=\"small\" sx={{ color: category.color }} />\n </ListItemIcon>\n <ListItemText \n primary={category.name}\n secondary={`${category.itemCount} items • ${formatBytes(category.size)}`}\n />\n </ListItem>\n ))}\n </List>\n <Alert severity=\"error\" sx={{ mt: 2 }}>\n <Typography variant=\"body2\">\n <strong>This action cannot be undone!</strong> Make sure to export any important data before proceeding.\n </Typography>\n </Alert>\n </DialogContent>\n <DialogActions>\n <Button \n onClick={() => setClearAllDialogOpen(false)}\n disabled={clearing}\n >\n Cancel\n </Button>\n <Button\n onClick={handleClearAll}\n color=\"error\"\n variant=\"contained\"\n startIcon={clearing ? <CircularProgress size={16} /> : <CleaningServicesIcon />}\n disabled={clearing}\n >\n {clearing ? 'Clearing All...' : 'Clear All Data'}\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Snackbar */}\n <Snackbar\n open={showSnackbar}\n autoHideDuration={4000}\n onClose={() => setShowSnackbar(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Alert\n onClose={() => setShowSnackbar(false)}\n severity={snackbarSeverity}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {snackbarMessage}\n </Alert>\n </Snackbar>\n </Box>\n </Box>\n );\n};\n\nexport default StorageTab;\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-8422-DD3359\nconst __banditFingerprint_components_ProviderTabtsx = 'BL-FP-40A439-27B6';\nconst __auditTrail_components_ProviderTabtsx = 'BL-AU-MGOIKVVK-2GRA';\n// File: ProviderTab.tsx | Path: src/management/components/ProviderTab.tsx | Hash: 842227b6\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport {\n Box,\n Typography,\n Paper,\n Button,\n TextField,\n MenuItem,\n Chip,\n Snackbar,\n Alert,\n useTheme,\n useMediaQuery,\n} from '@mui/material';\nimport { useAIProviderStore } from '../../store/aiProviderStore';\nimport { usePackageSettingsStore } from '../../store/packageSettingsStore';\nimport { AIProviderConfig, AIProviderType } from '../../services/ai-provider/types/common.types';\nimport { aiProviderInitService } from '../../services/ai-provider-init.service';\nimport { AIProviderFactory } from '../../services/ai-provider/ai-provider.factory';\nimport { debugLogger } from '../../services/logging/debugLogger';\nimport indexedDBService from '../../services/indexedDB/indexedDBService';\n\ntype PersistedProviderConfig = Omit<AIProviderConfig, 'tokenFactory'> & { id: string };\ntype GatewayBackendProvider = NonNullable<AIProviderConfig['provider']>;\n\nexport const ProviderTab: React.FC = () => {\n const { provider: currentProvider, config: currentProviderConfig } = useAIProviderStore();\n const { settings: packageSettings } = usePackageSettingsStore();\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n\n const getSuggestedModel = useCallback((type: AIProviderType): string => {\n const configuredDefault = packageSettings?.defaultModel?.trim();\n if (configuredDefault) {\n return configuredDefault;\n }\n\n switch (type) {\n case AIProviderType.OPENAI:\n return 'gpt-4o-mini';\n case AIProviderType.XAI:\n return 'grok-beta';\n case AIProviderType.BANDIT:\n return 'bandit-core-1';\n default:\n return '';\n }\n }, [packageSettings?.defaultModel]);\n\n const applyDefaultModel = useCallback((config: AIProviderConfig): AIProviderConfig => {\n const normalized = { ...config } as AIProviderConfig & { defaultModel?: string };\n const trimmed = typeof normalized.defaultModel === 'string' ? normalized.defaultModel.trim() : undefined;\n const requiresModel =\n normalized.type === AIProviderType.OPENAI ||\n normalized.type === AIProviderType.XAI ||\n normalized.type === AIProviderType.BANDIT;\n\n if (trimmed) {\n normalized.defaultModel = trimmed;\n return normalized;\n }\n\n if (!requiresModel) {\n delete normalized.defaultModel;\n return normalized;\n }\n\n const suggestion = getSuggestedModel(normalized.type as AIProviderType);\n if (suggestion) {\n normalized.defaultModel = suggestion;\n } else {\n delete normalized.defaultModel;\n }\n\n return normalized;\n }, [getSuggestedModel]);\n\n const sanitizeConfigForSave = useCallback((config: AIProviderConfig): AIProviderConfig => {\n const sanitized = { ...config } as AIProviderConfig & { defaultModel?: string };\n if (typeof sanitized.defaultModel === 'string') {\n const trimmed = sanitized.defaultModel.trim();\n sanitized.defaultModel = trimmed || undefined;\n }\n if (typeof sanitized.apiKey === 'string') {\n const trimmedKey = sanitized.apiKey.trim();\n sanitized.apiKey = trimmedKey || undefined;\n }\n return sanitized;\n }, []);\n\n // AI Provider configuration state\n const [providerConfig, setProviderConfig] = useState<AIProviderConfig>({\n type: 'gateway' as const,\n gatewayUrl: packageSettings?.gatewayApiUrl || '',\n provider: 'bandit'\n });\n const [isProviderConfigOpen, setIsProviderConfigOpen] = useState(false);\n\n // Snackbar states\n const [snackbarMessage, setSnackbarMessage] = useState('');\n const [showSnackbar, setShowSnackbar] = useState(false);\n const [snackbarSeverity, setSnackbarSeverity] = useState<'success' | 'error'>('success');\n\n const saveProviderConfigToDB = async (config: AIProviderConfig) => {\n try {\n const { tokenFactory: _tokenFactory, ...persistableConfig } = config;\n const serializableConfig: PersistedProviderConfig = {\n ...persistableConfig,\n id: 'aiProvider'\n };\n\n await indexedDBService.put<PersistedProviderConfig>(\n 'banditConfig', \n 1, \n 'config', \n serializableConfig,\n [{ name: 'config', keyPath: 'id' }]\n );\n debugLogger.info('Provider configuration saved to IndexedDB', { type: config.type });\n } catch (error) {\n console.error('Failed to save provider config to IndexedDB:', error);\n debugLogger.error('Failed to save provider config to IndexedDB:', { error });\n throw error; // Re-throw to handle in the calling function\n }\n };\n\n const loadProviderConfigFromDB = async (): Promise<AIProviderConfig | null> => {\n try {\n const config = await indexedDBService.get<PersistedProviderConfig>(\n 'banditConfig', \n 1, \n 'config', \n 'aiProvider',\n [{ name: 'config', keyPath: 'id' }]\n );\n if (config) {\n debugLogger.info('Provider configuration loaded from IndexedDB', { type: config.type });\n // Remove the id property that was added for IndexedDB storage\n const { id: _id, ...configWithoutId } = config;\n return configWithoutId as AIProviderConfig;\n }\n } catch (error) {\n debugLogger.error('Failed to load provider config from IndexedDB:', { error });\n }\n return null;\n };\n\n const convertAnthropicConfig = useCallback((config: AIProviderConfig | null | undefined): AIProviderConfig | null => {\n if (!config) return null;\n if (config.type !== AIProviderType.ANTHROPIC) {\n return config;\n }\n\n const gatewayUrl = config.gatewayUrl || packageSettings?.gatewayApiUrl || '';\n const defaultModel = typeof config.defaultModel === 'string' && config.defaultModel.trim()\n ? config.defaultModel.trim()\n : 'claude-3-5-sonnet-latest';\n const converted: AIProviderConfig = {\n type: AIProviderType.GATEWAY,\n gatewayUrl,\n provider: 'anthropic',\n defaultModel,\n tokenFactory: config.tokenFactory\n };\n\n return converted;\n }, [packageSettings?.gatewayApiUrl]);\n\n // Load current provider configuration\n useEffect(() => {\n const initializeProviderConfig = async () => {\n // First try to load from IndexedDB\n const savedConfig = await loadProviderConfigFromDB();\n \n if (savedConfig) {\n const normalized = convertAnthropicConfig(savedConfig) || savedConfig;\n setProviderConfig(applyDefaultModel(normalized));\n } else if (currentProviderConfig) {\n const normalized = convertAnthropicConfig(currentProviderConfig) || currentProviderConfig;\n setProviderConfig(applyDefaultModel(normalized));\n } else if (packageSettings?.aiProvider) {\n const normalized = convertAnthropicConfig(packageSettings.aiProvider) || packageSettings.aiProvider;\n setProviderConfig(applyDefaultModel(normalized));\n }\n };\n\n initializeProviderConfig();\n }, [applyDefaultModel, convertAnthropicConfig, currentProviderConfig, packageSettings]);\n\n const showMessage = (message: string, severity: 'success' | 'error') => {\n setSnackbarMessage(message);\n setSnackbarSeverity(severity);\n setShowSnackbar(true);\n };\n\n // AI Provider configuration handlers\n const handleProviderTypeChange = (type: AIProviderType) => {\n const baseConfig: AIProviderConfig = { type };\n \n switch (type) {\n case AIProviderType.OLLAMA:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n baseUrl: 'http://localhost:11434'\n }));\n break;\n case AIProviderType.OPENAI:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n baseUrl: 'https://api.openai.com/v1',\n apiKey: ''\n }));\n break;\n case AIProviderType.AZURE_OPENAI:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n baseUrl: '',\n apiKey: '',\n apiVersion: '2024-02-01',\n deploymentName: ''\n }));\n break;\n case AIProviderType.ANTHROPIC:\n showMessage('Anthropic is only available via the Gateway provider. Please configure Gateway and choose Anthropic as the backend.', 'error');\n setProviderConfig(applyDefaultModel({\n type: AIProviderType.GATEWAY,\n gatewayUrl: packageSettings?.gatewayApiUrl || '',\n provider: 'anthropic',\n defaultModel: 'claude-3-5-sonnet-latest'\n }));\n break;\n case AIProviderType.XAI:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n baseUrl: 'https://api.x.ai/v1',\n apiKey: ''\n }));\n break;\n case AIProviderType.BANDIT:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n baseUrl: 'https://api.burtson.ai',\n apiKey: '',\n defaultModel: 'bandit-core-1'\n }));\n break;\n case AIProviderType.GATEWAY:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n gatewayUrl: packageSettings?.gatewayApiUrl || '',\n provider: 'bandit'\n }));\n break;\n case AIProviderType.PLAYGROUND:\n setProviderConfig(applyDefaultModel({\n ...baseConfig\n }));\n break;\n }\n };\n\n const handleSaveProviderConfig = async () => {\n try { \n const normalizedConfigIntermediate = sanitizeConfigForSave(providerConfig);\n const normalizedConfig = convertAnthropicConfig(normalizedConfigIntermediate) || normalizedConfigIntermediate;\n const requiresModel =\n normalizedConfig.type === AIProviderType.OPENAI ||\n normalizedConfig.type === AIProviderType.XAI ||\n normalizedConfig.type === AIProviderType.BANDIT;\n\n if (requiresModel && !normalizedConfig.defaultModel) {\n showMessage('Please provide a default model ID for the selected provider.', 'error');\n return;\n }\n\n // Validate the configuration\n const isValid = AIProviderFactory.validateConfig(normalizedConfig);\n if (!isValid) {\n showMessage('Invalid provider configuration. Please check all required fields.', 'error');\n return;\n }\n\n // Save to IndexedDB first\n await saveProviderConfigToDB(normalizedConfig);\n\n // Switch to the new provider\n await aiProviderInitService.switchProvider(normalizedConfig);\n \n // Update package settings\n if (packageSettings) {\n const updatedSettings = {\n ...packageSettings,\n aiProvider: normalizedConfig\n };\n if (normalizedConfig.defaultModel) {\n updatedSettings.defaultModel = normalizedConfig.defaultModel;\n }\n usePackageSettingsStore.setState({ settings: updatedSettings });\n }\n\n setProviderConfig(applyDefaultModel(normalizedConfig));\n setIsProviderConfigOpen(false);\n showMessage('Provider configuration saved and switched successfully!', 'success');\n debugLogger.info('Provider configuration saved and switched', { type: normalizedConfig.type });\n } catch (error) {\n debugLogger.error('Failed to save provider configuration:', { error });\n showMessage(`Failed to save provider configuration: ${error instanceof Error ? error.message : 'Unknown error'}`, 'error');\n }\n };\n\n const handleTestProviderConnection = async () => {\n try {\n const testConfig = sanitizeConfigForSave(providerConfig);\n const normalizedTestConfig = convertAnthropicConfig(testConfig) || testConfig;\n const testProvider = AIProviderFactory.createProvider(normalizedTestConfig);\n\n const result = await testProvider.validateServiceAvailability({ timeoutMs: 10000 });\n \n if (result.isAvailable) {\n showMessage('Connection successful! Provider is available.', 'success');\n } else {\n showMessage('Connection failed. Please check your configuration.', 'error');\n }\n } catch (error) {\n debugLogger.error('Provider connection test failed:', { error });\n showMessage('Connection test failed. Please check your configuration.', 'error');\n }\n };\n\n return (\n <Box sx={{ p: { xs: 1.5, sm: 3, md: 4 } }}>\n <Box sx={{ mb: { xs: 2.5, md: 3 } }}>\n <Typography\n variant=\"h5\"\n sx={{ fontWeight: 600, mb: 1, color: \"primary.main\", fontSize: { xs: '1.6rem', md: '1.8rem' } }}\n >\n AI Provider Configuration\n </Typography>\n <Typography\n variant=\"body1\"\n color=\"text.secondary\"\n paragraph\n sx={{ opacity: 0.9, fontSize: { xs: '0.95rem', sm: '1rem' }, lineHeight: 1.5 }}\n >\n Configure your AI provider for chat, generation, and model services. This determines which backend service powers your AI interactions.\n </Typography>\n\n {/* Current Provider Status */}\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 }, mb: { xs: 2, md: 3 }, bgcolor: 'background.paper', border: '1px solid', borderColor: 'divider' }}>\n <Typography variant=\"h6\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n Current Provider\n </Typography>\n {currentProvider ? (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <Chip\n label={currentProvider.getProviderType().toUpperCase()}\n color=\"primary\"\n variant=\"filled\"\n />\n <Typography variant=\"body2\" color=\"text.secondary\">\n {currentProviderConfig?.baseUrl || currentProviderConfig?.gatewayUrl || 'No URL configured'}\n </Typography>\n </Box>\n ) : (\n <Chip label=\"No Provider Configured\" color=\"warning\" />\n )}\n </Paper>\n\n {/* Provider Configuration Form */}\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 }, mb: { xs: 2, md: 3 }, bgcolor: 'background.paper', border: '1px solid', borderColor: 'divider' }}>\n <Box\n sx={{\n display: 'flex',\n flexDirection: { xs: 'column', sm: 'row' },\n alignItems: { xs: 'flex-start', sm: 'center' },\n justifyContent: 'space-between',\n gap: { xs: 1, sm: 2 },\n mb: 3,\n }}\n >\n <Typography variant=\"h6\" sx={{ fontWeight: 600, color: \"text.primary\" }}>\n Provider Configuration\n </Typography>\n <Button\n variant=\"outlined\"\n onClick={() => setIsProviderConfigOpen(!isProviderConfigOpen)}\n size={isMobile ? 'small' : 'medium'}\n >\n {isProviderConfigOpen ? 'Hide' : 'Configure'} Provider\n </Button>\n </Box>\n\n {isProviderConfigOpen && (\n <Box sx={{ mt: 3 }}>\n {/* Provider Type Selection */}\n <TextField\n label=\"Provider Type\"\n select\n value={providerConfig.type}\n onChange={(e) => handleProviderTypeChange(e.target.value as AIProviderType)}\n fullWidth\n sx={{ mb: 3 }}\n >\n <MenuItem value=\"gateway\">Gateway (Recommended)</MenuItem>\n <MenuItem value=\"ollama\">Ollama</MenuItem>\n <MenuItem value=\"openai\">OpenAI</MenuItem>\n <MenuItem value=\"azure-openai\">Azure OpenAI</MenuItem>\n <MenuItem value=\"bandit\">Bandit AI</MenuItem>\n <MenuItem value=\"xai\">xAI</MenuItem>\n <MenuItem value=\"playground\">Playground (Mock Demo)</MenuItem>\n </TextField>\n\n {/* Gateway Configuration */}\n {providerConfig.type === 'gateway' && (\n <Box>\n <TextField\n label=\"Gateway URL\"\n value={providerConfig.gatewayUrl || ''}\n onChange={(e) => setProviderConfig({...providerConfig, gatewayUrl: e.target.value})}\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"https://your-gateway-api.com\"\n />\n <TextField\n label=\"Backend Provider\"\n select\n value={providerConfig.provider || 'openai'}\n onChange={(e) => setProviderConfig({\n ...providerConfig,\n provider: e.target.value as GatewayBackendProvider\n })}\n fullWidth\n sx={{ mb: 2 }}\n >\n <MenuItem value=\"openai\">OpenAI</MenuItem>\n <MenuItem value=\"azure-openai\">Azure OpenAI</MenuItem>\n <MenuItem value=\"anthropic\">Anthropic</MenuItem>\n <MenuItem value=\"ollama\">Ollama</MenuItem>\n <MenuItem value=\"bandit\">Bandit AI</MenuItem>\n <MenuItem value=\"xai\">xAI</MenuItem>\n </TextField>\n </Box>\n )}\n\n {/* Ollama Configuration */}\n {providerConfig.type === 'ollama' && (\n <TextField\n label=\"Ollama URL\"\n value={providerConfig.baseUrl || ''}\n onChange={(e) => setProviderConfig({...providerConfig, baseUrl: e.target.value})}\n fullWidth\n placeholder=\"http://localhost:11434\"\n />\n )}\n\n {/* Bandit AI Configuration */}\n {providerConfig.type === 'bandit' && (\n <Box>\n <TextField\n label=\"API Base URL\"\n value={providerConfig.baseUrl || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n baseUrl: e.target.value\n }))\n }\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"https://api.burtson.ai\"\n helperText=\"Defaults to https://api.burtson.ai\"\n />\n <TextField\n label=\"API Key\"\n type=\"password\"\n value={providerConfig.apiKey || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n apiKey: e.target.value\n }))\n }\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"bai_...\"\n />\n <TextField\n label=\"Default Model ID\"\n value={providerConfig.defaultModel || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n defaultModel: e.target.value\n }))\n }\n fullWidth\n placeholder=\"bandit-core-1\"\n helperText=\"Example: bandit-core-1 (Bandit Core canonical alias).\"\n />\n </Box>\n )}\n\n {/* OpenAI Configuration */}\n {providerConfig.type === 'openai' && (\n <Box>\n <TextField\n label=\"API Base URL\"\n value={providerConfig.baseUrl || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n baseUrl: e.target.value\n }))\n }\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"https://api.openai.com/v1\"\n />\n <TextField\n label=\"API Key\"\n type=\"password\"\n value={providerConfig.apiKey || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n apiKey: e.target.value\n }))\n }\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"sk-...\"\n />\n <TextField\n label=\"Default Model ID\"\n value={providerConfig.defaultModel || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n defaultModel: e.target.value\n }))\n }\n fullWidth\n placeholder=\"gpt-4o-mini\"\n helperText=\"Example: gpt-4o-mini, gpt-4.1, gpt-3.5-turbo\"\n />\n </Box>\n )}\n\n {/* Azure OpenAI Configuration */}\n {providerConfig.type === 'azure-openai' && (\n <Box>\n <TextField\n label=\"Azure Endpoint\"\n value={providerConfig.baseUrl || ''}\n onChange={(e) => setProviderConfig({...providerConfig, baseUrl: e.target.value})}\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"https://your-resource.openai.azure.com\"\n />\n <TextField\n label=\"API Key\"\n type=\"password\"\n value={providerConfig.apiKey || ''}\n onChange={(e) => setProviderConfig({...providerConfig, apiKey: e.target.value})}\n fullWidth\n sx={{ mb: 2 }}\n />\n <TextField\n label=\"API Version\"\n value={providerConfig.apiVersion || ''}\n onChange={(e) => setProviderConfig({...providerConfig, apiVersion: e.target.value})}\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"2024-02-01\"\n />\n <TextField\n label=\"Deployment Name\"\n value={providerConfig.deploymentName || ''}\n onChange={(e) => setProviderConfig({...providerConfig, deploymentName: e.target.value})}\n fullWidth\n placeholder=\"gpt-4\"\n />\n </Box>\n )}\n\n {/* xAI Configuration */}\n {providerConfig.type === 'xai' && (\n <Box>\n <TextField\n label=\"API Base URL\"\n value={providerConfig.baseUrl || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n baseUrl: e.target.value\n }))\n }\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"https://api.x.ai/v1\"\n />\n <TextField\n label=\"API Key\"\n type=\"password\"\n value={providerConfig.apiKey || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n apiKey: e.target.value\n }))\n }\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"xai-...\"\n />\n <TextField\n label=\"Default Model ID\"\n value={providerConfig.defaultModel || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n defaultModel: e.target.value\n }))\n }\n fullWidth\n placeholder=\"grok-beta\"\n helperText=\"Example: grok-beta, grok-2, grok-vision-beta\"\n />\n </Box>\n )}\n\n {/* Anthropic Configuration (deprecated direct support) */}\n {providerConfig.type === 'anthropic' && (\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n Anthropic is only supported through the Bandit Gateway provider. Please switch to Gateway and\n select Anthropic as the backend service.\n </Alert>\n )}\n\n {/* Action Buttons */}\n <Box sx={{ display: 'flex', gap: 2, mt: 3 }}>\n <Button\n variant=\"outlined\"\n onClick={handleTestProviderConnection}\n disabled={!providerConfig.type}\n >\n Test Connection\n </Button>\n <Button\n variant=\"contained\"\n onClick={handleSaveProviderConfig}\n disabled={!providerConfig.type}\n >\n Save & Switch Provider\n </Button>\n </Box>\n </Box>\n )}\n </Paper>\n\n {/* Migration Information */}\n <Paper sx={{ p: 3, bgcolor: 'info.main', color: 'info.contrastText', borderRadius: 2 }}>\n <Typography variant=\"h6\" sx={{ mb: 1, fontWeight: 600, color: \"text.primary\" }}>\n 🚀 Gateway Provider Recommended\n </Typography>\n <Typography variant=\"body2\">\n For production deployments, we recommend using the Gateway provider which routes requests through your secure backend API. \n This approach keeps API keys secure, enables rate limiting, and provides better monitoring capabilities.\n </Typography>\n </Paper>\n </Box>\n\n {/* Snackbar for messages */}\n <Snackbar\n open={showSnackbar}\n autoHideDuration={6000}\n onClose={() => setShowSnackbar(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Alert\n onClose={() => setShowSnackbar(false)}\n severity={snackbarSeverity}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {snackbarMessage}\n </Alert>\n </Snackbar>\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-6468-24BE3B\nconst __banditFingerprint_components_MCPToolsTabV2tsx = 'BL-FP-885971-25D5';\nconst __auditTrail_components_MCPToolsTabV2tsx = 'BL-AU-MGOIKVVJ-JBSK';\n// File: MCPToolsTabV2.tsx | Path: src/management/components/MCPToolsTabV2.tsx | Hash: 646825d5\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { Box, Typography, Paper, Chip, Stack, IconButton, Tooltip, LinearProgress, Switch, FormControlLabel } from '@mui/material';\nimport { fetchAvailableMcpTools, fetchMcpHealth, McpTool } from '../../services/mcp/mcpControllerService';\nimport McpServersSection from './McpServersSection';\nimport { useMCPToolsStore } from '../../store/mcpToolsStore';\nimport { usePackageSettingsStore } from '../../store/packageSettingsStore';\nimport {\n ErrorOutlineIcon,\n HealthAndSafetyIcon,\n RefreshIcon,\n SettingsIcon,\n} from \"../../icons/lucide-icons\";\n\nconst MCPToolsTabV2: React.FC = () => {\n const { settings } = usePackageSettingsStore();\n const { tools: localTools, loadTools, toggleTool, addTool, updateTool, isLoaded } = useMCPToolsStore();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [tools, setTools] = useState<McpTool[]>([]);\n const [health, setHealth] = useState<{ status: 'healthy' | 'unhealthy' | 'unknown'; timestamp?: string } | null>(null);\n\n const gatewayConfigured = !!settings?.gatewayApiUrl;\n\n const refresh = async () => {\n setLoading(true);\n setError(null);\n try {\n await loadTools(); // ensure local store is hydrated\n const [serverTools, healthResp] = await Promise.all([\n fetchAvailableMcpTools(),\n fetchMcpHealth().catch(() => null)\n ]);\n setTools(serverTools);\n // Merge controller tools into local store to keep AI enablement aligned\n serverTools.forEach(ct => {\n const functionName = (ct.id || ct.name).replace(/[^a-zA-Z0-9_]/g, '_');\n let match = localTools.find(lt => lt.function.name === functionName);\n if (!match) {\n match = localTools.find(lt => lt.function.name === ct.id);\n }\n if (!match) {\n match = localTools.find(lt => lt.id === ct.id);\n }\n \n if (!match) {\n // Add a new local tool representation to allow enabling for AI\n addTool({\n name: functionName,\n description: ct.description,\n enabled: ct.isEnabled, // Use server's enabled state for new tools\n type: 'function',\n function: {\n name: ct.id, // Use server ID as function name for better mapping\n description: ct.description,\n parameters: { type: 'object', properties: {}, required: [] },\n },\n endpoint: `/mcp/${ct.id}`,\n method: 'GET',\n isBuiltIn: false,\n });\n } else {\n // For existing tools, sync with server state\n updateTool(match.id, { enabled: ct.isEnabled });\n }\n });\n if (healthResp) {\n const status = healthResp.status === 'healthy' || healthResp.status === 'unhealthy'\n ? healthResp.status\n : 'unknown';\n setHealth({ status, timestamp: healthResp.timestamp });\n } else {\n setHealth({ status: 'unknown' });\n }\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to load MCP data');\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n if (isLoaded) {\n refresh();\n } else {\n // Ensure local tools are loaded first\n loadTools().then(() => {\n refresh();\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isLoaded]);\n\n const localEnabledMap = useMemo(() => {\n const map = new Map<string, boolean>();\n \n // Sort tools to prioritize built-in tools over custom duplicates\n const sortedTools = [...localTools].sort((a, b) => {\n // Built-in tools (shorter, cleaner IDs) come first\n if (a.isBuiltIn && !b.isBuiltIn) return -1;\n if (!a.isBuiltIn && b.isBuiltIn) return 1;\n // Among non-built-in tools, shorter IDs (likely original) come first\n return a.id.length - b.id.length;\n });\n \n sortedTools.forEach(t => {\n // Map by function name (primary)\n map.set(t.function.name, t.enabled);\n // Also map by tool id for easier lookup\n map.set(t.id, t.enabled);\n // Map by tool name for fallback\n if (t.name) {\n map.set(t.name, t.enabled);\n }\n });\n \n return map;\n }, [localTools]);\n\n return (\n <Box>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 2 }}>\n <Typography variant=\"h5\" sx={{ fontWeight: 600, color: 'primary.main' }}>Available Tools</Typography>\n <Box>\n <Tooltip title=\"Refresh\">\n <IconButton onClick={refresh}>\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n </Box>\n </Box>\n\n <McpServersSection />\n\n {!gatewayConfigured && (\n <Paper sx={{ p: 2, mb: 2 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Gateway API URL isn’t configured. The controller endpoints will be fetched relative to this origin.\n </Typography>\n </Paper>\n )}\n\n <Paper sx={{ p: 2, mb: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n {health?.status === 'healthy' ? (\n <HealthAndSafetyIcon color=\"success\" />\n ) : health?.status === 'unhealthy' ? (\n <ErrorOutlineIcon color=\"error\" />\n ) : (\n <ErrorOutlineIcon color=\"disabled\" />\n )}\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 600 }}>Controller Health</Typography>\n <Chip\n size=\"small\"\n label={(health?.status || 'unknown').toString()}\n color={health?.status === 'healthy' ? 'success' : health?.status === 'unhealthy' ? 'error' : 'default'}\n sx={{ ml: 1 }}\n />\n {health?.timestamp && (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ ml: 1 }}>\n {new Date(health.timestamp).toLocaleString()}\n </Typography>\n )}\n </Box>\n </Paper>\n\n {loading && (\n <Box sx={{ mb: 2 }}>\n <LinearProgress />\n </Box>\n )}\n {error && (\n <Paper sx={{ p: 2, mb: 2 }}>\n <Typography color=\"error\">{error}</Typography>\n </Paper>\n )}\n\n <Stack spacing={2}>\n {tools.map((tool) => {\n // Try multiple lookup strategies to find the local enabled state\n let locallyEnabled = localEnabledMap.get(tool.id); // Try server tool id first\n if (locallyEnabled === undefined) {\n locallyEnabled = localEnabledMap.get(tool.name); // Try server tool name\n }\n if (locallyEnabled === undefined) {\n // Fallback to direct lookup in localTools array (more reliable)\n const directLookup = localTools.find(t => \n t.id === tool.id || \n t.function.name === tool.id || \n t.name === tool.name\n );\n locallyEnabled = directLookup?.enabled ?? tool.isEnabled;\n }\n \n return (\n <Paper key={tool.id} sx={{ p: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Box>\n <Typography variant=\"h6\" sx={{ fontWeight: 700 }}>{tool.name}</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 0.5 }}>\n {tool.description}\n </Typography>\n </Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <FormControlLabel\n control={<Switch checked={!!locallyEnabled} onChange={() => {\n // Find the corresponding local tool using multiple strategies\n let local = localTools.find(t => t.function.name === tool.id);\n if (!local) {\n local = localTools.find(t => t.function.name === tool.name);\n }\n if (!local) {\n local = localTools.find(t => t.id === tool.id);\n }\n if (!local) {\n local = localTools.find(t => t.name === tool.name);\n }\n \n if (local) {\n toggleTool(local.id);\n } else {\n console.warn('Could not find local tool for server tool:', tool);\n }\n }} />}\n label={locallyEnabled ? 'Enabled' : 'Disabled'}\n />\n <Tooltip title=\"Controller-driven tools (read-only schema)\">\n <SettingsIcon color=\"disabled\" />\n </Tooltip>\n </Box>\n </Box>\n {!!tool.supportedParameters?.length && (\n <Box sx={{ mt: 1.5 }}>\n <Typography variant=\"caption\" color=\"text.secondary\">Supported parameters</Typography>\n <Box sx={{ mt: 0.5, display: 'flex', flexWrap: 'wrap', gap: 1 }}>\n {tool.supportedParameters.map((p) => (\n <Chip key={p} size=\"small\" label={p} />\n ))}\n </Box>\n </Box>\n )}\n </Paper>\n );\n })}\n </Stack>\n </Box>\n );\n};\n\nexport default MCPToolsTabV2;\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-D920-E6B3B8\nconst __banditFingerprint_mcp_mcpControllerServicets = 'BL-FP-5B6964-A0CB';\nconst __auditTrail_mcp_mcpControllerServicets = 'BL-AU-MGOIKVVV-RXNY';\n// File: mcpControllerService.ts | Path: src/services/mcp/mcpControllerService.ts | Hash: d920a0cb\n\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { authenticationService } from \"../auth/authenticationService\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\nexport interface McpTool {\n id: string;\n name: string;\n description: string;\n supportedParameters: string[];\n isEnabled: boolean;\n}\n\nexport interface McpHealthResponse {\n status: string; // \"healthy\" | \"unhealthy\"\n timestamp: string;\n totalTools: number;\n enabledTools: number;\n availableTools: Array<{ id: string; name: string }>;\n}\n\nconst isPlaygroundMode = (): boolean => {\n const settings = usePackageSettingsStore.getState().settings;\n if (!settings) {\n return false;\n }\n const gatewayUrl = settings.gatewayApiUrl?.toLowerCase() ?? \"\";\n return Boolean(settings.playgroundMode || gatewayUrl.startsWith(\"playground://\"));\n};\n\nfunction buildUrl(path: string): string {\n // When running in playground mode, we never call the gateway directly.\n if (isPlaygroundMode()) {\n debugLogger.info(\"MCP controller URL build skipped in playground mode\", { path });\n return path.startsWith(\"/\") ? path : `/${path}`;\n }\n\n // Prefer configured gateway URL when available, otherwise fall back to relative path\n const base = usePackageSettingsStore.getState().settings?.gatewayApiUrl?.replace(/\\/$/, \"\") || \"\";\n if (base) {\n // Ensure path begins with '/'\n const normalized = path.startsWith('/') ? path : `/${path}`;\n return `${base}${normalized}`;\n }\n return path; // relative to current origin\n}\n\nfunction authHeaders(): HeadersInit {\n const headers: HeadersInit = { 'Content-Type': 'application/json' };\n const token = authenticationService.getToken();\n if (token) headers['Authorization'] = `Bearer ${token}`;\n return headers;\n}\n\nexport async function fetchAvailableMcpTools(): Promise<McpTool[]> {\n if (isPlaygroundMode()) {\n debugLogger.info(\"Skipping remote MCP tool fetch — playground mode active\");\n return [];\n }\n\n const url = buildUrl('/mcp/tools');\n try {\n const res = await fetch(url, { headers: authHeaders() });\n const data = await res.json();\n if (!res.ok) {\n throw new Error(data?.error || `Failed to load MCP tools (${res.status})`);\n }\n return data as McpTool[];\n } catch (error) {\n debugLogger.error('Failed to fetch MCP tools', { error: error instanceof Error ? error.message : String(error) });\n throw error;\n }\n}\n\nexport async function fetchMcpHealth(): Promise<McpHealthResponse> {\n if (isPlaygroundMode()) {\n debugLogger.info(\"Returning mocked MCP health — playground mode active\");\n return {\n status: \"healthy\",\n timestamp: new Date().toISOString(),\n totalTools: 0,\n enabledTools: 0,\n availableTools: [],\n };\n }\n\n const url = buildUrl('/mcp/health');\n try {\n const res = await fetch(url, { headers: authHeaders() });\n const data = await res.json();\n if (!res.ok) {\n throw new Error(data?.error || `Failed to fetch MCP health (${res.status})`);\n }\n return data as McpHealthResponse;\n } catch (error) {\n debugLogger.error('Failed to fetch MCP health', { error: error instanceof Error ? error.message : String(error) });\n throw error;\n }\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport {\n Alert,\n Box,\n Button,\n Chip,\n CircularProgress,\n Collapse,\n FormControlLabel,\n IconButton,\n LinearProgress,\n MenuItem,\n Paper,\n Stack,\n Switch,\n TextField,\n Tooltip,\n Typography,\n} from '@mui/material';\nimport { AddIcon, CloudIcon, DeleteIcon, RefreshIcon } from '../../icons/lucide-icons';\nimport {\n addMcpServer,\n deleteMcpServer,\n discoverMcpTools,\n listMcpServers,\n updateMcpServer,\n type McpDiscoveredTool,\n type McpServer,\n type McpServerInput,\n} from '../../services/mcp/mcpServersService';\nimport { useMCPToolsStore } from '../../store/mcpToolsStore';\n\nconst emptyForm: McpServerInput = { name: '', url: '', authType: 'none', authValue: '', headerName: '' };\n\ntype ToolState = McpDiscoveredTool[] | { error: string } | 'loading' | undefined;\n\nconst McpServersSection = () => {\n const [servers, setServers] = useState<McpServer[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [form, setForm] = useState<McpServerInput>(emptyForm);\n const [adding, setAdding] = useState(false);\n const [showForm, setShowForm] = useState(false);\n const [tools, setTools] = useState<Record<string, ToolState>>({});\n const reloadChatTools = useMCPToolsStore((s) => s.loadMcpServerTools);\n\n const refresh = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n setServers(await listMcpServers());\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not load MCP servers.');\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const handleAdd = async () => {\n if (!form.name.trim() || !form.url.trim()) {\n setError('Name and URL are required.');\n return;\n }\n setAdding(true);\n setError(null);\n try {\n await addMcpServer({\n name: form.name.trim(),\n url: form.url.trim(),\n authType: form.authType,\n authValue: form.authType === 'none' ? undefined : form.authValue,\n headerName: form.authType === 'header' ? form.headerName : undefined,\n });\n setForm(emptyForm);\n setShowForm(false);\n await refresh();\n void reloadChatTools();\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not add the server.');\n } finally {\n setAdding(false);\n }\n };\n\n const handleDelete = async (id: string) => {\n setError(null);\n try {\n await deleteMcpServer(id);\n await refresh();\n void reloadChatTools();\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not remove the server.');\n }\n };\n\n const handleToggle = async (server: McpServer) => {\n setError(null);\n try {\n await updateMcpServer(server.id, { enabled: !server.enabled });\n await refresh();\n void reloadChatTools();\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not update the server.');\n }\n };\n\n const handleDiscover = async (id: string) => {\n setTools((prev) => ({ ...prev, [id]: 'loading' }));\n try {\n const { tools: discovered } = await discoverMcpTools(id);\n setTools((prev) => ({ ...prev, [id]: discovered }));\n } catch (e) {\n setTools((prev) => ({ ...prev, [id]: { error: e instanceof Error ? e.message : 'Could not connect.' } }));\n }\n };\n\n return (\n <Paper sx={{ p: 2, mb: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 1, gap: 1, flexWrap: 'wrap' }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <CloudIcon />\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 700 }}>\n MCP Servers\n </Typography>\n <Chip size=\"small\" label={String(servers.length)} />\n </Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <Tooltip title=\"Refresh\">\n <IconButton onClick={refresh} size=\"small\">\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n <Button size=\"small\" variant=\"contained\" startIcon={<AddIcon />} onClick={() => setShowForm((v) => !v)}>\n Add server\n </Button>\n </Box>\n </Box>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Connect a remote Model Context Protocol server to give the assistant its tools. The gateway holds the\n connection and proxies calls — your browser never talks to the server directly.\n </Typography>\n\n {error && (\n <Alert severity=\"error\" sx={{ mb: 2 }} onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n\n <Collapse in={showForm}>\n <Paper variant=\"outlined\" sx={{ p: 2, mb: 2 }}>\n <Stack spacing={2}>\n <TextField\n label=\"Name\"\n size=\"small\"\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n placeholder=\"e.g. github\"\n fullWidth\n />\n <TextField\n label=\"Server URL\"\n size=\"small\"\n value={form.url}\n onChange={(e) => setForm({ ...form, url: e.target.value })}\n placeholder=\"https://mcp.example.com/mcp\"\n fullWidth\n />\n <TextField\n select\n label=\"Auth\"\n size=\"small\"\n value={form.authType}\n onChange={(e) => setForm({ ...form, authType: e.target.value as McpServerInput['authType'] })}\n sx={{ maxWidth: 220 }}\n >\n <MenuItem value=\"none\">None</MenuItem>\n <MenuItem value=\"bearer\">Bearer token</MenuItem>\n <MenuItem value=\"header\">Custom header</MenuItem>\n </TextField>\n {form.authType === 'header' && (\n <TextField\n label=\"Header name\"\n size=\"small\"\n value={form.headerName}\n onChange={(e) => setForm({ ...form, headerName: e.target.value })}\n placeholder=\"X-Api-Key\"\n fullWidth\n />\n )}\n {form.authType !== 'none' && (\n <TextField\n label={form.authType === 'bearer' ? 'Token' : 'Header value'}\n size=\"small\"\n type=\"password\"\n value={form.authValue}\n onChange={(e) => setForm({ ...form, authValue: e.target.value })}\n fullWidth\n />\n )}\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Button variant=\"contained\" onClick={handleAdd} disabled={adding}>\n {adding ? 'Adding…' : 'Add server'}\n </Button>\n <Button\n onClick={() => {\n setShowForm(false);\n setForm(emptyForm);\n }}\n >\n Cancel\n </Button>\n </Box>\n </Stack>\n </Paper>\n </Collapse>\n\n {loading && <LinearProgress sx={{ mb: 2 }} />}\n\n <Stack spacing={1.5}>\n {servers.length === 0 && !loading && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No MCP servers connected yet.\n </Typography>\n )}\n {servers.map((server) => {\n const toolState = tools[server.id];\n return (\n <Paper key={server.id} variant=\"outlined\" sx={{ p: 1.5 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 1 }}>\n <Box sx={{ minWidth: 0 }}>\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 700 }}>\n {server.name}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ wordBreak: 'break-all' }}>\n {server.url}\n </Typography>\n </Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5, flexShrink: 0 }}>\n {server.hasAuth && <Chip size=\"small\" label={server.authType} />}\n <Tooltip title={server.enabled ? 'Enabled' : 'Disabled'}>\n <FormControlLabel\n sx={{ mr: 0 }}\n control={<Switch size=\"small\" checked={server.enabled} onChange={() => handleToggle(server)} />}\n label=\"\"\n />\n </Tooltip>\n <Tooltip title=\"Test & list tools\">\n <IconButton size=\"small\" onClick={() => handleDiscover(server.id)}>\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Remove\">\n <IconButton size=\"small\" onClick={() => handleDelete(server.id)}>\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n </Box>\n </Box>\n\n {toolState === 'loading' && (\n <Box sx={{ mt: 1, display: 'flex', alignItems: 'center', gap: 1 }}>\n <CircularProgress size={16} />\n <Typography variant=\"caption\" color=\"text.secondary\">\n Connecting…\n </Typography>\n </Box>\n )}\n {Array.isArray(toolState) && (\n <Box sx={{ mt: 1, display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\n {toolState.length === 0 ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n Connected — no tools reported.\n </Typography>\n ) : (\n toolState.map((t) => (\n <Tooltip key={t.name} title={t.description || ''}>\n <Chip size=\"small\" label={t.name} />\n </Tooltip>\n ))\n )}\n </Box>\n )}\n {toolState && !Array.isArray(toolState) && toolState !== 'loading' && (\n <Alert severity=\"warning\" sx={{ mt: 1 }}>\n {toolState.error}\n </Alert>\n )}\n </Paper>\n );\n })}\n </Stack>\n </Paper>\n );\n};\n\nexport default McpServersSection;\n"],"mappings":"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","names":["useState","useEffect","useCallback","useMemo","useMediaQuery","alpha","Box","Button","Typography","List","ListItemButton","ListItemIcon","ListItemText","Divider","useState","Box","Button","Typography","Dialog","DialogTitle","DialogContent","DialogActions","Alert","minScale","Fragment","jsx","jsxs","useState","jsxs","Fragment","jsx","Box","Typography","Button","Alert","Dialog","DialogTitle","DialogContent","DialogActions","useState","useEffect","useRef","useCallback","Box","Button","Typography","Paper","Chip","TextField","Alert","IconButton","useMediaQuery","useTheme","jsx","jsxs","useTheme","useMediaQuery","useState","useRef","jsx","Box","jsxs","Typography","useCallback","useEffect","Paper","Chip","Alert","Button","TextField","IconButton","useState","useRef","Box","Typography","Button","TextField","Card","CardContent","Paper","Chip","Alert","useTheme","useMediaQuery","useState","useRef","useCallback","useEffect","Dialog","DialogTitle","DialogContent","DialogActions","Button","Box","Typography","Slider","IconButton","Paper","Alert","Chip","Fragment","jsx","jsxs","useRef","useState","useCallback","useEffect","minScale","jsxs","Dialog","DialogTitle","jsx","Typography","DialogContent","Fragment","Box","Paper","IconButton","Slider","Button","Chip","Alert","DialogActions","jsx","jsxs","predefinedThemes","useTheme","useMediaQuery","useState","useRef","jsxs","Box","jsx","Typography","Alert","Paper","Button","TextField","theme","Card","Chip","CardContent","useEffect","useState","Box","Tab","Tabs","useMediaQuery","useTheme","useState","useMemo","useCallback","useEffect","Box","Typography","Button","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","TextField","InputAdornment","Chip","LinearProgress","Card","CardContent","IconButton","Alert","Stack","MenuItem","Snackbar","Switch","useMediaQuery","useTheme","useState","useEffect","Dialog","DialogContent","Box","Typography","Fade","useTheme","jsx","jsxs","jsx","useTheme","useState","useEffect","jsxs","Dialog","sparkle","Box","DialogContent","Typography","Fade","useState","useCallback","useState","useCallback","Fragment","jsx","jsxs","useTheme","useMediaQuery","useState","useCallback","useEffect","useMemo","jsx","Box","jsxs","Typography","Chip","Button","Card","CardContent","Switch","Fragment","LinearProgress","TextField","InputAdornment","MenuItem","IconButton","Stack","Dialog","DialogTitle","DialogContent","DialogContentText","Alert","DialogActions","Snackbar","useCallback","useEffect","useMemo","useRef","useState","Alert","Box","Button","Card","CardContent","Chip","Dialog","DialogActions","DialogContent","DialogContentText","DialogTitle","IconButton","LinearProgress","Snackbar","Stack","TextField","Tooltip","Typography","jsx","jsxs","formatFileSize","jsx","Card","jsxs","CardContent","Box","IconButton","Typography","Tooltip","Chip","Button","useState","useRef","useMemo","useCallback","useEffect","buildDraftPayload","Stack","Alert","LinearProgress","TextField","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","Snackbar","jsx","jsxs","useTheme","useMediaQuery","useState","useEffect","jsxs","Box","jsx","Tabs","Tab","useState","useEffect","useMemo","Box","Typography","Button","Card","CardContent","LinearProgress","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","Alert","Stack","Chip","List","Snackbar","useTheme","Fragment","jsx","jsxs","useTheme","useState","useEffect","useMemo","jsxs","Box","jsx","Typography","Button","Fragment","Card","CardContent","Chip","LinearProgress","Alert","Stack","List","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","Snackbar","useState","useEffect","useCallback","Box","Typography","Paper","Button","TextField","MenuItem","Chip","Snackbar","Alert","useTheme","useMediaQuery","jsx","jsxs","useTheme","useMediaQuery","useCallback","useState","useEffect","jsxs","Box","jsx","Typography","Paper","Chip","Button","TextField","MenuItem","Alert","Snackbar","useEffect","useMemo","useState","Box","Typography","Paper","Chip","Stack","IconButton","Tooltip","LinearProgress","Switch","FormControlLabel","buildUrl","useCallback","useEffect","useState","Alert","Box","Button","Chip","CircularProgress","Collapse","FormControlLabel","IconButton","LinearProgress","MenuItem","Paper","Stack","Switch","TextField","Tooltip","Typography","jsx","jsxs","useState","useCallback","useEffect","Paper","Box","Typography","Chip","Tooltip","IconButton","Button","Alert","Collapse","Stack","TextField","MenuItem","LinearProgress","FormControlLabel","Switch","CircularProgress","jsx","jsxs","useState","useEffect","useMemo","jsxs","Box","jsx","Typography","Tooltip","IconButton","Paper","Chip","LinearProgress","Stack","FormControlLabel","Switch","jsx","jsxs","useMediaQuery","useState","banditHead","useEffect","useCallback","packageSettings","modelName","file","e","useMemo","jsx","jsxs","Box","theme","alpha","Button","Divider","List","ListItemButton","ListItemIcon","ListItemText","Typography"]}