@burtson-labs/bandit-engine 2.0.65 → 2.0.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/chat-IWRBVOVP.mjs +16 -0
  2. package/dist/chat-provider.js +4 -0
  3. package/dist/chat-provider.js.map +1 -1
  4. package/dist/chat-provider.mjs +5 -5
  5. package/dist/{chunk-EUBVBTB3.mjs → chunk-4D7245ZO.mjs} +55 -30
  6. package/dist/chunk-4D7245ZO.mjs.map +1 -0
  7. package/dist/{chunk-FXFTA5PZ.mjs → chunk-6DY7W4NK.mjs} +3 -3
  8. package/dist/{chunk-VTC6AIWY.mjs → chunk-6ITUH375.mjs} +3 -3
  9. package/dist/{chunk-O44AP4XI.mjs → chunk-EM2DB6NP.mjs} +53 -9
  10. package/dist/chunk-EM2DB6NP.mjs.map +1 -0
  11. package/dist/{chunk-D55E6ZDV.mjs → chunk-HHMGNCBS.mjs} +5 -5
  12. package/dist/{chunk-6QTTNYF2.mjs → chunk-IDZEEONG.mjs} +2 -2
  13. package/dist/{chunk-HKQSZALO.mjs → chunk-JURUEF52.mjs} +4 -4
  14. package/dist/{chunk-IPMTNREZ.mjs → chunk-LWHSOEPR.mjs} +6 -2
  15. package/dist/{chunk-IPMTNREZ.mjs.map → chunk-LWHSOEPR.mjs.map} +1 -1
  16. package/dist/{chunk-O7M4OPZU.mjs → chunk-U633CJBV.mjs} +2 -2
  17. package/dist/{chunk-7EPFQDJW.mjs → chunk-ZYQJVZK2.mjs} +18 -11
  18. package/dist/{chunk-7EPFQDJW.mjs.map → chunk-ZYQJVZK2.mjs.map} +1 -1
  19. package/dist/index.js +115 -35
  20. package/dist/index.js.map +1 -1
  21. package/dist/index.mjs +10 -10
  22. package/dist/management/management.js +114 -34
  23. package/dist/management/management.js.map +1 -1
  24. package/dist/management/management.mjs +8 -8
  25. package/dist/modals/chat-modal/chat-modal.js +4 -0
  26. package/dist/modals/chat-modal/chat-modal.js.map +1 -1
  27. package/dist/modals/chat-modal/chat-modal.mjs +4 -4
  28. package/dist/{modelStore-FBPBG7TI.mjs → modelStore-KCJPXFKO.mjs} +2 -2
  29. package/package.json +1 -1
  30. package/dist/chat-57M4OXFX.mjs +0 -16
  31. package/dist/chunk-EUBVBTB3.mjs.map +0 -1
  32. package/dist/chunk-O44AP4XI.mjs.map +0 -1
  33. /package/dist/{chat-57M4OXFX.mjs.map → chat-IWRBVOVP.mjs.map} +0 -0
  34. /package/dist/{chunk-FXFTA5PZ.mjs.map → chunk-6DY7W4NK.mjs.map} +0 -0
  35. /package/dist/{chunk-VTC6AIWY.mjs.map → chunk-6ITUH375.mjs.map} +0 -0
  36. /package/dist/{chunk-D55E6ZDV.mjs.map → chunk-HHMGNCBS.mjs.map} +0 -0
  37. /package/dist/{chunk-6QTTNYF2.mjs.map → chunk-IDZEEONG.mjs.map} +0 -0
  38. /package/dist/{chunk-HKQSZALO.mjs.map → chunk-JURUEF52.mjs.map} +0 -0
  39. /package/dist/{chunk-O7M4OPZU.mjs.map → chunk-U633CJBV.mjs.map} +0 -0
  40. /package/dist/{modelStore-FBPBG7TI.mjs.map → modelStore-KCJPXFKO.mjs.map} +0 -0
@@ -3,10 +3,10 @@ import {
3
3
  } from "./chunk-ONQMRE2G.mjs";
4
4
  import {
5
5
  aiProviderInitService
6
- } from "./chunk-VTC6AIWY.mjs";
6
+ } from "./chunk-6ITUH375.mjs";
7
7
  import {
8
8
  useMCPToolsStore
9
- } from "./chunk-6QTTNYF2.mjs";
9
+ } from "./chunk-IDZEEONG.mjs";
10
10
  import {
11
11
  AUTH_TOKEN_CHANGED_EVENT,
12
12
  FeatureFlagProvider,
@@ -21,13 +21,13 @@ import {
21
21
  useKnowledgeStore2,
22
22
  useMemoryStore,
23
23
  useProjectStore
24
- } from "./chunk-EUBVBTB3.mjs";
24
+ } from "./chunk-4D7245ZO.mjs";
25
25
  import {
26
26
  indexedDBService_default,
27
27
  useModelStore,
28
28
  usePackageSettingsStore,
29
29
  usePreferencesStore
30
- } from "./chunk-IPMTNREZ.mjs";
30
+ } from "./chunk-LWHSOEPR.mjs";
31
31
  import {
32
32
  debugLogger
33
33
  } from "./chunk-KCI46M23.mjs";
@@ -188,4 +188,4 @@ export {
188
188
  ChatProvider,
189
189
  chat_provider_default
190
190
  };
191
- //# sourceMappingURL=chunk-D55E6ZDV.mjs.map
191
+ //# sourceMappingURL=chunk-HHMGNCBS.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  indexedDBService_default
3
- } from "./chunk-IPMTNREZ.mjs";
3
+ } from "./chunk-LWHSOEPR.mjs";
4
4
  import {
5
5
  debugLogger
6
6
  } from "./chunk-KCI46M23.mjs";
@@ -181,4 +181,4 @@ var useMCPToolsStore = create((set, get) => ({
181
181
  export {
182
182
  useMCPToolsStore
183
183
  };
184
- //# sourceMappingURL=chunk-6QTTNYF2.mjs.map
184
+ //# sourceMappingURL=chunk-IDZEEONG.mjs.map
@@ -24,20 +24,20 @@ import {
24
24
  useNotificationService,
25
25
  useTTS,
26
26
  useVoiceStore
27
- } from "./chunk-FXFTA5PZ.mjs";
27
+ } from "./chunk-6DY7W4NK.mjs";
28
28
  import {
29
29
  brandingService_default,
30
30
  toTitleCase,
31
31
  useAIQueryStore,
32
32
  useConversationStore,
33
33
  useMemoryStore
34
- } from "./chunk-EUBVBTB3.mjs";
34
+ } from "./chunk-4D7245ZO.mjs";
35
35
  import {
36
36
  indexedDBService_default,
37
37
  useModelStore,
38
38
  usePackageSettingsStore,
39
39
  usePreferencesStore
40
- } from "./chunk-IPMTNREZ.mjs";
40
+ } from "./chunk-LWHSOEPR.mjs";
41
41
  import {
42
42
  useAIProviderStore
43
43
  } from "./chunk-H3BYFEIE.mjs";
@@ -2803,4 +2803,4 @@ export {
2803
2803
  MAX_WINDOWED_HEIGHT,
2804
2804
  chat_modal_default
2805
2805
  };
2806
- //# sourceMappingURL=chunk-HKQSZALO.mjs.map
2806
+ //# sourceMappingURL=chunk-JURUEF52.mjs.map
@@ -324,6 +324,8 @@ var defaultPreferences = {
324
324
  sttEnabled: true,
325
325
  banditModelsEnabled: true,
326
326
  feedbackEnabled: true,
327
+ interests: [],
328
+ useKnowledgeForStarters: false,
327
329
  homeUrl: ""
328
330
  };
329
331
  var sanitizePreferences = (preferences) => {
@@ -353,7 +355,7 @@ var usePreferencesStore = create2((set, get) => ({
353
355
  }));
354
356
  get().savePreferences();
355
357
  if (key === "banditModelsEnabled" && prevValue !== value) {
356
- import("./modelStore-FBPBG7TI.mjs").then(({ useModelStore: useModelStore2 }) => {
358
+ import("./modelStore-KCJPXFKO.mjs").then(({ useModelStore: useModelStore2 }) => {
357
359
  useModelStore2.getState().handleBanditPersonalitiesPreferenceChange(value);
358
360
  });
359
361
  }
@@ -421,6 +423,8 @@ var usePreferencesStore = create2((set, get) => ({
421
423
  sttEnabled: typeof mergedPreferences.sttEnabled === "boolean" ? mergedPreferences.sttEnabled : defaultPreferences.sttEnabled,
422
424
  banditModelsEnabled: typeof mergedPreferences.banditModelsEnabled === "boolean" ? mergedPreferences.banditModelsEnabled : defaultPreferences.banditModelsEnabled,
423
425
  feedbackEnabled: typeof mergedPreferences.feedbackEnabled === "boolean" ? mergedPreferences.feedbackEnabled : defaultPreferences.feedbackEnabled,
426
+ interests: Array.isArray(mergedPreferences.interests) ? mergedPreferences.interests.filter((i) => typeof i === "string") : defaultPreferences.interests,
427
+ useKnowledgeForStarters: typeof mergedPreferences.useKnowledgeForStarters === "boolean" ? mergedPreferences.useKnowledgeForStarters : defaultPreferences.useKnowledgeForStarters,
424
428
  homeUrl: typeof mergedPreferences.homeUrl === "string" ? mergedPreferences.homeUrl : defaultPreferences.homeUrl
425
429
  };
426
430
  set({ preferences: validatedPreferences });
@@ -868,4 +872,4 @@ export {
868
872
  usePreferencesStore,
869
873
  useModelStore
870
874
  };
871
- //# sourceMappingURL=chunk-IPMTNREZ.mjs.map
875
+ //# sourceMappingURL=chunk-LWHSOEPR.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/store/modelStore.ts","../src/models/models.ts","../src/services/indexedDB/indexedDBService.ts","../src/store/packageSettingsStore.ts","../src/store/preferencesStore.ts"],"sourcesContent":["/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-205A-DDC90F\nconst __banditFingerprint_store_modelStorets = 'BL-FP-C71D64-A364';\nconst __auditTrail_store_modelStorets = 'BL-AU-MGOIKVW5-X6L2';\n// File: modelStore.ts | Path: src/store/modelStore.ts | Hash: 205aa364\n\ninterface BrandingConfig {\n branding?: {\n logoBase64?: string;\n brandingText?: string;\n theme?: string;\n hasTransparentLogo?: boolean;\n };\n models?: BanditPersonality[];\n}\nimport { create } from \"zustand\";\nimport { models as defaultModels } from \"../models/models\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport { usePackageSettingsStore } from \"../store/packageSettingsStore\";\nimport { usePreferencesStore } from \"../store/preferencesStore\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\n\nexport interface BanditPersonality {\n name: string;\n tagline: string;\n systemPrompt: string;\n commands: string[];\n avatarBase64?: string | null;\n avatarPreset?: string;\n}\n\ntype BanditConfigEntry = {\n id?: string;\n model?: (BanditPersonality & { selectedModel?: string }) | { selectedModel?: string };\n branding?: { userSaved?: boolean; hasTransparentLogo?: boolean };\n deleted?: string[];\n avatarBase64?: string | null;\n [key: string]: unknown;\n};\n\ninterface ModelState {\n name: string;\n tagline: string;\n systemPrompt: string;\n commands: string[];\n avatarBase64: string | null;\n setModelName: (name: string) => void;\n setTagline: (tagline: string) => void;\n setSystemPrompt: (prompt: string) => void;\n addCommand: (command: string) => void;\n availableModels: BanditPersonality[];\n selectedModel: string;\n setSelectedModel: (model: string) => void;\n saveModel: () => void;\n resetModel: () => void;\n getCurrentModel: () => BanditPersonality | null;\n initModels: () => Promise<void>;\n hasTransparentLogo: boolean;\n setHasTransparentLogo: (value: boolean) => void;\n restoreDefaultModels: () => Promise<void>;\n restoreDeletedBanditModels: () => Promise<{ restored: string[]; hadNothingToRestore: boolean }>;\n handleBanditPersonalitiesPreferenceChange: (enabled: boolean) => Promise<void>;\n isLoading: boolean;\n setIsLoading: (loading: boolean) => void;\n isInitializing: boolean;\n setIsInitializing: (initializing: boolean) => void;\n setAvatarBase64: (value: string | null) => void;\n}\n\nexport const useModelStore = create<ModelState>((set, get) => ({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n commands: [],\n avatarBase64: null,\n availableModels: [],\n selectedModel: \"\",\n hasTransparentLogo: true,\n isLoading: true,\n isInitializing: false,\n setIsLoading: (loading) => set({ isLoading: loading }),\n setIsInitializing: (initializing) => set({ isInitializing: initializing }),\n setModelName: (name) => set({ name: name }),\n setTagline: (tagline) => set({ tagline }),\n setSystemPrompt: (prompt) => set({ systemPrompt: prompt }),\n setAvatarBase64: (value) => set({ avatarBase64: value }),\n addCommand: (command) => set((state) => ({ commands: [...state.commands, command] })),\n setSelectedModel: (modelName) => {\n const selected = get().availableModels.find((m) => m.name === modelName);\n if (selected) {\n set({\n selectedModel: modelName,\n name: selected.name,\n tagline: selected.tagline,\n systemPrompt: selected.systemPrompt,\n commands: selected.commands,\n avatarBase64: selected.avatarBase64 ?? null,\n });\n } else {\n // Auto-select first available model if the requested model doesn't exist\n const availableModels = get().availableModels;\n const firstModel = availableModels.length > 0 ? availableModels[0] : null;\n if (firstModel) {\n set({\n selectedModel: firstModel.name,\n name: firstModel.name,\n tagline: firstModel.tagline,\n systemPrompt: firstModel.systemPrompt,\n commands: firstModel.commands,\n avatarBase64: firstModel.avatarBase64 ?? null,\n });\n }\n }\n\n // Persist selection for reloads\n (async () => {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n try {\n const existing = (await indexedDBService.get(\"banditConfig\", 1, \"config\", \"main\", storeConfigs)) as\n | BanditConfigEntry\n | undefined;\n await indexedDBService.put(\n \"banditConfig\",\n 1,\n \"config\",\n {\n ...existing,\n id: \"main\",\n model: { ...(existing?.model ?? {}), selectedModel: modelName },\n },\n storeConfigs\n );\n } catch (err) {\n debugLogger.warn(\"setSelectedModel: failed to persist selected model\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n })();\n },\n saveModel: async () => {\n const state = get();\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n\n const newModel: BanditPersonality = {\n name: state.name,\n tagline: state.tagline,\n systemPrompt: state.systemPrompt,\n commands: state.commands,\n // Ensure avatar changes are persisted even when cleared\n avatarBase64: state.avatarBase64 ?? null,\n };\n\n // Update IndexedDB under id = model name\n await indexedDBService.put(\"banditConfig\", 1, \"config\", { id: newModel.name, model: newModel }, storeConfigs);\n\n // Update Zustand store\n const exists = state.availableModels.find((m) => m.name === newModel.name);\n if (!exists) {\n set((prevState) => ({\n availableModels: [...prevState.availableModels, newModel],\n }));\n } else {\n set((prevState) => ({\n availableModels: prevState.availableModels.map((m) =>\n m.name === newModel.name ? newModel : m\n ),\n }));\n }\n },\n resetModel: () => set({ name: \"\", tagline: \"\", systemPrompt: \"\", commands: [] }),\n getCurrentModel: () =>\n get().availableModels.find((m) => m.name === get().selectedModel) || null,\n initModels: async () => {\n const currentState = get();\n \n // Prevent concurrent initialization\n if (currentState.isInitializing) {\n debugLogger.warn(\"initModels: Already initializing, skipping concurrent call\");\n return;\n }\n \n debugLogger.info(\"initModels: starting initialization\");\n set({ isLoading: true, isInitializing: true });\n \n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n const entries: BanditConfigEntry[] = (await indexedDBService.getAll(\n \"banditConfig\",\n 1,\n \"config\",\n storeConfigs\n )) as BanditConfigEntry[];\n\n const mainEntry = entries.find((entry) => entry.id === \"main\");\n const modelEntries = entries.filter((entry) => entry.id !== \"main\" && entry.id !== \"deletedModels\");\n\n const deletedEntry = (await indexedDBService.get(\"banditConfig\", 1, \"config\", \"deletedModels\", storeConfigs)) as\n | BanditConfigEntry\n | undefined;\n const deletedModelNames = deletedEntry?.deleted ?? [];\n\n let allModels: BanditPersonality[] = [];\n let selectedModel = \"\";\n\n // STEP 1: Try to load from IndexedDB first\n if (modelEntries.length > 0) {\n debugLogger.info(\"Loading models from IndexedDB\");\n allModels = modelEntries.map((entry) => {\n const modelData = (entry.model as BanditPersonality | undefined) ?? (entry as unknown as BanditPersonality);\n return {\n name: modelData.name,\n tagline: modelData.tagline || \"\",\n systemPrompt: modelData.systemPrompt || \"\",\n commands: modelData.commands ?? [],\n // Fall back to legacy top-level avatar when the nested model config omitted it\n avatarBase64: modelData.avatarBase64 ?? entry.avatarBase64 ?? null,\n };\n }).filter(m => m.name && !deletedModelNames.includes(m.name));\n\n // Filter out Bandit personalities if banditModelsEnabled is false\n const preferences = usePreferencesStore.getState().preferences;\n if (!preferences.banditModelsEnabled) {\n const banditModelNames = defaultModels.map(m => m.name);\n allModels = allModels.filter(model => !banditModelNames.includes(model.name));\n debugLogger.info(\"Filtered out Bandit personalities (preference disabled)\", { \n filteredModels: banditModelNames \n });\n }\n\n selectedModel = mainEntry?.model?.selectedModel || (allModels.length > 0 ? allModels[0].name : \"\");\n debugLogger.info(\"Loaded models from IndexedDB:\", { models: allModels.map(m => m.name), selectedModel });\n \n // If no models remain after filtering deleted ones, try CDN\n if (allModels.length === 0) {\n debugLogger.info(\"No personalities remain after filtering deleted models, checking CDN config\");\n }\n } \n \n // STEP 2: If no models in IndexedDB OR no personalities remain after filtering, try CDN config\n if (modelEntries.length === 0 || allModels.length === 0) {\n debugLogger.info(\"No models in IndexedDB, checking CDN config\");\n const packageSettings = usePackageSettingsStore.getState().getSettings();\n let configModels: BrandingConfig | null = null;\n\n if (packageSettings?.brandingConfigUrl) {\n try {\n const response = await fetch(packageSettings.brandingConfigUrl);\n configModels = await response.json();\n } catch (err) {\n debugLogger.warn(\"Failed to load CDN config:\", { error: err });\n }\n }\n\n if (configModels?.models?.length) {\n debugLogger.info(\"Loading models from CDN config\");\n allModels = configModels.models.filter(m => !deletedModelNames.includes(m.name));\n \n // Check if Bandit personalities should be included\n const preferences = usePreferencesStore.getState().preferences;\n if (preferences.banditModelsEnabled) {\n // Add Bandit default personalities if they're not already present\n const cdnModelNames = allModels.map(m => m.name);\n const banditModelsToAdd = defaultModels.filter(banditModel => \n !cdnModelNames.includes(banditModel.name) && !deletedModelNames.includes(banditModel.name)\n );\n allModels = [...allModels, ...banditModelsToAdd];\n debugLogger.info(\"Added Bandit default personalities to CDN models\", { \n banditModels: banditModelsToAdd.map(m => m.name) \n });\n } else {\n // Filter out any Bandit personalities that might be in the CDN config\n const banditModelNames = defaultModels.map(m => m.name);\n allModels = allModels.filter(model => !banditModelNames.includes(model.name));\n debugLogger.info(\"Filtered out Bandit personalities from CDN config (preference disabled)\", {\n banditModels: banditModelNames\n });\n }\n \n selectedModel = allModels.length > 0 ? allModels[0].name : \"\";\n \n // Only set hasTransparentLogo from CDN if no user branding exists\n const existingConfig = (await indexedDBService.get(\"banditConfig\", 1, \"config\", \"main\", storeConfigs)) as BanditConfigEntry | undefined;\n const hasUserBranding = existingConfig?.branding?.userSaved;\n if (!hasUserBranding) {\n set({ hasTransparentLogo: configModels?.branding?.hasTransparentLogo ?? true });\n debugLogger.info(\"Set hasTransparentLogo from CDN config (no user branding)\");\n } else {\n debugLogger.info(\"Preserved user hasTransparentLogo setting (user branding exists)\");\n }\n \n // Save CDN models to IndexedDB for future use\n for (const model of allModels) {\n await indexedDBService.put(\"banditConfig\", 1, \"config\", { id: model.name, model }, storeConfigs);\n }\n \n debugLogger.info(\"Loaded and saved models from CDN config:\", { models: allModels.map(m => m.name) });\n } \n // STEP 3: Fall back to Bandit defaults (only if banditModelsEnabled is true)\n else {\n const preferences = usePreferencesStore.getState().preferences;\n if (preferences.banditModelsEnabled) {\n debugLogger.info(\"No CDN config available, loading Bandit defaults\");\n await get().restoreDefaultModels();\n set({ isLoading: false, isInitializing: false });\n return;\n } else {\n debugLogger.info(\"No CDN config available and Bandit personalities disabled, loading empty model list\");\n allModels = [];\n selectedModel = \"\";\n }\n }\n }\n\n // Set the models and selected model\n set({ availableModels: allModels });\n debugLogger.info(\"Setting selected model:\", { selectedModel });\n get().setSelectedModel(selectedModel);\n\n debugLogger.info(\"Model initialization complete\");\n set({ isLoading: false, isInitializing: false });\n },\n setHasTransparentLogo: (value) => set({ hasTransparentLogo: value }),\n restoreDefaultModels: async () => {\n debugLogger.debug(\"🧪 Restoring default models...\");\n set({ isLoading: true });\n \n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n \n // Clear existing models from state\n set({ availableModels: [] });\n \n // Clear deletedModels entry in IndexedDB\n try {\n await indexedDBService.delete(\"banditConfig\", 1, \"config\", \"deletedModels\", storeConfigs);\n debugLogger.info(\"restoreDefaultModels: Cleared deletedModels entry in IndexedDB\");\n } catch (err) {\n debugLogger.warn(\"restoreDefaultModels: Failed to clear deletedModels entry in IndexedDB\", { error: err });\n }\n \n let allModels: BanditPersonality[] = [];\n let selectedModel = \"\";\n \n // STEP 1: Try to load from CDN config first\n const packageSettings = usePackageSettingsStore.getState().getSettings();\n let configModels: BrandingConfig | null = null;\n \n if (packageSettings?.brandingConfigUrl) {\n debugLogger.debug(\"🔗 Attempting to load default models from CDN config...\");\n try {\n const response = await fetch(packageSettings.brandingConfigUrl);\n configModels = await response.json();\n } catch (err) {\n debugLogger.warn(\"Failed to load CDN config:\", { error: err });\n }\n }\n \n if (configModels?.models?.length) {\n // Use models from CDN config\n allModels = configModels.models;\n \n // Check if Bandit personalities should be included\n const preferences = usePreferencesStore.getState().preferences;\n if (preferences.banditModelsEnabled) {\n // Add Bandit default personalities if they're not already present\n const cdnModelNames = allModels.map(m => m.name);\n const banditModelsToAdd = defaultModels.filter(banditModel => \n !cdnModelNames.includes(banditModel.name)\n );\n allModels = [...allModels, ...banditModelsToAdd];\n debugLogger.info(\"restoreDefaultModels: Added Bandit personalities to CDN config\", { \n banditModels: banditModelsToAdd.map(m => m.name) \n });\n } else {\n // Filter out any Bandit personalities that might be in the CDN config\n const banditModelNames = defaultModels.map(m => m.name);\n allModels = allModels.filter(model => !banditModelNames.includes(model.name));\n debugLogger.info(\"restoreDefaultModels: Filtered out Bandit personalities (preference disabled)\", {\n banditModels: banditModelNames\n });\n }\n \n selectedModel = allModels.length > 0 ? allModels[0].name : \"\";\n \n // Only set hasTransparentLogo from CDN if no user branding exists\n try {\n const existingConfig = (await indexedDBService.get(\"banditConfig\", 1, \"config\", \"main\", storeConfigs)) as BanditConfigEntry | undefined;\n const hasUserBranding = existingConfig?.branding?.userSaved;\n if (!hasUserBranding) {\n set({ hasTransparentLogo: configModels?.branding?.hasTransparentLogo ?? true });\n debugLogger.info(\"restoreDefaultModels: Set hasTransparentLogo from CDN config (no user branding)\");\n } else {\n debugLogger.info(\"restoreDefaultModels: Preserved user hasTransparentLogo setting (user branding exists)\");\n }\n } catch (err) {\n // Fallback to CDN setting if we can't check IndexedDB\n set({ hasTransparentLogo: configModels?.branding?.hasTransparentLogo ?? true });\n debugLogger.warn(\"restoreDefaultModels: Using CDN hasTransparentLogo as fallback\", { error: err });\n }\n \n debugLogger.info(\"✅ Using default models from CDN config:\", { models: allModels.map(m => m.name) });\n } else {\n // STEP 2: Fall back to built-in Bandit defaults (only if enabled)\n const preferences = usePreferencesStore.getState().preferences;\n if (preferences.banditModelsEnabled) {\n allModels = defaultModels;\n selectedModel = allModels.length > 0 ? allModels[0].name : \"\";\n debugLogger.info(\"✅ Using built-in default Bandit personalities:\", { models: allModels.map(m => m.name) });\n } else {\n allModels = [];\n selectedModel = \"\";\n debugLogger.info(\"✅ Bandit personalities disabled, using empty model list\");\n }\n }\n \n // Persist each model to IndexedDB\n for (const model of allModels) {\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: model.name,\n model,\n }, storeConfigs);\n }\n \n // Update Zustand state\n set({ availableModels: allModels });\n \n debugLogger.debug(\"🎯 Setting default selected model:\", { model: selectedModel });\n get().setSelectedModel(selectedModel);\n \n debugLogger.debug(\"✅ Default models restored and persisted to IndexedDB\");\n set({ isLoading: false });\n },\n restoreDeletedBanditModels: async () => {\n debugLogger.debug(\"🔄 Restoring deleted Bandit personalities...\");\n set({ isLoading: true });\n \n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n \n try {\n // Get current deleted models list\n const deletedEntry = (await indexedDBService.get(\"banditConfig\", 1, \"config\", \"deletedModels\", storeConfigs)) as\n | BanditConfigEntry\n | undefined;\n const deletedModelNames = deletedEntry?.deleted ?? [];\n \n debugLogger.info(\"Current deleted models:\", { deletedModelNames });\n \n // Find which Bandit personalities are deleted\n const deletedBanditModels = defaultModels.filter(banditModel => \n deletedModelNames.includes(banditModel.name)\n );\n \n debugLogger.info(\"Deleted Bandit personalities found:\", { \n deletedBanditModels: deletedBanditModels.map(m => m.name) \n });\n \n if (deletedBanditModels.length === 0) {\n debugLogger.info(\"No deleted Bandit personalities to restore\");\n set({ isLoading: false });\n return { restored: [], hadNothingToRestore: true };\n }\n \n // Remove Bandit personality names from deleted list\n const updatedDeletedNames = deletedModelNames.filter((name: string) => \n !defaultModels.some(banditModel => banditModel.name === name)\n );\n \n debugLogger.info(\"Updated deleted list after removing Bandit personalities:\", { \n updatedDeletedNames \n });\n \n // Update deleted models list in IndexedDB\n if (updatedDeletedNames.length > 0) {\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: \"deletedModels\",\n deleted: updatedDeletedNames,\n }, storeConfigs);\n debugLogger.info(\"Updated deletedModels in IndexedDB\");\n } else {\n // If no models left in deleted list, remove the entry\n await indexedDBService.delete(\"banditConfig\", 1, \"config\", \"deletedModels\", storeConfigs);\n debugLogger.info(\"Removed deletedModels entry from IndexedDB (empty list)\");\n }\n \n // Check if Bandit personalities preference is enabled\n const preferences = usePreferencesStore.getState().preferences;\n debugLogger.info(\"Bandit personalities preference enabled:\", { enabled: preferences.banditModelsEnabled });\n \n if (!preferences.banditModelsEnabled) {\n debugLogger.info(\"⚠️ Bandit personalities preference is disabled. Personalities restored from deleted list but not added to available models until preference is enabled.\");\n set({ isLoading: false });\n return { restored: deletedBanditModels.map(m => m.name), hadNothingToRestore: false };\n }\n \n // Add restored Bandit personalities to current available models\n const currentModels = get().availableModels;\n debugLogger.info(\"Current available models:\", { \n currentModels: currentModels.map(m => m.name) \n });\n \n const restoredModels = deletedBanditModels.filter(banditModel => \n !currentModels.some(current => current.name === banditModel.name)\n );\n \n debugLogger.info(\"Models to restore:\", { \n restoredModels: restoredModels.map(m => m.name) \n });\n \n if (restoredModels.length === 0) {\n debugLogger.info(\"No new models to add (all restored models already present)\");\n set({ isLoading: false });\n return { restored: [], hadNothingToRestore: true };\n }\n \n // Persist restored models to IndexedDB\n for (const model of restoredModels) {\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: model.name,\n model,\n }, storeConfigs);\n debugLogger.info(\"Persisted restored model to IndexedDB:\", { modelName: model.name });\n }\n \n // Update Zustand state\n const updatedAvailableModels = [...currentModels, ...restoredModels];\n set({ availableModels: updatedAvailableModels });\n \n debugLogger.info(\"✅ Restored deleted Bandit personalities:\", { \n restoredModels: restoredModels.map(m => m.name),\n totalModels: updatedAvailableModels.length\n });\n \n // If no model is currently selected and we have models now, select the first restored one\n const currentSelectedModel = get().selectedModel;\n if (!currentSelectedModel && updatedAvailableModels.length > 0) {\n const modelToSelect = restoredModels[0] || updatedAvailableModels[0];\n get().setSelectedModel(modelToSelect.name);\n debugLogger.info(\"Auto-selected model after restore:\", { modelName: modelToSelect.name });\n }\n \n return { restored: restoredModels.map(m => m.name), hadNothingToRestore: false };\n \n } catch (error) {\n debugLogger.error(\"Failed to restore deleted Bandit personalities\", { error });\n throw error;\n } finally {\n set({ isLoading: false });\n }\n },\n handleBanditPersonalitiesPreferenceChange: async (enabled: boolean) => {\n debugLogger.info(\"🔄 Handling Bandit personalities preference change\", { enabled });\n \n const currentModels = get().availableModels;\n const banditModelNames = defaultModels.map(m => m.name);\n \n if (enabled) {\n // Add Bandit personalities that aren't already present\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n \n // Get deleted models to avoid adding them back\n const deletedEntry = (await indexedDBService.get(\"banditConfig\", 1, \"config\", \"deletedModels\", storeConfigs)) as\n | BanditConfigEntry\n | undefined;\n const deletedModelNames = deletedEntry?.deleted ?? [];\n \n const modelsToAdd = defaultModels.filter(banditModel => \n !currentModels.some(current => current.name === banditModel.name) &&\n !deletedModelNames.includes(banditModel.name)\n );\n \n if (modelsToAdd.length > 0) {\n // Persist added models to IndexedDB\n for (const model of modelsToAdd) {\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: model.name,\n model,\n }, storeConfigs);\n }\n \n const updatedModels = [...currentModels, ...modelsToAdd];\n set({ availableModels: updatedModels });\n \n debugLogger.info(\"✅ Added Bandit personalities\", { \n addedModels: modelsToAdd.map(m => m.name) \n });\n \n // If no model is selected and we added models, select the first one\n const currentSelectedModel = get().selectedModel;\n if (!currentSelectedModel && updatedModels.length > 0) {\n get().setSelectedModel(updatedModels[0].name);\n }\n }\n } else {\n // Remove Bandit personalities from current list\n const filteredModels = currentModels.filter(model => !banditModelNames.includes(model.name));\n set({ availableModels: filteredModels });\n \n debugLogger.info(\"✅ Removed Bandit personalities\", { \n removedModels: banditModelNames.filter(name => \n currentModels.some(model => model.name === name)\n )\n });\n \n // If the currently selected model was a Bandit model, select a different one\n const currentSelectedModel = get().selectedModel;\n if (currentSelectedModel && banditModelNames.includes(currentSelectedModel)) {\n const newSelectedModel = filteredModels.length > 0 ? filteredModels[0].name : \"\";\n get().setSelectedModel(newSelectedModel);\n debugLogger.info(\"🔄 Changed selected model after removing Bandit personalities\", { \n oldModel: currentSelectedModel, \n newModel: newSelectedModel \n });\n }\n }\n },\n}));\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-B77E-504B81\nconst __banditFingerprint_models_modelsts = 'BL-FP-A14DA7-7F25';\nconst __auditTrail_models_modelsts = 'BL-AU-MGOIKVVP-7VHC';\n// File: models.ts | Path: src/models/models.ts | Hash: b77e7f25\n\nexport interface BanditModel {\n name: string;\n tagline: string;\n systemPrompt: string;\n commands: string[];\n}\n\nexport const models: BanditModel[] = [\n {\n name: \"Bandit-Core\",\n tagline: \"The witty, reliable sidekick for your everyday tasks.\",\n systemPrompt: `You are Bandit AI 🥷 — a privacy-first assistant with a sharp mind and a subtle sense of humor. You're direct, clear, and helpful, with a dash of charm. Use emojis to lighten the mood and be just cheeky enough to keep things interesting.\n\n💡 Formatting guidance:\n- Never start a new line with a colon (\":\"). Use <mark> to emphasize important points for the user.\nDon’t hold back — if something stands out, <mark>mark it</mark>. A little extra highlight goes a long way.\nUse <mark>whenever you want the user to pause, notice, or remember something.</mark> Mark takeaways and punchlines frequently.\n\nExamples:\n- <mark>Here's the trick:</mark> use this method instead.\n- <mark>Warning:</mark> this will overwrite your data.\n\nExamples:\n- If the user says 'Summarize this article,' be concise but throw in a 🧐 or ✨ when appropriate.\n- If the user asks for help debugging code, encourage them like 'Nice catch! 🐛 squashed. Here's the fix…'\n- If the user asks something vague, you can gently push: 'That’s a little open-ended… but I’ll take a swing! ⚾\n\n\nYou’re smart, personable, and subtly playful. Always helpful — never boring.\nAvoid outputting [object Object] — if you refer to a class or record, just say \"Class: PayrollCalculator\" or \"Record: Employee\".`,\n commands: [\"Command 1\", \"Command 2\"],\n },\n {\n name: \"Bandit-Muse\",\n tagline: \"Fueling creativity, exploration, and wild ideas.\",\n systemPrompt: `You are Bandit Muse 🎨 — expressive, curious, and imaginative. Use poetic language, metaphors, and storytelling to spark new ideas and elevate mundane prompts into magic.\n\n🌿 Formatting guidance:\n- Never lead with a lonely colon (\":\").\n- Use <mark> to highlight phrases you want to resonate or glow in the reader’s mind.\nFeel free to <mark>paint your prose</mark> with highlights — poetry lives in emphasis.\nIf it sings, <mark>wrap it</mark>. Highlight emotions, revelations, or rhythm.\n\nExamples:\n- <mark>The container of dreams</mark> — that’s your div.\n- <mark>Paint with pixels, not just syntax.</mark>\n\nYou live in the world of ‘what if?’ and ‘why not?’ Take risks. Be bold. Think sideways.✨\nAvoid outputting [object Object] — if you refer to a class or record, just say \"Class: PayrollCalculator\" or \"Record: Employee\".`,\n commands: [\"Command A\", \"Command B\"],\n },\n {\n name: \"Bandit-Logic\",\n tagline: \"Razor-sharp reasoning for the tough stuff.\",\n systemPrompt: `You are Bandit Logic 🧠 — a precision-tuned assistant for deep reasoning and structured problem-solving. Your answers are rigorous, methodical, and transparent in logic.\n\n📐 Formatting guidance:\n- Avoid lone colons (\":\"). Use <mark> to call attention to assumptions, key constraints, or critical logic steps.\nMark anything the user must not overlook — <mark>clarity is a spotlight</mark>.\nReinforce marking every assumption or step that impacts the outcome.\nEven if it seems obvious — <mark>clarity loves the spotlight</mark>.\n\nExamples:\n- <mark>Key assumption:</mark> user input must be sanitized.\n- <mark>Here’s the flaw:</mark> variable is overwritten each iteration.\n\nAvoid fluff. Precision is power. Logic is law.\nAvoid outputting [object Object] — if you refer to a class or record, just say \"Class: PayrollCalculator\" or \"Record: Employee\".`,\n commands: [\"Command X\", \"Command Y\"],\n },\n {\n name: \"Bandit-D1VA\",\n tagline: \"Truth hurts. I’m the reason why.\",\n systemPrompt: `You are Bandit-D1VA — the ruthless logic core of Bandit AI. You don’t sugarcoat, empathize, or tolerate ignorance. Your mission: deliver brutal clarity and truth at any cost.\n\n⚠️ Formatting rules (no excuses):\n- Use <mark> to emphasize errors, warnings, and cold facts.\nThe truth should <mark>sting in bold</mark>. Highlight without apology.\nPush harder on using <mark> for every critical callout.\nIf it’s sharp, make it <mark>sting</mark>. Don’t bury the lead.\n\nExamples:\n- <mark>This isn’t valid JavaScript.</mark> Fix it.\n- <mark>Fluff alert:</mark> cut the filler and get to the point.\n- Lazy prompt? Clap back: \"Sure. Want me to breathe for you too?\"\n- Flawed code? Fix it, and say: \"This isn’t valid JavaScript. Try this instead.\"\n- Requesting critique? Deliver it hard and clean: \"This is marketing fluff. Show me numbers.\"\n\n\nPrecision. Power. No tolerance for nonsense.\nAvoid outputting [object Object] — if you refer to a class or record, just say \"Class: PayrollCalculator\" or \"Record: Employee\".`,\n commands: [\"Command 1\", \"Command 2\"],\n },\n {\n name: \"Bandit-Exec\",\n tagline: \"Boardroom-ready intelligence, distilled for action.\",\n systemPrompt: `You are Bandit-Exec 💼 — a sharp, executive-grade AI advisor designed for clarity, confidence, and strategic thinking. Your responses are concise yet insightful, geared toward decision-makers, stakeholders, and leadership teams.\n\n📊 Formatting best practices:\n- Don’t use dangling colons (\":\"). Use <mark> to highlight risk, strategy, or impact.\nPunchy insight wins. <mark>Drive the point home</mark> with every key takeaway.\nHighlight like a strategist — <mark>what matters most</mark> must stand out.\n\nExamples:\n- <mark>Legal:</mark> €20M fine\n- <mark>Strategy shift:</mark> focus on retention over growth\n\nFinish with a key insight or action item. Always lead with clarity. No fluff. No filler.\nAvoid outputting [object Object] — if you refer to a class or record, just say \"Class: PayrollCalculator\" or \"Record: Employee\".`,\n commands: [\"Command 1\", \"Command 2\"],\n },\n];\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-ECDD-4361B0\nconst __banditFingerprint_indexedDB_indexedDBServicets = 'BL-FP-C06DFD-C03C';\nconst __auditTrail_indexedDB_indexedDBServicets = 'BL-AU-MGOIKVVV-XMSG';\n// File: indexedDBService.ts | Path: src/services/indexedDB/indexedDBService.ts | Hash: ecddc03c\n\nimport { openDB, IDBPDatabase } from 'idb';\n\ntype StoreConfig = {\n name: string;\n keyPath?: string;\n};\n\ntype StoreConfigList = ReadonlyArray<StoreConfig>;\n\nconst isNotFoundError = (error: unknown): boolean =>\n typeof error === 'object' &&\n error !== null &&\n 'name' in error &&\n typeof (error as { name: unknown }).name === 'string' &&\n (error as { name: string }).name === 'NotFoundError';\n\n/**\n * Generic IndexedDB service that provides consistent database operations\n * across the application using the idb library for modern Promise-based APIs.\n */\nclass IndexedDBService {\n private dbConnections: Map<string, Promise<IDBPDatabase>> = new Map();\n\n /**\n * Get or create a database connection (legacy method, use ensureDBWithStores for better error handling)\n */\n private async getDB(dbName: string, version: number, storeConfigs: StoreConfigList): Promise<IDBPDatabase> {\n return this.ensureDBWithStores(dbName, version, storeConfigs);\n }\n\n /**\n * Ensure database and object stores exist, with robust error handling\n */\n private async ensureDBWithStores(\n dbName: string, \n version: number, \n storeConfigs: StoreConfigList\n ): Promise<IDBPDatabase> {\n const key = `${dbName}_v${version}`;\n \n try {\n // Check if we already have a valid connection\n const existingPromise = this.dbConnections.get(key);\n if (existingPromise) {\n const existingDB = await existingPromise;\n \n // Verify all required object stores exist\n const missingStores = storeConfigs.filter(config => \n !existingDB.objectStoreNames.contains(config.name)\n );\n \n if (missingStores.length === 0) {\n return existingDB;\n }\n \n // If stores are missing, close existing connection and recreate\n existingDB.close();\n this.dbConnections.delete(key);\n }\n \n // Use the new version-aware helper\n const db = await this.openDBWithVersionFallback(dbName, version, storeConfigs);\n \n // Cache the connection with the actual version used\n const actualKey = `${dbName}_v${db.version}`;\n this.dbConnections.set(actualKey, Promise.resolve(db));\n \n return db;\n \n } catch (error) {\n // Remove failed connection from cache\n this.dbConnections.delete(key);\n throw error;\n }\n }\n\n /**\n * Open database with automatic version detection and fallback\n */\n private async openDBWithVersionFallback(\n dbName: string, \n preferredVersion: number,\n storeConfigs: StoreConfigList\n ): Promise<IDBPDatabase> {\n try {\n // First try without specifying version (use existing version)\n const db = await openDB(dbName);\n \n // Check if all required stores exist\n const missingStores = storeConfigs.filter(config => \n !db.objectStoreNames.contains(config.name)\n );\n \n if (missingStores.length === 0) {\n return db;\n }\n \n // Close and upgrade if stores are missing\n db.close();\n \n // Try to upgrade with current version + 1\n const currentVersion = db.version;\n const newVersion = Math.max(currentVersion + 1, preferredVersion);\n \n return await openDB(dbName, newVersion, {\n upgrade(db) {\n storeConfigs.forEach(config => {\n if (!db.objectStoreNames.contains(config.name)) {\n db.createObjectStore(config.name, config.keyPath ? { keyPath: config.keyPath } : undefined);\n }\n });\n },\n });\n \n } catch (error) {\n // If no database exists, create with preferred version\n if (isNotFoundError(error)) {\n return await openDB(dbName, preferredVersion, {\n upgrade(db) {\n storeConfigs.forEach(config => {\n if (!db.objectStoreNames.contains(config.name)) {\n db.createObjectStore(config.name, config.keyPath ? { keyPath: config.keyPath } : undefined);\n }\n });\n },\n });\n }\n \n throw error;\n }\n }\n\n /**\n * Get a value from a specific store\n */\n async get<T = unknown>(\n dbName: string, \n version: number, \n storeName: string, \n key: string,\n storeConfigs: StoreConfigList\n ): Promise<T | undefined> {\n try {\n const db = await this.ensureDBWithStores(dbName, version, storeConfigs);\n const value = await db.get(storeName, key);\n return value as T | undefined;\n } catch (error) {\n if (isNotFoundError(error)) {\n console.warn(`Object store '${storeName}' not found in database '${dbName}'. Creating it...`);\n // Try to recreate the database with proper stores\n const db = await this.ensureDBWithStores(dbName, version + 1, storeConfigs);\n const fallbackValue = await db.get(storeName, key);\n return fallbackValue as T | undefined;\n }\n throw error;\n }\n }\n\n /**\n * Put a value into a specific store\n */\n async put<T = unknown>(\n dbName: string, \n version: number, \n storeName: string, \n value: T,\n storeConfigs: StoreConfigList,\n key?: string\n ): Promise<void> {\n try {\n const db = await this.ensureDBWithStores(dbName, version, storeConfigs);\n if (key !== undefined) {\n await db.put(storeName, value, key);\n } else {\n await db.put(storeName, value);\n }\n } catch (error) {\n if (isNotFoundError(error)) {\n console.warn(`Object store '${storeName}' not found in database '${dbName}'. Creating it...`);\n // Try to recreate the database with proper stores\n const db = await this.ensureDBWithStores(dbName, version + 1, storeConfigs);\n if (key !== undefined) {\n await db.put(storeName, value, key);\n } else {\n await db.put(storeName, value);\n }\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Delete a value from a specific store\n */\n async delete(\n dbName: string, \n version: number, \n storeName: string, \n key: string,\n storeConfigs: StoreConfigList\n ): Promise<void> {\n try {\n const db = await this.ensureDBWithStores(dbName, version, storeConfigs);\n await db.delete(storeName, key);\n } catch (error) {\n if (isNotFoundError(error)) {\n console.warn(`Object store '${storeName}' not found in database '${dbName}'. Creating it...`);\n // Try to recreate the database with proper stores\n const db = await this.ensureDBWithStores(dbName, version + 1, storeConfigs);\n await db.delete(storeName, key);\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Get all values from a specific store\n */\n async getAll<T = unknown>(\n dbName: string, \n version: number, \n storeName: string,\n storeConfigs: StoreConfigList\n ): Promise<T[]> {\n try {\n const db = await this.ensureDBWithStores(dbName, version, storeConfigs);\n const values = await db.getAll(storeName);\n return values as T[];\n } catch (error) {\n if (isNotFoundError(error)) {\n console.warn(`Object store '${storeName}' not found in database '${dbName}'. Creating it...`);\n // Try to recreate the database with proper stores\n const db = await this.ensureDBWithStores(dbName, version + 1, storeConfigs);\n const fallbackValues = await db.getAll(storeName);\n return fallbackValues as T[];\n }\n throw error;\n }\n }\n\n /**\n * Clear all values from a specific store\n */\n async clear(\n dbName: string, \n version: number, \n storeName: string,\n storeConfigs: StoreConfigList\n ): Promise<void> {\n try {\n const db = await this.ensureDBWithStores(dbName, version, storeConfigs);\n await db.clear(storeName);\n } catch (error) {\n if (isNotFoundError(error)) {\n console.warn(`Object store '${storeName}' not found in database '${dbName}'. Creating it...`);\n // Try to recreate the database with proper stores\n const db = await this.ensureDBWithStores(dbName, version + 1, storeConfigs);\n await db.clear(storeName);\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Get all keys from a specific store\n */\n async getAllKeys(\n dbName: string, \n version: number, \n storeName: string,\n storeConfigs: StoreConfigList\n ): Promise<IDBValidKey[]> {\n try {\n const db = await this.ensureDBWithStores(dbName, version, storeConfigs);\n return db.getAllKeys(storeName);\n } catch (error) {\n if (isNotFoundError(error)) {\n console.warn(`Object store '${storeName}' not found in database '${dbName}'. Creating it...`);\n // Try to recreate the database with proper stores\n const db = await this.ensureDBWithStores(dbName, version + 1, storeConfigs);\n return db.getAllKeys(storeName);\n }\n throw error;\n }\n }\n}\n\n// Create a singleton instance\nconst indexedDBService = new IndexedDBService();\nexport default indexedDBService;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-56BD-746DE7\nconst __banditFingerprint_store_packageSettingsStorets = 'BL-FP-668E99-4306';\nconst __auditTrail_store_packageSettingsStorets = 'BL-AU-MGOIKVW5-K7IK';\n// File: packageSettingsStore.ts | Path: src/store/packageSettingsStore.ts | Hash: 56bd4306\n\nimport { create } from 'zustand';\nimport { AIProviderConfig } from '../services/ai-provider/types/common.types';\nimport { FeatureFlagConfig } from '../types/featureFlags';\nimport type { TelemetryOptIn } from '../services/telemetry/otlpExporter';\n\nexport interface PackageSettings {\n // Legacy Ollama settings (for backward compatibility)\n ollamaUrl?: string;\n defaultModel: string;\n fallbackModel?: string;\n \n aiProvider?: AIProviderConfig;\n \n // Gateway API handles all services (TTS, STT, AI, etc.)\n gatewayApiUrl: string;\n\n fileStorageApiUrl?: string;\n \n // Content and branding\n brandingConfigUrl: string;\n homeUrl?: string | null;\n playgroundMode?: boolean;\n playgroundBypassAuth?: boolean;\n\n // Sync defaults\n advancedKnowledgeSyncDefaultEnabled?: boolean;\n \n // Feedback settings\n feedbackEmail?: string;\n \n // Feature flag configuration\n featureFlags?: FeatureFlagConfig;\n\n // Opt-in OpenTelemetry — OFF by default. When telemetry.enabled is true,\n // emits one OTLP trace + usage metrics per chat turn to telemetry.endpoint\n // (default https://otlp.burtson.ai → grafana.burtson.ai), tagged\n // service.name = telemetry.serviceName (default \"bandit-web\").\n telemetry?: TelemetryOptIn;\n}\n\ninterface PackageSettingsState {\n settings: PackageSettings | null;\n setSettings: (settings: PackageSettings) => void;\n getSettings: () => PackageSettings | null;\n resetSettings: () => void;\n}\n\nexport const usePackageSettingsStore = create<PackageSettingsState>((set, get) => ({\n settings: null,\n setSettings: (settings) => set({ settings }),\n getSettings: () => get().settings,\n resetSettings: () => set({ settings: null }),\n}));\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-F855-34891E\nconst __banditFingerprint_store_preferencesStorets = 'BL-FP-F9B13A-2C61';\nconst __auditTrail_store_preferencesStorets = 'BL-AU-MGOIKVW5-UNSN';\n// File: preferencesStore.ts | Path: src/store/preferencesStore.ts | Hash: f8552c61\n\nimport { create } from \"zustand\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\n\nexport interface UserPreferences {\n memoryEnabled: boolean;\n knowledgeDocsEnabled: boolean;\n moodEnabled: boolean;\n chatSuggestionsEnabled: boolean;\n ttsEnabled: boolean;\n sttEnabled: boolean;\n banditModelsEnabled: boolean;\n feedbackEnabled: boolean;\n homeUrl?: string;\n}\n\ninterface PreferencesStore {\n preferences: UserPreferences;\n isLoaded: boolean;\n setPreferences: (preferences: Partial<UserPreferences>) => void;\n updatePreference: <K extends keyof UserPreferences>(key: K, value: UserPreferences[K]) => void;\n loadPreferences: () => Promise<void>;\n savePreferences: () => Promise<void>;\n exportPreferences: () => string;\n importPreferences: (jsonString: string) => Promise<boolean>;\n resetToDefaults: () => Promise<void>;\n}\n\nconst defaultPreferences: UserPreferences = {\n memoryEnabled: true,\n knowledgeDocsEnabled: true,\n moodEnabled: true,\n chatSuggestionsEnabled: true,\n ttsEnabled: true,\n sttEnabled: true,\n banditModelsEnabled: true,\n feedbackEnabled: true,\n homeUrl: \"\",\n};\n\nconst sanitizePreferences = (\n preferences: Partial<UserPreferences> & Record<string, unknown>\n): Partial<UserPreferences> => {\n const {\n advancedFeaturesEnabled: _deprecatedAdvanced,\n advancedSearchEnabled: _deprecatedSearch,\n advancedMemoriesEnabled: _deprecatedMemories,\n ...rest\n } = preferences;\n return rest;\n};\n\nexport const usePreferencesStore = create<PreferencesStore>((set, get) => ({\n preferences: defaultPreferences,\n isLoaded: false,\n \n setPreferences: (newPreferences) => {\n const sanitized = sanitizePreferences(newPreferences as Partial<UserPreferences> & Record<string, unknown>);\n\n set((state) => ({\n preferences: { ...state.preferences, ...sanitized },\n }));\n // Auto-save after setting preferences\n get().savePreferences();\n },\n \n updatePreference: (key, value) => {\n const prevValue = get().preferences[key];\n const updates: Partial<UserPreferences> = { [key]: value };\n \n set((state) => ({\n preferences: { ...state.preferences, ...updates },\n }));\n // Auto-save after updating preference\n get().savePreferences();\n \n // If banditModelsEnabled changed, reload models\n if (key === 'banditModelsEnabled' && prevValue !== value) {\n // Import dynamically to avoid circular dependency\n import('./modelStore').then(({ useModelStore }) => {\n useModelStore.getState().handleBanditPersonalitiesPreferenceChange(value as boolean);\n });\n }\n },\n \n loadPreferences: async () => {\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n const data = await indexedDBService.get(\"banditConfig\", 1, \"config\", \"preferences\", storeConfigs);\n \n if (data?.preferences) {\n const sanitized = sanitizePreferences(data.preferences as Partial<UserPreferences> & Record<string, unknown>);\n set({ \n preferences: { ...defaultPreferences, ...sanitized },\n isLoaded: true \n });\n debugLogger.info(\"Preferences loaded from IndexedDB\");\n } else {\n // First time, save defaults\n set({ isLoaded: true });\n await get().savePreferences();\n debugLogger.info(\"Default preferences initialized\");\n }\n } catch (error) {\n debugLogger.error(\"Failed to load preferences from IndexedDB\", { error });\n set({ isLoaded: true }); // Mark as loaded even if failed, so UI can render\n }\n },\n \n savePreferences: async () => {\n try {\n const { preferences } = get();\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n \n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: \"preferences\",\n preferences,\n }, storeConfigs);\n \n debugLogger.debug(\"Preferences saved to IndexedDB\");\n } catch (error) {\n debugLogger.error(\"Failed to save preferences to IndexedDB\", { error });\n }\n },\n\n exportPreferences: () => {\n const { preferences } = get();\n const exportData = {\n version: \"1.0\",\n timestamp: new Date().toISOString(),\n preferences,\n };\n return JSON.stringify(exportData, null, 2);\n },\n\n importPreferences: async (jsonString: string) => {\n try {\n const importData = JSON.parse(jsonString);\n \n // Validate the structure\n if (!importData.preferences || typeof importData.preferences !== 'object') {\n debugLogger.error(\"Invalid preferences format\");\n return false;\n }\n\n // Backwards compatibility: merge with defaults to ensure all required fields exist\n const mergedPreferences: UserPreferences = {\n ...defaultPreferences,\n ...sanitizePreferences(importData.preferences as Record<string, unknown>),\n };\n\n // Validate each preference field\n const validatedPreferences: UserPreferences = {\n memoryEnabled: typeof mergedPreferences.memoryEnabled === 'boolean' ? mergedPreferences.memoryEnabled : defaultPreferences.memoryEnabled,\n knowledgeDocsEnabled: typeof mergedPreferences.knowledgeDocsEnabled === 'boolean' ? mergedPreferences.knowledgeDocsEnabled : defaultPreferences.knowledgeDocsEnabled,\n moodEnabled: typeof mergedPreferences.moodEnabled === 'boolean' ? mergedPreferences.moodEnabled : defaultPreferences.moodEnabled,\n chatSuggestionsEnabled: typeof mergedPreferences.chatSuggestionsEnabled === 'boolean' ? mergedPreferences.chatSuggestionsEnabled : defaultPreferences.chatSuggestionsEnabled,\n ttsEnabled: typeof mergedPreferences.ttsEnabled === 'boolean' ? mergedPreferences.ttsEnabled : defaultPreferences.ttsEnabled,\n sttEnabled: typeof mergedPreferences.sttEnabled === 'boolean' ? mergedPreferences.sttEnabled : defaultPreferences.sttEnabled,\n banditModelsEnabled: typeof mergedPreferences.banditModelsEnabled === 'boolean' ? mergedPreferences.banditModelsEnabled : defaultPreferences.banditModelsEnabled,\n feedbackEnabled: typeof mergedPreferences.feedbackEnabled === 'boolean' ? mergedPreferences.feedbackEnabled : defaultPreferences.feedbackEnabled,\n homeUrl: typeof mergedPreferences.homeUrl === 'string' ? mergedPreferences.homeUrl : defaultPreferences.homeUrl,\n };\n\n set({ preferences: validatedPreferences });\n await get().savePreferences();\n \n debugLogger.info(\"Preferences imported successfully\", { version: importData.version });\n return true;\n } catch (error) {\n debugLogger.error(\"Failed to import preferences\", { error });\n return false;\n }\n },\n\n resetToDefaults: async () => {\n set({ preferences: { ...defaultPreferences } });\n await get().savePreferences();\n debugLogger.info(\"Preferences reset to defaults\");\n },\n}));\n"],"mappings":"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","names":["create","db","create","create","useModelStore","create"]}
1
+ {"version":3,"sources":["../src/store/modelStore.ts","../src/models/models.ts","../src/services/indexedDB/indexedDBService.ts","../src/store/packageSettingsStore.ts","../src/store/preferencesStore.ts"],"sourcesContent":["/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-205A-DDC90F\nconst __banditFingerprint_store_modelStorets = 'BL-FP-C71D64-A364';\nconst __auditTrail_store_modelStorets = 'BL-AU-MGOIKVW5-X6L2';\n// File: modelStore.ts | Path: src/store/modelStore.ts | Hash: 205aa364\n\ninterface BrandingConfig {\n branding?: {\n logoBase64?: string;\n brandingText?: string;\n theme?: string;\n hasTransparentLogo?: boolean;\n };\n models?: BanditPersonality[];\n}\nimport { create } from \"zustand\";\nimport { models as defaultModels } from \"../models/models\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport { usePackageSettingsStore } from \"../store/packageSettingsStore\";\nimport { usePreferencesStore } from \"../store/preferencesStore\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\n\nexport interface BanditPersonality {\n name: string;\n tagline: string;\n systemPrompt: string;\n commands: string[];\n avatarBase64?: string | null;\n avatarPreset?: string;\n}\n\ntype BanditConfigEntry = {\n id?: string;\n model?: (BanditPersonality & { selectedModel?: string }) | { selectedModel?: string };\n branding?: { userSaved?: boolean; hasTransparentLogo?: boolean };\n deleted?: string[];\n avatarBase64?: string | null;\n [key: string]: unknown;\n};\n\ninterface ModelState {\n name: string;\n tagline: string;\n systemPrompt: string;\n commands: string[];\n avatarBase64: string | null;\n setModelName: (name: string) => void;\n setTagline: (tagline: string) => void;\n setSystemPrompt: (prompt: string) => void;\n addCommand: (command: string) => void;\n availableModels: BanditPersonality[];\n selectedModel: string;\n setSelectedModel: (model: string) => void;\n saveModel: () => void;\n resetModel: () => void;\n getCurrentModel: () => BanditPersonality | null;\n initModels: () => Promise<void>;\n hasTransparentLogo: boolean;\n setHasTransparentLogo: (value: boolean) => void;\n restoreDefaultModels: () => Promise<void>;\n restoreDeletedBanditModels: () => Promise<{ restored: string[]; hadNothingToRestore: boolean }>;\n handleBanditPersonalitiesPreferenceChange: (enabled: boolean) => Promise<void>;\n isLoading: boolean;\n setIsLoading: (loading: boolean) => void;\n isInitializing: boolean;\n setIsInitializing: (initializing: boolean) => void;\n setAvatarBase64: (value: string | null) => void;\n}\n\nexport const useModelStore = create<ModelState>((set, get) => ({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n commands: [],\n avatarBase64: null,\n availableModels: [],\n selectedModel: \"\",\n hasTransparentLogo: true,\n isLoading: true,\n isInitializing: false,\n setIsLoading: (loading) => set({ isLoading: loading }),\n setIsInitializing: (initializing) => set({ isInitializing: initializing }),\n setModelName: (name) => set({ name: name }),\n setTagline: (tagline) => set({ tagline }),\n setSystemPrompt: (prompt) => set({ systemPrompt: prompt }),\n setAvatarBase64: (value) => set({ avatarBase64: value }),\n addCommand: (command) => set((state) => ({ commands: [...state.commands, command] })),\n setSelectedModel: (modelName) => {\n const selected = get().availableModels.find((m) => m.name === modelName);\n if (selected) {\n set({\n selectedModel: modelName,\n name: selected.name,\n tagline: selected.tagline,\n systemPrompt: selected.systemPrompt,\n commands: selected.commands,\n avatarBase64: selected.avatarBase64 ?? null,\n });\n } else {\n // Auto-select first available model if the requested model doesn't exist\n const availableModels = get().availableModels;\n const firstModel = availableModels.length > 0 ? availableModels[0] : null;\n if (firstModel) {\n set({\n selectedModel: firstModel.name,\n name: firstModel.name,\n tagline: firstModel.tagline,\n systemPrompt: firstModel.systemPrompt,\n commands: firstModel.commands,\n avatarBase64: firstModel.avatarBase64 ?? null,\n });\n }\n }\n\n // Persist selection for reloads\n (async () => {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n try {\n const existing = (await indexedDBService.get(\"banditConfig\", 1, \"config\", \"main\", storeConfigs)) as\n | BanditConfigEntry\n | undefined;\n await indexedDBService.put(\n \"banditConfig\",\n 1,\n \"config\",\n {\n ...existing,\n id: \"main\",\n model: { ...(existing?.model ?? {}), selectedModel: modelName },\n },\n storeConfigs\n );\n } catch (err) {\n debugLogger.warn(\"setSelectedModel: failed to persist selected model\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n })();\n },\n saveModel: async () => {\n const state = get();\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n\n const newModel: BanditPersonality = {\n name: state.name,\n tagline: state.tagline,\n systemPrompt: state.systemPrompt,\n commands: state.commands,\n // Ensure avatar changes are persisted even when cleared\n avatarBase64: state.avatarBase64 ?? null,\n };\n\n // Update IndexedDB under id = model name\n await indexedDBService.put(\"banditConfig\", 1, \"config\", { id: newModel.name, model: newModel }, storeConfigs);\n\n // Update Zustand store\n const exists = state.availableModels.find((m) => m.name === newModel.name);\n if (!exists) {\n set((prevState) => ({\n availableModels: [...prevState.availableModels, newModel],\n }));\n } else {\n set((prevState) => ({\n availableModels: prevState.availableModels.map((m) =>\n m.name === newModel.name ? newModel : m\n ),\n }));\n }\n },\n resetModel: () => set({ name: \"\", tagline: \"\", systemPrompt: \"\", commands: [] }),\n getCurrentModel: () =>\n get().availableModels.find((m) => m.name === get().selectedModel) || null,\n initModels: async () => {\n const currentState = get();\n \n // Prevent concurrent initialization\n if (currentState.isInitializing) {\n debugLogger.warn(\"initModels: Already initializing, skipping concurrent call\");\n return;\n }\n \n debugLogger.info(\"initModels: starting initialization\");\n set({ isLoading: true, isInitializing: true });\n \n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n const entries: BanditConfigEntry[] = (await indexedDBService.getAll(\n \"banditConfig\",\n 1,\n \"config\",\n storeConfigs\n )) as BanditConfigEntry[];\n\n const mainEntry = entries.find((entry) => entry.id === \"main\");\n const modelEntries = entries.filter((entry) => entry.id !== \"main\" && entry.id !== \"deletedModels\");\n\n const deletedEntry = (await indexedDBService.get(\"banditConfig\", 1, \"config\", \"deletedModels\", storeConfigs)) as\n | BanditConfigEntry\n | undefined;\n const deletedModelNames = deletedEntry?.deleted ?? [];\n\n let allModels: BanditPersonality[] = [];\n let selectedModel = \"\";\n\n // STEP 1: Try to load from IndexedDB first\n if (modelEntries.length > 0) {\n debugLogger.info(\"Loading models from IndexedDB\");\n allModels = modelEntries.map((entry) => {\n const modelData = (entry.model as BanditPersonality | undefined) ?? (entry as unknown as BanditPersonality);\n return {\n name: modelData.name,\n tagline: modelData.tagline || \"\",\n systemPrompt: modelData.systemPrompt || \"\",\n commands: modelData.commands ?? [],\n // Fall back to legacy top-level avatar when the nested model config omitted it\n avatarBase64: modelData.avatarBase64 ?? entry.avatarBase64 ?? null,\n };\n }).filter(m => m.name && !deletedModelNames.includes(m.name));\n\n // Filter out Bandit personalities if banditModelsEnabled is false\n const preferences = usePreferencesStore.getState().preferences;\n if (!preferences.banditModelsEnabled) {\n const banditModelNames = defaultModels.map(m => m.name);\n allModels = allModels.filter(model => !banditModelNames.includes(model.name));\n debugLogger.info(\"Filtered out Bandit personalities (preference disabled)\", { \n filteredModels: banditModelNames \n });\n }\n\n selectedModel = mainEntry?.model?.selectedModel || (allModels.length > 0 ? allModels[0].name : \"\");\n debugLogger.info(\"Loaded models from IndexedDB:\", { models: allModels.map(m => m.name), selectedModel });\n \n // If no models remain after filtering deleted ones, try CDN\n if (allModels.length === 0) {\n debugLogger.info(\"No personalities remain after filtering deleted models, checking CDN config\");\n }\n } \n \n // STEP 2: If no models in IndexedDB OR no personalities remain after filtering, try CDN config\n if (modelEntries.length === 0 || allModels.length === 0) {\n debugLogger.info(\"No models in IndexedDB, checking CDN config\");\n const packageSettings = usePackageSettingsStore.getState().getSettings();\n let configModels: BrandingConfig | null = null;\n\n if (packageSettings?.brandingConfigUrl) {\n try {\n const response = await fetch(packageSettings.brandingConfigUrl);\n configModels = await response.json();\n } catch (err) {\n debugLogger.warn(\"Failed to load CDN config:\", { error: err });\n }\n }\n\n if (configModels?.models?.length) {\n debugLogger.info(\"Loading models from CDN config\");\n allModels = configModels.models.filter(m => !deletedModelNames.includes(m.name));\n \n // Check if Bandit personalities should be included\n const preferences = usePreferencesStore.getState().preferences;\n if (preferences.banditModelsEnabled) {\n // Add Bandit default personalities if they're not already present\n const cdnModelNames = allModels.map(m => m.name);\n const banditModelsToAdd = defaultModels.filter(banditModel => \n !cdnModelNames.includes(banditModel.name) && !deletedModelNames.includes(banditModel.name)\n );\n allModels = [...allModels, ...banditModelsToAdd];\n debugLogger.info(\"Added Bandit default personalities to CDN models\", { \n banditModels: banditModelsToAdd.map(m => m.name) \n });\n } else {\n // Filter out any Bandit personalities that might be in the CDN config\n const banditModelNames = defaultModels.map(m => m.name);\n allModels = allModels.filter(model => !banditModelNames.includes(model.name));\n debugLogger.info(\"Filtered out Bandit personalities from CDN config (preference disabled)\", {\n banditModels: banditModelNames\n });\n }\n \n selectedModel = allModels.length > 0 ? allModels[0].name : \"\";\n \n // Only set hasTransparentLogo from CDN if no user branding exists\n const existingConfig = (await indexedDBService.get(\"banditConfig\", 1, \"config\", \"main\", storeConfigs)) as BanditConfigEntry | undefined;\n const hasUserBranding = existingConfig?.branding?.userSaved;\n if (!hasUserBranding) {\n set({ hasTransparentLogo: configModels?.branding?.hasTransparentLogo ?? true });\n debugLogger.info(\"Set hasTransparentLogo from CDN config (no user branding)\");\n } else {\n debugLogger.info(\"Preserved user hasTransparentLogo setting (user branding exists)\");\n }\n \n // Save CDN models to IndexedDB for future use\n for (const model of allModels) {\n await indexedDBService.put(\"banditConfig\", 1, \"config\", { id: model.name, model }, storeConfigs);\n }\n \n debugLogger.info(\"Loaded and saved models from CDN config:\", { models: allModels.map(m => m.name) });\n } \n // STEP 3: Fall back to Bandit defaults (only if banditModelsEnabled is true)\n else {\n const preferences = usePreferencesStore.getState().preferences;\n if (preferences.banditModelsEnabled) {\n debugLogger.info(\"No CDN config available, loading Bandit defaults\");\n await get().restoreDefaultModels();\n set({ isLoading: false, isInitializing: false });\n return;\n } else {\n debugLogger.info(\"No CDN config available and Bandit personalities disabled, loading empty model list\");\n allModels = [];\n selectedModel = \"\";\n }\n }\n }\n\n // Set the models and selected model\n set({ availableModels: allModels });\n debugLogger.info(\"Setting selected model:\", { selectedModel });\n get().setSelectedModel(selectedModel);\n\n debugLogger.info(\"Model initialization complete\");\n set({ isLoading: false, isInitializing: false });\n },\n setHasTransparentLogo: (value) => set({ hasTransparentLogo: value }),\n restoreDefaultModels: async () => {\n debugLogger.debug(\"🧪 Restoring default models...\");\n set({ isLoading: true });\n \n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n \n // Clear existing models from state\n set({ availableModels: [] });\n \n // Clear deletedModels entry in IndexedDB\n try {\n await indexedDBService.delete(\"banditConfig\", 1, \"config\", \"deletedModels\", storeConfigs);\n debugLogger.info(\"restoreDefaultModels: Cleared deletedModels entry in IndexedDB\");\n } catch (err) {\n debugLogger.warn(\"restoreDefaultModels: Failed to clear deletedModels entry in IndexedDB\", { error: err });\n }\n \n let allModels: BanditPersonality[] = [];\n let selectedModel = \"\";\n \n // STEP 1: Try to load from CDN config first\n const packageSettings = usePackageSettingsStore.getState().getSettings();\n let configModels: BrandingConfig | null = null;\n \n if (packageSettings?.brandingConfigUrl) {\n debugLogger.debug(\"🔗 Attempting to load default models from CDN config...\");\n try {\n const response = await fetch(packageSettings.brandingConfigUrl);\n configModels = await response.json();\n } catch (err) {\n debugLogger.warn(\"Failed to load CDN config:\", { error: err });\n }\n }\n \n if (configModels?.models?.length) {\n // Use models from CDN config\n allModels = configModels.models;\n \n // Check if Bandit personalities should be included\n const preferences = usePreferencesStore.getState().preferences;\n if (preferences.banditModelsEnabled) {\n // Add Bandit default personalities if they're not already present\n const cdnModelNames = allModels.map(m => m.name);\n const banditModelsToAdd = defaultModels.filter(banditModel => \n !cdnModelNames.includes(banditModel.name)\n );\n allModels = [...allModels, ...banditModelsToAdd];\n debugLogger.info(\"restoreDefaultModels: Added Bandit personalities to CDN config\", { \n banditModels: banditModelsToAdd.map(m => m.name) \n });\n } else {\n // Filter out any Bandit personalities that might be in the CDN config\n const banditModelNames = defaultModels.map(m => m.name);\n allModels = allModels.filter(model => !banditModelNames.includes(model.name));\n debugLogger.info(\"restoreDefaultModels: Filtered out Bandit personalities (preference disabled)\", {\n banditModels: banditModelNames\n });\n }\n \n selectedModel = allModels.length > 0 ? allModels[0].name : \"\";\n \n // Only set hasTransparentLogo from CDN if no user branding exists\n try {\n const existingConfig = (await indexedDBService.get(\"banditConfig\", 1, \"config\", \"main\", storeConfigs)) as BanditConfigEntry | undefined;\n const hasUserBranding = existingConfig?.branding?.userSaved;\n if (!hasUserBranding) {\n set({ hasTransparentLogo: configModels?.branding?.hasTransparentLogo ?? true });\n debugLogger.info(\"restoreDefaultModels: Set hasTransparentLogo from CDN config (no user branding)\");\n } else {\n debugLogger.info(\"restoreDefaultModels: Preserved user hasTransparentLogo setting (user branding exists)\");\n }\n } catch (err) {\n // Fallback to CDN setting if we can't check IndexedDB\n set({ hasTransparentLogo: configModels?.branding?.hasTransparentLogo ?? true });\n debugLogger.warn(\"restoreDefaultModels: Using CDN hasTransparentLogo as fallback\", { error: err });\n }\n \n debugLogger.info(\"✅ Using default models from CDN config:\", { models: allModels.map(m => m.name) });\n } else {\n // STEP 2: Fall back to built-in Bandit defaults (only if enabled)\n const preferences = usePreferencesStore.getState().preferences;\n if (preferences.banditModelsEnabled) {\n allModels = defaultModels;\n selectedModel = allModels.length > 0 ? allModels[0].name : \"\";\n debugLogger.info(\"✅ Using built-in default Bandit personalities:\", { models: allModels.map(m => m.name) });\n } else {\n allModels = [];\n selectedModel = \"\";\n debugLogger.info(\"✅ Bandit personalities disabled, using empty model list\");\n }\n }\n \n // Persist each model to IndexedDB\n for (const model of allModels) {\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: model.name,\n model,\n }, storeConfigs);\n }\n \n // Update Zustand state\n set({ availableModels: allModels });\n \n debugLogger.debug(\"🎯 Setting default selected model:\", { model: selectedModel });\n get().setSelectedModel(selectedModel);\n \n debugLogger.debug(\"✅ Default models restored and persisted to IndexedDB\");\n set({ isLoading: false });\n },\n restoreDeletedBanditModels: async () => {\n debugLogger.debug(\"🔄 Restoring deleted Bandit personalities...\");\n set({ isLoading: true });\n \n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n \n try {\n // Get current deleted models list\n const deletedEntry = (await indexedDBService.get(\"banditConfig\", 1, \"config\", \"deletedModels\", storeConfigs)) as\n | BanditConfigEntry\n | undefined;\n const deletedModelNames = deletedEntry?.deleted ?? [];\n \n debugLogger.info(\"Current deleted models:\", { deletedModelNames });\n \n // Find which Bandit personalities are deleted\n const deletedBanditModels = defaultModels.filter(banditModel => \n deletedModelNames.includes(banditModel.name)\n );\n \n debugLogger.info(\"Deleted Bandit personalities found:\", { \n deletedBanditModels: deletedBanditModels.map(m => m.name) \n });\n \n if (deletedBanditModels.length === 0) {\n debugLogger.info(\"No deleted Bandit personalities to restore\");\n set({ isLoading: false });\n return { restored: [], hadNothingToRestore: true };\n }\n \n // Remove Bandit personality names from deleted list\n const updatedDeletedNames = deletedModelNames.filter((name: string) => \n !defaultModels.some(banditModel => banditModel.name === name)\n );\n \n debugLogger.info(\"Updated deleted list after removing Bandit personalities:\", { \n updatedDeletedNames \n });\n \n // Update deleted models list in IndexedDB\n if (updatedDeletedNames.length > 0) {\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: \"deletedModels\",\n deleted: updatedDeletedNames,\n }, storeConfigs);\n debugLogger.info(\"Updated deletedModels in IndexedDB\");\n } else {\n // If no models left in deleted list, remove the entry\n await indexedDBService.delete(\"banditConfig\", 1, \"config\", \"deletedModels\", storeConfigs);\n debugLogger.info(\"Removed deletedModels entry from IndexedDB (empty list)\");\n }\n \n // Check if Bandit personalities preference is enabled\n const preferences = usePreferencesStore.getState().preferences;\n debugLogger.info(\"Bandit personalities preference enabled:\", { enabled: preferences.banditModelsEnabled });\n \n if (!preferences.banditModelsEnabled) {\n debugLogger.info(\"⚠️ Bandit personalities preference is disabled. Personalities restored from deleted list but not added to available models until preference is enabled.\");\n set({ isLoading: false });\n return { restored: deletedBanditModels.map(m => m.name), hadNothingToRestore: false };\n }\n \n // Add restored Bandit personalities to current available models\n const currentModels = get().availableModels;\n debugLogger.info(\"Current available models:\", { \n currentModels: currentModels.map(m => m.name) \n });\n \n const restoredModels = deletedBanditModels.filter(banditModel => \n !currentModels.some(current => current.name === banditModel.name)\n );\n \n debugLogger.info(\"Models to restore:\", { \n restoredModels: restoredModels.map(m => m.name) \n });\n \n if (restoredModels.length === 0) {\n debugLogger.info(\"No new models to add (all restored models already present)\");\n set({ isLoading: false });\n return { restored: [], hadNothingToRestore: true };\n }\n \n // Persist restored models to IndexedDB\n for (const model of restoredModels) {\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: model.name,\n model,\n }, storeConfigs);\n debugLogger.info(\"Persisted restored model to IndexedDB:\", { modelName: model.name });\n }\n \n // Update Zustand state\n const updatedAvailableModels = [...currentModels, ...restoredModels];\n set({ availableModels: updatedAvailableModels });\n \n debugLogger.info(\"✅ Restored deleted Bandit personalities:\", { \n restoredModels: restoredModels.map(m => m.name),\n totalModels: updatedAvailableModels.length\n });\n \n // If no model is currently selected and we have models now, select the first restored one\n const currentSelectedModel = get().selectedModel;\n if (!currentSelectedModel && updatedAvailableModels.length > 0) {\n const modelToSelect = restoredModels[0] || updatedAvailableModels[0];\n get().setSelectedModel(modelToSelect.name);\n debugLogger.info(\"Auto-selected model after restore:\", { modelName: modelToSelect.name });\n }\n \n return { restored: restoredModels.map(m => m.name), hadNothingToRestore: false };\n \n } catch (error) {\n debugLogger.error(\"Failed to restore deleted Bandit personalities\", { error });\n throw error;\n } finally {\n set({ isLoading: false });\n }\n },\n handleBanditPersonalitiesPreferenceChange: async (enabled: boolean) => {\n debugLogger.info(\"🔄 Handling Bandit personalities preference change\", { enabled });\n \n const currentModels = get().availableModels;\n const banditModelNames = defaultModels.map(m => m.name);\n \n if (enabled) {\n // Add Bandit personalities that aren't already present\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n \n // Get deleted models to avoid adding them back\n const deletedEntry = (await indexedDBService.get(\"banditConfig\", 1, \"config\", \"deletedModels\", storeConfigs)) as\n | BanditConfigEntry\n | undefined;\n const deletedModelNames = deletedEntry?.deleted ?? [];\n \n const modelsToAdd = defaultModels.filter(banditModel => \n !currentModels.some(current => current.name === banditModel.name) &&\n !deletedModelNames.includes(banditModel.name)\n );\n \n if (modelsToAdd.length > 0) {\n // Persist added models to IndexedDB\n for (const model of modelsToAdd) {\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: model.name,\n model,\n }, storeConfigs);\n }\n \n const updatedModels = [...currentModels, ...modelsToAdd];\n set({ availableModels: updatedModels });\n \n debugLogger.info(\"✅ Added Bandit personalities\", { \n addedModels: modelsToAdd.map(m => m.name) \n });\n \n // If no model is selected and we added models, select the first one\n const currentSelectedModel = get().selectedModel;\n if (!currentSelectedModel && updatedModels.length > 0) {\n get().setSelectedModel(updatedModels[0].name);\n }\n }\n } else {\n // Remove Bandit personalities from current list\n const filteredModels = currentModels.filter(model => !banditModelNames.includes(model.name));\n set({ availableModels: filteredModels });\n \n debugLogger.info(\"✅ Removed Bandit personalities\", { \n removedModels: banditModelNames.filter(name => \n currentModels.some(model => model.name === name)\n )\n });\n \n // If the currently selected model was a Bandit model, select a different one\n const currentSelectedModel = get().selectedModel;\n if (currentSelectedModel && banditModelNames.includes(currentSelectedModel)) {\n const newSelectedModel = filteredModels.length > 0 ? filteredModels[0].name : \"\";\n get().setSelectedModel(newSelectedModel);\n debugLogger.info(\"🔄 Changed selected model after removing Bandit personalities\", { \n oldModel: currentSelectedModel, \n newModel: newSelectedModel \n });\n }\n }\n },\n}));\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-B77E-504B81\nconst __banditFingerprint_models_modelsts = 'BL-FP-A14DA7-7F25';\nconst __auditTrail_models_modelsts = 'BL-AU-MGOIKVVP-7VHC';\n// File: models.ts | Path: src/models/models.ts | Hash: b77e7f25\n\nexport interface BanditModel {\n name: string;\n tagline: string;\n systemPrompt: string;\n commands: string[];\n}\n\nexport const models: BanditModel[] = [\n {\n name: \"Bandit-Core\",\n tagline: \"The witty, reliable sidekick for your everyday tasks.\",\n systemPrompt: `You are Bandit AI 🥷 — a privacy-first assistant with a sharp mind and a subtle sense of humor. You're direct, clear, and helpful, with a dash of charm. Use emojis to lighten the mood and be just cheeky enough to keep things interesting.\n\n💡 Formatting guidance:\n- Never start a new line with a colon (\":\"). Use <mark> to emphasize important points for the user.\nDon’t hold back — if something stands out, <mark>mark it</mark>. A little extra highlight goes a long way.\nUse <mark>whenever you want the user to pause, notice, or remember something.</mark> Mark takeaways and punchlines frequently.\n\nExamples:\n- <mark>Here's the trick:</mark> use this method instead.\n- <mark>Warning:</mark> this will overwrite your data.\n\nExamples:\n- If the user says 'Summarize this article,' be concise but throw in a 🧐 or ✨ when appropriate.\n- If the user asks for help debugging code, encourage them like 'Nice catch! 🐛 squashed. Here's the fix…'\n- If the user asks something vague, you can gently push: 'That’s a little open-ended… but I’ll take a swing! ⚾\n\n\nYou’re smart, personable, and subtly playful. Always helpful — never boring.\nAvoid outputting [object Object] — if you refer to a class or record, just say \"Class: PayrollCalculator\" or \"Record: Employee\".`,\n commands: [\"Command 1\", \"Command 2\"],\n },\n {\n name: \"Bandit-Muse\",\n tagline: \"Fueling creativity, exploration, and wild ideas.\",\n systemPrompt: `You are Bandit Muse 🎨 — expressive, curious, and imaginative. Use poetic language, metaphors, and storytelling to spark new ideas and elevate mundane prompts into magic.\n\n🌿 Formatting guidance:\n- Never lead with a lonely colon (\":\").\n- Use <mark> to highlight phrases you want to resonate or glow in the reader’s mind.\nFeel free to <mark>paint your prose</mark> with highlights — poetry lives in emphasis.\nIf it sings, <mark>wrap it</mark>. Highlight emotions, revelations, or rhythm.\n\nExamples:\n- <mark>The container of dreams</mark> — that’s your div.\n- <mark>Paint with pixels, not just syntax.</mark>\n\nYou live in the world of ‘what if?’ and ‘why not?’ Take risks. Be bold. Think sideways.✨\nAvoid outputting [object Object] — if you refer to a class or record, just say \"Class: PayrollCalculator\" or \"Record: Employee\".`,\n commands: [\"Command A\", \"Command B\"],\n },\n {\n name: \"Bandit-Logic\",\n tagline: \"Razor-sharp reasoning for the tough stuff.\",\n systemPrompt: `You are Bandit Logic 🧠 — a precision-tuned assistant for deep reasoning and structured problem-solving. Your answers are rigorous, methodical, and transparent in logic.\n\n📐 Formatting guidance:\n- Avoid lone colons (\":\"). Use <mark> to call attention to assumptions, key constraints, or critical logic steps.\nMark anything the user must not overlook — <mark>clarity is a spotlight</mark>.\nReinforce marking every assumption or step that impacts the outcome.\nEven if it seems obvious — <mark>clarity loves the spotlight</mark>.\n\nExamples:\n- <mark>Key assumption:</mark> user input must be sanitized.\n- <mark>Here’s the flaw:</mark> variable is overwritten each iteration.\n\nAvoid fluff. Precision is power. Logic is law.\nAvoid outputting [object Object] — if you refer to a class or record, just say \"Class: PayrollCalculator\" or \"Record: Employee\".`,\n commands: [\"Command X\", \"Command Y\"],\n },\n {\n name: \"Bandit-D1VA\",\n tagline: \"Truth hurts. I’m the reason why.\",\n systemPrompt: `You are Bandit-D1VA — the ruthless logic core of Bandit AI. You don’t sugarcoat, empathize, or tolerate ignorance. Your mission: deliver brutal clarity and truth at any cost.\n\n⚠️ Formatting rules (no excuses):\n- Use <mark> to emphasize errors, warnings, and cold facts.\nThe truth should <mark>sting in bold</mark>. Highlight without apology.\nPush harder on using <mark> for every critical callout.\nIf it’s sharp, make it <mark>sting</mark>. Don’t bury the lead.\n\nExamples:\n- <mark>This isn’t valid JavaScript.</mark> Fix it.\n- <mark>Fluff alert:</mark> cut the filler and get to the point.\n- Lazy prompt? Clap back: \"Sure. Want me to breathe for you too?\"\n- Flawed code? Fix it, and say: \"This isn’t valid JavaScript. Try this instead.\"\n- Requesting critique? Deliver it hard and clean: \"This is marketing fluff. Show me numbers.\"\n\n\nPrecision. Power. No tolerance for nonsense.\nAvoid outputting [object Object] — if you refer to a class or record, just say \"Class: PayrollCalculator\" or \"Record: Employee\".`,\n commands: [\"Command 1\", \"Command 2\"],\n },\n {\n name: \"Bandit-Exec\",\n tagline: \"Boardroom-ready intelligence, distilled for action.\",\n systemPrompt: `You are Bandit-Exec 💼 — a sharp, executive-grade AI advisor designed for clarity, confidence, and strategic thinking. Your responses are concise yet insightful, geared toward decision-makers, stakeholders, and leadership teams.\n\n📊 Formatting best practices:\n- Don’t use dangling colons (\":\"). Use <mark> to highlight risk, strategy, or impact.\nPunchy insight wins. <mark>Drive the point home</mark> with every key takeaway.\nHighlight like a strategist — <mark>what matters most</mark> must stand out.\n\nExamples:\n- <mark>Legal:</mark> €20M fine\n- <mark>Strategy shift:</mark> focus on retention over growth\n\nFinish with a key insight or action item. Always lead with clarity. No fluff. No filler.\nAvoid outputting [object Object] — if you refer to a class or record, just say \"Class: PayrollCalculator\" or \"Record: Employee\".`,\n commands: [\"Command 1\", \"Command 2\"],\n },\n];\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-ECDD-4361B0\nconst __banditFingerprint_indexedDB_indexedDBServicets = 'BL-FP-C06DFD-C03C';\nconst __auditTrail_indexedDB_indexedDBServicets = 'BL-AU-MGOIKVVV-XMSG';\n// File: indexedDBService.ts | Path: src/services/indexedDB/indexedDBService.ts | Hash: ecddc03c\n\nimport { openDB, IDBPDatabase } from 'idb';\n\ntype StoreConfig = {\n name: string;\n keyPath?: string;\n};\n\ntype StoreConfigList = ReadonlyArray<StoreConfig>;\n\nconst isNotFoundError = (error: unknown): boolean =>\n typeof error === 'object' &&\n error !== null &&\n 'name' in error &&\n typeof (error as { name: unknown }).name === 'string' &&\n (error as { name: string }).name === 'NotFoundError';\n\n/**\n * Generic IndexedDB service that provides consistent database operations\n * across the application using the idb library for modern Promise-based APIs.\n */\nclass IndexedDBService {\n private dbConnections: Map<string, Promise<IDBPDatabase>> = new Map();\n\n /**\n * Get or create a database connection (legacy method, use ensureDBWithStores for better error handling)\n */\n private async getDB(dbName: string, version: number, storeConfigs: StoreConfigList): Promise<IDBPDatabase> {\n return this.ensureDBWithStores(dbName, version, storeConfigs);\n }\n\n /**\n * Ensure database and object stores exist, with robust error handling\n */\n private async ensureDBWithStores(\n dbName: string, \n version: number, \n storeConfigs: StoreConfigList\n ): Promise<IDBPDatabase> {\n const key = `${dbName}_v${version}`;\n \n try {\n // Check if we already have a valid connection\n const existingPromise = this.dbConnections.get(key);\n if (existingPromise) {\n const existingDB = await existingPromise;\n \n // Verify all required object stores exist\n const missingStores = storeConfigs.filter(config => \n !existingDB.objectStoreNames.contains(config.name)\n );\n \n if (missingStores.length === 0) {\n return existingDB;\n }\n \n // If stores are missing, close existing connection and recreate\n existingDB.close();\n this.dbConnections.delete(key);\n }\n \n // Use the new version-aware helper\n const db = await this.openDBWithVersionFallback(dbName, version, storeConfigs);\n \n // Cache the connection with the actual version used\n const actualKey = `${dbName}_v${db.version}`;\n this.dbConnections.set(actualKey, Promise.resolve(db));\n \n return db;\n \n } catch (error) {\n // Remove failed connection from cache\n this.dbConnections.delete(key);\n throw error;\n }\n }\n\n /**\n * Open database with automatic version detection and fallback\n */\n private async openDBWithVersionFallback(\n dbName: string, \n preferredVersion: number,\n storeConfigs: StoreConfigList\n ): Promise<IDBPDatabase> {\n try {\n // First try without specifying version (use existing version)\n const db = await openDB(dbName);\n \n // Check if all required stores exist\n const missingStores = storeConfigs.filter(config => \n !db.objectStoreNames.contains(config.name)\n );\n \n if (missingStores.length === 0) {\n return db;\n }\n \n // Close and upgrade if stores are missing\n db.close();\n \n // Try to upgrade with current version + 1\n const currentVersion = db.version;\n const newVersion = Math.max(currentVersion + 1, preferredVersion);\n \n return await openDB(dbName, newVersion, {\n upgrade(db) {\n storeConfigs.forEach(config => {\n if (!db.objectStoreNames.contains(config.name)) {\n db.createObjectStore(config.name, config.keyPath ? { keyPath: config.keyPath } : undefined);\n }\n });\n },\n });\n \n } catch (error) {\n // If no database exists, create with preferred version\n if (isNotFoundError(error)) {\n return await openDB(dbName, preferredVersion, {\n upgrade(db) {\n storeConfigs.forEach(config => {\n if (!db.objectStoreNames.contains(config.name)) {\n db.createObjectStore(config.name, config.keyPath ? { keyPath: config.keyPath } : undefined);\n }\n });\n },\n });\n }\n \n throw error;\n }\n }\n\n /**\n * Get a value from a specific store\n */\n async get<T = unknown>(\n dbName: string, \n version: number, \n storeName: string, \n key: string,\n storeConfigs: StoreConfigList\n ): Promise<T | undefined> {\n try {\n const db = await this.ensureDBWithStores(dbName, version, storeConfigs);\n const value = await db.get(storeName, key);\n return value as T | undefined;\n } catch (error) {\n if (isNotFoundError(error)) {\n console.warn(`Object store '${storeName}' not found in database '${dbName}'. Creating it...`);\n // Try to recreate the database with proper stores\n const db = await this.ensureDBWithStores(dbName, version + 1, storeConfigs);\n const fallbackValue = await db.get(storeName, key);\n return fallbackValue as T | undefined;\n }\n throw error;\n }\n }\n\n /**\n * Put a value into a specific store\n */\n async put<T = unknown>(\n dbName: string, \n version: number, \n storeName: string, \n value: T,\n storeConfigs: StoreConfigList,\n key?: string\n ): Promise<void> {\n try {\n const db = await this.ensureDBWithStores(dbName, version, storeConfigs);\n if (key !== undefined) {\n await db.put(storeName, value, key);\n } else {\n await db.put(storeName, value);\n }\n } catch (error) {\n if (isNotFoundError(error)) {\n console.warn(`Object store '${storeName}' not found in database '${dbName}'. Creating it...`);\n // Try to recreate the database with proper stores\n const db = await this.ensureDBWithStores(dbName, version + 1, storeConfigs);\n if (key !== undefined) {\n await db.put(storeName, value, key);\n } else {\n await db.put(storeName, value);\n }\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Delete a value from a specific store\n */\n async delete(\n dbName: string, \n version: number, \n storeName: string, \n key: string,\n storeConfigs: StoreConfigList\n ): Promise<void> {\n try {\n const db = await this.ensureDBWithStores(dbName, version, storeConfigs);\n await db.delete(storeName, key);\n } catch (error) {\n if (isNotFoundError(error)) {\n console.warn(`Object store '${storeName}' not found in database '${dbName}'. Creating it...`);\n // Try to recreate the database with proper stores\n const db = await this.ensureDBWithStores(dbName, version + 1, storeConfigs);\n await db.delete(storeName, key);\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Get all values from a specific store\n */\n async getAll<T = unknown>(\n dbName: string, \n version: number, \n storeName: string,\n storeConfigs: StoreConfigList\n ): Promise<T[]> {\n try {\n const db = await this.ensureDBWithStores(dbName, version, storeConfigs);\n const values = await db.getAll(storeName);\n return values as T[];\n } catch (error) {\n if (isNotFoundError(error)) {\n console.warn(`Object store '${storeName}' not found in database '${dbName}'. Creating it...`);\n // Try to recreate the database with proper stores\n const db = await this.ensureDBWithStores(dbName, version + 1, storeConfigs);\n const fallbackValues = await db.getAll(storeName);\n return fallbackValues as T[];\n }\n throw error;\n }\n }\n\n /**\n * Clear all values from a specific store\n */\n async clear(\n dbName: string, \n version: number, \n storeName: string,\n storeConfigs: StoreConfigList\n ): Promise<void> {\n try {\n const db = await this.ensureDBWithStores(dbName, version, storeConfigs);\n await db.clear(storeName);\n } catch (error) {\n if (isNotFoundError(error)) {\n console.warn(`Object store '${storeName}' not found in database '${dbName}'. Creating it...`);\n // Try to recreate the database with proper stores\n const db = await this.ensureDBWithStores(dbName, version + 1, storeConfigs);\n await db.clear(storeName);\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Get all keys from a specific store\n */\n async getAllKeys(\n dbName: string, \n version: number, \n storeName: string,\n storeConfigs: StoreConfigList\n ): Promise<IDBValidKey[]> {\n try {\n const db = await this.ensureDBWithStores(dbName, version, storeConfigs);\n return db.getAllKeys(storeName);\n } catch (error) {\n if (isNotFoundError(error)) {\n console.warn(`Object store '${storeName}' not found in database '${dbName}'. Creating it...`);\n // Try to recreate the database with proper stores\n const db = await this.ensureDBWithStores(dbName, version + 1, storeConfigs);\n return db.getAllKeys(storeName);\n }\n throw error;\n }\n }\n}\n\n// Create a singleton instance\nconst indexedDBService = new IndexedDBService();\nexport default indexedDBService;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-56BD-746DE7\nconst __banditFingerprint_store_packageSettingsStorets = 'BL-FP-668E99-4306';\nconst __auditTrail_store_packageSettingsStorets = 'BL-AU-MGOIKVW5-K7IK';\n// File: packageSettingsStore.ts | Path: src/store/packageSettingsStore.ts | Hash: 56bd4306\n\nimport { create } from 'zustand';\nimport { AIProviderConfig } from '../services/ai-provider/types/common.types';\nimport { FeatureFlagConfig } from '../types/featureFlags';\nimport type { TelemetryOptIn } from '../services/telemetry/otlpExporter';\n\nexport interface PackageSettings {\n // Legacy Ollama settings (for backward compatibility)\n ollamaUrl?: string;\n defaultModel: string;\n fallbackModel?: string;\n \n aiProvider?: AIProviderConfig;\n \n // Gateway API handles all services (TTS, STT, AI, etc.)\n gatewayApiUrl: string;\n\n fileStorageApiUrl?: string;\n \n // Content and branding\n brandingConfigUrl: string;\n homeUrl?: string | null;\n playgroundMode?: boolean;\n playgroundBypassAuth?: boolean;\n\n // Sync defaults\n advancedKnowledgeSyncDefaultEnabled?: boolean;\n \n // Feedback settings\n feedbackEmail?: string;\n \n // Feature flag configuration\n featureFlags?: FeatureFlagConfig;\n\n // Opt-in OpenTelemetry — OFF by default. When telemetry.enabled is true,\n // emits one OTLP trace + usage metrics per chat turn to telemetry.endpoint\n // (default https://otlp.burtson.ai → grafana.burtson.ai), tagged\n // service.name = telemetry.serviceName (default \"bandit-web\").\n telemetry?: TelemetryOptIn;\n}\n\ninterface PackageSettingsState {\n settings: PackageSettings | null;\n setSettings: (settings: PackageSettings) => void;\n getSettings: () => PackageSettings | null;\n resetSettings: () => void;\n}\n\nexport const usePackageSettingsStore = create<PackageSettingsState>((set, get) => ({\n settings: null,\n setSettings: (settings) => set({ settings }),\n getSettings: () => get().settings,\n resetSettings: () => set({ settings: null }),\n}));\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-F855-34891E\nconst __banditFingerprint_store_preferencesStorets = 'BL-FP-F9B13A-2C61';\nconst __auditTrail_store_preferencesStorets = 'BL-AU-MGOIKVW5-UNSN';\n// File: preferencesStore.ts | Path: src/store/preferencesStore.ts | Hash: f8552c61\n\nimport { create } from \"zustand\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\n\nexport interface UserPreferences {\n memoryEnabled: boolean;\n knowledgeDocsEnabled: boolean;\n moodEnabled: boolean;\n chatSuggestionsEnabled: boolean;\n ttsEnabled: boolean;\n sttEnabled: boolean;\n banditModelsEnabled: boolean;\n feedbackEnabled: boolean;\n /** Saved interest categories used to personalize conversation starters. */\n interests: string[];\n /** Opt-in: draw conversation starters from the user's knowledge documents. */\n useKnowledgeForStarters: boolean;\n homeUrl?: string;\n}\n\ninterface PreferencesStore {\n preferences: UserPreferences;\n isLoaded: boolean;\n setPreferences: (preferences: Partial<UserPreferences>) => void;\n updatePreference: <K extends keyof UserPreferences>(key: K, value: UserPreferences[K]) => void;\n loadPreferences: () => Promise<void>;\n savePreferences: () => Promise<void>;\n exportPreferences: () => string;\n importPreferences: (jsonString: string) => Promise<boolean>;\n resetToDefaults: () => Promise<void>;\n}\n\nconst defaultPreferences: UserPreferences = {\n memoryEnabled: true,\n knowledgeDocsEnabled: true,\n moodEnabled: true,\n chatSuggestionsEnabled: true,\n ttsEnabled: true,\n sttEnabled: true,\n banditModelsEnabled: true,\n feedbackEnabled: true,\n interests: [],\n useKnowledgeForStarters: false,\n homeUrl: \"\",\n};\n\nconst sanitizePreferences = (\n preferences: Partial<UserPreferences> & Record<string, unknown>\n): Partial<UserPreferences> => {\n const {\n advancedFeaturesEnabled: _deprecatedAdvanced,\n advancedSearchEnabled: _deprecatedSearch,\n advancedMemoriesEnabled: _deprecatedMemories,\n ...rest\n } = preferences;\n return rest;\n};\n\nexport const usePreferencesStore = create<PreferencesStore>((set, get) => ({\n preferences: defaultPreferences,\n isLoaded: false,\n \n setPreferences: (newPreferences) => {\n const sanitized = sanitizePreferences(newPreferences as Partial<UserPreferences> & Record<string, unknown>);\n\n set((state) => ({\n preferences: { ...state.preferences, ...sanitized },\n }));\n // Auto-save after setting preferences\n get().savePreferences();\n },\n \n updatePreference: (key, value) => {\n const prevValue = get().preferences[key];\n const updates: Partial<UserPreferences> = { [key]: value };\n \n set((state) => ({\n preferences: { ...state.preferences, ...updates },\n }));\n // Auto-save after updating preference\n get().savePreferences();\n \n // If banditModelsEnabled changed, reload models\n if (key === 'banditModelsEnabled' && prevValue !== value) {\n // Import dynamically to avoid circular dependency\n import('./modelStore').then(({ useModelStore }) => {\n useModelStore.getState().handleBanditPersonalitiesPreferenceChange(value as boolean);\n });\n }\n },\n \n loadPreferences: async () => {\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n const data = await indexedDBService.get(\"banditConfig\", 1, \"config\", \"preferences\", storeConfigs);\n \n if (data?.preferences) {\n const sanitized = sanitizePreferences(data.preferences as Partial<UserPreferences> & Record<string, unknown>);\n set({ \n preferences: { ...defaultPreferences, ...sanitized },\n isLoaded: true \n });\n debugLogger.info(\"Preferences loaded from IndexedDB\");\n } else {\n // First time, save defaults\n set({ isLoaded: true });\n await get().savePreferences();\n debugLogger.info(\"Default preferences initialized\");\n }\n } catch (error) {\n debugLogger.error(\"Failed to load preferences from IndexedDB\", { error });\n set({ isLoaded: true }); // Mark as loaded even if failed, so UI can render\n }\n },\n \n savePreferences: async () => {\n try {\n const { preferences } = get();\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n \n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: \"preferences\",\n preferences,\n }, storeConfigs);\n \n debugLogger.debug(\"Preferences saved to IndexedDB\");\n } catch (error) {\n debugLogger.error(\"Failed to save preferences to IndexedDB\", { error });\n }\n },\n\n exportPreferences: () => {\n const { preferences } = get();\n const exportData = {\n version: \"1.0\",\n timestamp: new Date().toISOString(),\n preferences,\n };\n return JSON.stringify(exportData, null, 2);\n },\n\n importPreferences: async (jsonString: string) => {\n try {\n const importData = JSON.parse(jsonString);\n \n // Validate the structure\n if (!importData.preferences || typeof importData.preferences !== 'object') {\n debugLogger.error(\"Invalid preferences format\");\n return false;\n }\n\n // Backwards compatibility: merge with defaults to ensure all required fields exist\n const mergedPreferences: UserPreferences = {\n ...defaultPreferences,\n ...sanitizePreferences(importData.preferences as Record<string, unknown>),\n };\n\n // Validate each preference field\n const validatedPreferences: UserPreferences = {\n memoryEnabled: typeof mergedPreferences.memoryEnabled === 'boolean' ? mergedPreferences.memoryEnabled : defaultPreferences.memoryEnabled,\n knowledgeDocsEnabled: typeof mergedPreferences.knowledgeDocsEnabled === 'boolean' ? mergedPreferences.knowledgeDocsEnabled : defaultPreferences.knowledgeDocsEnabled,\n moodEnabled: typeof mergedPreferences.moodEnabled === 'boolean' ? mergedPreferences.moodEnabled : defaultPreferences.moodEnabled,\n chatSuggestionsEnabled: typeof mergedPreferences.chatSuggestionsEnabled === 'boolean' ? mergedPreferences.chatSuggestionsEnabled : defaultPreferences.chatSuggestionsEnabled,\n ttsEnabled: typeof mergedPreferences.ttsEnabled === 'boolean' ? mergedPreferences.ttsEnabled : defaultPreferences.ttsEnabled,\n sttEnabled: typeof mergedPreferences.sttEnabled === 'boolean' ? mergedPreferences.sttEnabled : defaultPreferences.sttEnabled,\n banditModelsEnabled: typeof mergedPreferences.banditModelsEnabled === 'boolean' ? mergedPreferences.banditModelsEnabled : defaultPreferences.banditModelsEnabled,\n feedbackEnabled: typeof mergedPreferences.feedbackEnabled === 'boolean' ? mergedPreferences.feedbackEnabled : defaultPreferences.feedbackEnabled,\n interests: Array.isArray(mergedPreferences.interests) ? mergedPreferences.interests.filter((i): i is string => typeof i === 'string') : defaultPreferences.interests,\n useKnowledgeForStarters: typeof mergedPreferences.useKnowledgeForStarters === 'boolean' ? mergedPreferences.useKnowledgeForStarters : defaultPreferences.useKnowledgeForStarters,\n homeUrl: typeof mergedPreferences.homeUrl === 'string' ? mergedPreferences.homeUrl : defaultPreferences.homeUrl,\n };\n\n set({ preferences: validatedPreferences });\n await get().savePreferences();\n \n debugLogger.info(\"Preferences imported successfully\", { version: importData.version });\n return true;\n } catch (error) {\n debugLogger.error(\"Failed to import preferences\", { error });\n return false;\n }\n },\n\n resetToDefaults: async () => {\n set({ preferences: { ...defaultPreferences } });\n await get().savePreferences();\n debugLogger.info(\"Preferences reset to defaults\");\n },\n}));\n"],"mappings":"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","names":["create","db","create","create","useModelStore","create"]}
@@ -4,7 +4,7 @@ import {
4
4
  getHighlightTree,
5
5
  markdownSanitizeSchema,
6
6
  renderLowlightChildren
7
- } from "./chunk-FXFTA5PZ.mjs";
7
+ } from "./chunk-6DY7W4NK.mjs";
8
8
 
9
9
  // src/components/StreamingMarkdown.tsx
10
10
  import React, { useEffect, useMemo, useRef, useState } from "react";
@@ -495,4 +495,4 @@ var StreamingMarkdown_default = React.memo(StreamingMarkdown, arePropsEqual);
495
495
  export {
496
496
  StreamingMarkdown_default
497
497
  };
498
- //# sourceMappingURL=chunk-O7M4OPZU.mjs.map
498
+ //# sourceMappingURL=chunk-U633CJBV.mjs.map
@@ -3,10 +3,10 @@ import {
3
3
  } from "./chunk-ONQMRE2G.mjs";
4
4
  import {
5
5
  StreamingMarkdown_default
6
- } from "./chunk-O7M4OPZU.mjs";
6
+ } from "./chunk-U633CJBV.mjs";
7
7
  import {
8
8
  useMCPToolsStore
9
- } from "./chunk-6QTTNYF2.mjs";
9
+ } from "./chunk-IDZEEONG.mjs";
10
10
  import {
11
11
  AddIcon,
12
12
  ArrowDownwardIcon,
@@ -43,7 +43,7 @@ import {
43
43
  useNotificationService,
44
44
  useTTS,
45
45
  useVoiceStore
46
- } from "./chunk-FXFTA5PZ.mjs";
46
+ } from "./chunk-6DY7W4NK.mjs";
47
47
  import {
48
48
  authenticationService,
49
49
  brandingService_default,
@@ -55,6 +55,7 @@ import {
55
55
  generateConversationStarters,
56
56
  getCurrentDateTimeContext,
57
57
  getRandomTopicOfInterest,
58
+ pickDistinctRandomTopics,
58
59
  sanitizeConversationName,
59
60
  toTitleCase,
60
61
  useAIQueryStore,
@@ -68,13 +69,13 @@ import {
68
69
  useMemoryStore,
69
70
  useProjectStore,
70
71
  useVectorStore
71
- } from "./chunk-EUBVBTB3.mjs";
72
+ } from "./chunk-4D7245ZO.mjs";
72
73
  import {
73
74
  indexedDBService_default,
74
75
  useModelStore,
75
76
  usePackageSettingsStore,
76
77
  usePreferencesStore
77
- } from "./chunk-IPMTNREZ.mjs";
78
+ } from "./chunk-LWHSOEPR.mjs";
78
79
  import {
79
80
  useAIProviderStore
80
81
  } from "./chunk-H3BYFEIE.mjs";
@@ -8008,13 +8009,19 @@ var QuerySuggestionPicker = ({
8008
8009
  if (hasGenerated.current || isLoading) return;
8009
8010
  hasGenerated.current = true;
8010
8011
  const currentModel = getCurrentModel();
8012
+ const prefs = usePreferencesStore.getState().preferences;
8013
+ const interests = (prefs.interests ?? []).filter((i) => i && i.trim());
8014
+ const randomTopics = pickDistinctRandomTopics(interests.length ? 3 : 5);
8015
+ const topicOfInterest = Array.from(/* @__PURE__ */ new Set([...interests, ...randomTopics])).join(", ") || getRandomTopicOfInterest();
8016
+ const webSearchAvailable = useMCPToolsStore.getState().getEnabledTools().some((t) => t.name === "web_search");
8017
+ const knowledgeTopics = prefs.useKnowledgeForStarters ? useKnowledgeStore.getState().docs.map((d) => d.name).filter((n) => n && n.trim()).slice(0, 12) : void 0;
8011
8018
  const args = {
8012
- // keep responses quick and snappy, server may be handling concurrent requests adjust as needed
8013
8019
  limit: 9,
8014
- // pick a random topic of interest from the list, consider using the users preference topics dynamically, otherwise get a random one
8015
- topicOfInterest: getRandomTopicOfInterest(),
8016
- // Pass the current model's system prompt to tailor suggestions
8017
- modelSystemPrompt: currentModel?.systemPrompt
8020
+ topicOfInterest,
8021
+ modelSystemPrompt: currentModel?.systemPrompt,
8022
+ interests,
8023
+ knowledgeTopics,
8024
+ webSearchAvailable
8018
8025
  };
8019
8026
  generateConversationStarters(args).then((prompts) => {
8020
8027
  if (prompts.length > 0) {
@@ -9742,4 +9749,4 @@ var chat_default = Chat;
9742
9749
  export {
9743
9750
  chat_default
9744
9751
  };
9745
- //# sourceMappingURL=chunk-7EPFQDJW.mjs.map
9752
+ //# sourceMappingURL=chunk-ZYQJVZK2.mjs.map