@burtson-labs/bandit-engine 2.0.167 → 2.0.168
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chat-6N5B7A7F.mjs → chat-7LOFYEWE.mjs} +5 -5
- package/dist/chat-provider.js +154 -38
- package/dist/chat-provider.js.map +1 -1
- package/dist/chat-provider.mjs +2 -2
- package/dist/{chunk-PK3LFBGC.mjs → chunk-4SXXEGEK.mjs} +142 -27
- package/dist/chunk-4SXXEGEK.mjs.map +1 -0
- package/dist/{chunk-KDIL5WUL.mjs → chunk-62IYSU3I.mjs} +4 -3
- package/dist/chunk-62IYSU3I.mjs.map +1 -0
- package/dist/{chunk-5BZWJQ5O.mjs → chunk-JD6C64CT.mjs} +2 -2
- package/dist/{chunk-46OGYEME.mjs → chunk-KAXUI5H7.mjs} +154 -40
- package/dist/chunk-KAXUI5H7.mjs.map +1 -0
- package/dist/{chunk-US4TG745.mjs → chunk-QI67R5F6.mjs} +2 -2
- package/dist/{chunk-N4BQ6HKL.mjs → chunk-R3NOM2DG.mjs} +3 -3
- package/dist/{chunk-SHYNXDRO.mjs → chunk-YGOLNWXJ.mjs} +4 -4
- package/dist/index.d.mts +54 -2
- package/dist/index.d.ts +54 -2
- package/dist/index.js +306 -68
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -7
- package/dist/management/management.js +305 -68
- package/dist/management/management.js.map +1 -1
- package/dist/management/management.mjs +5 -5
- package/dist/modals/chat-modal/chat-modal.js +159 -42
- package/dist/modals/chat-modal/chat-modal.js.map +1 -1
- package/dist/modals/chat-modal/chat-modal.mjs +3 -3
- package/package.json +1 -1
- package/dist/chunk-46OGYEME.mjs.map +0 -1
- package/dist/chunk-KDIL5WUL.mjs.map +0 -1
- package/dist/chunk-PK3LFBGC.mjs.map +0 -1
- /package/dist/{chat-6N5B7A7F.mjs.map → chat-7LOFYEWE.mjs.map} +0 -0
- /package/dist/{chunk-5BZWJQ5O.mjs.map → chunk-JD6C64CT.mjs.map} +0 -0
- /package/dist/{chunk-US4TG745.mjs.map → chunk-QI67R5F6.mjs.map} +0 -0
- /package/dist/{chunk-N4BQ6HKL.mjs.map → chunk-R3NOM2DG.mjs.map} +0 -0
- /package/dist/{chunk-SHYNXDRO.mjs.map → chunk-YGOLNWXJ.mjs.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/management/management.tsx","../src/management/components/PersonalitiesTab.tsx","../src/components/AvatarCropper.tsx","../src/management/shell/parts.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","../src/management/shell/ManagementShell.tsx","../src/management/shell/ManagementOverview.tsx","../src/management/shell/sections.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nconst preloadChatPage = () => import(\"../chat/chat\");\n\nimport React, { useState, useEffect, useCallback, useMemo } from \"react\";\nimport useMediaQuery from \"@mui/material/useMediaQuery\";\n\nimport { useKnowledgeStore } from \"../chat/hooks/useKnowledgeStore\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport { Box, Button, ThemeProvider, CssBaseline, Fab } from \"@mui/material\";\nimport type { Theme } from \"@mui/material/styles\";\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 { predefinedThemes } from \"../theme/themeMap\";\nimport { createBrandingTheme, describeBrandingTheme } from \"@burtson-labs/bandit-themes\";\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 { UploadFileIcon } from \"../icons\";\nimport { ManagementShell, type ManagementLink } from \"./shell/ManagementShell\";\nimport { ManagementOverview, providerLabel } from \"./shell/ManagementOverview\";\nimport { ManagementPageHeader, SaveStatus, SectionSkeleton, UnsavedChangesBar, type SaveState } from \"./shell/parts\";\nimport { MANAGEMENT_SECTIONS, sectionById, useManagementAccess, type ManagementSectionId } from \"./shell/sections\";\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\nexport interface ManagementProps {\n /** Controlled section; omit to let Management keep its own. */\n section?: ManagementSectionId;\n onSectionChange?: (section: ManagementSectionId) => void;\n /** Host destinations for the Organization group (members, usage, billing …). */\n organizationLinks?: ManagementLink[];\n /** Shows \"Search ⌘K\" in the rail; the host owns the palette. */\n onOpenCommandPalette?: () => void;\n /**\n * A one-shot action from the host (its command palette). A new `id` runs it\n * once: it opens the right section and starts the same flow its button does.\n */\n request?: ManagementRequest;\n /**\n * The console's theme (the workspace skin and mode at compact density).\n * Hosts apply it to their own chrome, such as a command palette, so it\n * matches the console.\n */\n onThemeChange?: (theme: Theme) => void;\n /**\n * A fixed section list instead of the signed-in user's access. For\n * previews that run on local data (the playground), never for real access.\n */\n sections?: ManagementSectionId[];\n /** A short line above the page header, such as \"This is a preview\". */\n notice?: React.ReactNode;\n /** Where \"Back to chat\" goes. Default /chat. */\n chatPath?: string;\n}\n\nexport type ManagementRequest = { action: \"create-personality\" | \"upload-knowledge\"; id: number };\n\nconst Management = ({\n section: controlledSection,\n onSectionChange,\n organizationLinks,\n onOpenCommandPalette,\n request,\n onThemeChange,\n sections: sectionOverride,\n notice,\n chatPath = \"/chat\",\n}: ManagementProps = {}) => {\n const navigate = useNavigate();\n\n const notificationService = useNotificationService();\n\n const isMobile = useMediaQuery(\"(max-width:900px)\");\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 [logoFile, setLogoFile] = useState<File | null>(null);\n const [logoBase64, setLogoBase64] = useState<string | null>(null);\n const [brandingText, setBrandingText] = useState(\"\");\n const [headerMode, setHeaderMode] = useState<\"logo\" | \"text\" | \"minimal\">(\"logo\");\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\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 { 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 setHeaderMode((brandingConfig?.headerMode as \"logo\" | \"text\" | \"minimal\") || \"logo\");\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 setHeaderMode((cdnBranding.headerMode as \"logo\" | \"text\" | \"minimal\") || \"logo\");\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(`Saved ${modelToSave.name}.`, '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(\"Couldn't save the personality. 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 headerMode,\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.\", 'success');\n return true;\n } catch (error) {\n debugLogger.error(\"Failed to save branding\", { error });\n showSnackbarMessage(\"Couldn't save branding. Try again.\", 'error');\n return false;\n }\n };\n\n // Preferences save through the store on every change. Fields that confirm a\n // save (Home URL) await the same write here, so \"Saved\" means it was written\n // and a failed write reaches them as an error instead of a false \"Saved\".\n const handleSavePreferences = async () => {\n await usePreferencesStore.getState().savePreferences();\n if (usePreferencesStore.getState().saveState === \"error\") {\n throw new Error(\"Preferences were not saved\");\n }\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 headerMode,\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 setHeaderMode((cdnBranding.headerMode as \"logo\" | \"text\" | \"minimal\") || \"logo\");\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 setHeaderMode(\"logo\");\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 headerMode: \"logo\" as const,\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 setHeaderMode((data.branding.headerMode as \"logo\" | \"text\" | \"minimal\") || \"logo\");\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 // One theme for the whole console, from the shared factory: the chosen\n // skin and mode at compact density. No nested createTheme.\n // A tenant accent (\"tenant-0f766e-dark\") goes through createBanditTheme({ tenant }) too.\n const currentTheme = useMemo(() => createBrandingTheme(theme, { density: \"compact\" }), [theme]);\n useEffect(() => {\n onThemeChange?.(currentTheme);\n }, [currentTheme, onThemeChange]);\n\n // Which sections this user can open (role, then plan features).\n const access = useManagementAccess();\n const sections = useMemo(\n () => (sectionOverride ? MANAGEMENT_SECTIONS.filter((s) => sectionOverride.includes(s.id)) : access.sections),\n [sectionOverride, access.sections],\n );\n const defaultSection: ManagementSectionId = sections.some((s) => s.id === \"overview\")\n ? \"overview\"\n : sections.some((s) => s.id === \"preferences\")\n ? \"preferences\"\n : sections[0]?.id ?? \"preferences\";\n const [ownSection, setOwnSection] = useState<ManagementSectionId | null>(null);\n const requested = controlledSection ?? ownSection ?? defaultSection;\n const active: ManagementSectionId = sections.some((s) => s.id === requested) ? requested : defaultSection;\n const selectSection = useCallback(\n (id: ManagementSectionId) => {\n setOwnSection(id);\n onSectionChange?.(id);\n },\n [onSectionChange],\n );\n const activeDef = sectionById(active);\n\n // Host requests (⌘K): open the section, then run the flow its own button runs.\n const [createPersonalityRequest, setCreatePersonalityRequest] = useState(0);\n const [pendingUpload, setPendingUpload] = useState(0);\n useEffect(() => {\n if (!request) return;\n if (request.action === \"create-personality\") {\n selectSection(\"personalities\");\n setCreatePersonalityRequest(request.id);\n } else if (request.action === \"upload-knowledge\") {\n selectSection(\"knowledge\");\n setPendingUpload(request.id);\n }\n // Only a new request id should run it.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [request?.id]);\n // The tab reads the request in its own effect (children's effects run first);\n // clear it after, so remounting the section doesn't start it again.\n useEffect(() => {\n if (createPersonalityRequest && active === \"personalities\" && brandingLoaded) setCreatePersonalityRequest(0);\n }, [createPersonalityRequest, active, brandingLoaded]);\n useEffect(() => {\n if (!pendingUpload || active !== \"knowledge\" || !brandingLoaded) return;\n const frame = requestAnimationFrame(() => {\n document.getElementById(\"file-upload\")?.click();\n setPendingUpload(0);\n });\n return () => cancelAnimationFrame(frame);\n }, [pendingUpload, active, brandingLoaded]);\n\n // ── Save semantics ─────────────────────────────────────────────────────\n // Preferences save on change (the store persists each update); Branding and\n // Personalities are explicit-save forms with an unsaved-changes bar.\n const prefSaveState = usePreferencesStore((state) => state.saveState);\n const prefSavedAt = usePreferencesStore((state) => state.lastSavedAt);\n const retryPreferences = usePreferencesStore((state) => state.savePreferences);\n\n const brandingValue = JSON.stringify({ logoBase64, brandingText, headerMode, theme });\n const [brandingBaseline, setBrandingBaseline] = useState<string | null>(null);\n const [brandingSave, setBrandingSave] = useState<SaveState>(\"idle\");\n useEffect(() => {\n if (brandingLoaded && brandingBaseline === null) setBrandingBaseline(brandingValue);\n }, [brandingLoaded, brandingBaseline, brandingValue]);\n const brandingDirty = brandingBaseline !== null && brandingBaseline !== brandingValue;\n const saveBrandingFromBar = async () => {\n setBrandingSave(\"saving\");\n const ok = await handleSaveBranding();\n if (ok) setBrandingBaseline(brandingValue);\n setBrandingSave(ok ? \"saved\" : \"error\");\n };\n const discardBranding = () => {\n if (!brandingBaseline) return;\n const saved = JSON.parse(brandingBaseline) as {\n logoBase64: string | null;\n brandingText: string;\n headerMode: \"logo\" | \"text\" | \"minimal\";\n theme: string;\n };\n setLogoFile(null);\n setLogoBase64(saved.logoBase64);\n setBrandingText(saved.brandingText);\n setHeaderMode(saved.headerMode);\n setTheme(saved.theme);\n setBrandingSave(\"idle\");\n };\n\n const norm = (v?: string | null) => (v ?? \"\").trim();\n const savedPersonality = availableModels.find(\n (m) => m.name === (localSelectedModel.selectedModel || localSelectedModel.name),\n );\n const personalityDirty = savedPersonality\n ? norm(localSelectedModel.name) !== norm(savedPersonality.name) ||\n norm(localSelectedModel.tagline) !== norm(savedPersonality.tagline) ||\n norm(localSelectedModel.systemPrompt) !== norm(savedPersonality.systemPrompt)\n : Boolean(norm(localSelectedModel.name) || norm(localSelectedModel.tagline) || norm(localSelectedModel.systemPrompt));\n const [personalitySaving, setPersonalitySaving] = useState(false);\n const savePersonalityFromBar = async () => {\n setPersonalitySaving(true);\n try {\n await handleSaveModel();\n } finally {\n setPersonalitySaving(false);\n }\n };\n const discardPersonality = () => {\n if (savedPersonality) {\n setLocalSelectedModel({\n name: savedPersonality.name,\n tagline: savedPersonality.tagline ?? \"\",\n systemPrompt: savedPersonality.systemPrompt ?? \"\",\n selectedModel: savedPersonality.name,\n });\n } else {\n handleResetModel();\n }\n };\n\n const headerStatus: React.ReactNode =\n active === \"preferences\" ? (\n <SaveStatus auto state={prefSaveState} savedAt={prefSavedAt} onRetry={() => void retryPreferences()} />\n ) : active === \"branding\" ? (\n <SaveStatus state={brandingDirty ? \"unsaved\" : brandingSave === \"saving\" ? \"saving\" : brandingSave} />\n ) : active === \"personalities\" && personalityDirty ? (\n <SaveStatus state=\"unsaved\" />\n ) : null;\n\n const themeLabel = describeBrandingTheme(theme);\n\n // Hold the console's shape while the workspace config loads, instead of a blank page.\n if (!brandingLoaded) {\n return (\n <ThemeProvider theme={currentTheme}>\n <CssBaseline />\n <ManagementShell\n sections={sections}\n active={active}\n onSelect={selectSection}\n organizationLinks={organizationLinks}\n onBackToChat={() => navigate(chatPath)}\n onBackHover={preloadChatPage}\n onOpenCommandPalette={onOpenCommandPalette}\n isMobile={isMobile}\n >\n <SectionSkeleton />\n </ManagementShell>\n </ThemeProvider>\n );\n }\n\n return (\n <ThemeProvider theme={currentTheme}>\n <CssBaseline />\n <ManagementShell\n sections={sections}\n active={active}\n onSelect={selectSection}\n organizationLinks={organizationLinks}\n onBackToChat={() => navigate(chatPath)}\n onBackHover={preloadChatPage}\n onOpenCommandPalette={onOpenCommandPalette}\n isMobile={isMobile}\n >\n {notice}\n <ManagementPageHeader\n title={activeDef.label}\n description={activeDef.description}\n status={headerStatus}\n actions={\n active === \"knowledge\" ? (\n <Button\n variant=\"contained\"\n startIcon={<UploadFileIcon />}\n onClick={() => document.getElementById(\"file-upload\")?.click()}\n >\n Upload\n </Button>\n ) : undefined\n }\n />\n\n <Box sx={{ flex: 1, minWidth: 0, display: \"flex\", flexDirection: \"column\" }}>\n {/* Sections sit on the same gutter as the page header; the overview lays out its own grid. */}\n <Box\n key={active}\n sx={active === \"overview\" ? undefined : { px: { xs: 1.5, sm: 2.5, md: 3 }, pt: 1.5, pb: 3, minWidth: 0 }}\n >\n {active === \"overview\" && (\n <ManagementOverview\n sections={sections}\n onSelect={selectSection}\n facts={{\n personalities: availableModels.length,\n activePersonality: selectedModel || undefined,\n documents: documents.length,\n providerLabel: providerLabel(currentProviderConfig?.type ?? packageSettings?.aiProvider?.type),\n providerModel: currentProviderConfig?.defaultModel ?? packageSettings?.defaultModel,\n themeLabel,\n }}\n />\n )}\n {active === \"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 createRequest={createPersonalityRequest}\n />\n )}\n {active === \"branding\" && (\n <BrandingTab\n logoFile={logoFile}\n logoBase64={logoBase64}\n brandingText={brandingText}\n setBrandingText={setBrandingText}\n headerMode={headerMode}\n setHeaderMode={setHeaderMode}\n theme={theme}\n setTheme={setTheme}\n predefinedThemes={predefinedThemes}\n handleLogoUpload={handleLogoUpload}\n handleRestoreDefaults={handleRestoreDefaults}\n handleExportConfig={handleExportConfig}\n handleImportConfig={handleImportConfig}\n handleSaveBranding={async () => {\n const ok = await handleSaveBranding();\n if (ok) setBrandingBaseline(brandingValue);\n return ok;\n }}\n setLogoFile={setLogoFile}\n setLogoBase64={setLogoBase64}\n />\n )}\n {active === \"knowledge\" && (\n <KnowledgeHubTab\n documents={documents}\n addDocuments={addDocuments}\n removeDocument={removeDocument}\n loadDocuments={loadDocuments}\n clearAllDocuments={clearAllDocuments}\n currentTheme={currentTheme}\n isLimitedAdmin={access.isLimitedAdmin}\n seedPacksEnabled={seedPacksEnabled}\n />\n )}\n {active === \"storage\" && <StorageTab currentTheme={currentTheme} />}\n {active === \"preferences\" && (\n <PreferencesTab\n preferences={preferences}\n updatePreference={updatePreference}\n packageSettings={packageSettings}\n handleSavePreferences={handleSavePreferences}\n showSnackbar={showSnackbarMessage}\n />\n )}\n {active === \"provider\" && <ProviderTab />}\n {active === \"tools\" && <MCPToolsTabV2 />}\n </Box>\n\n {active === \"branding\" && (\n <UnsavedChangesBar\n open={brandingDirty}\n saving={brandingSave === \"saving\"}\n error={brandingSave === \"error\" ? \"Branding wasn't saved. Try again.\" : null}\n onSave={() => void saveBrandingFromBar()}\n onDiscard={discardBranding}\n message=\"Branding has unsaved changes\"\n />\n )}\n {active === \"personalities\" && (\n <UnsavedChangesBar\n open={personalityDirty}\n saving={personalitySaving}\n onSave={() => void savePersonalityFromBar()}\n onDiscard={discardPersonality}\n saveLabel=\"Save personality\"\n message={\n savedPersonality\n ? `${savedPersonality.name} has unsaved changes`\n : \"This personality hasn't been saved yet\"\n }\n />\n )}\n </Box>\n </ManagementShell>\n\n {/* Desktop only: on phones the floating assistant covers page actions and the\n in-modal chat duplicates the main chat one tap away. */}\n {!isMobile && (\n <Fab\n aria-label=\"Ask the assistant\"\n onClick={handleOpenModal}\n color=\"primary\"\n sx={{ position: \"fixed\", bottom: 16, right: 16, zIndex: (t) => t.zIndex.modal - 1 }}\n >\n <img src={fabLogo} alt=\"\" style={{ width: 30, height: 30, objectFit: \"contain\" }} />\n </Fab>\n )}\n {!isMobile && <ChatModal open={modalOpen} onClose={handleCloseModal} />}\n </ThemeProvider>\n );\n};\n\nexport default Management;\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport {\n Box,\n TextField,\n Button,\n ButtonBase,\n Typography,\n MenuItem,\n Avatar,\n Card,\n CardActionArea,\n CardContent,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n Stack,\n Tabs,\n Tab,\n Chip,\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 AddIcon,\n EditNoteOutlinedIcon,\n ManageAccountsOutlinedIcon,\n PersonIcon,\n ViewModuleOutlinedIcon,\n} from \"../../icons\";\nimport { ManagementEmptyState } from \"../shell/parts\";\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 /**\n * Bump to a new truthy value to start a new personality (as the Create\n * personality button does), e.g. from the command palette. 0/undefined is ignored.\n */\n createRequest?: number;\n}\n\nconst 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 createRequest,\n}) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n const [personalityTabIndex, setPersonalityTabIndex] = useState(0);\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 [cropperOpen, setCropperOpen] = useState(false);\n const [selectedImageFile, setSelectedImageFile] = useState<File | null>(null);\n\n /** Clears the form and opens Create / Edit for a new personality. */\n const startNewPersonality = () => {\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 // Outside callers (the command palette) ask for a new personality by bumping createRequest.\n const startNewPersonalityRef = useRef(startNewPersonality);\n startNewPersonalityRef.current = startNewPersonality;\n useEffect(() => {\n if (createRequest) startNewPersonalityRef.current();\n }, [createRequest]);\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\" },\n { label: \"Professional\" },\n { label: \"Casual\" },\n { label: \"Enthusiastic\" },\n { label: \"Calm\" },\n { label: \"Witty\" },\n { label: \"Serious\" },\n { label: \"Supportive\" }\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 the ${mood} mood to the prompt.`, '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.', '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<{ deleted?: string[] }>(\"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\");\n \n // Show success message\n if (showSnackbar) {\n showSnackbar(`Deleted ${personalityToDelete}.`, 'success');\n }\n \n } catch (error) {\n debugLogger.error(\"Failed to delete personality\", { error });\n \n // Show error message\n if (showSnackbar) {\n showSnackbar(`Couldn't delete ${personalityToDelete}. Try again.`, 'error');\n }\n } finally {\n setDeleteDialogOpen(false);\n setPersonalityToDelete(null);\n }\n };\n\n /** One click adds a line to the system prompt; the chip fills briefly to confirm. */\n const renderPromptChip = (chipKey: string, label: string, onClick: () => void) => {\n const active = clickedChips.has(chipKey);\n return (\n <Chip\n key={chipKey}\n label={label}\n onClick={onClick}\n variant={active ? \"filled\" : \"outlined\"}\n color={active ? \"primary\" : \"default\"}\n />\n );\n };\n\n const flashChip = (chipKey: string) => {\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\n const renderAvatarOption = (label: string, src: string) => {\n const selected = presetAvatar === src;\n return (\n <ButtonBase\n aria-label={`Use the ${label} avatar`}\n aria-pressed={selected}\n onClick={() => {\n setPresetAvatar(src);\n setCustomAvatarBase64(null);\n }}\n sx={{\n borderRadius: \"50%\",\n p: \"2px\",\n border: 2,\n borderColor: selected ? \"primary.main\" : \"transparent\",\n \"&:hover\": { borderColor: selected ? \"primary.main\" : \"divider\" },\n \"&.Mui-focusVisible\": { borderColor: \"primary.main\" },\n }}\n >\n <Avatar src={src} alt={label} sx={{ width: 52, height: 52 }} />\n </ButtonBase>\n );\n };\n\n const sectionHeading = (title: string, hint?: string) => (\n <Box sx={{ mb: 1 }}>\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 600 }}>\n {title}\n </Typography>\n {hint && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {hint}\n </Typography>\n )}\n </Box>\n );\n\n const renderTemplatesTab = () => (\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1.5 }}>\n Start from a template, then adjust the name, prompt and avatar in Create / Edit. Nothing is saved until you save it.\n </Typography>\n\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 lg: \"repeat(4, minmax(0, 1fr))\",\n },\n gap: 1.5,\n alignItems: \"stretch\",\n }}\n >\n {/* Create from scratch */}\n <Card variant=\"outlined\" sx={{ borderStyle: \"dashed\", display: \"flex\" }}>\n <CardActionArea\n onClick={startNewPersonality}\n sx={{ p: 1.5, display: \"flex\", flexDirection: \"column\", alignItems: \"flex-start\", justifyContent: \"flex-start\", gap: 1 }}\n >\n <Box\n aria-hidden\n sx={{\n width: 44,\n height: 44,\n borderRadius: \"50%\",\n display: \"grid\",\n placeItems: \"center\",\n color: \"primary.main\",\n border: 1,\n borderColor: \"divider\",\n }}\n >\n <AddIcon fontSize=\"small\" />\n </Box>\n <Box>\n <Typography variant=\"body2\" sx={{ fontWeight: 600 }}>\n Start from scratch\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n A blank personality: you write the name, prompt and pick an avatar.\n </Typography>\n </Box>\n </CardActionArea>\n </Card>\n\n {promptTemplates.map((template, index) => (\n <Card key={index} variant=\"outlined\" sx={{ display: \"flex\" }}>\n <CardActionArea\n aria-label={`Use the ${template.name} template`}\n onClick={() => handleTemplateSelect(template)}\n sx={{ p: 1.5, display: \"flex\", flexDirection: \"column\", alignItems: \"stretch\", justifyContent: \"flex-start\" }}\n >\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1.25, mb: 1 }}>\n <Avatar src={template.avatar} alt={template.name} sx={{ width: 44, height: 44, flexShrink: 0 }} />\n <Box sx={{ minWidth: 0 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600 }} noWrap>\n {template.name}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: \"block\" }} noWrap>\n {template.tagline}\n </Typography>\n </Box>\n </Box>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{\n flex: 1,\n display: \"-webkit-box\",\n WebkitLineClamp: 3,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n }}\n >\n {template.description}\n </Typography>\n <Typography variant=\"body2\" color=\"primary\" sx={{ fontWeight: 600, mt: 1 }}>\n Use template\n </Typography>\n </CardActionArea>\n </Card>\n ))}\n </Box>\n </Box>\n );\n\n const renderCreateEditTab = () => (\n <Box sx={{ maxWidth: 880 }}>\n <Box sx={{ mb: 1.5 }}>\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 600 }}>\n {localSelectedModel.selectedModel ? \"Edit personality\" : \"New personality\"}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {localSelectedModel.selectedModel\n ? `Changes to ${localSelectedModel.selectedModel} apply once you save.`\n : \"Give it a name and a system prompt, then save to add it to the personality list.\"}\n </Typography>\n </Box>\n\n <Box sx={{ mb: 1.5 }}>\n {localSelectedModel.selectedModel && (\n <Box sx={{ display: \"flex\", alignItems: \"center\", mb: 1.5 }}>\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: 36, height: 36, mr: 1.5 }}\n />\n <Typography variant=\"body2\" sx={{ fontWeight: 600 }}>{localSelectedModel.selectedModel}</Typography>\n </Box>\n )}\n\n <TextField\n label=\"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 SelectProps={{ displayEmpty: true }}\n InputLabelProps={{ shrink: true }}\n >\n <MenuItem value=\"\">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 <Box sx={{ display: \"flex\", flexDirection: { xs: \"column\", sm: \"row\" }, gap: 1.5, mb: 2 }}>\n <TextField\n label=\"Name\"\n variant=\"outlined\"\n value={localSelectedModel.name}\n onChange={(e) =>\n setLocalSelectedModel({ ...localSelectedModel, name: e.target.value })\n }\n fullWidth\n required\n placeholder=\"e.g., My Custom Assistant\"\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 />\n </Box>\n\n <Box sx={{ mb: 2 }}>\n {sectionHeading(\"Tone\", \"Adds a line about tone to the system prompt.\")}\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 1 }}>\n {moodSuggestions.map((mood) =>\n renderPromptChip(`mood-${mood.label}`, mood.label, () => handleMoodSelect(mood.label))\n )}\n </Box>\n </Box>\n\n <Box sx={{ mb: 2 }}>\n {sectionHeading(\"Guidance\", \"Adds a line about how to answer to the system prompt.\")}\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 1 }}>\n {[\n { label: \"Be Specific\", text: \"Always be specific and detailed in your responses.\" },\n { label: \"Stay In Character\", text: \"Maintain your personality consistently throughout the conversation.\" },\n { label: \"Ask Questions\", text: \"Ask clarifying questions when you need more information to help effectively.\" },\n { label: \"Be Helpful\", text: \"Always prioritize being helpful and providing actionable advice.\" },\n { label: \"Use Examples\", text: \"Provide concrete examples whenever possible to illustrate your points.\" },\n { label: \"Be Concise\", text: \"Keep responses focused and concise while still being thorough.\" },\n ].map((tip) =>\n renderPromptChip(`tip-${tip.label}`, tip.label, () => {\n const currentPrompt = localSelectedModel.systemPrompt || \"\";\n const updatedPrompt = currentPrompt + (currentPrompt ? \"\\n\\n\" : \"\") + tip.text;\n setLocalSelectedModel({\n ...localSelectedModel,\n systemPrompt: updatedPrompt\n });\n flashChip(`tip-${tip.label}`);\n if (showSnackbar) {\n showSnackbar(`Added \"${tip.label}\" to the prompt.`, 'success');\n }\n })\n )}\n </Box>\n </Box>\n\n <Box sx={{ mb: 2 }}>\n {sectionHeading(\"Formatting\", \"Adds an instruction about response formatting to the system prompt.\")}\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 1 }}>\n {[\n { label: \"Highlight Text\", text: \"Use <mark>highlighted text</mark> to emphasize important points.\" },\n { label: \"Bold Emphasis\", text: \"Use **bold text** to make key concepts stand out.\" },\n { label: \"Add Emojis\", text: \"Use relevant emojis 🎯 to make responses more friendly and engaging.\" },\n { label: \"Code Blocks\", text: \"Use `code snippets` or ```code blocks``` for technical content.\" },\n { label: \"Lists & Structure\", text: \"Use bullet points:\\n• Point 1\\n• Point 2\\n• Point 3\" },\n { label: \"Action Items\", text: \"Create actionable steps:\\n✅ Do this first\\n🔄 Then this\\n🎯 Finally this\" },\n ].map((tool) =>\n renderPromptChip(`tool-${tool.label}`, tool.label, () => {\n const currentPrompt = localSelectedModel.systemPrompt || \"\";\n const updatedPrompt = currentPrompt + (currentPrompt ? \"\\n\\n\" : \"\") + tool.text;\n setLocalSelectedModel({\n ...localSelectedModel,\n systemPrompt: updatedPrompt\n });\n flashChip(`tool-${tool.label}`);\n if (showSnackbar) {\n showSnackbar(`Added \"${tool.label}\" to the prompt.`, 'success');\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 required\n multiline\n rows={8}\n placeholder=\"Describe how your assistant should behave...\"\n InputLabelProps={{ shrink: true }}\n InputProps={{\n style: {\n maxHeight: \"320px\",\n },\n }}\n sx={{ mb: 2 }}\n />\n\n {/* Avatar selection: show for all models */}\n <Box sx={{ mb: 2 }}>\n {sectionHeading(\"Avatar\", \"Shown next to this personality's replies.\")}\n\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mb: 0.75, display: \"block\" }}>\n Robots\n </Typography>\n <Box sx={{ display: \"flex\", gap: 1, mb: 1.5, 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 <Box key={label}>{renderAvatarOption(label, src)}</Box>\n ))}\n </Box>\n\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mb: 0.75, display: \"block\" }}>\n Characters\n </Typography>\n <Box sx={{ display: \"flex\", gap: 1, mb: 1.5, 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.25, width: 76 }}>\n {renderAvatarOption(label, src)}\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{\n textAlign: 'center',\n lineHeight: 1.2,\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden'\n }}\n >\n {role}\n </Typography>\n </Box>\n ))}\n </Box>\n\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mb: 0.75, display: \"block\" }}>\n Your own image\n </Typography>\n <Box sx={{ display: \"flex\", flexDirection: { xs: \"column\", sm: \"row\" }, alignItems: { sm: \"center\" }, gap: 1.5 }}>\n <Button\n variant=\"outlined\"\n component=\"label\"\n sx={{ width: { xs: '100%', sm: 'auto' } }}\n >\n Upload and crop an image\n <input\n type=\"file\"\n accept=\"image/png, image/jpeg, image/jpg\"\n hidden\n onChange={handleImageUpload}\n />\n </Button>\n <Typography variant=\"caption\" color=\"text.secondary\">\n JPG or PNG up to 10 MB, cropped to 512×512 px\n </Typography>\n </Box>\n\n {(customAvatarBase64 || presetAvatar) && (\n <Box sx={{ mt: 1.5, display: 'flex', alignItems: 'center', gap: 1.5 }}>\n <Avatar\n src={(customAvatarBase64 || presetAvatar) as string}\n alt=\"Avatar Preview\"\n sx={{ width: 52, height: 52 }}\n />\n <Box>\n <Typography variant=\"body2\" sx={{ fontWeight: 600 }}>\n Selected avatar\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {customAvatarBase64 ? 'Your uploaded image' : 'From the avatar set'}\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 {/* The page's unsaved-changes bar also saves; these stay for the form's own flow. */}\n <Box\n sx={{\n display: \"flex\",\n flexDirection: { xs: \"column-reverse\", sm: \"row\" },\n gap: 1,\n pt: 1.5,\n borderTop: 1,\n borderColor: \"divider\",\n }}\n >\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 <Button\n variant=\"text\"\n color=\"inherit\"\n onClick={handleResetModel}\n sx={{ width: { xs: '100%', sm: 'auto' } }}\n >\n Reset form\n </Button>\n </Box>\n </Box>\n );\n\n const renderManageTab = () => (\n <Box>\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n mb: 1.5,\n flexWrap: \"wrap\",\n gap: 1,\n }}\n >\n <Typography variant=\"body2\" color=\"text.secondary\">\n {availableModels.length === 1 ? \"1 personality\" : `${availableModels.length} personalities`}\n </Typography>\n <Button\n variant=\"outlined\"\n onClick={() => setRestoreDialogOpen(true)}\n >\n Restore defaults\n </Button>\n </Box>\n\n {availableModels.length === 0 ? (\n <ManagementEmptyState\n icon={<PersonIcon />}\n title=\"No personalities yet\"\n description=\"A personality is the name, avatar and system prompt people chat with. Start from scratch or from a template.\"\n action={\n <Button variant=\"contained\" onClick={startNewPersonality}>\n Create personality\n </Button>\n }\n secondaryAction={\n <Button\n variant=\"outlined\"\n onClick={() => setPersonalityTabIndex(0)} // Switch to Templates tab\n >\n Browse templates\n </Button>\n }\n />\n ) : (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 1 }}>\n {availableModels.map((model) => (\n <Card key={model.name} variant=\"outlined\">\n <CardContent\n sx={{\n p: 1.25,\n \"&:last-child\": { pb: 1.25 },\n display: \"flex\",\n alignItems: \"center\",\n gap: 1.5,\n flexWrap: { xs: \"wrap\", sm: \"nowrap\" },\n }}\n >\n <Avatar\n src={resolveAvatar(model)}\n alt={model.name}\n sx={{ width: 40, height: 40, flexShrink: 0 }}\n />\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, lineHeight: 1.2 }} noWrap>\n {model.name}\n </Typography>\n <Typography variant=\"caption\" sx={{ color: \"text.secondary\", display: \"block\" }} noWrap>\n {model.tagline}\n </Typography>\n </Box>\n <Box sx={{ display: \"flex\", gap: 1, flexShrink: 0, width: { xs: \"100%\", sm: \"auto\" } }}>\n <Button\n variant=\"outlined\"\n aria-label={`Edit ${model.name}`}\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: { xs: 1, sm: \"initial\" }, minHeight: { xs: 44, sm: \"auto\" } }}\n >\n Edit\n </Button>\n <Button\n variant=\"text\"\n color=\"error\"\n aria-label={`Delete ${model.name}`}\n onClick={() => handleDeletePersonality(model.name)}\n sx={{ flex: { xs: 1, sm: \"initial\" }, minHeight: { xs: 44, sm: \"auto\" } }}\n >\n Delete\n </Button>\n </Box>\n </CardContent>\n </Card>\n ))}\n </Box>\n )}\n\n\n <Dialog open={restoreDialogOpen} onClose={() => setRestoreDialogOpen(false)}>\n <DialogTitle>Restore default personalities?</DialogTitle>\n <DialogContent>\n <DialogContentText>\n This deletes every custom personality and restores the original set. It can't be undone.\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 This deletes the personality and its prompt. It can't 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\", minWidth: 0 }}>\n {/* Sub-sections, with the page's create action beside them. */}\n <Stack\n direction={{ xs: \"column-reverse\", sm: \"row\" }}\n alignItems={{ xs: \"stretch\", sm: \"flex-end\" }}\n justifyContent=\"space-between\"\n spacing={1}\n sx={{ borderBottom: 1, borderColor: \"divider\", mb: 2 }}\n >\n <Tabs\n value={personalityTabIndex}\n onChange={(_, newValue) => setPersonalityTabIndex(newValue)}\n variant={isMobile ? \"fullWidth\" : \"standard\"}\n aria-label=\"Personality sections\"\n sx={{ minWidth: 0, \"& .MuiTab-root\": { minHeight: 44 } }}\n >\n <Tab icon={isMobile ? undefined : <ViewModuleOutlinedIcon fontSize=\"small\" />} iconPosition=\"start\" label=\"Templates\" />\n <Tab icon={isMobile ? undefined : <EditNoteOutlinedIcon fontSize=\"small\" />} iconPosition=\"start\" label=\"Create / Edit\" />\n <Tab icon={isMobile ? undefined : <ManageAccountsOutlinedIcon fontSize=\"small\" />} iconPosition=\"start\" label=\"Manage\" />\n </Tabs>\n <Box sx={{ display: \"flex\", justifyContent: \"flex-end\", pb: { xs: 0, sm: 0.75 } }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<AddIcon fontSize=\"small\" />}\n onClick={startNewPersonality}\n >\n Create personality\n </Button>\n </Box>\n </Stack>\n\n <Box sx={{ minHeight: 0, minWidth: 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 * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\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\";\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, display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <ZoomInIcon fontSize=\"inherit\" aria-hidden /> 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\n/**\n * Management's shared pieces: page header, save status, the unsaved-changes\n * bar, empty states and loading placeholders. They are MUI themed by\n * createBanditTheme (the engine ships no Burtson UI CSS to embedders), and they\n * read only theme tokens: no colours, radii or shadows of their own.\n */\nimport React from \"react\";\nimport { Box, Button, Skeleton, Stack, Typography } from \"@mui/material\";\nimport { alpha, type Theme } from \"@mui/material/styles\";\n\n/* ─────────────────────────── page header ─────────────────────────── */\n\nexport function ManagementPageHeader({\n title,\n description,\n status,\n actions,\n}: {\n title: string;\n description?: string;\n /** A SaveStatus, or anything short that says the state of the page. */\n status?: React.ReactNode;\n actions?: React.ReactNode;\n}) {\n return (\n <Box\n component=\"header\"\n sx={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"flex-start\",\n justifyContent: \"space-between\",\n gap: 1.5,\n px: { xs: 1.5, sm: 2.5, md: 3 },\n pt: { xs: 1.5, sm: 2.5, md: 3 },\n pb: 0.5,\n }}\n >\n <Box sx={{ minWidth: 0, flex: \"1 1 320px\" }}>\n <Stack direction=\"row\" alignItems=\"center\" spacing={1.25} sx={{ minWidth: 0 }}>\n <Typography component=\"h1\" variant=\"h5\" sx={{ fontWeight: 600, letterSpacing: \"-0.01em\" }}>\n {title}\n </Typography>\n {status}\n </Stack>\n {description && (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 0.5, maxWidth: 720 }}>\n {description}\n </Typography>\n )}\n </Box>\n {actions && (\n <Stack direction=\"row\" spacing={1} sx={{ flexShrink: 0 }}>\n {actions}\n </Stack>\n )}\n </Box>\n );\n}\n\n/* ─────────────────────────── save status ─────────────────────────── */\n\nexport type SaveState = \"idle\" | \"saving\" | \"saved\" | \"error\" | \"unsaved\";\n\nconst SAVE_TEXT: Record<Exclude<SaveState, \"idle\">, string> = {\n saving: \"Saving…\",\n saved: \"Saved\",\n error: \"Couldn't save\",\n unsaved: \"Unsaved changes\",\n};\n\nconst saveTone = (theme: Theme, state: SaveState) => {\n const s = theme.palette.bandit?.status;\n switch (state) {\n case \"saving\":\n return s?.syncing ?? theme.palette.info.main;\n case \"saved\":\n return s?.success ?? theme.palette.success.main;\n case \"error\":\n return s?.error ?? theme.palette.error.main;\n default:\n return s?.warning ?? theme.palette.warning.main;\n }\n};\n\n/**\n * Says whether a setting saved. `auto` adds \"Changes save automatically\" so an\n * auto-save page never looks like it needs a Save button. Announced politely.\n */\nexport function SaveStatus({\n state,\n auto,\n savedAt,\n onRetry,\n}: {\n state: SaveState;\n auto?: boolean;\n savedAt?: number | null;\n onRetry?: () => void;\n}) {\n const label =\n state === \"idle\"\n ? auto\n ? \"Changes save automatically\"\n : null\n : state === \"saved\" && savedAt\n ? `Saved ${new Date(savedAt).toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\" })}`\n : SAVE_TEXT[state];\n if (!label) return null;\n return (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.75}\n role=\"status\"\n aria-live=\"polite\"\n data-save-state={state}\n sx={{ minWidth: 0 }}\n >\n {state !== \"idle\" && (\n <Box\n aria-hidden\n sx={(theme) => ({\n width: 7,\n height: 7,\n borderRadius: \"50%\",\n flexShrink: 0,\n bgcolor: saveTone(theme, state),\n ...(state === \"saving\" && {\n \"@media (prefers-reduced-motion: no-preference)\": {\n animation: \"bandit-save-pulse 1.1s ease-in-out infinite\",\n },\n \"@keyframes bandit-save-pulse\": { \"50%\": { opacity: 0.35 } },\n }),\n })}\n />\n )}\n <Typography variant=\"caption\" color=\"text.secondary\" noWrap>\n {auto && state !== \"idle\" ? `${label} · saves automatically` : label}\n </Typography>\n {state === \"error\" && onRetry && (\n <Button size=\"small\" variant=\"text\" onClick={onRetry} sx={{ minWidth: 0, px: 0.75 }}>\n Retry\n </Button>\n )}\n </Stack>\n );\n}\n\n/* ─────────────────────── unsaved-changes bar ─────────────────────── */\n\n/**\n * Pinned to the bottom of the page while an explicit-save form has changes:\n * what's pending, Discard and Save. It never appears on auto-save pages.\n */\nexport function UnsavedChangesBar({\n open,\n saving,\n error,\n onSave,\n onDiscard,\n saveLabel = \"Save changes\",\n message = \"You have unsaved changes\",\n}: {\n open: boolean;\n saving?: boolean;\n error?: string | null;\n onSave: () => void;\n onDiscard: () => void;\n saveLabel?: string;\n message?: string;\n}) {\n if (!open && !error) return null;\n return (\n <Box\n role=\"region\"\n aria-label=\"Unsaved changes\"\n sx={{\n position: \"sticky\",\n bottom: 0,\n zIndex: 3,\n mt: \"auto\",\n px: { xs: 1.5, sm: 2.5, md: 3 },\n pb: \"calc(12px + env(safe-area-inset-bottom, 0px))\",\n pt: 1.5,\n }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1.5}\n sx={(theme) => ({\n mx: \"auto\",\n maxWidth: 880,\n px: 2,\n py: 1.25,\n borderRadius: `${Number(theme.shape.borderRadius)}px`,\n border: `1px solid ${theme.palette.divider}`,\n bgcolor: theme.palette.bandit?.surface.overlay ?? theme.palette.background.paper,\n boxShadow: theme.shadows[8],\n })}\n >\n <Box\n aria-hidden\n sx={(theme) => ({\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n flexShrink: 0,\n bgcolor: error ? saveTone(theme, \"error\") : saveTone(theme, \"unsaved\"),\n })}\n />\n {/* Wraps rather than truncates: on a phone the whole sentence still reads. */}\n <Typography variant=\"body2\" sx={{ flex: 1, minWidth: 0, lineHeight: 1.35 }}>\n {error ?? message}\n </Typography>\n <Button variant=\"text\" color=\"inherit\" onClick={onDiscard} disabled={saving} sx={{ flexShrink: 0 }}>\n Discard\n </Button>\n <Button variant=\"contained\" onClick={onSave} disabled={saving} sx={{ flexShrink: 0 }}>\n {saving ? \"Saving…\" : error ? \"Try again\" : saveLabel}\n </Button>\n </Stack>\n </Box>\n );\n}\n\n/* ─────────────────────────── empty state ─────────────────────────── */\n\nexport function ManagementEmptyState({\n icon,\n title,\n description,\n action,\n secondaryAction,\n compact,\n}: {\n icon?: React.ReactNode;\n title: string;\n description: string;\n action?: React.ReactNode;\n secondaryAction?: React.ReactNode;\n compact?: boolean;\n}) {\n return (\n <Box\n sx={(theme) => ({\n textAlign: \"center\",\n px: 3,\n py: compact ? 3 : 5,\n borderRadius: `${Number(theme.shape.borderRadius)}px`,\n border: `1px dashed ${theme.palette.divider}`,\n bgcolor: theme.palette.bandit?.surface.subtle ?? \"transparent\",\n })}\n >\n {icon && (\n <Box\n aria-hidden\n sx={(theme) => ({\n mx: \"auto\",\n mb: 1.5,\n width: 44,\n height: 44,\n display: \"grid\",\n placeItems: \"center\",\n borderRadius: \"50%\",\n color: \"primary.main\",\n bgcolor: alpha(theme.palette.primary.main, 0.1),\n \"& svg\": { width: 22, height: 22 },\n })}\n >\n {icon}\n </Box>\n )}\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 600 }}>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 0.5, mx: \"auto\", maxWidth: 440 }}>\n {description}\n </Typography>\n {(action || secondaryAction) && (\n <Stack direction=\"row\" spacing={1} justifyContent=\"center\" sx={{ mt: 2 }}>\n {action}\n {secondaryAction}\n </Stack>\n )}\n </Box>\n );\n}\n\n/* ─────────────────────────── loading ─────────────────────────── */\n\n/** Holds the page's shape while a section loads, so nothing jumps. */\nexport function SectionSkeleton({ rows = 4 }: { rows?: number }) {\n return (\n <Box role=\"status\" aria-busy=\"true\" aria-label=\"Loading\" sx={{ px: { xs: 1.5, sm: 2.5, md: 3 }, py: 2 }}>\n <Skeleton variant=\"text\" width=\"32%\" height={32} />\n <Skeleton variant=\"text\" width=\"56%\" sx={{ mb: 2 }} />\n <Stack spacing={1.25}>\n {Array.from({ length: rows }, (_, i) => (\n <Skeleton key={i} variant=\"rounded\" height={56} />\n ))}\n </Stack>\n </Box>\n );\n}\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport MemoryModal from \"../../chat/memory-modal\";\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 FormControl,\n InputLabel,\n Select,\n MenuItem,\n CircularProgress,\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 { isNativeShell, isStandalonePwa } from \"../../utils/installedApp\";\nimport {\n CheckCircleIcon,\n CloudDoneIcon,\n CloudOffIcon,\n DownloadIcon,\n ErrorIcon,\n LinkIcon,\n RefreshIcon,\n RestoreIcon,\n SyncIcon,\n UploadIcon,\n} from \"../../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 [memoryModalOpen, setMemoryModalOpen] = 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 + voice selection\n // (the voice picker moved here out of the chat app bar).\n const {\n isServiceAvailable: isTTSSTTAvailable,\n availableVoices,\n selectedVoice,\n setSelectedVoice,\n } = 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\",\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 <CircularProgress size={16} aria-label=\"Saving\" />\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>\n <Box sx={{ mb: { xs: 2.5, md: 3 } }}>\n\n <Paper variant=\"outlined\" sx={{ p: { xs: 1.5, sm: 1.75 }, mb: { xs: 1.5, md: 1.75 } }}>\n <Box>\n <Typography variant=\"subtitle1\" component=\"h2\" 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. Starters lean toward the topics you pick, mixed with\n fresh ones each time.\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 variant=\"outlined\" sx={{ p: { xs: 1.5, sm: 1.75 }, mb: { xs: 1.5, md: 1.75 } }}>\n <Box sx={{ display: 'flex', flexDirection: { xs: 'column', sm: 'row' }, justifyContent: 'space-between', gap: 2 }}>\n <Box>\n <Typography variant=\"subtitle1\" component=\"h2\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Conversation and 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 ? 'Takes effect as soon as you switch it.' : '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\n severity=\"error\"\n sx={{ mt: 2 }}\n action={\n syncEnabled ? (\n <Button\n color=\"inherit\"\n size=\"small\"\n onClick={handleManualSync}\n disabled={syncStatus === 'syncing' || manualSyncLoading}\n >\n Retry\n </Button>\n ) : undefined\n }\n >\n <Typography variant=\"body2\" sx={{ fontWeight: 600 }}>\n {syncEnabled\n ? \"Couldn't sync with Bandit Cloud. The gateway didn't respond.\"\n : \"Couldn't reach Bandit Cloud to check sync status.\"}\n </Typography>\n <Typography variant=\"caption\" sx={{ display: 'block', opacity: 0.8 }}>\n {syncError}\n </Typography>\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=\"outlined\"\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 Images and large files stay on this device for now.\n </Typography>\n </Box>\n </Paper>\n\n <Paper variant=\"outlined\" sx={{ p: { xs: 1.5, sm: 1.75 }, mb: { xs: 1.5, md: 1.75 } }}>\n <Typography variant=\"subtitle1\" component=\"h2\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>Features</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 {preferences.memoryEnabled && (\n <Box sx={{ pl: { xs: 0, sm: 6 }, mt: -0.5, mb: 0.5 }}>\n <Button size=\"small\" variant=\"outlined\" onClick={() => setMemoryModalOpen(true)}>\n Manage memories\n </Button>\n <MemoryModal open={memoryModalOpen} onClose={() => setMemoryModalOpen(false)} />\n </Box>\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 isn't configured. Contact your administrator.\"\n }\n </Typography>\n </Box>\n }\n />\n\n {preferences.ttsEnabled && isTTSSTTAvailable && availableVoices.length > 0 && (\n <FormControl size=\"small\" sx={{ ml: { xs: 0, sm: 6 }, mt: 1, maxWidth: 280 }}>\n <InputLabel id=\"tts-voice-label\">Voice</InputLabel>\n <Select\n labelId=\"tts-voice-label\"\n label=\"Voice\"\n value={availableVoices.includes(selectedVoice) ? selectedVoice : \"\"}\n onChange={(e) => setSelectedVoice(e.target.value as string)}\n >\n {availableVoices.map((voice) => (\n <MenuItem key={voice} value={voice}>\n {voice.split(\"-\")[1]\n ? voice.split(\"-\")[1].charAt(0).toUpperCase() + voice.split(\"-\")[1].slice(1)\n : voice}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\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 isn't configured. Contact your 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: 1, ml: { xs: 0, sm: 6 } }}>\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 variant=\"outlined\" sx={{ p: { xs: 1.5, sm: 1.75 }, mb: { xs: 1.5, md: 1.75 } }}>\n <Typography variant=\"subtitle1\" component=\"h2\" sx={{ mb: 1, fontWeight: 600, color: \"text.primary\" }}>Backup and 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' ? 'Import 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 variant=\"outlined\" sx={{ p: { xs: 1.5, sm: 1.75 }, mb: { xs: 1.5, md: 1.75 } }}>\n <Typography variant=\"subtitle1\" component=\"h2\" sx={{ mb: 1, 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 aria-label=\"Refresh gateway status\"\n sx={{ width: { xs: 44, sm: 28 }, height: { xs: 44, sm: 28 } }}\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 Couldn't reach the gateway. Use refresh to check again.\n </Typography>\n {gatewayHealthError.message && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {gatewayHealthError.message}\n </Typography>\n )}\n </Box>\n )}\n </Box>\n </Paper>\n\n {/* Viewport diagnostics — read-only, for debugging PWA geometry on\n real devices (screenshot this block when layout looks off). */}\n <ViewportDiagnostics />\n </Box>\n </Box>\n );\n};\n\nconst ViewportDiagnostics: React.FC = () => {\n const [metrics, setMetrics] = useState<Record<string, string>>({});\n useEffect(() => {\n const read = () => {\n const probe = document.createElement(\"div\");\n probe.style.cssText =\n \"position:fixed;top:0;bottom:0;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px);visibility:hidden;pointer-events:none;\";\n document.body.appendChild(probe);\n const cs = getComputedStyle(probe);\n setMetrics({\n mode: isNativeShell() ? \"native\" : isStandalonePwa() ? \"standalone\" : \"browser\",\n \"screen.height\": `${window.screen.height}`,\n innerHeight: `${window.innerHeight}`,\n \"docElement.clientHeight\": `${document.documentElement.clientHeight}`,\n \"visualViewport.height\": `${Math.round(window.visualViewport?.height ?? -1)}`,\n \"probe fixed t0/b0 height\": `${Math.round(probe.getBoundingClientRect().height)}`,\n \"safe-area-top\": cs.paddingTop,\n \"safe-area-bottom\": cs.paddingBottom,\n });\n probe.remove();\n };\n read();\n window.addEventListener(\"resize\", read);\n return () => window.removeEventListener(\"resize\", read);\n }, []);\n return (\n <Paper variant=\"outlined\" sx={{ p: 2, opacity: 0.85 }}>\n <Typography variant=\"caption\" sx={{ fontWeight: 700, display: \"block\", mb: 0.5 }}>\n Viewport diagnostics\n </Typography>\n {Object.entries(metrics).map(([k, v]) => (\n <Typography key={k} variant=\"caption\" sx={{ display: \"block\", fontFamily: \"monospace\" }}>\n {k}: {v}\n </Typography>\n ))}\n </Paper>\n );\n};\n\nexport default PreferencesTab;\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\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 * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport type { Theme } from '@mui/material/styles';\nimport {\n Alert,\n Box,\n Button,\n Paper,\n Snackbar,\n Stack,\n TextField,\n ToggleButton,\n ToggleButtonGroup,\n Tooltip,\n Typography,\n useTheme,\n} from '@mui/material';\nimport {\n brandingThemeKey,\n isTenantAccent,\n parseBrandingTheme,\n skins,\n TenantPreview,\n themeSkinIds,\n type BanditMode,\n type BrandingThemeChoice,\n} from '@burtson-labs/bandit-themes';\nimport LogoCropper from '../../components/LogoCropper';\nimport {\n DeleteIcon,\n DownloadIcon,\n FileUploadIcon,\n RestoreIcon,\n UploadIcon,\n} from \"../../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\";\nconst defaultLogoFor = (mode: BanditMode) => (mode === 'light' ? lightLogo : banditAiLogo);\n\ntype HeaderMode = 'logo' | 'text' | 'minimal';\n\ninterface BrandingTabProps {\n logoFile: File | null;\n logoBase64: string | null;\n brandingText: string;\n setBrandingText: (text: string) => void;\n headerMode: HeaderMode;\n setHeaderMode: (mode: HeaderMode) => void;\n /** The stored theme key: a skin (\"ocean-light\") or a tenant accent (\"tenant-0f766e-dark\"). */\n theme: string;\n setTheme: (theme: string) => void;\n /** Kept for callers; the skins come from bandit-themes. */\n predefinedThemes?: Record<string, Theme & { name: string }>;\n handleLogoUpload: (event: React.ChangeEvent<HTMLInputElement>) => void;\n handleRestoreDefaults: () => void;\n handleExportConfig: () => void;\n handleImportConfig: (event: React.ChangeEvent<HTMLInputElement>) => void;\n /**\n * Saving happens in Management's unsaved-changes bar (one Save per form);\n * kept so existing callers still type-check.\n */\n handleSaveBranding?: () => Promise<boolean | void> | void;\n setLogoFile?: (file: File | null) => void;\n setLogoBase64?: (base64: string | null) => void;\n}\n\nconst HEADER_MODE_HELP: Record<HeaderMode, string> = {\n logo: 'The logo above the chat.',\n text: 'The name above the chat, no logo.',\n minimal: 'No logo or name: just the greeting.',\n};\n\n/**\n * Branding for this workspace: the tenant's name, logo and accent (or one of\n * Bandit's skins) and light or dark. Everything else comes from\n * createBanditTheme, which corrects the accent for contrast; the preview shows\n * the corrected result in both modes. Saved with the page's unsaved-changes bar.\n */\nconst BrandingTab: React.FC<BrandingTabProps> = ({\n logoBase64,\n brandingText,\n setBrandingText,\n headerMode,\n setHeaderMode,\n theme,\n setTheme,\n handleLogoUpload,\n handleRestoreDefaults,\n handleExportConfig,\n handleImportConfig,\n setLogoFile,\n setLogoBase64,\n}) => {\n const [dragOver, setDragOver] = useState(false);\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 const pageMode = useTheme().palette.mode as BanditMode;\n const choice = parseBrandingTheme(theme);\n const setChoice = (next: BrandingThemeChoice) => setTheme(brandingThemeKey(next));\n const currentAccent = choice.accent ?? skins[choice.skin].accent[choice.mode];\n // The hex field keeps what's typed until it's a colour; the theme only takes valid ones.\n const [accentDraft, setAccentDraft] = useState(currentAccent);\n useEffect(() => setAccentDraft(currentAccent), [currentAccent]);\n const draftValid = isTenantAccent(accentDraft);\n const applyCustomAccent = (value: string) => {\n setAccentDraft(value);\n if (isTenantAccent(value)) setChoice({ skin: 'bandit', mode: choice.mode, accent: value.trim().toLowerCase() });\n };\n\n const notify = (message: string, severity: 'success' | 'error') => {\n setSnackbarMessage(message);\n setSnackbarSeverity(severity);\n setShowSnackbar(true);\n };\n\n const handleImageUpload = (file: File) => {\n if (!file.type.match(/^image\\/(jpeg|jpg|png)$/)) {\n notify('Please select a JPG or PNG image file.', 'error');\n return;\n }\n if (file.size > 10 * 1024 * 1024) {\n notify('Image file size must be less than 10MB.', 'error');\n return;\n }\n setSelectedImageFile(file);\n setCropperOpen(true);\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 handleCropComplete = (croppedImageData: string) => {\n if (setLogoBase64 && setLogoFile) {\n setLogoBase64(croppedImageData);\n setLogoFile(null);\n } else {\n // Fallback to the existing handler\n handleLogoUpload({ target: { files: null, value: '' } } as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n setCropperOpen(false);\n setSelectedImageFile(null);\n notify('Logo cropped and applied.', 'success');\n };\n\n const handleDeleteLogo = () => {\n if (fileInputRef.current) fileInputRef.current.value = '';\n if (setLogoFile && setLogoBase64) {\n setLogoFile(null);\n setLogoBase64(null);\n } else {\n handleLogoUpload({ target: { files: null, value: '' } } as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n };\n\n const withFeedback = (run: () => unknown, ok: string, failed: string) => async () => {\n try {\n await run();\n notify(ok, 'success');\n } catch {\n notify(failed, 'error');\n }\n };\n const handleExport = withFeedback(handleExportConfig, 'Branding configuration exported', 'Failed to export branding configuration');\n const handleReset = withFeedback(handleRestoreDefaults, 'Branding reset to defaults', 'Failed to reset branding settings');\n const handleImport = async (event: React.ChangeEvent<HTMLInputElement>) => {\n try {\n await handleImportConfig(event);\n notify('Branding configuration imported', 'success');\n } catch {\n notify('Failed to import branding configuration', 'error');\n }\n };\n\n const name = brandingText.trim() || 'Bandit AI';\n\n return (\n <Stack spacing={2.5} sx={{ maxWidth: 1040 }}>\n <BrandingSection title=\"Identity\" description=\"How the workspace introduces itself in chat.\">\n <Box sx={{ display: 'grid', gap: 2.5, gridTemplateColumns: { xs: '1fr', md: 'minmax(0, 1fr) minmax(0, 1fr)' } }}>\n <Stack spacing={2}>\n <TextField\n id=\"branding-name\"\n label=\"Name\"\n value={brandingText}\n onChange={(e) => setBrandingText(e.target.value)}\n placeholder=\"Bandit AI\"\n helperText=\"Shown in the browser tab and under the message box. Empty uses Bandit AI.\"\n fullWidth\n />\n <Box>\n <FieldLabel id=\"branding-header-label\">Welcome header</FieldLabel>\n <ToggleButtonGroup\n value={headerMode}\n exclusive\n onChange={(_, mode: HeaderMode | null) => mode && setHeaderMode(mode)}\n size=\"small\"\n fullWidth\n aria-labelledby=\"branding-header-label\"\n >\n <ToggleButton value=\"logo\">Logo</ToggleButton>\n <ToggleButton value=\"text\">Name</ToggleButton>\n <ToggleButton value=\"minimal\">Minimal</ToggleButton>\n </ToggleButtonGroup>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mt: 0.75 }}>\n {HEADER_MODE_HELP[headerMode]}\n </Typography>\n </Box>\n </Stack>\n\n <Box>\n <FieldLabel id=\"branding-logo-label\">Logo</FieldLabel>\n <Box\n role=\"button\"\n tabIndex={0}\n aria-labelledby=\"branding-logo-label\"\n aria-describedby=\"branding-logo-help\"\n onClick={() => fileInputRef.current?.click()}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n fileInputRef.current?.click();\n }\n }}\n onDragOver={(e) => {\n e.preventDefault();\n setDragOver(true);\n }}\n onDragLeave={(e) => {\n e.preventDefault();\n setDragOver(false);\n }}\n onDrop={handleDrop}\n sx={(t) => ({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n p: 2,\n cursor: 'pointer',\n borderRadius: `${Number(t.shape.borderRadius)}px`,\n border: `1px dashed ${dragOver ? t.palette.primary.main : t.palette.divider}`,\n bgcolor: dragOver ? 'action.hover' : t.palette.bandit.surface.subtle,\n '&:hover': { borderColor: 'primary.main' },\n })}\n >\n <Box\n component=\"img\"\n src={logoBase64 || defaultLogoFor(pageMode)}\n alt=\"\"\n sx={(t) => ({\n width: 56,\n height: 56,\n flexShrink: 0,\n objectFit: 'contain',\n p: 0.5,\n borderRadius: `${Number(t.shape.borderRadius)}px`,\n bgcolor: t.palette.background.paper,\n border: `1px solid ${t.palette.divider}`,\n })}\n />\n <Box sx={{ minWidth: 0 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600 }}>\n {dragOver ? 'Drop to upload' : logoBase64 ? 'Your logo' : 'Bandit logo (default)'}\n </Typography>\n <Typography id=\"branding-logo-help\" variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block' }}>\n Drop a JPG or PNG up to 10MB, or select to upload. You can crop it before it's used.\n </Typography>\n </Box>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/jpg\"\n hidden\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) handleImageUpload(file);\n }}\n />\n </Box>\n <Stack direction=\"row\" spacing={1} sx={{ mt: 1 }}>\n <Button size=\"small\" variant=\"outlined\" startIcon={<UploadIcon />} onClick={() => fileInputRef.current?.click()}>\n {logoBase64 ? 'Replace' : 'Upload'}\n </Button>\n {logoBase64 && (\n <Button size=\"small\" variant=\"text\" color=\"inherit\" startIcon={<DeleteIcon />} onClick={handleDeleteLogo}>\n Remove\n </Button>\n )}\n </Stack>\n </Box>\n </Box>\n </BrandingSection>\n\n <BrandingSection\n title=\"Colour\"\n description=\"Pick an accent for buttons, links and selection, and whether chat opens light or dark.\"\n >\n <Stack spacing={2.5}>\n <Box>\n <FieldLabel id=\"branding-mode-label\">Appearance</FieldLabel>\n <ToggleButtonGroup\n value={choice.mode}\n exclusive\n size=\"small\"\n aria-labelledby=\"branding-mode-label\"\n onChange={(_, mode: BanditMode | null) => mode && setChoice({ ...choice, mode })}\n >\n <ToggleButton value=\"dark\" sx={{ px: 2 }}>Dark</ToggleButton>\n <ToggleButton value=\"light\" sx={{ px: 2 }}>Light</ToggleButton>\n </ToggleButtonGroup>\n </Box>\n\n <Box>\n <FieldLabel id=\"branding-accent-label\">Accent</FieldLabel>\n <Stack direction=\"row\" role=\"group\" aria-labelledby=\"branding-accent-label\" sx={{ flexWrap: 'wrap', gap: 1 }}>\n {themeSkinIds.map((id) => {\n const skin = skins[id];\n const selected = !choice.accent && choice.skin === id;\n return (\n <Tooltip key={id} title={skin.label}>\n <Box\n component=\"button\"\n type=\"button\"\n aria-label={skin.label}\n aria-pressed={selected}\n onClick={() => setChoice({ skin: id, mode: choice.mode })}\n sx={(t) => ({\n width: 32,\n height: 32,\n p: 0,\n cursor: 'pointer',\n borderRadius: '50%',\n border: `2px solid ${selected ? t.palette.text.primary : t.palette.divider}`,\n outlineOffset: 2,\n })}\n // The fill is the skin's accent: data, not styling.\n style={{ backgroundColor: skin.accent[choice.mode] }}\n />\n </Tooltip>\n );\n })}\n </Stack>\n <Stack direction=\"row\" spacing={1} alignItems=\"flex-start\" sx={{ mt: 1.5 }}>\n <Box\n component=\"input\"\n type=\"color\"\n aria-label=\"Pick a custom accent colour\"\n value={draftValid ? accentDraft : currentAccent}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => applyCustomAccent(e.target.value)}\n sx={{ width: 40, height: 40, p: 0, border: 0, bgcolor: 'transparent', cursor: 'pointer', flexShrink: 0 }}\n />\n <TextField\n id=\"branding-accent-hex\"\n label=\"Custom accent\"\n size=\"small\"\n value={accentDraft}\n onChange={(e) => applyCustomAccent(e.target.value.trim())}\n error={!draftValid}\n helperText={\n draftValid\n ? choice.accent\n ? 'Your colour. We adjust it if text on it would be hard to read.'\n : `${skins[choice.skin].label}'s accent. Type a hex colour to use your own.`\n : 'Use a six-digit hex colour, like #0F766E.'\n }\n inputProps={{ spellCheck: false, style: { fontFamily: 'var(--font-mono, ui-monospace, monospace)' } }}\n sx={{ maxWidth: 360 }}\n />\n </Stack>\n </Box>\n </Stack>\n </BrandingSection>\n\n <BrandingSection title=\"Preview\" description=\"The chat's welcome screen in both modes, as your team will see it.\">\n <TenantPreview\n title={null}\n accent={choice.accent}\n skin={choice.skin}\n name={name}\n logoUrl={logoBase64 || undefined}\n modes={choice.mode === 'light' ? ['light', 'dark'] : ['dark', 'light']}\n renderBody={(mode) => (\n <WelcomePreview mode={mode} headerMode={headerMode} name={name} logo={logoBase64 || defaultLogoFor(mode)} />\n )}\n />\n </BrandingSection>\n\n <BrandingSection title=\"Configuration\" description=\"Move branding, personalities and knowledge between workspaces, or start again.\">\n <Stack direction=\"row\" sx={{ flexWrap: 'wrap', gap: 1 }}>\n <Button variant=\"outlined\" startIcon={<DownloadIcon />} onClick={() => void handleExport()}>\n Export\n </Button>\n <Button variant=\"outlined\" startIcon={<FileUploadIcon />} onClick={() => importInputRef.current?.click()}>\n Import\n </Button>\n <input ref={importInputRef} type=\"file\" accept=\"application/json\" hidden onChange={handleImport} />\n <Button variant=\"text\" color=\"inherit\" startIcon={<RestoreIcon />} onClick={() => void handleReset()}>\n Reset to defaults\n </Button>\n </Stack>\n </BrandingSection>\n\n <Snackbar\n open={showSnackbar}\n autoHideDuration={4000}\n onClose={() => setShowSnackbar(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Alert onClose={() => setShowSnackbar(false)} severity={snackbarSeverity} variant=\"filled\">\n {snackbarMessage}\n </Alert>\n </Snackbar>\n\n <LogoCropper\n open={cropperOpen}\n onClose={() => {\n setCropperOpen(false);\n setSelectedImageFile(null);\n }}\n onCrop={handleCropComplete}\n imageFile={selectedImageFile}\n />\n </Stack>\n );\n};\n\nconst FieldLabel = ({ id, children }: { id: string; children: React.ReactNode }) => (\n <Typography id={id} variant=\"body2\" sx={{ fontWeight: 600, mb: 0.75 }}>\n {children}\n </Typography>\n);\n\nconst BrandingSection = ({\n title,\n description,\n children,\n}: {\n title: string;\n description: string;\n children: React.ReactNode;\n}) => (\n <Paper variant=\"outlined\" component=\"section\" aria-label={title} sx={{ p: { xs: 2, sm: 2.5 } }}>\n <Typography component=\"h2\" variant=\"subtitle1\" sx={{ fontWeight: 600 }}>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 0.25, mb: 2 }}>\n {description}\n </Typography>\n {children}\n </Paper>\n);\n\n/** The chat's empty state, honouring the welcome header mode. Drawn with the pane's own theme. */\nconst WelcomePreview = ({\n mode,\n headerMode,\n name,\n logo,\n}: {\n mode: BanditMode;\n headerMode: HeaderMode;\n name: string;\n logo: string;\n}) => (\n <Stack spacing={1.5} alignItems=\"center\" sx={{ pt: 1 }}>\n <Box sx={{ minHeight: 64, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {headerMode === 'logo' && (\n <Box component=\"img\" src={logo} alt={`${name} logo (${mode})`} sx={{ maxWidth: 220, maxHeight: 64, objectFit: 'contain' }} />\n )}\n {headerMode === 'text' && (\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n {name}\n </Typography>\n )}\n {headerMode === 'minimal' && (\n <Typography variant=\"subtitle1\" color=\"text.secondary\">\n What can I help with?\n </Typography>\n )}\n </Box>\n <Box\n sx={(t) => ({\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n pl: 1.75,\n pr: 0.75,\n py: 0.75,\n borderRadius: `${Number(t.shape.borderRadius) * 2}px`,\n border: `1px solid ${t.palette.bandit.composer.border}`,\n bgcolor: t.palette.bandit.composer.surface,\n })}\n >\n <Typography variant=\"body2\" sx={(t) => ({ flex: 1, color: t.palette.bandit.composer.placeholder })}>\n What's on your mind?\n </Typography>\n <Box\n aria-hidden\n sx={(t) => ({\n width: 28,\n height: 28,\n borderRadius: '50%',\n bgcolor: t.palette.bandit.control.primarySurface,\n })}\n />\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ textAlign: 'center' }}>\n {name} may be wrong. Double-check important info.\n </Typography>\n </Stack>\n);\n\nexport default BrandingTab;\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\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\";\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 image = imageRef.current;\n if (!image) return;\n\n const cropDims = getCropDimensions();\n\n // Render the full transformed scene to a square scratch canvas using the\n // SAME geometry as the on-screen editor, then extract the crop rectangle.\n // This guarantees the exported region is a faithful, undistorted copy of\n // what the user sees — the crop's true width:height is preserved.\n const scene = document.createElement('canvas');\n scene.width = CANVAS_SIZE;\n scene.height = CANVAS_SIZE;\n const sceneCtx = scene.getContext('2d');\n if (!sceneCtx) return;\n\n sceneCtx.clearRect(0, 0, CANVAS_SIZE, CANVAS_SIZE);\n sceneCtx.save();\n // A single uniform scale (cropSettings.scale) is applied to BOTH axes,\n // so the image is never squashed or stretched.\n sceneCtx.translate(CANVAS_SIZE / 2, CANVAS_SIZE / 2);\n sceneCtx.rotate((cropSettings.rotation * Math.PI) / 180);\n sceneCtx.scale(cropSettings.scale, cropSettings.scale);\n sceneCtx.translate(-image.naturalWidth / 2 + cropSettings.x, -image.naturalHeight / 2 + cropSettings.y);\n sceneCtx.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight);\n sceneCtx.restore();\n\n // Crop rectangle on the scratch canvas (centered, same as editor preview)\n const cropX = (CANVAS_SIZE - cropDims.width) / 2;\n const cropY = (CANVAS_SIZE - cropDims.height) / 2;\n\n // Output canvas keeps the crop's TRUE aspect ratio. The longest side is\n // scaled to the requested output size; the other side follows the ratio.\n const finalSize: number = LOGO_OUTPUT_SIZES[outputSize];\n const cropAspect = cropDims.width / cropDims.height;\n let outputWidth: number = finalSize;\n let outputHeight: number = finalSize;\n if (cropAspect > 1) {\n outputHeight = Math.round(finalSize / cropAspect);\n } else if (cropAspect < 1) {\n outputWidth = Math.round(finalSize * cropAspect);\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = outputWidth;\n canvas.height = outputHeight;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n ctx.clearRect(0, 0, outputWidth, outputHeight);\n // Copy the crop rectangle, scaling it uniformly to the output size. Because\n // output aspect == crop aspect, there is no distortion — a wide logo stays wide.\n ctx.drawImage(\n scene,\n cropX, cropY, cropDims.width, cropDims.height,\n 0, 0, outputWidth, outputHeight\n );\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, 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 Logo\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Position and size your logo. The selected region is exported at its true aspect ratio.\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 — the outlined area is 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=\"info\" variant=\"outlined\" sx={{ borderRadius: 2, py: 0.5 }}>\n <Typography variant=\"caption\" sx={{ fontSize: '0.75rem', lineHeight: 1.5 }}>\n Exported as a transparent PNG at the selected aspect ratio. Wide logos stay wide.\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 Apply Crop\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default LogoCropper;\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\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\";\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 {/* A sub-tab bar only when there is more than one sub-section to switch between. */}\n {seedPacksEnabled && (\n <Tabs\n value={effectiveTabIndex}\n onChange={(_, newValue) => setTabIndex(newValue)}\n variant={isMobile ? \"fullWidth\" : \"standard\"}\n aria-label=\"Knowledge sections\"\n sx={{ mb: 2, borderBottom: 1, borderColor: \"divider\", minHeight: 44 }}\n >\n <Tab\n icon={<DescriptionIcon fontSize=\"small\" />}\n iconPosition=\"start\"\n label=\"Documents\"\n sx={{ minHeight: 44 }}\n />\n <Tab\n icon={<AutoStoriesIcon fontSize=\"small\" />}\n iconPosition=\"start\"\n label=\"Seed packs\"\n sx={{ minHeight: 44 }}\n />\n </Tabs>\n )}\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 * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\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 Checkbox,\n LinearProgress,\n IconButton,\n Alert,\n Skeleton,\n Stack,\n MenuItem,\n Snackbar,\n Switch,\n useTheme,\n Theme,\n} from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport { ManagementEmptyState } from '../shell/parts';\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 ArrowDownwardIcon,\n ArrowUpwardIcon,\n ArticleIcon,\n CheckCircleIcon,\n CodeIcon,\n DataObjectIcon,\n DeleteIcon,\n DescriptionIcon,\n DownloadIcon,\n ErrorIcon,\n GroupIcon,\n LockIcon,\n PersonIcon,\n PictureAsPdfIcon,\n PublicIcon,\n RefreshIcon,\n SearchIcon,\n UploadFileIcon,\n ViewListIcon,\n ViewModuleIcon,\n} from \"../../icons\";\n\n// File type detection. The category (Document, Text, Code, Data) is what the\n// page filters and sorts by; the icon tells the categories apart, so no\n// per-language colours.\ntype FileTypeMeta = { icon: React.ElementType; category: string; language?: string };\n\nconst DOCUMENT: FileTypeMeta = { icon: ArticleIcon, category: 'Document' };\nconst CODE = (language: string): FileTypeMeta => ({ icon: CodeIcon, category: 'Code', language });\nconst DATA = (language: string): FileTypeMeta => ({ icon: DataObjectIcon, category: 'Data', language });\n\nconst FILE_TYPES: Record<string, FileTypeMeta> = {\n // Documents\n pdf: { icon: PictureAsPdfIcon, category: 'Document' },\n doc: DOCUMENT,\n docx: DOCUMENT,\n odt: DOCUMENT,\n rtf: DOCUMENT,\n\n // Text files\n txt: { icon: DescriptionIcon, category: 'Text' },\n md: { icon: DescriptionIcon, category: 'Text', language: 'Markdown' },\n markdown: { icon: DescriptionIcon, category: 'Text', language: 'Markdown' },\n\n // Code\n js: CODE('JavaScript'),\n jsx: CODE('React'),\n ts: CODE('TypeScript'),\n tsx: CODE('React TS'),\n html: CODE('HTML'),\n css: CODE('CSS'),\n scss: CODE('SCSS'),\n sass: CODE('Sass'),\n php: CODE('PHP'),\n c: CODE('C'),\n cpp: CODE('C++'),\n cs: CODE('C#'),\n java: CODE('Java'),\n py: CODE('Python'),\n go: CODE('Go'),\n rs: CODE('Rust'),\n kt: CODE('Kotlin'),\n swift: CODE('Swift'),\n scala: CODE('Scala'),\n rb: CODE('Ruby'),\n sh: CODE('Shell'),\n bash: CODE('Bash'),\n bat: CODE('Batch'),\n ps1: CODE('PowerShell'),\n\n // Data formats\n json: DATA('JSON'),\n xml: DATA('XML'),\n yaml: DATA('YAML'),\n yml: DATA('YAML'),\n csv: DATA('CSV'),\n};\n\nconst getFileTypeInfo = (filename: string): FileTypeMeta => {\n const ext = filename.split('.').pop()?.toLowerCase() || '';\n return FILE_TYPES[ext] || { icon: DescriptionIcon, 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// Where a document lives: Team, Personal (synced) or Local (this browser).\nconst getContentSourceInfo = (doc: KnowledgeDoc, isVectorMode: boolean) => {\n // Vector documents from S3/private cloud: teamSid decides team vs personal\n if (isVectorMode && !!doc.s3Url) {\n return doc.teamSid\n ? { label: 'Team', icon: GroupIcon }\n : { label: 'Personal', icon: PersonIcon };\n }\n\n // Legacy content source classification\n if (doc.contentSource === 'user') {\n return { label: 'Personal', icon: PersonIcon };\n }\n if (doc.contentSource === 'team') {\n return { label: 'Team', icon: GroupIcon };\n }\n\n // Local IndexedDB documents\n return { label: 'Local', icon: LockIcon };\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 /** Kept for compatibility; the tab reads the theme from context. */\n currentTheme: Theme;\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 isLimitedAdmin = false,\n}) => {\n const muiTheme = useTheme();\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 const [vectorLoadError, setVectorLoadError] = useState<string | null>(null);\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 [uploadStatuses, setUploadStatuses] = useState<UploadStatus[]>([]);\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 setVectorLoadError(null);\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 setVectorLoadError(error instanceof Error ? error.message : String(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 // 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 your workspace',\n [\n 'Keeping your documents private while they are prepared',\n 'Reading the content',\n 'Building a searchable index',\n 'Organising the index for fast search',\n 'Finishing up',\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 ? `Uploaded ${files.length} ${files.length === 1 ? 'document' : 'documents'} to your workspace`\n : result.error \n ? `Uploaded with a warning: ${result.error}`\n : `Uploaded ${files.length} ${files.length === 1 ? 'document' : 'documents'}`;\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(`Couldn't upload: ${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(`Couldn't upload: ${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 ? `Uploaded ${files.length} ${files.length === 1 ? 'document' : 'documents'} to your workspace`\n : result.error \n ? `Uploaded with a warning: ${result.error}`\n : `Uploaded ${files.length} ${files.length === 1 ? 'document' : 'documents'}`;\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(`Couldn't upload: ${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(`Couldn't upload: ${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(`Couldn't 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(`Couldn't 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} ${selectedDocuments.length === 1 ? 'document' : '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 const sourceDocuments = shouldUseVector ? vectorDocuments : documents;\n const hasAnyDocuments = sourceDocuments.length > 0;\n const activeFilterCount = [\n searchQuery,\n contentSourceFilter !== 'all',\n selectedCategory !== 'all',\n ].filter(Boolean).length;\n const clearFilters = () => {\n setSearchQuery('');\n setSelectedCategory('all');\n setContentSourceFilter('all');\n };\n const openFilePicker = () => document.getElementById('file-upload')?.click();\n const storageHint = shouldUseVector\n ? hasTeam && shareWithTeam\n ? 'Shared with your team: members can search these documents.'\n : 'Stored privately in your account.'\n : 'Stored locally in this browser.';\n const isInitialVectorLoad = shouldUseVector && loadingVectorDocs && vectorDocuments.length === 0;\n const touchIcon = { width: { xs: 44, sm: 36 }, height: { xs: 44, sm: 36 } };\n const dropHandlers = {\n onDrop: handleFileDrop,\n onDragOver: handleDragOver,\n onDragLeave: handleDragLeave,\n };\n\n return (\n <Box>\n {/* The page header's Upload button clicks this input: keep the id. */}\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\n {/* Summary and page actions */}\n {(hasAnyDocuments || shouldUseVector) && (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n flexWrap=\"wrap\"\n useFlexGap\n spacing={1}\n sx={{ mb: 1.5 }}\n >\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ minWidth: 0 }}>\n {statistics.totalDocuments} {statistics.totalDocuments === 1 ? 'document' : 'documents'} · {statistics.totalSize}\n {Object.entries(statistics.categoryCounts).map(([category, count]) => ` · ${category} ${count}`)}\n {shouldUseVector && ' · Synced workspace'}\n </Typography>\n <Stack direction=\"row\" spacing={1}>\n {shouldUseVector && (\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<RefreshIcon />}\n onClick={loadVectorDocuments}\n disabled={loadingVectorDocs}\n >\n {loadingVectorDocs ? 'Loading…' : 'Refresh'}\n </Button>\n )}\n {documents.length > 0 && (\n <Button\n variant=\"text\"\n size=\"small\"\n color=\"error\"\n startIcon={<DeleteIcon />}\n onClick={() => setClearDocsDialogOpen(true)}\n >\n Clear all\n </Button>\n )}\n </Stack>\n </Stack>\n )}\n\n {/* Team sharing for synced uploads: only when the user has a team */}\n {shouldUseVector && hasTeam && (\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.75} sx={{ mb: 1.5 }}>\n <Switch\n checked={shareWithTeam}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setShareWithTeam(e.target.checked)}\n size=\"small\"\n slotProps={{ input: { 'aria-label': 'Share new uploads with your team' } }}\n />\n {shareWithTeam ? (\n <GroupIcon sx={{ fontSize: '1rem', color: 'text.secondary' }} />\n ) : (\n <PersonIcon sx={{ fontSize: '1rem', color: 'text.secondary' }} />\n )}\n <Typography variant=\"body2\" color=\"text.secondary\">\n {shareWithTeam\n ? 'New uploads are shared with your team'\n : 'New uploads are private to your account'}\n </Typography>\n </Stack>\n )}\n\n {/* Synced documents failed to load */}\n {shouldUseVector && vectorLoadError && (\n <Alert\n severity=\"error\"\n sx={{ mb: 1.5 }}\n action={\n <Button color=\"inherit\" size=\"small\" onClick={loadVectorDocuments} disabled={loadingVectorDocs}>\n Retry\n </Button>\n }\n >\n Couldn't load your synced documents. The workspace didn't respond.\n <Typography variant=\"caption\" component=\"div\" sx={{ opacity: 0.8 }}>\n {vectorLoadError}\n </Typography>\n </Alert>\n )}\n\n {/* Upload progress */}\n {uploadStatuses.length > 0 && (\n <Stack spacing={0.75} sx={{ mb: 1.5 }}>\n {uploadStatuses.map((status, index) => (\n <Stack\n key={index}\n direction=\"row\"\n alignItems=\"center\"\n spacing={1.5}\n sx={{ px: 1.5, py: 1, border: 1, borderColor: 'divider', borderRadius: 1 }}\n >\n {status.status === 'success' ? (\n <CheckCircleIcon color=\"success\" />\n ) : status.status === 'error' ? (\n <ErrorIcon color=\"error\" />\n ) : (\n <Box sx={{ width: 20 }}>\n <LinearProgress variant=\"determinate\" value={status.progress} />\n </Box>\n )}\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography variant=\"body2\" noWrap>\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 </Stack>\n ))}\n </Stack>\n )}\n\n {isInitialVectorLoad ? (\n /* First load of synced documents */\n <Box\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading documents\"\n sx={{\n display: 'grid',\n gridTemplateColumns: { xs: 'repeat(2, 1fr)', sm: 'repeat(3, 1fr)', md: 'repeat(4, 1fr)', lg: 'repeat(6, 1fr)' },\n gap: 1.5,\n }}\n >\n {Array.from({ length: 6 }, (_, i) => (\n <Skeleton key={i} variant=\"rounded\" height={160} />\n ))}\n </Box>\n ) : !hasAnyDocuments ? (\n /* No documents at all: the empty state is also a drop target */\n vectorLoadError ? null : (\n <Box\n {...dropHandlers}\n sx={{\n outline: dragActive ? `2px dashed ${muiTheme.palette.primary.main}` : 'none',\n outlineOffset: 2,\n }}\n >\n <ManagementEmptyState\n icon={<DescriptionIcon />}\n title={dragActive ? 'Drop files to upload' : 'No documents yet'}\n description={`Documents you add here are searched when you chat, so answers can draw on your own material. ${storageHint}`}\n action={\n <Button variant=\"outlined\" startIcon={<UploadFileIcon />} onClick={openFilePicker}>\n Upload documents\n </Button>\n }\n />\n </Box>\n )\n ) : (\n <>\n {/* Drop zone */}\n <Box\n role=\"button\"\n tabIndex={0}\n aria-label=\"Upload documents\"\n {...dropHandlers}\n onClick={openFilePicker}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openFilePicker();\n }\n }}\n sx={{\n mb: 1.5,\n px: 1.5,\n py: 1.5,\n textAlign: 'center',\n cursor: 'pointer',\n borderRadius: 1,\n border: '1px dashed',\n borderColor: dragActive ? 'primary.main' : 'divider',\n bgcolor: dragActive ? alpha(muiTheme.palette.primary.main, 0.06) : 'transparent',\n transition: 'border-color 0.15s ease, background-color 0.15s ease',\n '&:hover, &:focus-visible': { borderColor: 'primary.main', outline: 'none' },\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" justifyContent=\"center\" spacing={1}>\n <UploadFileIcon sx={{ fontSize: 18, color: dragActive ? 'primary.main' : 'text.secondary' }} />\n <Typography variant=\"body2\" sx={{ fontWeight: 500 }} color={dragActive ? 'primary' : 'text.primary'}>\n {dragActive ? 'Drop files here' : 'Drop files here or click to browse'}\n </Typography>\n </Stack>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mt: 0.25 }}>\n PDF, Word, text, Markdown, code and data files. {storageHint}\n </Typography>\n </Box>\n\n {/* Search, filters and view */}\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n useFlexGap\n spacing={1}\n sx={{ mb: 1.5 }}\n >\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 fontSize=\"small\" />\n </InputAdornment>\n ),\n }}\n inputProps={{ 'aria-label': 'Search documents' }}\n sx={{ flex: '1 1 220px', minWidth: 0 }}\n size=\"small\"\n />\n\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 <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={{ minWidth: 140 }}\n >\n <MenuItem value=\"all\">\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <PublicIcon sx={{ fontSize: 16, color: 'text.secondary' }} />\n <span>All sources</span>\n </Stack>\n </MenuItem>\n <MenuItem value=\"personal\">\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <PersonIcon sx={{ fontSize: 16, color: 'text.secondary' }} />\n <span>Personal only</span>\n </Stack>\n </MenuItem>\n <MenuItem value=\"team\">\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <GroupIcon sx={{ fontSize: 16, color: 'text.secondary' }} />\n <span>Team only</span>\n </Stack>\n </MenuItem>\n </TextField>\n\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 {activeFilterCount > 0 && (\n <Chip\n label={`${activeFilterCount} active ${activeFilterCount === 1 ? 'filter' : 'filters'}`}\n size=\"small\"\n variant=\"outlined\"\n onDelete={clearFilters}\n />\n )}\n\n <Stack direction=\"row\" sx={{ ml: 'auto' }}>\n <IconButton\n onClick={() => setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc')}\n aria-label={sortOrder === 'asc' ? 'Sorted ascending. Sort descending' : 'Sorted descending. Sort ascending'}\n sx={touchIcon}\n >\n {sortOrder === 'asc' ? <ArrowUpwardIcon fontSize=\"small\" /> : <ArrowDownwardIcon fontSize=\"small\" />}\n </IconButton>\n <IconButton\n onClick={() => setViewMode('grid')}\n color={viewMode === 'grid' ? 'primary' : 'default'}\n aria-label=\"Grid view\"\n aria-pressed={viewMode === 'grid'}\n sx={touchIcon}\n >\n <ViewModuleIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n onClick={() => setViewMode('list')}\n color={viewMode === 'list' ? 'primary' : 'default'}\n aria-label=\"List view\"\n aria-pressed={viewMode === 'list'}\n sx={touchIcon}\n >\n <ViewListIcon fontSize=\"small\" />\n </IconButton>\n </Stack>\n </Stack>\n\n {filteredAndSortedDocuments.length === 0 ? (\n /* Nothing matches the search or filters */\n <ManagementEmptyState\n compact\n icon={<SearchIcon />}\n title=\"No documents found\"\n description={\n searchQuery\n ? `Nothing matches \"${searchQuery}\"${activeFilterCount > 1 ? ' with these filters' : ''}.`\n : 'No documents match these filters.'\n }\n action={\n <Button variant=\"outlined\" size=\"small\" onClick={clearFilters}>\n {searchQuery ? 'Clear search' : 'Clear filters'}\n </Button>\n }\n />\n ) : (\n <Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mb: 1 }}>\n Showing {filteredAndSortedDocuments.length} of {sourceDocuments.length} documents\n {searchQuery && ` for \"${searchQuery}\"`}\n </Typography>\n\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: 1.5,\n }}\n >\n {filteredAndSortedDocuments.map((doc: KnowledgeDoc) => (\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={selectedDocuments.includes(doc.id)}\n isDeleting={deletingDocuments.has(doc.id)}\n variant=\"full\"\n showSelection={true}\n showDelete={true}\n showPreview={true}\n />\n ))}\n </Box>\n ) : (\n <Stack spacing={0.75}>\n {filteredAndSortedDocuments.map((doc: KnowledgeDoc) => {\n const fileInfo = getFileTypeInfo(doc.name);\n const IconComponent = fileInfo.icon;\n const sourceInfo = getContentSourceInfo(doc, shouldUseVector);\n const SourceIcon = sourceInfo.icon;\n const isSelected = selectedDocuments.includes(doc.id);\n const isDeleting = deletingDocuments.has(doc.id);\n\n return (\n <Stack\n key={doc.id}\n direction=\"row\"\n alignItems=\"center\"\n spacing={1}\n onClick={(e) => {\n if (e.ctrlKey || e.metaKey) {\n toggleDocumentSelection(doc.id);\n } else {\n handleDocumentClick(doc);\n }\n }}\n sx={{\n pl: 0.5,\n pr: 0.5,\n py: 0.25,\n cursor: 'pointer',\n border: 1,\n borderRadius: 1,\n borderColor: isSelected ? 'primary.main' : 'divider',\n bgcolor: isSelected\n ? alpha(muiTheme.palette.primary.main, 0.08)\n : muiTheme.palette.bandit?.surface.raised ?? 'background.paper',\n transition: 'border-color 0.15s ease, opacity 0.3s ease, transform 0.3s ease',\n '&:hover': { borderColor: 'primary.main' },\n opacity: isDeleting ? 0.3 : 1,\n transform: isDeleting ? 'scale(0.98)' : 'none',\n }}\n >\n <Checkbox\n size=\"small\"\n checked={isSelected}\n onClick={(e) => e.stopPropagation()}\n onChange={() => toggleDocumentSelection(doc.id)}\n slotProps={{ input: { 'aria-label': `Select ${doc.name}` } }}\n sx={touchIcon}\n />\n <IconComponent sx={{ fontSize: 20, color: 'text.secondary', flexShrink: 0 }} />\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography variant=\"body2\" noWrap sx={{ fontWeight: 500 }}>\n {doc.name}\n </Typography>\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.5} sx={{ color: 'text.secondary', minWidth: 0 }}>\n <SourceIcon sx={{ fontSize: 12 }} />\n <Typography variant=\"caption\" noWrap>\n {sourceInfo.label} · {fileInfo.language ?? fileInfo.category} · {formatFileSize(doc.content.length * 2)}\n </Typography>\n </Stack>\n </Box>\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n handleDownloadDocument(e, doc);\n }}\n aria-label={`Download ${doc.name}`}\n sx={{ ...touchIcon, color: 'text.secondary' }}\n >\n <DownloadIcon sx={{ fontSize: 18 }} />\n </IconButton>\n <IconButton\n onClick={(e) => handleRemoveDocument(e, doc.id)}\n aria-label={`Delete ${doc.name}`}\n sx={{ ...touchIcon, color: 'text.secondary', '&:hover': { color: 'error.main' } }}\n >\n <DeleteIcon sx={{ fontSize: 18 }} />\n </IconButton>\n </Stack>\n );\n })}\n </Stack>\n )}\n </Box>\n )}\n </>\n )}\n\n {/* Selection actions, pinned to the bottom while documents are selected */}\n {selectedDocuments.length > 0 && (\n <Box\n role=\"region\"\n aria-label=\"Selected documents\"\n sx={{ position: 'sticky', bottom: 0, zIndex: 3, pt: 1.5, pb: 'calc(12px + env(safe-area-inset-bottom, 0px))' }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1}\n sx={{\n mx: 'auto',\n maxWidth: 560,\n px: 2,\n py: 1,\n border: 1,\n borderColor: 'divider',\n borderRadius: 1,\n bgcolor: muiTheme.palette.bandit?.surface.overlay ?? 'background.paper',\n boxShadow: muiTheme.shadows[8],\n }}\n >\n <Typography variant=\"body2\" sx={{ flex: 1, minWidth: 0 }} noWrap>\n {selectedDocuments.length} selected\n </Typography>\n <Button variant=\"text\" size=\"small\" onClick={selectAllDocuments}>\n Select all\n </Button>\n <Button variant=\"text\" size=\"small\" color=\"inherit\" onClick={clearSelection}>\n Clear\n </Button>\n <Button variant=\"outlined\" size=\"small\" color=\"error\" startIcon={<DeleteIcon />} onClick={handleBulkDelete}>\n Delete\n </Button>\n </Stack>\n </Box>\n )}\n\n {/* Clear all documents */}\n <Dialog open={clearDocsDialogOpen} onClose={() => setClearDocsDialogOpen(false)}>\n <DialogTitle>Delete all documents?</DialogTitle>\n <DialogContent>\n <DialogContentText>\n This permanently deletes all {documents.length} documents from this browser's storage. It can't be undone.\n </DialogContentText>\n {documents.length > 0 && (\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n {statistics.totalSize} of document content will be removed.\n </Alert>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setClearDocsDialogOpen(false)}>Cancel</Button>\n <Button onClick={handleClearAllDocuments} color=\"error\" variant=\"contained\" startIcon={<DeleteIcon />}>\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 {/* 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 );\n};\n\nexport default KnowledgeTab;\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\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 { Upload as CloudUpload, Agent as Psychology, Cpu as Memory, Sparkles as AutoAwesome, Agent as SmartToy, Zap as Bolt } from '@burtson-labs/icons/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 * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\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 * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\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 Skeleton,\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 { ManagementEmptyState, SaveStatus } from \"../shell/parts\";\nimport {\n AddIcon,\n ArchiveIcon,\n AutoStoriesIcon,\n DeleteIcon,\n DescriptionIcon,\n FolderOpenIcon,\n GroupIcon,\n PersonIcon,\n PublishIcon,\n RefreshIcon,\n SaveIcon,\n SearchIcon,\n UploadFileIcon,\n} from \"../../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 variant=\"outlined\"\n sx={{\n cursor: \"pointer\",\n display: \"flex\",\n flexDirection: \"column\",\n transition: \"border-color 0.15s ease\",\n \"&:hover\": { borderColor: \"primary.main\" },\n }}\n onClick={onPreview}\n >\n <CardContent\n sx={{\n p: 1.5,\n \"&:last-child\": { pb: 1.5 },\n display: \"flex\",\n flexDirection: \"column\",\n gap: 1,\n minWidth: 0,\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1} sx={{ minWidth: 0 }}>\n <DescriptionIcon sx={{ fontSize: 20, color: \"text.secondary\", flexShrink: 0 }} />\n <Tooltip title={file.relativePath ?? file.name}>\n <Typography variant=\"body2\" noWrap sx={{ fontWeight: 600, flex: 1, minWidth: 0 }}>\n {file.name}\n </Typography>\n </Tooltip>\n {!isReadOnly && (\n <IconButton\n aria-label={`Remove ${file.name}`}\n onClick={(event) => {\n event.stopPropagation();\n onRemove();\n }}\n sx={{\n width: { xs: 44, sm: 32 },\n height: { xs: 44, sm: 32 },\n color: \"text.secondary\",\n \"&:hover\": { color: \"error.main\" },\n }}\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Stack>\n {file.relativePath && file.relativePath !== file.name && (\n <Typography variant=\"caption\" color=\"text.secondary\" noWrap sx={{ display: \"block\" }}>\n {file.relativePath}\n </Typography>\n )}\n\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{\n display: \"-webkit-box\",\n WebkitLineClamp: 3,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n lineHeight: 1.4,\n minHeight: \"4.2em\",\n }}\n >\n {getPreviewSnippet(file.content)}\n </Typography>\n\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ flex: 1, minWidth: 0 }} noWrap>\n {file.source === \"azure-wiki\" ? \"Azure DevOps wiki\" : \"Local file\"} · Markdown ·{\" \"}\n {formatFileSize(file.size)}\n </Typography>\n <Button\n size=\"small\"\n variant=\"text\"\n startIcon={<SearchIcon fontSize=\"small\" />}\n onClick={(event) => {\n event.stopPropagation();\n onPreview();\n }}\n >\n Preview\n </Button>\n </Stack>\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 [hasLoadedList, setHasLoadedList] = useState(false);\n const [listError, setListError] = useState<string | null>(null);\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 setListError(null);\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 setListError(error instanceof Error ? error.message : String(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 setHasLoadedList(true);\n }\n },\n [gatewayConfigured, selectedSid]\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(\"Couldn't load this seed pack. The gateway didn't respond.\", \"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(\"Couldn't import the 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(\"Couldn't save the 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(\"Couldn't create the 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(\"Couldn't publish the 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(\"Couldn't archive the 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(\"Couldn't delete the 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 const showListSkeleton = gatewayConfigured && !listError && !hasLoadedList && sortedSeedPacks.length === 0;\n const showEmptyState =\n gatewayConfigured && !listError && hasLoadedList && !isLoadingList && sortedSeedPacks.length === 0;\n\n return (\n <Box>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n flexWrap=\"wrap\"\n useFlexGap\n spacing={1}\n sx={{ mb: 2 }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1} sx={{ minWidth: 0 }}>\n {isTeamScope ? (\n <GroupIcon sx={{ fontSize: 18, color: \"text.secondary\" }} />\n ) : (\n <PersonIcon sx={{ fontSize: 18, color: \"text.secondary\" }} />\n )}\n <Typography variant=\"body2\" color=\"text.secondary\">\n {scopeLabel}. {scopeDescription} Assistants always have seed packs, and never show them as\n sources.\n </Typography>\n </Stack>\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 && !showEmptyState && (\n <Button\n size=\"small\"\n variant=\"contained\"\n startIcon={<AddIcon />}\n onClick={() => setCreateDialogOpen(true)}\n disabled={!gatewayConfigured}\n >\n New seed pack\n </Button>\n )}\n </Stack>\n </Stack>\n\n {!gatewayConfigured && (\n <Alert severity=\"warning\" sx={{ mb: 2 }}>\n Seed packs need a gateway. Add the gateway URL in package settings.\n </Alert>\n )}\n\n {gatewayConfigured && listError && (\n <Alert\n severity=\"error\"\n sx={{ mb: 2 }}\n action={\n <Button color=\"inherit\" size=\"small\" onClick={() => refreshSeedPacks()} disabled={isLoadingList}>\n Retry\n </Button>\n }\n >\n Couldn't load seed packs. The gateway didn't respond.\n <Typography variant=\"caption\" component=\"div\" sx={{ opacity: 0.8 }}>\n {listError}\n </Typography>\n </Alert>\n )}\n\n {gatewayConfigured && !canManage && (\n <Alert severity=\"info\" sx={{ mb: 2 }}>\n You have view-only access. Creating, publishing and archiving seed packs needs admin rights.\n </Alert>\n )}\n\n {showListSkeleton ? (\n <Stack spacing={1} role=\"status\" aria-busy=\"true\" aria-label=\"Loading seed packs\">\n {Array.from({ length: 3 }, (_, i) => (\n <Skeleton key={i} variant=\"rounded\" height={56} />\n ))}\n </Stack>\n ) : showEmptyState ? (\n <ManagementEmptyState\n icon={<AutoStoriesIcon />}\n title=\"No seed packs yet\"\n description={\n canManage\n ? \"A seed pack is internal reference material, such as policies or product notes, that assistants always have without citing it as a source.\"\n : \"A seed pack is internal reference material that assistants always have without citing it as a source. An admin can create one.\"\n }\n action={\n canManage ? (\n <Button variant=\"contained\" startIcon={<AddIcon />} onClick={() => setCreateDialogOpen(true)}>\n Create seed pack\n </Button>\n ) : undefined\n }\n />\n ) : gatewayConfigured ? (\n <Box\n sx={{\n display: \"grid\",\n gridTemplateColumns: { xs: \"minmax(0, 1fr)\", md: \"300px minmax(0, 1fr)\" },\n gap: 2,\n }}\n >\n <Card variant=\"outlined\" sx={{ height: \"fit-content\", minWidth: 0 }}>\n <Box sx={{ p: 1 }}>\n {isLoadingList && <LinearProgress sx={{ mb: 1 }} aria-label=\"Loading seed packs\" />}\n {sortedSeedPacks.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ p: 1 }}>\n No seed packs.\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={{ mb: 0.5, alignItems: \"flex-start\" }}\n >\n <Box sx={{ flex: 1 }}>\n <Stack direction=\"row\" spacing={1} alignItems=\"center\" sx={{ mb: 0.5 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, flex: 1, minWidth: 0 }} noWrap>\n {pack.name}\n </Typography>\n <Chip size=\"small\" variant=\"outlined\" 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 variant=\"outlined\" sx={{ minWidth: 0 }}>\n <CardContent>\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n justifyContent=\"space-between\"\n flexWrap=\"wrap\"\n useFlexGap\n >\n <Box sx={{ minWidth: 0 }}>\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 600 }}>\n {selectedSeedPack ? \"Edit seed pack\" : \"Seed pack details\"}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Draft content stays internal and is never shown as a source.\n </Typography>\n </Box>\n {selectedSeedPack && (\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <SaveStatus state={isSaving ? \"saving\" : isDirty ? \"unsaved\" : \"idle\"} />\n <Chip size=\"small\" variant=\"outlined\" 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\">\n Select a seed pack from the list to edit it.\n </Typography>\n </Box>\n )}\n\n {selectedSeedPack && (\n <Stack spacing={2}>\n {isLoadingDetail && <LinearProgress aria-label=\"Loading seed pack\" />}\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\" variant=\"outlined\" 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=\"inherit\"\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 ) : null}\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 by 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 * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\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 * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport React, { useState, useEffect, useMemo } from 'react';\nimport {\n Box,\n Typography,\n Button,\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 Skeleton,\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 { ManagementEmptyState } from '../shell/parts';\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\";\n\n// Storage category types\ninterface StorageCategory {\n name: string;\n icon: React.ElementType;\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 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 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 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 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 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 [loadError, setLoadError] = useState<string | null>(null);\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 setLoadError(null);\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 setLoadError(error instanceof Error && error.message ? error.message : 'No details were returned.');\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(`Cleared ${category.name}`);\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n setClearCategoryDialog(null);\n await loadStorageData(); // Refresh data\n } catch (error) {\n setSnackbarMessage(`Couldn't clear ${category.name}. Try again.`);\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('Cleared all local data');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n setClearAllDialogOpen(false);\n await loadStorageData(); // Refresh data\n } catch (error) {\n setSnackbarMessage(\"Couldn't clear all local data. Some items may remain.\");\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('Reset all storage?\\n\\nThis permanently deletes every Bandit database in this browser and reloads the app. It cannot be undone.\\n\\n\"Clear all data\" empties the databases but keeps them. \"Reset all storage\" deletes them entirely, including chat history, knowledge documents, custom personalities and app settings.\\n\\nContinue?')) {\n return;\n }\n \n if (!window.confirm('Last check: select OK to permanently delete all local Bandit data, or Cancel to keep it.')) {\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('All local data was deleted. Reloading…');\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(\"Couldn't delete every database. 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 const initialLoading = loading && storageCategories.length === 0 && storageQuota.quota === 0;\n\n if (initialLoading) {\n return (\n <Box role=\"status\" aria-busy=\"true\" aria-label=\"Loading storage usage\">\n <Box sx={{ display: 'flex', justifyContent: 'flex-end', gap: 1, mb: 1.5 }}>\n <Skeleton variant=\"rounded\" width={96} height={32} />\n <Skeleton variant=\"rounded\" width={120} height={32} />\n </Box>\n <Skeleton variant=\"rounded\" height={148} sx={{ mb: 1.5 }} />\n <Skeleton variant=\"text\" width={140} />\n <Stack spacing={1}>\n {Array.from({ length: 4 }, (_, i) => (\n <Skeleton key={i} variant=\"rounded\" height={44} />\n ))}\n </Stack>\n </Box>\n );\n }\n\n return (\n <Box>\n <Box>\n {/* Toolbar */}\n <Box\n sx={{\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'flex-end',\n gap: 1,\n mb: 1.5,\n }}\n >\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={loadStorageData}\n disabled={loading}\n startIcon={loading ? <CircularProgress size={14} color=\"inherit\" /> : <RefreshIcon fontSize=\"small\" />}\n >\n Refresh\n </Button>\n {clearableCategories.length > 0 && (\n <>\n <Button\n variant=\"outlined\"\n color=\"error\"\n size=\"small\"\n startIcon={<CleaningServicesIcon />}\n onClick={() => setClearAllDialogOpen(true)}\n >\n Clear all data\n </Button>\n <Button\n variant=\"text\"\n color=\"error\"\n size=\"small\"\n startIcon={<DeleteIcon />}\n onClick={() => handleNuclearClear()}\n >\n Reset all storage\n </Button>\n </>\n )}\n </Box>\n\n {loadError && (\n <Alert\n severity=\"error\"\n sx={{ mb: 1.5 }}\n action={\n <Button color=\"inherit\" size=\"small\" onClick={loadStorageData} disabled={loading}>\n Retry\n </Button>\n }\n >\n <Typography variant=\"body2\" sx={{ fontWeight: 600 }}>\n Couldn't read this browser's storage.\n </Typography>\n <Typography variant=\"caption\" sx={{ display: 'block', opacity: 0.8 }}>\n {loadError}\n </Typography>\n </Alert>\n )}\n\n {/* Storage Overview */}\n <Box\n sx={{\n p: { xs: 1.5, sm: 1.75 },\n mb: { xs: 1.25, md: 1.5 },\n border: '1px solid',\n borderColor: 'divider',\n bgcolor: 'background.paper',\n borderRadius: `${Number(theme.shape.borderRadius)}px`,\n }}\n >\n {/* Storage Quota */}\n <Typography variant=\"overline\" sx={{ color: 'text.secondary', display: 'flex', alignItems: 'center', gap: 0.75 }}>\n <StorageIcon fontSize=\"small\" />\n Storage quota\n </Typography>\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1, mt: 0.5, mb: 1.5 }}>\n <Chip\n label={`${formatBytes(storageQuota.used)} used`}\n size=\"small\"\n variant=\"outlined\"\n />\n <Chip\n label={`${formatBytes(storageQuota.available)} available`}\n size=\"small\"\n variant=\"outlined\"\n />\n <Chip\n label={`${formatBytes(storageQuota.quota)} total`}\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: 6,\n bgcolor: 'action.hover',\n '& .MuiLinearProgress-bar': {\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 {usagePercentage > 80 && (\n <Alert severity=\"warning\" sx={{ mt: 1, py: 0 }}>\n Storage usage is high. Consider clearing unused data.\n </Alert>\n )}\n\n {/* Usage Summary */}\n <Box sx={{ display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: 1, mt: 1.5 }}>\n <Chip\n label={`${storageCategories.length} categories`}\n size=\"small\"\n variant=\"outlined\"\n />\n <Chip\n label={`${storageCategories.reduce((sum, cat) => sum + cat.itemCount, 0)} items`}\n size=\"small\"\n variant=\"outlined\"\n />\n <Chip\n label={`${formatBytes(totalUsed)} used`}\n size=\"small\"\n variant=\"outlined\"\n />\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mt: 1 }}>\n {usageSummaryMessage}\n </Typography>\n </Box>\n\n {/* Storage Categories */}\n <Typography variant=\"overline\" sx={{ display: 'block', mb: 1, color: 'text.secondary' }}>\n Storage categories\n </Typography>\n\n <Box>\n {storageCategories.length === 0 ? (\n <ManagementEmptyState\n compact\n icon={<StorageIcon />}\n title=\"No stored data found\"\n description=\"Bandit keeps conversations, knowledge documents, memories and settings in this browser. Nothing was found, either because it's empty or the databases couldn't be read.\"\n action={\n <Button variant=\"outlined\" startIcon={<RefreshIcon fontSize=\"small\" />} onClick={loadStorageData} disabled={loading}>\n Check again\n </Button>\n }\n />\n ) : (\n <Stack spacing={1}>\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\n key={category.name}\n disableGutters\n elevation={0}\n sx={{\n bgcolor: 'background.paper',\n border: '1px solid',\n borderColor: 'divider',\n '&:before': { display: 'none' },\n }}\n >\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls={`${category.name}-content`}\n id={`${category.name}-header`}\n sx={{ px: 1.5, minHeight: 0, '& .MuiAccordionSummary-content': { my: 1 } }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', flexWrap: { xs: 'wrap', sm: 'nowrap' }, width: '100%', minWidth: 0, gap: { xs: 1, sm: 1.5 }, pr: { xs: 0.5, sm: 1.5 } }}>\n <IconComponent fontSize=\"small\" sx={{ color: 'text.secondary' }} />\n <Typography\n variant=\"body2\"\n color=\"text.primary\"\n sx={{ minWidth: 0, flexShrink: 0, fontWeight: 600 }}\n >\n {category.name}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ flexShrink: 0 }}>\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, minWidth: 24, flexBasis: { xs: '100%', sm: 'auto' }, order: { xs: 1, sm: 0 } }}>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(categoryRelativePercentage, 100)} // Use relative percentage for visual bar\n sx={{\n height: 4,\n bgcolor: 'action.hover',\n '& .MuiLinearProgress-bar': {\n bgcolor: 'primary.main',\n }\n }}\n />\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ flexShrink: 0 }}>\n {categoryRelativePercentage.toFixed(1)}%\n </Typography>\n </Box>\n </AccordionSummary>\n <AccordionDetails sx={{ px: 1.5, pt: 0, pb: 1.5 }}>\n <Box sx={{ pl: { xs: 0, sm: 3.5 } }}>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mb: 1 }}>\n {category.description}\n </Typography>\n\n <Typography variant=\"overline\" sx={{ color: 'text.secondary' }}>\n Storage locations\n </Typography>\n <List dense disablePadding>\n {category.stores.map((store) => (\n <ListItem key={store} sx={{ py: 0.25 }}>\n <ListItemIcon sx={{ minWidth: 28 }}>\n <StorageIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText\n primary={store}\n primaryTypographyProps={{ variant: 'caption', fontFamily: 'monospace' }}\n />\n </ListItem>\n ))}\n </List>\n\n {category.canClear ? (\n <Box sx={{ mt: 1, pt: 1, 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 <Typography variant=\"caption\" color=\"warning.main\" sx={{ display: 'block', mt: 1 }}>\n {category.clearWarning}\n </Typography>\n )}\n </Box>\n ) : (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mt: 1 }}>\n {category.itemCount === 0 ? 'This category is empty.' : 'This category cannot be cleared automatically.'}\n </Typography>\n )}\n </Box>\n </AccordionDetails>\n </Accordion>\n );\n })}\n </Stack>\n )}\n </Box>\n\n {/* Storage Tips */}\n <Box\n sx={{\n mt: 1.5,\n p: { xs: 1.5, sm: 1.75 },\n border: '1px solid',\n borderColor: 'divider',\n bgcolor: 'background.paper',\n borderRadius: `${Number(theme.shape.borderRadius)}px`,\n }}\n >\n <Typography variant=\"overline\" sx={{ color: 'text.secondary', display: 'flex', alignItems: 'center', gap: 0.75 }}>\n <InfoIcon fontSize=\"small\" />\n Storage tips and clear options\n </Typography>\n <List dense disablePadding sx={{ mt: 0.5 }}>\n <ListItem sx={{ py: 0.5 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <CheckCircleIcon\n fontSize=\"small\"\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 primaryTypographyProps={{ variant: 'body2' }}\n secondaryTypographyProps={{ variant: 'caption' }}\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 sx={{ py: 0.5 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <CleaningServicesIcon fontSize=\"small\" color=\"info\" />\n </ListItemIcon>\n <ListItemText\n primary=\"Clear all data\"\n primaryTypographyProps={{ variant: 'body2' }}\n secondaryTypographyProps={{ variant: 'caption' }}\n secondary=\"Deletes every item but keeps the databases, so the app keeps working normally.\"\n />\n </ListItem>\n <ListItem sx={{ py: 0.5 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <DeleteIcon fontSize=\"small\" color=\"error\" />\n </ListItemIcon>\n <ListItemText\n primary=\"Reset all storage\"\n primaryTypographyProps={{ variant: 'body2' }}\n secondaryTypographyProps={{ variant: 'caption' }}\n secondary=\"Deletes the databases themselves and reloads the app. Use it only when you want a complete reset.\"\n />\n </ListItem>\n <ListItem sx={{ py: 0.5 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <WarningIcon fontSize=\"small\" color=\"warning\" />\n </ListItemIcon>\n <ListItemText\n primary=\"Backup important data\"\n primaryTypographyProps={{ variant: 'body2' }}\n secondaryTypographyProps={{ variant: 'caption' }}\n secondary=\"Export custom personalities and important documents before clearing storage.\"\n />\n </ListItem>\n </List>\n </Box>\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' }}>\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 local data?\n </Box>\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n This permanently deletes all of 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: 'text.secondary' }} />\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 can't be undone.</strong> Export anything important before you continue.\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…' : '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 * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n Box,\n Typography,\n Paper,\n Button,\n TextField,\n MenuItem,\n Chip,\n Snackbar,\n Alert,\n CircularProgress,\n Stack,\n} from '@mui/material';\nimport { ManagementEmptyState } from '../shell/parts';\nimport { SettingsIcon } from '../../icons';\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\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\n // Inline results for the two explicit actions, shown next to their buttons.\n type ActionResult = { state: 'idle' | 'pending' | 'success' | 'error'; message?: string };\n const [saveResult, setSaveResult] = useState<ActionResult>({ state: 'idle' });\n const [testResult, setTestResult] = useState<ActionResult>({ state: 'idle' });\n const providerTypeRef = useRef<HTMLInputElement | null>(null);\n const formRef = useRef<HTMLDivElement | null>(null);\n\n const revealProviderForm = () => {\n formRef.current?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n providerTypeRef.current?.focus();\n };\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 setSaveResult({ state: 'idle' });\n setTestResult({ state: 'idle' });\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 setSaveResult({ state: 'pending' });\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 setSaveResult({ state: 'error', message: 'Not saved. Enter a default model ID for this provider.' });\n return;\n }\n\n // Validate the configuration\n const isValid = AIProviderFactory.validateConfig(normalizedConfig);\n if (!isValid) {\n setSaveResult({ state: 'error', message: 'Not saved. Some required fields are missing or invalid.' });\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 setSaveResult({ state: 'success', message: 'Saved. Chat now uses this provider.' });\n debugLogger.info('Provider configuration saved and switched', { type: normalizedConfig.type });\n } catch (error) {\n debugLogger.error('Failed to save provider configuration:', { error });\n setSaveResult({\n state: 'error',\n message: `Couldn't save or switch provider: ${error instanceof Error ? error.message : 'unknown error'}`,\n });\n }\n };\n\n const handleTestProviderConnection = async () => {\n setTestResult({ state: 'pending' });\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 setTestResult({ state: 'success', message: 'Connected. The provider responded.' });\n } else {\n setTestResult({ state: 'error', message: \"Couldn't reach the provider. Check the URL and key.\" });\n }\n } catch (error) {\n debugLogger.error('Provider connection test failed:', { error });\n setTestResult({\n state: 'error',\n message: `Connection test failed${error instanceof Error && error.message ? `: ${error.message}` : '.'}`,\n });\n }\n };\n\n const resultColor = (state: ActionResult['state']) =>\n state === 'success' ? 'success.main' : state === 'error' ? 'error.main' : 'text.secondary';\n\n return (\n <Box>\n <Box>\n {/* Current provider */}\n {currentProvider ? (\n <Paper variant=\"outlined\" sx={{ p: { xs: 1.5, sm: 1.75 }, mb: { xs: 1.5, md: 1.75 } }}>\n <Typography variant=\"overline\" sx={{ fontWeight: 700, color: \"text.secondary\", letterSpacing: 0.6, display: 'block', mb: 1 }}>\n Current provider\n </Typography>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5, flexWrap: 'wrap', minWidth: 0 }}>\n <Chip\n label={currentProvider.getProviderType().toUpperCase()}\n color=\"primary\"\n variant=\"outlined\"\n size=\"small\"\n />\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ wordBreak: 'break-all', minWidth: 0 }}>\n {currentProviderConfig?.baseUrl || currentProviderConfig?.gatewayUrl || 'No URL configured'}\n </Typography>\n </Box>\n </Paper>\n ) : (\n <Box sx={{ mb: { xs: 1.5, md: 1.75 } }}>\n <ManagementEmptyState\n compact\n icon={<SettingsIcon />}\n title=\"No provider configured\"\n description=\"A provider is the model service Bandit sends chat requests to, such as the Bandit gateway, Ollama or OpenAI. Chat won't answer until one is saved.\"\n action={\n <Button variant=\"contained\" onClick={revealProviderForm}>\n Configure a provider\n </Button>\n }\n />\n </Box>\n )}\n\n {/* Provider configuration form (explicit save) */}\n <Paper ref={formRef} variant=\"outlined\" sx={{ p: { xs: 1.5, sm: 1.75 }, mb: { xs: 1.5, md: 1.75 }, scrollMarginTop: 16 }}>\n <Typography variant=\"overline\" sx={{ fontWeight: 700, color: \"text.secondary\", letterSpacing: 0.6, display: 'block' }}>\n Provider configuration\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Changes here apply only when you select Save and switch provider.\n </Typography>\n\n <Box>\n {/* Provider Type Selection */}\n <TextField\n label=\"Provider type\"\n select\n inputRef={providerTypeRef}\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 + their outcomes */}\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1.5, mt: 3 }}>\n <Button\n variant=\"outlined\"\n onClick={handleTestProviderConnection}\n disabled={!providerConfig.type || testResult.state === 'pending'}\n startIcon={testResult.state === 'pending' ? <CircularProgress size={14} color=\"inherit\" /> : undefined}\n >\n {testResult.state === 'pending' ? 'Testing…' : 'Test connection'}\n </Button>\n <Button\n variant=\"contained\"\n onClick={handleSaveProviderConfig}\n disabled={!providerConfig.type || saveResult.state === 'pending'}\n startIcon={saveResult.state === 'pending' ? <CircularProgress size={14} color=\"inherit\" /> : undefined}\n >\n {saveResult.state === 'pending' ? 'Saving…' : 'Save & switch provider'}\n </Button>\n </Box>\n {(testResult.state === 'success' || testResult.state === 'error' ||\n saveResult.state === 'success' || saveResult.state === 'error') && (\n <Stack spacing={0.5} sx={{ mt: 1.5 }} role=\"status\" aria-live=\"polite\">\n {(testResult.state === 'success' || testResult.state === 'error') && (\n <Typography variant=\"body2\" sx={{ color: resultColor(testResult.state) }} data-testid=\"provider-test-result\">\n {testResult.message}\n </Typography>\n )}\n {(saveResult.state === 'success' || saveResult.state === 'error') && (\n <Typography variant=\"body2\" sx={{ color: resultColor(saveResult.state) }} data-testid=\"provider-save-result\">\n {saveResult.message}\n </Typography>\n )}\n </Stack>\n )}\n </Box>\n </Paper>\n\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mt: 0.5, lineHeight: 1.5 }}>\n Gateway is recommended for production. It routes requests through your backend, keeps API keys server-side, and adds rate limiting and monitoring.\n </Typography>\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 * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { Alert, Box, Button, Typography, Paper, IconButton, Tooltip, LinearProgress, Skeleton, Switch } 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 { DataObjectIcon, RefreshIcon } from \"../../icons\";\nimport { ManagementEmptyState, SaveStatus } from '../shell/parts';\n\nconst MCPToolsTabV2: React.FC = () => {\n const { settings } = usePackageSettingsStore();\n const { tools: localTools, loadTools, toggleTool, syncControllerTools, isLoaded, saveState, lastSavedAt, saveTools } =\n 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 // Add controller tools we don't have yet; a person's own choice always\n // wins over the controller's default (the store decides).\n syncControllerTools(serverTools);\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 const touchTarget = { width: { xs: 44, sm: 32 }, height: { xs: 44, sm: 32 } } as const;\n const healthLabel =\n health?.status === 'healthy' ? 'Tool controller online'\n : health?.status === 'unhealthy' ? 'Tool controller reporting problems'\n : 'Tool controller status unknown';\n\n return (\n <Box>\n <McpServersSection />\n\n {/* Built-in capabilities: things Bandit can do on its own */}\n <Box component=\"section\" aria-label=\"Built-in capabilities\" sx={{ mt: 4 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 0.5, gap: 1 }}>\n <Typography variant=\"overline\" color=\"text.secondary\" sx={{ fontWeight: 700, letterSpacing: 0.6 }}>\n Built-in capabilities\n </Typography>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.75 }}>\n <Tooltip title={healthLabel}>\n <Box\n role=\"img\"\n aria-label={healthLabel}\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor:\n health?.status === 'healthy'\n ? 'success.main'\n : health?.status === 'unhealthy'\n ? 'error.main'\n : 'text.disabled',\n }}\n />\n </Tooltip>\n <Tooltip title=\"Refresh\">\n <IconButton size=\"small\" onClick={refresh} aria-label=\"Refresh built-in capabilities\" sx={touchTarget}>\n <RefreshIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n </Box>\n </Box>\n <Box sx={{ display: 'flex', flexWrap: 'wrap', alignItems: 'center', columnGap: 1.5, rowGap: 0.5, mb: 1.5 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Things Bandit can do on its own. Switch one off to stop the assistant using it. Changes apply immediately.\n </Typography>\n {/* Your choice is kept for this workspace; say whether it was written. */}\n <SaveStatus auto state={saveState} savedAt={lastSavedAt} onRetry={() => void saveTools()} />\n </Box>\n\n {loading && tools.length > 0 && <LinearProgress sx={{ mb: 2 }} />}\n {error && (\n <Alert\n severity=\"error\"\n sx={{ mb: 2 }}\n action={\n <Button color=\"inherit\" size=\"small\" onClick={refresh}>\n Retry\n </Button>\n }\n >\n <Typography variant=\"body2\" sx={{ fontWeight: 600 }}>\n Couldn't load built-in capabilities. The tool controller didn't respond.\n </Typography>\n <Typography variant=\"caption\" sx={{ display: 'block', opacity: 0.8 }}>\n {error}\n </Typography>\n </Alert>\n )}\n {!gatewayConfigured && (\n <Alert severity=\"info\" sx={{ mb: 2 }}>\n No gateway URL is configured, so tool requests go to this site's own address.\n </Alert>\n )}\n\n {loading && tools.length === 0 ? (\n <Box\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading built-in capabilities\"\n sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', sm: 'repeat(2, 1fr)' }, gap: 1.25 }}\n >\n {Array.from({ length: 4 }, (_, i) => (\n <Skeleton key={i} variant=\"rounded\" height={64} />\n ))}\n </Box>\n ) : !loading && tools.length === 0 && !error ? (\n <ManagementEmptyState\n compact\n icon={<DataObjectIcon />}\n title=\"No built-in capabilities reported\"\n description=\"The tool controller answered but listed no capabilities. They appear here once it reports them.\"\n action={\n <Button variant=\"outlined\" onClick={refresh}>\n Check again\n </Button>\n }\n />\n ) : (\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: { xs: '1fr', sm: 'repeat(2, 1fr)' },\n gap: 1.25,\n }}\n >\n {tools.map((tool) => {\n let locallyEnabled = localEnabledMap.get(tool.id);\n if (locallyEnabled === undefined) {\n locallyEnabled = localEnabledMap.get(tool.name);\n }\n if (locallyEnabled === undefined) {\n const directLookup = localTools.find(\n (t) => t.id === tool.id || t.function.name === tool.id || t.name === tool.name,\n );\n locallyEnabled = directLookup?.enabled ?? tool.isEnabled;\n }\n\n return (\n <Paper\n key={tool.id}\n variant=\"outlined\"\n sx={{\n p: 1.5,\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 1,\n }}\n >\n <Box sx={{ minWidth: 0 }}>\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 600 }}>\n {tool.name}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', lineHeight: 1.4 }}>\n {tool.description}\n </Typography>\n </Box>\n <Switch\n size=\"small\"\n checked={!!locallyEnabled}\n slotProps={{ input: { 'aria-label': `Allow ${tool.name}` } }}\n sx={{ flexShrink: 0 }}\n onChange={() => {\n let local = localTools.find((t) => t.function.name === tool.id);\n if (!local) local = localTools.find((t) => t.function.name === tool.name);\n if (!local) local = localTools.find((t) => t.id === tool.id);\n if (!local) local = localTools.find((t) => t.name === tool.name);\n if (local) void toggleTool(local.id);\n }}\n />\n </Paper>\n );\n })}\n </Box>\n )}\n </Box>\n </Box>\n );\n};\n\nexport default MCPToolsTabV2;\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\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","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n Alert,\n Box,\n Button,\n Chip,\n Collapse,\n CircularProgress,\n FormControlLabel,\n IconButton,\n LinearProgress,\n Link,\n MenuItem,\n Paper,\n Skeleton,\n Stack,\n Switch,\n TextField,\n Tooltip,\n Typography,\n} from '@mui/material';\nimport { AddIcon, DeleteIcon, LinkIcon, RefreshIcon } from '../../icons';\nimport { ManagementEmptyState } from '../shell/parts';\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\n/**\n * Curated remote MCP servers people actually want to connect. These are hosted\n * (the gateway can reach them); each \"Connect\" pre-fills the form so the user\n * only has to paste their access token / authorize. `tokenHelp` links to where\n * the provider issues a token. Local-only servers (Figma Dev Mode, Azure DevOps)\n * live behind the custom option since the cloud gateway can't reach localhost.\n */\ntype CatalogEntry = {\n key: string;\n name: string;\n blurb: string;\n letter: string;\n url: string;\n authType: McpServerInput['authType'];\n tokenLabel?: string;\n tokenHelp?: string;\n};\n\nconst CATALOG: CatalogEntry[] = [\n {\n key: 'linear',\n name: 'Linear',\n blurb: 'Create and track issues, projects, and cycles',\n letter: 'L',\n url: 'https://mcp.linear.app/sse',\n authType: 'bearer',\n tokenLabel: 'Linear API key',\n tokenHelp: 'https://linear.app/settings/api',\n },\n {\n key: 'notion',\n name: 'Notion',\n blurb: 'Search and update pages across your workspace',\n letter: 'N',\n url: 'https://mcp.notion.com/mcp',\n authType: 'bearer',\n tokenLabel: 'Notion integration token',\n tokenHelp: 'https://www.notion.so/my-integrations',\n },\n {\n key: 'github',\n name: 'GitHub',\n blurb: 'Issues, pull requests, code search, and actions',\n letter: 'G',\n url: 'https://api.githubcopilot.com/mcp/',\n authType: 'bearer',\n tokenLabel: 'GitHub personal access token',\n tokenHelp: 'https://github.com/settings/tokens',\n },\n {\n key: 'sentry',\n name: 'Sentry',\n blurb: 'Triage errors and inspect production issues',\n letter: 'S',\n url: 'https://mcp.sentry.dev/mcp',\n authType: 'bearer',\n tokenLabel: 'Sentry auth token',\n tokenHelp: 'https://sentry.io/settings/auth-tokens/',\n },\n {\n key: 'atlassian',\n name: 'Jira & Confluence',\n blurb: 'Atlassian issues, boards, and docs',\n letter: 'J',\n url: 'https://mcp.atlassian.com/v1/sse',\n authType: 'bearer',\n tokenLabel: 'Atlassian API token',\n tokenHelp: 'https://id.atlassian.com/manage-profile/security/api-tokens',\n },\n {\n key: 'stripe',\n name: 'Stripe',\n blurb: 'Payments, customers, and invoices',\n letter: 'S',\n url: 'https://mcp.stripe.com',\n authType: 'bearer',\n tokenLabel: 'Stripe restricted key',\n tokenHelp: 'https://dashboard.stripe.com/apikeys',\n },\n];\n\ntype SectionError = { message: string; detail?: string };\n\nconst errorDetail = (e: unknown): string | undefined =>\n e instanceof Error && e.message ? e.message : undefined;\n\nconst McpServersSection = () => {\n const [servers, setServers] = useState<McpServer[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<SectionError | null>(null);\n const [loadError, setLoadError] = useState<SectionError | null>(null);\n const [form, setForm] = useState<McpServerInput>(emptyForm);\n const [activeEntry, setActiveEntry] = useState<CatalogEntry | null>(null);\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 const formRef = useRef<HTMLDivElement | null>(null);\n\n const refresh = useCallback(async () => {\n setLoading(true);\n setLoadError(null);\n try {\n setServers(await listMcpServers());\n } catch (e) {\n setLoadError({\n message: \"Couldn't load your connections. The gateway didn't respond.\",\n detail: errorDetail(e),\n });\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const connectedKeys = new Set(servers.map((s) => s.url.replace(/\\/+$/, '')));\n\n const openForCatalog = (entry: CatalogEntry) => {\n setActiveEntry(entry);\n setForm({ name: entry.name, url: entry.url, authType: entry.authType, authValue: '', headerName: '' });\n setShowForm(true);\n setError(null);\n requestAnimationFrame(() => formRef.current?.scrollIntoView({ behavior: 'smooth', block: 'nearest' }));\n };\n\n const openCustomForm = () => {\n setActiveEntry(null);\n setForm(emptyForm);\n setShowForm(true);\n setError(null);\n requestAnimationFrame(() => formRef.current?.scrollIntoView({ behavior: 'smooth', block: 'nearest' }));\n };\n\n const openCustom = () => {\n setActiveEntry(null);\n setForm(emptyForm);\n setShowForm((v) => !v);\n setError(null);\n };\n\n const handleAdd = async () => {\n if (!form.name.trim() || !form.url.trim()) {\n setError({ message: 'Enter a name and a server URL.' });\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 setActiveEntry(null);\n setShowForm(false);\n await refresh();\n void reloadChatTools();\n } catch (e) {\n setError({ message: `Couldn't connect ${form.name.trim() || 'the server'}.`, detail: errorDetail(e) });\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({ message: \"Couldn't remove the server.\", detail: errorDetail(e) });\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({\n message: `Couldn't ${server.enabled ? 'turn off' : 'turn on'} ${server.name}.`,\n detail: errorDetail(e),\n });\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: errorDetail(e) ?? 'No details were returned.' } }));\n }\n };\n\n const touchTarget = { width: { xs: 44, sm: 32 }, height: { xs: 44, sm: 32 } } as const;\n\n return (\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2.5, maxWidth: 680 }}>\n Connect a service once and Bandit can use it from chat. The gateway holds the connection, so your browser\n never talks to the service directly.\n </Typography>\n\n {loadError && (\n <Alert\n severity=\"error\"\n sx={{ mb: 2 }}\n action={\n <Button color=\"inherit\" size=\"small\" onClick={() => void refresh()} disabled={loading}>\n Retry\n </Button>\n }\n >\n <Typography variant=\"body2\" sx={{ fontWeight: 600 }}>\n {loadError.message}\n </Typography>\n {loadError.detail && (\n <Typography variant=\"caption\" sx={{ display: 'block', opacity: 0.8 }}>\n {loadError.detail}\n </Typography>\n )}\n </Alert>\n )}\n\n {error && (\n <Alert severity=\"error\" sx={{ mb: 2 }} onClose={() => setError(null)}>\n <Typography variant=\"body2\" sx={{ fontWeight: error.detail ? 600 : 400 }}>\n {error.message}\n </Typography>\n {error.detail && (\n <Typography variant=\"caption\" sx={{ display: 'block', opacity: 0.8 }}>\n {error.detail}\n </Typography>\n )}\n </Alert>\n )}\n\n {/* Catalog of popular integrations */}\n <Typography variant=\"overline\" color=\"text.secondary\" sx={{ fontWeight: 700, letterSpacing: 0.6 }}>\n Popular integrations\n </Typography>\n <Box\n sx={{\n mt: 1,\n mb: 3,\n display: 'grid',\n gridTemplateColumns: { xs: '1fr', sm: 'repeat(2, 1fr)', lg: 'repeat(3, 1fr)' },\n gap: 1.25,\n }}\n >\n {CATALOG.map((entry) => {\n const connected = connectedKeys.has(entry.url.replace(/\\/+$/, ''));\n return (\n <Paper\n key={entry.key}\n variant=\"outlined\"\n sx={{\n p: 1.5,\n display: 'flex',\n alignItems: 'center',\n gap: 1.25,\n minWidth: 0,\n }}\n >\n <Box\n aria-hidden\n sx={(theme) => ({\n width: 36,\n height: 36,\n borderRadius: '50%',\n flexShrink: 0,\n display: 'grid',\n placeItems: 'center',\n color: 'text.primary',\n fontWeight: 600,\n fontSize: 15,\n bgcolor: theme.palette.bandit?.surface.interactive ?? theme.palette.action.hover,\n })}\n >\n {entry.letter}\n </Box>\n <Box sx={{ minWidth: 0, flex: 1 }}>\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 600, lineHeight: 1.2 }}>\n {entry.name}\n </Typography>\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{ display: 'block', lineHeight: 1.35 }}\n >\n {entry.blurb}\n </Typography>\n </Box>\n {connected ? (\n <Chip size=\"small\" color=\"success\" variant=\"outlined\" label=\"Added\" sx={{ flexShrink: 0 }} />\n ) : (\n <Button\n size=\"small\"\n variant=\"outlined\"\n onClick={() => openForCatalog(entry)}\n aria-label={`Connect ${entry.name}`}\n sx={{ flexShrink: 0, minWidth: 0 }}\n >\n Connect\n </Button>\n )}\n </Paper>\n );\n })}\n </Box>\n\n {/* Connect form — pre-filled from the catalog, or blank for a custom server */}\n <Box ref={formRef}>\n <Collapse in={showForm}>\n <Paper variant=\"outlined\" sx={{ p: 2, mb: 2 }}>\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 600, mb: 0.5 }}>\n {activeEntry ? `Connect ${activeEntry.name}` : 'Add a custom server'}\n </Typography>\n {activeEntry?.tokenHelp && (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mb: 1.5 }}>\n Paste your {activeEntry.tokenLabel}.{' '}\n <Link href={activeEntry.tokenHelp} target=\"_blank\" rel=\"noopener noreferrer\">\n Where to get one\n </Link>\n </Typography>\n )}\n <Stack spacing={1.75}>\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. Linear\"\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={\n activeEntry?.tokenLabel ?? (form.authType === 'bearer' ? 'Token' : 'Header value')\n }\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 ? 'Connecting…' : 'Connect'}\n </Button>\n <Button\n onClick={() => {\n setShowForm(false);\n setActiveEntry(null);\n setForm(emptyForm);\n }}\n >\n Cancel\n </Button>\n </Box>\n </Stack>\n </Paper>\n </Collapse>\n </Box>\n\n {/* Connected servers */}\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 1 }}>\n <Typography variant=\"overline\" color=\"text.secondary\" sx={{ fontWeight: 700, letterSpacing: 0.6 }}>\n Your connections{servers.length ? ` (${servers.length})` : ''}\n </Typography>\n <Button size=\"small\" startIcon={<AddIcon />} onClick={openCustom}>\n Custom server\n </Button>\n </Box>\n\n {loading && servers.length > 0 && <LinearProgress sx={{ mb: 2 }} />}\n\n <Stack spacing={1.25}>\n {loading && servers.length === 0 && (\n <Box role=\"status\" aria-busy=\"true\" aria-label=\"Loading connections\">\n <Stack spacing={1.25}>\n <Skeleton variant=\"rounded\" height={60} />\n <Skeleton variant=\"rounded\" height={60} />\n </Stack>\n </Box>\n )}\n {servers.length === 0 && !loading && !loadError && (\n <ManagementEmptyState\n compact\n icon={<LinkIcon />}\n title=\"No connections yet\"\n description=\"Connect one of the services above, or add your own MCP server, and its tools become available in chat.\"\n action={\n <Button variant=\"outlined\" startIcon={<AddIcon />} onClick={openCustomForm}>\n Add a custom server\n </Button>\n }\n />\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, flexWrap: 'wrap' }}>\n <Box sx={{ minWidth: 0, flex: '1 1 180px' }}>\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 600 }}>\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={\n <Switch\n size=\"small\"\n checked={server.enabled}\n onChange={() => handleToggle(server)}\n slotProps={{ input: { 'aria-label': `${server.enabled ? 'Disable' : 'Enable'} ${server.name}` } }}\n />\n }\n label=\"\"\n />\n </Tooltip>\n <Tooltip title=\"Test & list tools\">\n <IconButton\n size=\"small\"\n onClick={() => handleDiscover(server.id)}\n aria-label={`Test ${server.name} and list its tools`}\n sx={touchTarget}\n >\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Remove\">\n <IconButton\n size=\"small\"\n onClick={() => handleDelete(server.id)}\n aria-label={`Remove ${server.name}`}\n sx={touchTarget}\n >\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. The server reported no tools.\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\n severity=\"warning\"\n sx={{ mt: 1 }}\n action={\n <Button color=\"inherit\" size=\"small\" onClick={() => handleDiscover(server.id)}>\n Retry\n </Button>\n }\n >\n <Typography variant=\"body2\" sx={{ fontWeight: 600 }}>\n Couldn't reach {server.name}.\n </Typography>\n <Typography variant=\"caption\" sx={{ display: 'block', opacity: 0.8 }}>\n {toolState.error}\n </Typography>\n </Alert>\n )}\n </Paper>\n );\n })}\n </Stack>\n\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mt: 2, lineHeight: 1.5 }}>\n Running a local server (Figma Dev Mode, Azure DevOps)? Add it as a custom server. The cloud gateway\n can't reach <code>localhost</code>, so local servers need the Bandit desktop app.\n </Typography>\n </Box>\n );\n};\n\nexport default McpServersSection;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n*/\n\n/**\n * The Management workspace frame: a quiet left rail grouped into Workspace\n * (this workspace's configuration) and Organization (host links such as\n * members, usage and billing), a compact page area, and on phones a sticky\n * header with a bottom sheet for navigation. Themed by createBanditTheme with\n * `density: 'compact'`; no colours, radii or shadows of its own.\n */\nimport React from \"react\";\nimport {\n Box,\n ButtonBase,\n IconButton,\n List,\n ListItemButton,\n ListItemIcon,\n ListItemText,\n ListSubheader,\n Stack,\n SwipeableDrawer,\n Tooltip,\n Typography,\n} from \"@mui/material\";\nimport { alpha, type Theme } from \"@mui/material/styles\";\n\nimport {\n BrushIcon,\n BuildIcon,\n ChevronLeftIcon,\n CloudIcon,\n FaceRetouchingNaturalIcon,\n HomeIcon,\n MenuBookIcon,\n PanelLeftIcon,\n SearchIcon,\n StorageIcon,\n TuneIcon,\n} from \"../../icons\";\nimport type { ManagementSectionDef, ManagementSectionId } from \"./sections\";\n\nconst RAIL_WIDTH = 248;\n\n/** Control radius: a step under the theme's card radius. */\nconst controlRadius = (theme: Theme) => `${Math.max(Number(theme.shape.borderRadius) - 2, 4)}px`;\n\nconst SECTION_ICONS: Record<ManagementSectionId, typeof HomeIcon> = {\n overview: HomeIcon,\n personalities: FaceRetouchingNaturalIcon,\n knowledge: MenuBookIcon,\n tools: BuildIcon,\n provider: CloudIcon,\n storage: StorageIcon,\n branding: BrushIcon,\n preferences: TuneIcon,\n};\n\n/** A host destination outside the engine (members, usage, billing …). */\nexport interface ManagementLink {\n id: string;\n label: string;\n icon?: React.ReactNode;\n /** Called on click; hosts route with their own router. */\n onSelect: () => void;\n}\n\nexport interface ManagementShellProps {\n sections: ManagementSectionDef[];\n active: ManagementSectionId;\n onSelect: (id: ManagementSectionId) => void;\n organizationLinks?: ManagementLink[];\n onBackToChat: () => void;\n onBackHover?: () => void;\n /** Shows the \"Search ⌘K\" control when the host provides a palette. */\n onOpenCommandPalette?: () => void;\n isMobile: boolean;\n children: React.ReactNode;\n}\n\nconst isMac = () =>\n typeof navigator !== \"undefined\" && /Mac|iPhone|iPad/.test(navigator.platform || navigator.userAgent);\n\nconst railItemSx = (theme: Theme, selected: boolean) => ({\n minHeight: 34,\n borderRadius: controlRadius(theme),\n px: 1.25,\n py: 0.375,\n mb: 0.25,\n color: selected ? theme.palette.text.primary : theme.palette.text.secondary,\n bgcolor: selected ? alpha(theme.palette.primary.main, theme.palette.mode === \"dark\" ? 0.16 : 0.1) : \"transparent\",\n boxShadow: selected ? `inset 2px 0 0 ${theme.palette.primary.main}` : \"none\",\n transition: theme.transitions.create([\"background-color\", \"color\"], {\n duration: theme.transitions.duration.shortest,\n }),\n \"&:hover\": {\n bgcolor: selected\n ? alpha(theme.palette.primary.main, theme.palette.mode === \"dark\" ? 0.2 : 0.14)\n : theme.palette.bandit?.surface.interactiveHover ?? theme.palette.action.hover,\n color: theme.palette.text.primary,\n },\n \"&.Mui-selected, &.Mui-selected:hover\": {\n bgcolor: alpha(theme.palette.primary.main, theme.palette.mode === \"dark\" ? 0.18 : 0.12),\n },\n \"& .MuiListItemIcon-root\": {\n minWidth: 28,\n color: selected ? theme.palette.primary.main : \"inherit\",\n },\n \"& .MuiListItemIcon-root svg\": { width: 17, height: 17 },\n});\n\nfunction Navigation({\n sections,\n active,\n onSelect,\n organizationLinks,\n onBackToChat,\n onBackHover,\n onOpenCommandPalette,\n onAfterSelect,\n}: Omit<ManagementShellProps, \"children\" | \"isMobile\"> & { onAfterSelect?: () => void }) {\n const subheaderSx = {\n bgcolor: \"transparent\",\n lineHeight: \"28px\",\n px: 1.25,\n mt: 1,\n fontSize: \"0.7rem\",\n fontWeight: 600,\n letterSpacing: \"0.06em\",\n textTransform: \"uppercase\" as const,\n color: \"text.secondary\",\n };\n return (\n <Stack sx={{ height: \"100%\", minHeight: 0 }}>\n <Box sx={{ px: 1.5, pt: 1.5, pb: 1 }}>\n <ButtonBase\n onClick={() => {\n onAfterSelect?.();\n onBackToChat();\n }}\n onMouseEnter={onBackHover}\n sx={(theme) => ({\n width: \"100%\",\n justifyContent: \"flex-start\",\n gap: 0.75,\n px: 1,\n py: 0.75,\n borderRadius: controlRadius(theme),\n color: \"text.secondary\",\n typography: \"body2\",\n \"&:hover\": { color: \"text.primary\", bgcolor: theme.palette.action.hover },\n \"& svg\": { width: 16, height: 16 },\n })}\n >\n <ChevronLeftIcon />\n Back to chat\n </ButtonBase>\n <Typography variant=\"subtitle1\" sx={{ px: 1, mt: 1, fontWeight: 600 }}>\n Management\n </Typography>\n {onOpenCommandPalette && (\n <ButtonBase\n onClick={() => {\n onAfterSelect?.();\n onOpenCommandPalette();\n }}\n aria-label=\"Search Management\"\n sx={(theme) => ({\n mt: 1.25,\n width: \"100%\",\n justifyContent: \"flex-start\",\n gap: 1,\n px: 1.25,\n height: 34,\n borderRadius: controlRadius(theme),\n border: `1px solid ${theme.palette.divider}`,\n bgcolor: theme.palette.bandit?.surface.raised ?? theme.palette.background.paper,\n color: \"text.secondary\",\n typography: \"body2\",\n \"&:hover\": { borderColor: theme.palette.text.secondary },\n \"& svg\": { width: 15, height: 15 },\n })}\n >\n <SearchIcon />\n <Box component=\"span\" sx={{ flex: 1, textAlign: \"left\" }}>\n Search…\n </Box>\n <Box\n component=\"kbd\"\n sx={(theme) => ({\n fontFamily: theme.typography.fontFamily,\n fontSize: \"0.7rem\",\n px: 0.75,\n py: 0.125,\n borderRadius: 1,\n border: `1px solid ${theme.palette.divider}`,\n })}\n >\n {isMac() ? \"⌘K\" : \"Ctrl K\"}\n </Box>\n </ButtonBase>\n )}\n </Box>\n\n <Box component=\"nav\" aria-label=\"Management\" sx={{ flex: 1, overflowY: \"auto\", px: 1.5, pb: 2 }}>\n {/* Links, not list items: ListItemButton renders a div, so the lists are divs too. */}\n <List\n component=\"div\"\n dense\n disablePadding\n subheader={\n <ListSubheader component=\"div\" disableSticky sx={subheaderSx}>\n Workspace\n </ListSubheader>\n }\n >\n {sections.map((section) => {\n const Icon = SECTION_ICONS[section.id];\n const selected = section.id === active;\n return (\n <ListItemButton\n key={section.id}\n selected={selected}\n aria-current={selected ? \"page\" : undefined}\n onClick={() => {\n onSelect(section.id);\n onAfterSelect?.();\n }}\n sx={(theme) => railItemSx(theme, selected)}\n >\n <ListItemIcon>\n <Icon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText\n primary={section.label}\n primaryTypographyProps={{ variant: \"body2\", fontWeight: selected ? 600 : 500 }}\n />\n </ListItemButton>\n );\n })}\n </List>\n\n {organizationLinks && organizationLinks.length > 0 && (\n <List\n component=\"div\"\n dense\n disablePadding\n sx={{ mt: 1 }}\n subheader={\n <ListSubheader component=\"div\" disableSticky sx={subheaderSx}>\n Organization\n </ListSubheader>\n }\n >\n {organizationLinks.map((link) => (\n <ListItemButton\n key={link.id}\n onClick={() => {\n onAfterSelect?.();\n link.onSelect();\n }}\n sx={(theme) => railItemSx(theme, false)}\n >\n {link.icon && <ListItemIcon>{link.icon}</ListItemIcon>}\n <ListItemText primary={link.label} primaryTypographyProps={{ variant: \"body2\", fontWeight: 500 }} />\n </ListItemButton>\n ))}\n </List>\n )}\n </Box>\n </Stack>\n );\n}\n\nexport function ManagementShell(props: ManagementShellProps) {\n const { isMobile, children, sections, active, onBackToChat, onBackHover, onOpenCommandPalette } = props;\n const [sheetOpen, setSheetOpen] = React.useState(false);\n const current = sections.find((s) => s.id === active);\n\n if (isMobile) {\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100dvh\", bgcolor: \"background.default\" }}>\n <Box\n component=\"header\"\n sx={(theme) => ({\n position: \"sticky\",\n top: 0,\n zIndex: theme.zIndex.appBar,\n display: \"flex\",\n alignItems: \"center\",\n gap: 0.5,\n px: 1,\n minHeight: 56,\n // Installed PWAs and the native shell run edge to edge: reserve the inset.\n pt: \"env(safe-area-inset-top, 0px)\",\n borderBottom: `1px solid ${theme.palette.divider}`,\n bgcolor: theme.palette.bandit?.surface.base ?? theme.palette.background.default,\n })}\n >\n <Tooltip title=\"Back to chat\">\n <IconButton aria-label=\"Back to chat\" onClick={onBackToChat} sx={{ width: 44, height: 44 }}>\n <ChevronLeftIcon />\n </IconButton>\n </Tooltip>\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: \"block\", lineHeight: 1.2 }}>\n Management\n </Typography>\n <Typography variant=\"subtitle1\" noWrap sx={{ fontWeight: 600, lineHeight: 1.3 }}>\n {current?.label}\n </Typography>\n </Box>\n {onOpenCommandPalette && (\n <IconButton aria-label=\"Search Management\" onClick={onOpenCommandPalette} sx={{ width: 44, height: 44 }}>\n <SearchIcon />\n </IconButton>\n )}\n <IconButton\n aria-label=\"Open Management navigation\"\n aria-expanded={sheetOpen}\n onClick={() => setSheetOpen(true)}\n sx={{ width: 44, height: 44 }}\n >\n <PanelLeftIcon />\n </IconButton>\n </Box>\n <SwipeableDrawer\n anchor=\"bottom\"\n open={sheetOpen}\n onClose={() => setSheetOpen(false)}\n onOpen={() => setSheetOpen(true)}\n disableSwipeToOpen\n ModalProps={{ keepMounted: true }}\n PaperProps={{\n sx: (theme: Theme) => ({\n maxHeight: \"min(720px, 85dvh)\",\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n pb: \"env(safe-area-inset-bottom, 0px)\",\n bgcolor: theme.palette.bandit?.surface.overlay ?? theme.palette.background.paper,\n }),\n }}\n >\n <Box\n aria-hidden\n sx={(theme) => ({\n width: 40,\n height: 4,\n borderRadius: 2,\n mx: \"auto\",\n mt: 1,\n bgcolor: alpha(theme.palette.text.primary, 0.2),\n })}\n />\n <Navigation {...props} onAfterSelect={() => setSheetOpen(false)} />\n </SwipeableDrawer>\n <Box component=\"main\" sx={{ flex: 1, minHeight: 0, overflowY: \"auto\", display: \"flex\", flexDirection: \"column\" }}>\n {children}\n </Box>\n </Box>\n );\n }\n\n return (\n <Box sx={{ display: \"flex\", height: \"100vh\", width: \"100%\", overflow: \"hidden\", bgcolor: \"background.default\" }}>\n <Box\n component=\"aside\"\n sx={(theme) => ({\n width: RAIL_WIDTH,\n flexShrink: 0,\n height: \"100%\",\n borderRight: `1px solid ${theme.palette.divider}`,\n bgcolor: theme.palette.bandit?.surface.subtle ?? theme.palette.background.paper,\n })}\n >\n <Navigation {...props} />\n </Box>\n <Box\n component=\"main\"\n sx={{ flex: 1, minWidth: 0, height: \"100%\", overflowY: \"auto\", display: \"flex\", flexDirection: \"column\" }}\n >\n {children}\n </Box>\n </Box>\n );\n}\n\nexport { SECTION_ICONS };\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n*/\n\n/**\n * The workspace at a glance. Every number comes from the same stores the\n * sections use; nothing here is invented, and anything unknown says so.\n */\nimport React from \"react\";\nimport { Box, Button, ButtonBase, Stack, Typography } from \"@mui/material\";\nimport { alpha } from \"@mui/material/styles\";\n\nimport { SECTION_ICONS } from \"./ManagementShell\";\nimport { ManagementEmptyState } from \"./parts\";\nimport type { ManagementSectionDef, ManagementSectionId } from \"./sections\";\n\nexport interface OverviewFacts {\n personalities: number;\n activePersonality?: string;\n documents: number;\n providerLabel?: string;\n providerModel?: string;\n themeLabel: string;\n preferencesSummary?: string;\n}\n\nconst PROVIDER_LABELS: Record<string, string> = {\n ollama: \"Ollama\",\n openai: \"OpenAI\",\n \"azure-openai\": \"Azure OpenAI\",\n anthropic: \"Anthropic\",\n xai: \"xAI\",\n bandit: \"Bandit\",\n gateway: \"Bandit Gateway\",\n playground: \"Playground\",\n};\n\nexport const providerLabel = (type?: string | null) => (type ? PROVIDER_LABELS[type] ?? type : undefined);\n\nfunction Tile({\n id,\n label,\n value,\n detail,\n onOpen,\n}: {\n id: ManagementSectionId;\n label: string;\n value: string;\n detail?: string;\n onOpen: () => void;\n}) {\n const Icon = SECTION_ICONS[id];\n return (\n <ButtonBase\n onClick={onOpen}\n aria-label={`${label}: ${value}. Open ${label}`}\n sx={(theme) => ({\n display: \"block\",\n textAlign: \"left\",\n p: 2,\n borderRadius: `${Number(theme.shape.borderRadius)}px`,\n border: `1px solid ${theme.palette.divider}`,\n bgcolor: theme.palette.bandit?.surface.raised ?? theme.palette.background.paper,\n transition: theme.transitions.create([\"border-color\", \"background-color\"], {\n duration: theme.transitions.duration.shortest,\n }),\n \"&:hover\": { borderColor: alpha(theme.palette.primary.main, 0.5) },\n \"&:focus-visible\": { outline: `2px solid ${theme.palette.primary.main}`, outlineOffset: 2 },\n })}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1} sx={{ color: \"text.secondary\" }}>\n <Box sx={{ display: \"grid\", \"& svg\": { width: 16, height: 16 } }}>\n <Icon fontSize=\"small\" />\n </Box>\n <Typography variant=\"caption\" sx={{ fontWeight: 600, letterSpacing: \"0.04em\", textTransform: \"uppercase\" }}>\n {label}\n </Typography>\n </Stack>\n <Typography variant=\"h6\" sx={{ mt: 1, fontWeight: 600 }} noWrap>\n {value}\n </Typography>\n {detail && (\n <Typography variant=\"body2\" color=\"text.secondary\" noWrap>\n {detail}\n </Typography>\n )}\n </ButtonBase>\n );\n}\n\nexport function ManagementOverview({\n sections,\n facts,\n onSelect,\n}: {\n sections: ManagementSectionDef[];\n facts: OverviewFacts;\n onSelect: (id: ManagementSectionId) => void;\n}) {\n const has = (id: ManagementSectionId) => sections.some((s) => s.id === id);\n const plural = (n: number, one: string, many = `${one}s`) => `${n.toLocaleString()} ${n === 1 ? one : many}`;\n const tiles: React.ReactNode[] = [];\n if (has(\"personalities\"))\n tiles.push(\n <Tile\n key=\"personalities\"\n id=\"personalities\"\n label=\"Personalities\"\n value={plural(facts.personalities, \"personality\", \"personalities\")}\n detail={facts.activePersonality ? `Active: ${facts.activePersonality}` : \"None selected\"}\n onOpen={() => onSelect(\"personalities\")}\n />,\n );\n if (has(\"knowledge\"))\n tiles.push(\n <Tile\n key=\"knowledge\"\n id=\"knowledge\"\n label=\"Knowledge\"\n value={plural(facts.documents, \"document\")}\n detail={facts.documents ? \"Available to every conversation\" : \"Nothing uploaded yet\"}\n onOpen={() => onSelect(\"knowledge\")}\n />,\n );\n if (has(\"provider\"))\n tiles.push(\n <Tile\n key=\"provider\"\n id=\"provider\"\n label=\"Provider\"\n value={facts.providerLabel ?? \"Not configured\"}\n detail={facts.providerModel ? facts.providerModel : \"No default model\"}\n onOpen={() => onSelect(\"provider\")}\n />,\n );\n if (has(\"branding\"))\n tiles.push(\n <Tile\n key=\"branding\"\n id=\"branding\"\n label=\"Appearance\"\n value={facts.themeLabel}\n detail=\"Theme, logo and name\"\n onOpen={() => onSelect(\"branding\")}\n />,\n );\n if (has(\"preferences\"))\n tiles.push(\n <Tile\n key=\"preferences\"\n id=\"preferences\"\n label=\"Preferences\"\n value=\"This device\"\n detail={facts.preferencesSummary ?? \"Saved automatically\"}\n onOpen={() => onSelect(\"preferences\")}\n />,\n );\n\n return (\n <Box sx={{ px: { xs: 1.5, sm: 2.5, md: 3 }, py: 2 }}>\n {facts.personalities === 0 && has(\"personalities\") && (\n <Box sx={{ mb: 2 }}>\n <ManagementEmptyState\n compact\n title=\"Give this workspace its first personality\"\n description=\"A personality is the assistant people chat with: its name, instructions and the model it runs on.\"\n action={\n <Button variant=\"contained\" onClick={() => onSelect(\"personalities\")}>\n Create a personality\n </Button>\n }\n />\n </Box>\n )}\n <Box\n sx={{\n display: \"grid\",\n gap: 1.5,\n gridTemplateColumns: { xs: \"1fr\", sm: \"repeat(2, minmax(0, 1fr))\", lg: \"repeat(3, minmax(0, 1fr))\" },\n }}\n >\n {tiles}\n </Box>\n </Box>\n );\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n*/\n\nimport { useMemo } from \"react\";\n\nimport { useFeatures } from \"../../hooks/useFeatures\";\nimport { authenticationService } from \"../../services/auth/authenticationService\";\n\n/** Every Management section that exists. Order is the sidebar order. */\nexport type ManagementSectionId =\n | \"overview\"\n | \"personalities\"\n | \"knowledge\"\n | \"tools\"\n | \"provider\"\n | \"storage\"\n | \"branding\"\n | \"preferences\";\n\ntype FeatureGate = \"limitedAdminDashboard\" | \"advancedSearch\";\n\nexport interface ManagementSectionDef {\n id: ManagementSectionId;\n label: string;\n /** One sentence under the page title. */\n description: string;\n /** Extra words the command palette matches on. */\n keywords: string[];\n /** Platform/tenant configuration: only a workspace admin sees it. */\n requiresAdmin: boolean;\n requiresFeature: FeatureGate;\n}\n\nexport const MANAGEMENT_SECTIONS: readonly ManagementSectionDef[] = [\n {\n id: \"overview\",\n label: \"Overview\",\n description: \"This workspace at a glance: personalities, knowledge, provider and appearance.\",\n keywords: [\"home\", \"summary\", \"dashboard\"],\n requiresAdmin: true,\n requiresFeature: \"limitedAdminDashboard\",\n },\n {\n id: \"personalities\",\n label: \"Personalities\",\n description: \"The assistants people chat with: their name, prompt, model and avatar.\",\n keywords: [\"models\", \"assistant\", \"prompt\", \"persona\", \"create personality\"],\n requiresAdmin: true,\n requiresFeature: \"limitedAdminDashboard\",\n },\n {\n id: \"knowledge\",\n label: \"Knowledge\",\n description: \"Documents Bandit can answer from, and seed packs for new workspaces.\",\n keywords: [\"documents\", \"upload\", \"files\", \"seed packs\", \"rag\"],\n requiresAdmin: true,\n requiresFeature: \"limitedAdminDashboard\",\n },\n {\n id: \"tools\",\n label: \"Tools\",\n description: \"Built-in tools and connected MCP servers the assistant can call.\",\n keywords: [\"mcp\", \"integrations\", \"servers\", \"functions\"],\n requiresAdmin: true,\n requiresFeature: \"advancedSearch\",\n },\n {\n id: \"provider\",\n label: \"Provider\",\n description: \"The model backend that powers chat: gateway, OpenAI, Ollama and others.\",\n keywords: [\"engine\", \"model\", \"api key\", \"gateway\", \"ollama\", \"openai\"],\n requiresAdmin: true,\n requiresFeature: \"advancedSearch\",\n },\n {\n id: \"storage\",\n label: \"Storage\",\n description: \"What this browser keeps locally, and how much room it takes.\",\n keywords: [\"indexeddb\", \"cache\", \"clear\", \"data\"],\n requiresAdmin: true,\n requiresFeature: \"limitedAdminDashboard\",\n },\n {\n id: \"branding\",\n label: \"Branding\",\n description: \"Logo, name and theme for this workspace.\",\n keywords: [\"theme\", \"logo\", \"colors\", \"appearance\", \"change theme\"],\n requiresAdmin: true,\n requiresFeature: \"limitedAdminDashboard\",\n },\n {\n id: \"preferences\",\n label: \"Preferences\",\n description: \"Your own settings for this device. Changes save automatically.\",\n keywords: [\"settings\", \"memory\", \"voice\", \"features\"],\n requiresAdmin: false,\n requiresFeature: \"limitedAdminDashboard\",\n },\n];\n\nexport const sectionById = (id: ManagementSectionId): ManagementSectionDef =>\n MANAGEMENT_SECTIONS.find((s) => s.id === id) ?? MANAGEMENT_SECTIONS[0]!;\n\nexport interface ManagementAccessInput {\n roles: string[];\n limitedAdminDashboard: boolean;\n adminDashboard: boolean;\n advancedSearch: boolean;\n}\n\n/**\n * A workspace admin is a PLATFORM admin (admin / platform_admin) or a\n * per-tenant admin. AuthApi's TeamService grants tenant owners/admins a role of\n * the form \"<slug>-admin\", so any role ending in \"-admin\" is a tenant admin.\n * super-user is NOT an admin: it's the trial/power-user role, so trial and\n * consumer users see only Preferences.\n */\nexport function isWorkspaceAdminRole(roles: string[]): boolean {\n const platformAdminRoles = new Set([\"admin\", \"platform_admin\"]);\n return roles\n .map((r) => r.toLowerCase())\n .some((r) => platformAdminRoles.has(r) || r.endsWith(\"-admin\"));\n}\n\n/** Which sections this user can open: role first, then plan features. Pure, for tests and hosts. */\nexport function resolveManagementSections(input: ManagementAccessInput): ManagementSectionDef[] {\n const admin = isWorkspaceAdminRole(input.roles);\n const visible = MANAGEMENT_SECTIONS.filter((section) => {\n if (section.requiresAdmin && !admin) return false;\n if (section.requiresFeature === \"limitedAdminDashboard\") {\n return input.limitedAdminDashboard || input.adminDashboard;\n }\n return input.advancedSearch; // Pro/Team\n });\n // The overview only earns its place when there is something to summarise.\n return visible.length > 2 ? visible : visible.filter((s) => s.id !== \"overview\");\n}\n\nexport interface ManagementAccess {\n sections: ManagementSectionDef[];\n isWorkspaceAdmin: boolean;\n /** Admin-dashboard users limited to the lighter feature set. */\n isLimitedAdmin: boolean;\n}\n\n/** The signed-in user's Management access. Hosts use it to build their command palette. */\nexport function useManagementAccess(): ManagementAccess {\n const { hasLimitedAdminDashboard, hasAdminDashboard, hasAdvancedSearch } = useFeatures();\n const token = authenticationService.getToken() ?? \"\";\n const limited = hasLimitedAdminDashboard();\n const full = hasAdminDashboard();\n const advanced = hasAdvancedSearch();\n return useMemo(() => {\n const roles = (token ? authenticationService.parseJwtClaims(token)?.roles : undefined) ?? [];\n return {\n sections: resolveManagementSections({\n roles,\n limitedAdminDashboard: limited,\n adminDashboard: full,\n advancedSearch: advanced,\n }),\n isWorkspaceAdmin: isWorkspaceAdminRole(roles),\n isLimitedAdmin: limited && !full,\n };\n }, [token, limited, full, advanced]);\n}\n"],"mappings":"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","names":["useState","useEffect","useCallback","useMemo","useMediaQuery","Box","Button","useEffect","useRef","useState","Box","Button","Typography","Dialog","DialogTitle","DialogContent","DialogActions","Stack","minScale","Box","Button","Typography","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","Box","Typography","Button","Dialog","DialogTitle","DialogContent","DialogActions","Stack","LayoutGrid","useState","useEffect","useRef","useCallback","Box","Button","Typography","Paper","Chip","TextField","Alert","IconButton","useMediaQuery","useTheme","MenuItem","jsx","jsxs","useTheme","useMediaQuery","useState","useRef","Box","Typography","useCallback","useEffect","Paper","Chip","Alert","Button","TextField","MenuItem","RotateCcw","IconButton","Refresh","useEffect","useRef","useState","Alert","Box","Button","Paper","Stack","TextField","ToggleButton","ToggleButtonGroup","Tooltip","Typography","useTheme","useState","useRef","useCallback","useEffect","Dialog","DialogTitle","DialogContent","DialogActions","Button","Box","Typography","Slider","IconButton","Paper","Alert","Chip","Fragment","jsx","jsxs","useRef","useState","useCallback","useEffect","minScale","Dialog","DialogTitle","Typography","DialogContent","Box","Paper","IconButton","Slider","Button","Chip","Alert","DialogActions","jsx","jsxs","useState","useRef","useTheme","useEffect","Stack","Box","TextField","ToggleButtonGroup","ToggleButton","Typography","Button","Tooltip","RotateCcw","Alert","Paper","useEffect","useState","Box","Tab","Tabs","useMediaQuery","useTheme","useState","useMemo","useCallback","useEffect","Box","Typography","Button","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","TextField","InputAdornment","Chip","LinearProgress","IconButton","Alert","Skeleton","Stack","MenuItem","Snackbar","Switch","useTheme","alpha","useState","useEffect","Dialog","DialogContent","Box","Typography","useTheme","alpha","jsx","jsxs","sparkle","useState","useCallback","Fragment","jsx","jsxs","FileText","useTheme","useState","useCallback","useEffect","useMemo","sourceDocuments","Box","Stack","Typography","Button","Refresh","Switch","Alert","LinearProgress","Skeleton","FileUp","alpha","TextField","InputAdornment","MenuItem","Chip","IconButton","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","Snackbar","useCallback","useEffect","useMemo","useRef","useState","Alert","Box","Button","Card","CardContent","Chip","Dialog","DialogActions","DialogContent","DialogContentText","DialogTitle","IconButton","LinearProgress","List","Skeleton","Snackbar","Stack","TextField","Tooltip","Typography","jsx","jsxs","formatFileSize","Card","CardContent","Stack","Tooltip","Typography","IconButton","Button","useState","useRef","useMemo","useCallback","useEffect","buildDraftPayload","Box","Refresh","Alert","Skeleton","LinearProgress","List","Chip","TextField","FileUp","Upload","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","Snackbar","jsx","jsxs","useTheme","useMediaQuery","useState","useEffect","Box","Tabs","Tab","useState","useEffect","useMemo","Box","Typography","Button","LinearProgress","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","Alert","Stack","Chip","List","CircularProgress","Skeleton","Snackbar","useTheme","Fragment","jsx","jsxs","useTheme","useState","useEffect","useMemo","Box","Skeleton","Stack","Button","CircularProgress","Refresh","Alert","Typography","Chip","LinearProgress","List","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","Snackbar","useState","useEffect","useCallback","useRef","Box","Typography","Paper","Button","TextField","MenuItem","Chip","Snackbar","Alert","CircularProgress","Stack","jsx","jsxs","useCallback","useState","useRef","useEffect","Box","Paper","Typography","Chip","Button","TextField","MenuItem","Alert","CircularProgress","Stack","Snackbar","useEffect","useMemo","useState","Alert","Box","Button","Typography","Paper","IconButton","Tooltip","LinearProgress","Skeleton","Switch","buildUrl","useCallback","useEffect","useRef","useState","Alert","Box","Button","Chip","CircularProgress","FormControlLabel","IconButton","LinearProgress","Link","MenuItem","Paper","Skeleton","Stack","Switch","TextField","Tooltip","Typography","jsx","jsxs","useState","useRef","useCallback","useEffect","Box","Typography","Alert","Button","Paper","Chip","Link","Stack","TextField","MenuItem","LinearProgress","Skeleton","Tooltip","FormControlLabel","Switch","IconButton","Refresh","CircularProgress","jsx","jsxs","useState","useEffect","useMemo","Box","Typography","Tooltip","IconButton","Refresh","LinearProgress","Alert","Button","Skeleton","Paper","Switch","React","Box","ButtonBase","IconButton","List","ListItemButton","ListItemIcon","ListItemText","Stack","Tooltip","Typography","alpha","jsx","jsxs","alpha","Stack","Box","ButtonBase","Typography","List","ListItemButton","ListItemIcon","ListItemText","React","Tooltip","IconButton","Box","Button","ButtonBase","Stack","Typography","alpha","jsx","jsxs","ButtonBase","alpha","Stack","Box","Typography","Button","useMemo","useMemo","jsx","jsxs","useMediaQuery","banditHead","useState","useEffect","useCallback","packageSettings","modelName","file","e","useMemo","Button","FileUp","Box"]}
|