@burtson-labs/bandit-engine 2.0.42 → 2.0.49

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 (54) hide show
  1. package/README.md +7 -5
  2. package/dist/{aiProviderStore-UQI33C5E.mjs → aiProviderStore-3N3VE6D4.mjs} +2 -2
  3. package/dist/chat-647M6BRG.mjs +15 -0
  4. package/dist/chat-provider.js +45 -10
  5. package/dist/chat-provider.js.map +1 -1
  6. package/dist/chat-provider.mjs +6 -6
  7. package/dist/{chunk-UXE67LR7.mjs → chunk-6WZUQHZT.mjs} +11 -7
  8. package/dist/chunk-6WZUQHZT.mjs.map +1 -0
  9. package/dist/{chunk-EOEI74X4.mjs → chunk-7HXARU5R.mjs} +101 -37
  10. package/dist/chunk-7HXARU5R.mjs.map +1 -0
  11. package/dist/{chunk-XUBYA5I7.mjs → chunk-7ZDS33S2.mjs} +34 -6
  12. package/dist/chunk-7ZDS33S2.mjs.map +1 -0
  13. package/dist/{chunk-SBNENBUQ.mjs → chunk-AXFX2HUK.mjs} +12 -12
  14. package/dist/{chunk-SBNENBUQ.mjs.map → chunk-AXFX2HUK.mjs.map} +1 -1
  15. package/dist/{chunk-54ZQ3FSN.mjs → chunk-BENL3EF2.mjs} +7 -4
  16. package/dist/chunk-BENL3EF2.mjs.map +1 -0
  17. package/dist/{chunk-RTQDQ6TC.mjs → chunk-EHNWQ4T3.mjs} +2 -2
  18. package/dist/{chunk-KBKWVG7X.mjs → chunk-HKJTRBWC.mjs} +5 -5
  19. package/dist/{chunk-4RCAVVDN.mjs → chunk-JCLL7AGP.mjs} +63 -45
  20. package/dist/chunk-JCLL7AGP.mjs.map +1 -0
  21. package/dist/{chunk-ERV7GLY3.mjs → chunk-TVF45U7B.mjs} +5 -5
  22. package/dist/{chunk-H4PBQ5LJ.mjs → chunk-VL3CMSDO.mjs} +4 -4
  23. package/dist/cli.js +45 -45
  24. package/dist/cli.js.map +1 -1
  25. package/dist/{gateway-5yt_3QDP.d.mts → gateway-oScD5tvE.d.mts} +4 -3
  26. package/dist/{gateway-5yt_3QDP.d.ts → gateway-oScD5tvE.d.ts} +4 -3
  27. package/dist/index.d.mts +2 -2
  28. package/dist/index.d.ts +2 -2
  29. package/dist/index.js +199 -76
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +10 -10
  32. package/dist/management/management.js +199 -76
  33. package/dist/management/management.js.map +1 -1
  34. package/dist/management/management.mjs +8 -8
  35. package/dist/modals/chat-modal/chat-modal.js +53 -18
  36. package/dist/modals/chat-modal/chat-modal.js.map +1 -1
  37. package/dist/modals/chat-modal/chat-modal.mjs +5 -5
  38. package/dist/{modelStore-UMJBDSEF.mjs → modelStore-XWFHNTBT.mjs} +2 -2
  39. package/dist/public-types.d.mts +2 -1
  40. package/dist/public-types.d.ts +2 -1
  41. package/package.json +2 -2
  42. package/dist/chat-XDC4SNJF.mjs +0 -15
  43. package/dist/chunk-4RCAVVDN.mjs.map +0 -1
  44. package/dist/chunk-54ZQ3FSN.mjs.map +0 -1
  45. package/dist/chunk-EOEI74X4.mjs.map +0 -1
  46. package/dist/chunk-UXE67LR7.mjs.map +0 -1
  47. package/dist/chunk-XUBYA5I7.mjs.map +0 -1
  48. /package/dist/{aiProviderStore-UQI33C5E.mjs.map → aiProviderStore-3N3VE6D4.mjs.map} +0 -0
  49. /package/dist/{chat-XDC4SNJF.mjs.map → chat-647M6BRG.mjs.map} +0 -0
  50. /package/dist/{chunk-RTQDQ6TC.mjs.map → chunk-EHNWQ4T3.mjs.map} +0 -0
  51. /package/dist/{chunk-KBKWVG7X.mjs.map → chunk-HKJTRBWC.mjs.map} +0 -0
  52. /package/dist/{chunk-ERV7GLY3.mjs.map → chunk-TVF45U7B.mjs.map} +0 -0
  53. /package/dist/{chunk-H4PBQ5LJ.mjs.map → chunk-VL3CMSDO.mjs.map} +0 -0
  54. /package/dist/{modelStore-UMJBDSEF.mjs.map → modelStore-XWFHNTBT.mjs.map} +0 -0
@@ -353,7 +353,7 @@ var usePreferencesStore = create2((set, get) => ({
353
353
  }));
354
354
  get().savePreferences();
355
355
  if (key === "banditModelsEnabled" && prevValue !== value) {
356
- import("./modelStore-UMJBDSEF.mjs").then(({ useModelStore: useModelStore2 }) => {
356
+ import("./modelStore-XWFHNTBT.mjs").then(({ useModelStore: useModelStore2 }) => {
357
357
  useModelStore2.getState().handleBanditPersonalitiesPreferenceChange(value);
358
358
  });
359
359
  }
@@ -483,6 +483,27 @@ var useModelStore = create3((set, get) => ({
483
483
  });
484
484
  }
485
485
  }
486
+ (async () => {
487
+ const storeConfigs = [{ name: "config", keyPath: "id" }];
488
+ try {
489
+ const existing = await indexedDBService_default.get("banditConfig", 1, "config", "main", storeConfigs);
490
+ await indexedDBService_default.put(
491
+ "banditConfig",
492
+ 1,
493
+ "config",
494
+ {
495
+ ...existing,
496
+ id: "main",
497
+ model: { ...existing?.model ?? {}, selectedModel: modelName }
498
+ },
499
+ storeConfigs
500
+ );
501
+ } catch (err) {
502
+ debugLogger.warn("setSelectedModel: failed to persist selected model", {
503
+ error: err instanceof Error ? err.message : String(err)
504
+ });
505
+ }
506
+ })();
486
507
  },
487
508
  saveModel: async () => {
488
509
  const state = get();
@@ -492,7 +513,8 @@ var useModelStore = create3((set, get) => ({
492
513
  tagline: state.tagline,
493
514
  systemPrompt: state.systemPrompt,
494
515
  commands: state.commands,
495
- avatarBase64: state.avatarBase64 ?? void 0
516
+ // Ensure avatar changes are persisted even when cleared
517
+ avatarBase64: state.avatarBase64 ?? null
496
518
  };
497
519
  await indexedDBService_default.put("banditConfig", 1, "config", { id: newModel.name, model: newModel }, storeConfigs);
498
520
  const exists = state.availableModels.find((m) => m.name === newModel.name);
@@ -519,7 +541,12 @@ var useModelStore = create3((set, get) => ({
519
541
  debugLogger.info("initModels: starting initialization");
520
542
  set({ isLoading: true, isInitializing: true });
521
543
  const storeConfigs = [{ name: "config", keyPath: "id" }];
522
- const entries = await indexedDBService_default.getAll("banditConfig", 1, "config", storeConfigs);
544
+ const entries = await indexedDBService_default.getAll(
545
+ "banditConfig",
546
+ 1,
547
+ "config",
548
+ storeConfigs
549
+ );
523
550
  const mainEntry = entries.find((entry) => entry.id === "main");
524
551
  const modelEntries = entries.filter((entry) => entry.id !== "main" && entry.id !== "deletedModels");
525
552
  const deletedEntry = await indexedDBService_default.get("banditConfig", 1, "config", "deletedModels", storeConfigs);
@@ -529,13 +556,14 @@ var useModelStore = create3((set, get) => ({
529
556
  if (modelEntries.length > 0) {
530
557
  debugLogger.info("Loading models from IndexedDB");
531
558
  allModels = modelEntries.map((entry) => {
532
- const modelData = entry.model?.name ? entry.model : entry;
559
+ const modelData = entry.model ?? entry;
533
560
  return {
534
561
  name: modelData.name,
535
562
  tagline: modelData.tagline || "",
536
563
  systemPrompt: modelData.systemPrompt || "",
537
564
  commands: modelData.commands ?? [],
538
- avatarBase64: modelData.avatarBase64 ?? null
565
+ // Fall back to legacy top-level avatar when the nested model config omitted it
566
+ avatarBase64: modelData.avatarBase64 ?? entry.avatarBase64 ?? null
539
567
  };
540
568
  }).filter((m) => m.name && !deletedModelNames.includes(m.name));
541
569
  const preferences = usePreferencesStore.getState().preferences;
@@ -840,4 +868,4 @@ export {
840
868
  usePreferencesStore,
841
869
  useModelStore
842
870
  };
843
- //# sourceMappingURL=chunk-XUBYA5I7.mjs.map
871
+ //# sourceMappingURL=chunk-7ZDS33S2.mjs.map
@@ -0,0 +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';\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\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"]}
@@ -8,15 +8,15 @@ import {
8
8
  useMemoryStore,
9
9
  useNotification,
10
10
  useVectorStore
11
- } from "./chunk-UXE67LR7.mjs";
11
+ } from "./chunk-6WZUQHZT.mjs";
12
12
  import {
13
13
  useModelStore,
14
14
  usePackageSettingsStore,
15
15
  usePreferencesStore
16
- } from "./chunk-XUBYA5I7.mjs";
16
+ } from "./chunk-7ZDS33S2.mjs";
17
17
  import {
18
18
  GatewayService
19
- } from "./chunk-54ZQ3FSN.mjs";
19
+ } from "./chunk-BENL3EF2.mjs";
20
20
  import {
21
21
  debugLogger
22
22
  } from "./chunk-KCI46M23.mjs";
@@ -7875,7 +7875,7 @@ var MemoryModal = ({ open, onClose }) => {
7875
7875
  children: [
7876
7876
  /* @__PURE__ */ jsxs7(Box6, { sx: { display: "flex", alignItems: "center", gap: 0.75 }, children: [
7877
7877
  /* @__PURE__ */ jsx7(Typography5, { variant: "h6", sx: { fontWeight: 600 }, children: "Memory" }),
7878
- shouldUseVectorForMemories && /* @__PURE__ */ jsx7(Tooltip6, { title: "Memories are stored in an AI vector database with semantic search capabilities", children: /* @__PURE__ */ jsx7(
7878
+ shouldUseVectorForMemories && /* @__PURE__ */ jsx7(Tooltip6, { title: "Memories stay in your private knowledge space for faster, more accurate answers.", children: /* @__PURE__ */ jsx7(
7879
7879
  Typography5,
7880
7880
  {
7881
7881
  variant: "caption",
@@ -7890,7 +7890,7 @@ var MemoryModal = ({ open, onClose }) => {
7890
7890
  textTransform: "uppercase",
7891
7891
  cursor: "help"
7892
7892
  },
7893
- children: "Vector"
7893
+ children: "Synced"
7894
7894
  }
7895
7895
  ) })
7896
7896
  ] }),
@@ -7989,7 +7989,7 @@ var MemoryModal = ({ open, onClose }) => {
7989
7989
  onClick: () => setBulkImportOpen(true),
7990
7990
  startIcon: /* @__PURE__ */ jsx7(CloudSyncIcon, {}),
7991
7991
  sx: { textTransform: "none", borderRadius: 2, fontSize: "0.75rem" },
7992
- children: "Import to Vector"
7992
+ children: "Import to workspace"
7993
7993
  }
7994
7994
  ),
7995
7995
  /* @__PURE__ */ jsx7(
@@ -8231,7 +8231,7 @@ var MemoryModal = ({ open, onClose }) => {
8231
8231
  /* @__PURE__ */ jsx7(Typography5, { variant: "body2", sx: {
8232
8232
  color: alpha3(theme.palette.text.secondary, 0.7),
8233
8233
  maxWidth: 280
8234
- }, children: selectedTab === "user" ? shouldUseVectorForMemories ? "Start by adding something you'd like me to remember. Your memories will be stored in the AI vector database for intelligent retrieval." : "Start by adding something you'd like me to remember about you or your preferences." : shouldUseVectorForMemories ? "Auto memories are created automatically based on our conversations and stored in the vector database for semantic search." : "Auto memories are created automatically based on our conversations." })
8234
+ }, children: selectedTab === "user" ? shouldUseVectorForMemories ? "Start by adding something you'd like me to remember. Your memories will be kept in a private workspace for quick recall." : "Start by adding something you'd like me to remember about you or your preferences." : shouldUseVectorForMemories ? "Auto memories are created automatically based on our conversations and kept in your private workspace for better answers." : "Auto memories are created automatically based on our conversations." })
8235
8235
  ] }) : filteredMemories.map((memory) => {
8236
8236
  const isSelected = selectedIds.includes(memory.id);
8237
8237
  return /* @__PURE__ */ jsxs7(React7.Fragment, { children: [
@@ -8503,7 +8503,7 @@ var MemoryModal = ({ open, onClose }) => {
8503
8503
  size: "small",
8504
8504
  value: newMemory,
8505
8505
  onChange: (e) => setNewMemory(e.target.value),
8506
- placeholder: shouldUseVectorForMemories ? `Add a new ${selectedTab} memory to vector database...` : `Add a new ${selectedTab} memory...`,
8506
+ placeholder: shouldUseVectorForMemories ? `Add a new ${selectedTab} memory to your workspace...` : `Add a new ${selectedTab} memory...`,
8507
8507
  onKeyDown: (e) => {
8508
8508
  if (e.key === "Enter" && !e.shiftKey && newMemory.trim()) {
8509
8509
  e.preventDefault();
@@ -8743,15 +8743,15 @@ var MemoryModal = ({ open, onClose }) => {
8743
8743
  gap: 1
8744
8744
  }, children: [
8745
8745
  /* @__PURE__ */ jsx7(CloudSyncIcon, { color: "primary" }),
8746
- "Import Memories to Vector Database"
8746
+ "Import Memories to Secure Workspace"
8747
8747
  ] }),
8748
8748
  /* @__PURE__ */ jsx7(DialogContent2, { sx: { py: 2 }, children: !importProgress.isImporting ? /* @__PURE__ */ jsxs7(Box6, { children: [
8749
8749
  /* @__PURE__ */ jsxs7(Typography5, { variant: "body2", color: "text.secondary", sx: { mb: 2 }, children: [
8750
8750
  "This will import all your local memories (",
8751
8751
  entries.length,
8752
- " memories) to the vector database for enhanced semantic search capabilities."
8752
+ " memories) to your secure workspace for faster, more reliable answers."
8753
8753
  ] }),
8754
- /* @__PURE__ */ jsx7(Typography5, { variant: "body2", color: "text.secondary", sx: { mb: 2 }, children: "\u2022 Memories will be added to your vector storage \u2022 Local memories will remain unchanged \u2022 You can switch between local and vector storage anytime" }),
8754
+ /* @__PURE__ */ jsx7(Typography5, { variant: "body2", color: "text.secondary", sx: { mb: 2 }, children: "\u2022 Memories will be added to your synced workspace \u2022 Local memories will remain unchanged \u2022 You can switch between synced and local storage anytime" }),
8755
8755
  /* @__PURE__ */ jsxs7(Typography5, { variant: "body2", color: "primary", sx: { fontWeight: 500 }, children: [
8756
8756
  "Ready to import ",
8757
8757
  entries.length,
@@ -8922,4 +8922,4 @@ export {
8922
8922
  FeedbackButton,
8923
8923
  useNotificationService
8924
8924
  };
8925
- //# sourceMappingURL=chunk-SBNENBUQ.mjs.map
8925
+ //# sourceMappingURL=chunk-AXFX2HUK.mjs.map