@burtson-labs/bandit-engine 2.0.162 → 2.0.163

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 (211) hide show
  1. package/README.md +7 -22
  2. package/dist/aiProviderStore-PEGSX4PK.mjs +9 -0
  3. package/dist/chat-MRDQ2WRJ.mjs +16 -0
  4. package/dist/chat-provider.js.map +1 -1
  5. package/dist/chat-provider.mjs +7 -7
  6. package/dist/{chunk-ZNK3ELTZ.mjs → chunk-5KBTOCQZ.mjs} +4 -4
  7. package/dist/chunk-5KBTOCQZ.mjs.map +1 -0
  8. package/dist/{chunk-Q6LXVYTC.mjs → chunk-CQJGUYRW.mjs} +2 -2
  9. package/dist/chunk-CQJGUYRW.mjs.map +1 -0
  10. package/dist/{chunk-3ACT5BTW.mjs → chunk-F32P7Q5O.mjs} +122 -232
  11. package/dist/chunk-F32P7Q5O.mjs.map +1 -0
  12. package/dist/{chunk-RUXYVMW2.mjs → chunk-HSGQXL4N.mjs} +11 -11
  13. package/dist/chunk-HSGQXL4N.mjs.map +1 -0
  14. package/dist/{chunk-47MOBOP3.mjs → chunk-IZX2J65Q.mjs} +2 -2
  15. package/dist/chunk-IZX2J65Q.mjs.map +1 -0
  16. package/dist/{chunk-ODGVCSKV.mjs → chunk-J6SWNO7Z.mjs} +6 -27
  17. package/dist/chunk-J6SWNO7Z.mjs.map +1 -0
  18. package/dist/{chunk-G5POQT2R.mjs → chunk-O6P37PFR.mjs} +4 -4
  19. package/dist/chunk-O6P37PFR.mjs.map +1 -0
  20. package/dist/{chunk-KCI46M23.mjs → chunk-OCVZVBQQ.mjs} +1 -1
  21. package/dist/chunk-OCVZVBQQ.mjs.map +1 -0
  22. package/dist/{chunk-IXIM7BNO.mjs → chunk-P4C5IRM5.mjs} +1 -1
  23. package/dist/chunk-P4C5IRM5.mjs.map +1 -0
  24. package/dist/{chunk-WQEBTH2R.mjs → chunk-TY5VL3SG.mjs} +3 -3
  25. package/dist/chunk-TY5VL3SG.mjs.map +1 -0
  26. package/dist/{chunk-YHSYHU5P.mjs → chunk-URZSIL7X.mjs} +7 -7
  27. package/dist/chunk-URZSIL7X.mjs.map +1 -0
  28. package/dist/{chunk-OGMXL7BF.mjs → chunk-VBHI4TJC.mjs} +6 -6
  29. package/dist/chunk-VBHI4TJC.mjs.map +1 -0
  30. package/dist/{chunk-R6HMLYKQ.mjs → chunk-WLNZL6SP.mjs} +5 -16
  31. package/dist/chunk-WLNZL6SP.mjs.map +1 -0
  32. package/dist/index.d.mts +6 -0
  33. package/dist/index.d.ts +6 -0
  34. package/dist/index.js +574 -728
  35. package/dist/index.js.map +1 -1
  36. package/dist/index.mjs +15 -31
  37. package/dist/index.mjs.map +1 -1
  38. package/dist/management/management.js +214 -352
  39. package/dist/management/management.js.map +1 -1
  40. package/dist/management/management.mjs +10 -10
  41. package/dist/{memoryUtils-33TZKHSQ.mjs → memoryUtils-2FVXDSS6.mjs} +1 -1
  42. package/dist/memoryUtils-2FVXDSS6.mjs.map +1 -0
  43. package/dist/modals/chat-modal/chat-modal.js.map +1 -1
  44. package/dist/modals/chat-modal/chat-modal.mjs +6 -6
  45. package/dist/modelStore-7XYYDCNC.mjs +9 -0
  46. package/dist/shared/custom-element.js.map +1 -1
  47. package/dist/shared/custom-element.mjs +1 -1
  48. package/docs/05_contributing.md +1 -1
  49. package/docs/api_reference/assets/navigation.js +1 -1
  50. package/docs/api_reference/assets/search.js +1 -1
  51. package/docs/api_reference/classes/DebugLogger.html +11 -11
  52. package/docs/api_reference/classes/FeatureFlagService.html +13 -13
  53. package/docs/api_reference/classes/NotificationService.html +10 -10
  54. package/docs/api_reference/classes/StreamingTTSClient.html +9 -9
  55. package/docs/api_reference/classes/VectorDatabaseService.html +24 -24
  56. package/docs/api_reference/classes/VectorMigrationService.html +8 -8
  57. package/docs/api_reference/classes/VoiceService.html +2 -2
  58. package/docs/api_reference/enums/TTSState.html +2 -2
  59. package/docs/api_reference/functions/Chat.html +1 -1
  60. package/docs/api_reference/functions/ChatModal.html +1 -1
  61. package/docs/api_reference/functions/ChatProvider.html +1 -1
  62. package/docs/api_reference/functions/FeatureFlagProvider.html +1 -1
  63. package/docs/api_reference/functions/FeedbackButton.html +1 -1
  64. package/docs/api_reference/functions/FeedbackModal.html +1 -1
  65. package/docs/api_reference/functions/InterestsEditor.html +5 -0
  66. package/docs/api_reference/functions/Management.html +1 -1
  67. package/docs/api_reference/functions/NotificationProvider.html +1 -1
  68. package/docs/api_reference/functions/SubscriptionExpiredGuard.html +1 -1
  69. package/docs/api_reference/functions/SubscriptionExpiredModal.html +1 -1
  70. package/docs/api_reference/functions/defineCustomElement.html +1 -1
  71. package/docs/api_reference/functions/getCriticalConfig.html +2 -1
  72. package/docs/api_reference/functions/getFeatureMatrix.html +1 -1
  73. package/docs/api_reference/functions/getStreamingTTSClient.html +1 -1
  74. package/docs/api_reference/functions/getSystemConstants.html +2 -1
  75. package/docs/api_reference/functions/getTTSState.html +1 -1
  76. package/docs/api_reference/functions/handleHttpError.html +1 -1
  77. package/docs/api_reference/functions/handleSubscriptionUpgrade.html +1 -1
  78. package/docs/api_reference/functions/handleValidationError.html +1 -1
  79. package/docs/api_reference/functions/initializeCoreSystem.html +2 -1
  80. package/docs/api_reference/functions/isWorkspaceAdminRole.html +6 -0
  81. package/docs/api_reference/functions/pauseTTS.html +1 -1
  82. package/docs/api_reference/functions/previewTierUpgrade.html +1 -1
  83. package/docs/api_reference/functions/resolveManagementSections.html +2 -0
  84. package/docs/api_reference/functions/resumeTTS.html +1 -1
  85. package/docs/api_reference/functions/showInfoNotification.html +1 -1
  86. package/docs/api_reference/functions/showSuccessNotification.html +1 -1
  87. package/docs/api_reference/functions/speakWithStreaming.html +1 -1
  88. package/docs/api_reference/functions/stopTTS.html +1 -1
  89. package/docs/api_reference/functions/syncSubscriptionWithAPI.html +1 -1
  90. package/docs/api_reference/functions/updateSubscriptionTier.html +1 -1
  91. package/docs/api_reference/functions/useFeatureFlag.html +1 -1
  92. package/docs/api_reference/functions/useFeatureVisibility.html +1 -1
  93. package/docs/api_reference/functions/useFeatures.html +1 -1
  94. package/docs/api_reference/functions/useGatewayHealth.html +1 -1
  95. package/docs/api_reference/functions/useGatewayMemory.html +1 -1
  96. package/docs/api_reference/functions/useGatewayModels.html +1 -1
  97. package/docs/api_reference/functions/useGlobalTTS.html +1 -1
  98. package/docs/api_reference/functions/useManagementAccess.html +2 -0
  99. package/docs/api_reference/functions/useNotification.html +1 -1
  100. package/docs/api_reference/functions/useNotificationService.html +1 -1
  101. package/docs/api_reference/functions/useTTS.html +1 -1
  102. package/docs/api_reference/functions/useVectorStore.html +1 -1
  103. package/docs/api_reference/functions/useVoiceStore.html +2 -2
  104. package/docs/api_reference/functions/useVoices.html +1 -1
  105. package/docs/api_reference/functions/validateEnvironment.html +2 -1
  106. package/docs/api_reference/functions/validateSystemIntegrity.html +2 -1
  107. package/docs/api_reference/index.html +219 -155
  108. package/docs/api_reference/interfaces/AIChatRequest.html +2 -2
  109. package/docs/api_reference/interfaces/AIChatResponse.html +2 -2
  110. package/docs/api_reference/interfaces/AIGenerateRequest.html +2 -2
  111. package/docs/api_reference/interfaces/AIGenerateResponse.html +2 -2
  112. package/docs/api_reference/interfaces/AIMessage.html +2 -2
  113. package/docs/api_reference/interfaces/AIModel.html +2 -2
  114. package/docs/api_reference/interfaces/AIProviderConfig.html +5 -2
  115. package/docs/api_reference/interfaces/ChatConfig.html +3 -3
  116. package/docs/api_reference/interfaces/ChatModalProps.html +3 -3
  117. package/docs/api_reference/interfaces/CreateMemoryOptions.html +2 -2
  118. package/docs/api_reference/interfaces/FeatureEvaluation.html +7 -7
  119. package/docs/api_reference/interfaces/FeatureFlagConfig.html +9 -9
  120. package/docs/api_reference/interfaces/FeatureFlagContextValue.html +8 -8
  121. package/docs/api_reference/interfaces/FeatureFlagProviderProps.html +2 -2
  122. package/docs/api_reference/interfaces/FeedbackButtonProps.html +10 -10
  123. package/docs/api_reference/interfaces/FeedbackCategories.html +2 -2
  124. package/docs/api_reference/interfaces/FeedbackModalProps.html +2 -2
  125. package/docs/api_reference/interfaces/FeedbackPriorities.html +2 -2
  126. package/docs/api_reference/interfaces/FeedbackRequest.html +2 -2
  127. package/docs/api_reference/interfaces/FeedbackResponse.html +2 -2
  128. package/docs/api_reference/interfaces/FileUploadResult.html +2 -2
  129. package/docs/api_reference/interfaces/GatewayChatRequest.html +3 -2
  130. package/docs/api_reference/interfaces/GatewayChatResponse.html +2 -2
  131. package/docs/api_reference/interfaces/GatewayContract.html +2 -2
  132. package/docs/api_reference/interfaces/GatewayGenerateRequest.html +2 -2
  133. package/docs/api_reference/interfaces/GatewayGenerateResponse.html +2 -2
  134. package/docs/api_reference/interfaces/GatewayHealthResponse.html +2 -2
  135. package/docs/api_reference/interfaces/GatewayMemoryRecord.html +2 -2
  136. package/docs/api_reference/interfaces/GatewayMemoryResponse.html +2 -2
  137. package/docs/api_reference/interfaces/GatewayMessage.html +2 -2
  138. package/docs/api_reference/interfaces/GatewayMessageContent.html +2 -2
  139. package/docs/api_reference/interfaces/GatewayModel.html +2 -2
  140. package/docs/api_reference/interfaces/GatewayModelsResponse.html +2 -2
  141. package/docs/api_reference/interfaces/ManagementAccess.html +5 -0
  142. package/docs/api_reference/interfaces/ManagementAccessInput.html +5 -0
  143. package/docs/api_reference/interfaces/ManagementLink.html +7 -0
  144. package/docs/api_reference/interfaces/ManagementProps.html +22 -0
  145. package/docs/api_reference/interfaces/ManagementSectionDef.html +10 -0
  146. package/docs/api_reference/interfaces/MemorySearchFilters.html +2 -2
  147. package/docs/api_reference/interfaces/MigrationProgress.html +2 -2
  148. package/docs/api_reference/interfaces/MigrationStatus.html +2 -2
  149. package/docs/api_reference/interfaces/NotificationConfig.html +2 -2
  150. package/docs/api_reference/interfaces/NotificationContextType.html +2 -2
  151. package/docs/api_reference/interfaces/NotificationProviderProps.html +2 -2
  152. package/docs/api_reference/interfaces/PackageSettings.html +11 -2
  153. package/docs/api_reference/interfaces/SearchOptions.html +2 -2
  154. package/docs/api_reference/interfaces/SearchResult.html +2 -2
  155. package/docs/api_reference/interfaces/SubscriptionExpiredGuardProps.html +2 -2
  156. package/docs/api_reference/interfaces/SubscriptionExpiredModalProps.html +2 -2
  157. package/docs/api_reference/interfaces/TTSOptions.html +2 -2
  158. package/docs/api_reference/interfaces/TTSProgress.html +2 -2
  159. package/docs/api_reference/interfaces/TrialUsage.html +2 -2
  160. package/docs/api_reference/interfaces/UploadRequest.html +3 -3
  161. package/docs/api_reference/interfaces/UseTTSReturn.html +2 -2
  162. package/docs/api_reference/interfaces/VectorDocument.html +2 -2
  163. package/docs/api_reference/interfaces/VectorMemory.html +2 -2
  164. package/docs/api_reference/interfaces/VectorMemoryMetadata.html +2 -2
  165. package/docs/api_reference/interfaces/VectorStoreStatus.html +2 -2
  166. package/docs/api_reference/interfaces/VoiceModelsResponse.html +2 -2
  167. package/docs/api_reference/interfaces/VoiceState.html +2 -2
  168. package/docs/api_reference/media/PROTECTION-NOTICE.md +6 -55
  169. package/docs/api_reference/media/README.md +20 -1
  170. package/docs/api_reference/modules.html +18 -6
  171. package/docs/api_reference/types/FeatureKey.html +1 -1
  172. package/docs/api_reference/types/FeatureMatrix.html +1 -1
  173. package/docs/api_reference/types/GatewayQueryOptions.html +1 -1
  174. package/docs/api_reference/types/LogContext.html +1 -1
  175. package/docs/api_reference/types/ManagementRequest.html +1 -0
  176. package/docs/api_reference/types/ManagementSectionId.html +2 -0
  177. package/docs/api_reference/types/SubscriptionTier.html +1 -1
  178. package/docs/api_reference/variables/DEFAULT_TIER_FEATURES.html +1 -1
  179. package/docs/api_reference/variables/FeatureFlagContext.html +1 -1
  180. package/docs/api_reference/variables/MANAGEMENT_SECTIONS.html +1 -0
  181. package/docs/api_reference/variables/OSS_DEFAULT_FEATURES.html +1 -1
  182. package/docs/api_reference/variables/SYSTEM_FLAGS.html +2 -1
  183. package/docs/api_reference/variables/authenticationService.html +1 -1
  184. package/docs/api_reference/variables/debugLogger-1.html +1 -1
  185. package/docs/api_reference/variables/featureFlagService-1.html +1 -1
  186. package/docs/api_reference/variables/notificationService-1.html +1 -1
  187. package/docs/api_reference/variables/vectorDatabaseService-1.html +1 -1
  188. package/docs/api_reference/variables/vectorMigrationService-1.html +1 -1
  189. package/docs/api_reference/variables/voiceService-1.html +1 -1
  190. package/package.json +1 -1
  191. package/dist/aiProviderStore-JOB2H4LP.mjs +0 -9
  192. package/dist/chat-LB6UEEEW.mjs +0 -16
  193. package/dist/chunk-3ACT5BTW.mjs.map +0 -1
  194. package/dist/chunk-47MOBOP3.mjs.map +0 -1
  195. package/dist/chunk-G5POQT2R.mjs.map +0 -1
  196. package/dist/chunk-IXIM7BNO.mjs.map +0 -1
  197. package/dist/chunk-KCI46M23.mjs.map +0 -1
  198. package/dist/chunk-ODGVCSKV.mjs.map +0 -1
  199. package/dist/chunk-OGMXL7BF.mjs.map +0 -1
  200. package/dist/chunk-Q6LXVYTC.mjs.map +0 -1
  201. package/dist/chunk-R6HMLYKQ.mjs.map +0 -1
  202. package/dist/chunk-RUXYVMW2.mjs.map +0 -1
  203. package/dist/chunk-WQEBTH2R.mjs.map +0 -1
  204. package/dist/chunk-YHSYHU5P.mjs.map +0 -1
  205. package/dist/chunk-ZNK3ELTZ.mjs.map +0 -1
  206. package/dist/memoryUtils-33TZKHSQ.mjs.map +0 -1
  207. package/dist/modelStore-FGUGOWTL.mjs +0 -9
  208. package/docs/api_reference/media/PROTECTION-README.md +0 -39
  209. /package/dist/{aiProviderStore-JOB2H4LP.mjs.map → aiProviderStore-PEGSX4PK.mjs.map} +0 -0
  210. /package/dist/{chat-LB6UEEEW.mjs.map → chat-MRDQ2WRJ.mjs.map} +0 -0
  211. /package/dist/{modelStore-FGUGOWTL.mjs.map → modelStore-7XYYDCNC.mjs.map} +0 -0
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  indexedDBService_default,
3
3
  usePackageSettingsStore
4
- } from "./chunk-WQEBTH2R.mjs";
4
+ } from "./chunk-TY5VL3SG.mjs";
5
5
  import {
6
6
  authenticationService
7
- } from "./chunk-Q6LXVYTC.mjs";
7
+ } from "./chunk-CQJGUYRW.mjs";
8
8
  import {
9
9
  debugLogger
10
- } from "./chunk-KCI46M23.mjs";
10
+ } from "./chunk-OCVZVBQQ.mjs";
11
11
 
12
12
  // src/store/mcpToolsStore.ts
13
13
  import { create } from "zustand";
@@ -387,4 +387,4 @@ export {
387
387
  discoverMcpTools,
388
388
  useMCPToolsStore
389
389
  };
390
- //# sourceMappingURL=chunk-G5POQT2R.mjs.map
390
+ //# sourceMappingURL=chunk-O6P37PFR.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/store/mcpToolsStore.ts","../src/services/mcp/mcpServersService.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport { create } from \"zustand\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport { listMcpServers, discoverMcpTools } from \"../services/mcp/mcpServersService\";\nimport type { McpTool as ControllerTool } from \"../services/mcp/mcpControllerService\";\n\n// Sanitize an MCP tool into a valid, namespaced function name for the model.\nconst sanitizeMcpToolName = (raw: string): string =>\n raw.replace(/[^a-zA-Z0-9_]/g, \"_\").replace(/_+/g, \"_\").replace(/^_|_$/g, \"\").slice(0, 60);\n\nexport interface MCPTool {\n id: string;\n name: string;\n description: string;\n enabled: boolean;\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: Record<string, unknown>;\n required: string[];\n };\n };\n endpoint?: string; // API endpoint for gateway calls\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n isBuiltIn?: boolean;\n // Set when this tool comes from a user-connected MCP server. Such tools are\n // invoked through POST /mcp/invoke (not a fixed endpoint) and are never\n // persisted to IndexedDB — they're re-discovered from the gateway each load.\n mcpServerId?: string;\n mcpToolName?: string; // the tool's real name on the MCP server\n}\n\nexport type ToolSaveState = \"idle\" | \"saving\" | \"saved\" | \"error\";\n\ninterface MCPToolsStore {\n tools: MCPTool[];\n isLoaded: boolean;\n /**\n * The person's own on/off choice per tool id. It wins over every default:\n * a built-in's, the tool controller's `isEnabled`, and a discovered MCP\n * server tool's. A tool with no entry follows its default. Persisted with\n * the custom tools in this origin's IndexedDB, and each workspace is its own\n * origin (acme.banditai.ai), so choices are per workspace.\n */\n choices: Record<string, boolean>;\n /** Whether the last change a person made was written. */\n saveState: ToolSaveState;\n lastSavedAt: number | null;\n addTool: (tool: Omit<MCPTool, \"id\">) => void;\n updateTool: (id: string, updates: Partial<MCPTool>) => void;\n deleteTool: (id: string) => void;\n /** Flips a tool, records it as the person's choice and saves. Resolves false if the save failed. */\n toggleTool: (id: string) => Promise<boolean>;\n loadTools: () => Promise<void>;\n /** Saves, reporting through saveState. Resolves false if the write failed. */\n saveTools: () => Promise<boolean>;\n getEnabledTools: () => MCPTool[];\n loadMcpServerTools: () => Promise<void>;\n /**\n * Aligns local tools with what the tool controller reports: adds the ones\n * we don't have, and sets each to the person's choice or, if they haven't\n * made one, the controller's default. Never overrides a choice.\n */\n syncControllerTools: (controllerTools: ControllerTool[]) => void;\n}\n\nconst STORE_CONFIGS = [{ name: \"config\", keyPath: \"id\" }];\n\ntype PersistedTools = { tools?: unknown; choices?: unknown };\n\nconst readChoices = (value: unknown): Record<string, boolean> => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n const out: Record<string, boolean> = {};\n for (const [id, on] of Object.entries(value as Record<string, unknown>)) {\n if (typeof on === \"boolean\") out[id] = on;\n }\n return out;\n};\n\nconst withChoice = (tool: MCPTool, choices: Record<string, boolean>): MCPTool =>\n Object.prototype.hasOwnProperty.call(choices, tool.id) && tool.enabled !== choices[tool.id]\n ? { ...tool, enabled: choices[tool.id]! }\n : tool;\n\n// Built-in controller-backed tools\nconst healthCheckTool: MCPTool = {\n id: \"health-check\",\n name: \"check_gateway_health\",\n description: \"Check the health status of the gateway API service\",\n enabled: true,\n type: \"function\",\n function: {\n name: \"check_gateway_health\",\n description: \"Check the health status of the gateway API service\",\n parameters: {\n type: \"object\",\n properties: {},\n required: []\n }\n },\n endpoint: \"/mcp/health\",\n method: \"GET\",\n isBuiltIn: true\n};\n\nconst webSearchTool: MCPTool = {\n id: \"web-search\",\n name: \"web_search\",\n description: \"Search the web for current information, documentation, and facts\",\n enabled: true,\n type: \"function\",\n function: {\n name: \"web_search\",\n description: \"Search the web and return ranked results with snippets (and an optional summarized answer). Use for current events, documentation, libraries, error messages, and factual lookups.\",\n parameters: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"The search query — natural language or keywords\" },\n count: { type: \"number\", description: \"Number of results to return (1-10, default 5)\" },\n include_answer: { type: \"boolean\", description: \"Include a short summarized answer when available\" }\n },\n required: [\"query\"]\n }\n },\n endpoint: \"/mcp/web-search\",\n method: \"GET\",\n isBuiltIn: true\n};\n\nconst webFetchTool: MCPTool = {\n id: \"web-fetch\",\n name: \"web_fetch\",\n description: \"Fetch the text content of a specific URL\",\n enabled: true,\n type: \"function\",\n function: {\n name: \"web_fetch\",\n description: \"Fetch a single public URL and return its trimmed text content. Use when you already have a specific link you need to read.\",\n parameters: {\n type: \"object\",\n properties: {\n url: { type: \"string\", description: \"Absolute http(s) URL to fetch\" }\n },\n required: [\"url\"]\n }\n },\n endpoint: \"/mcp/web-fetch\",\n method: \"GET\",\n isBuiltIn: true\n};\n\n// Image generation runs on Burtson's own GPU (the Image Studio backend behind\n// the gateway) — never a third-party image API. The gateway forwards the\n// user's token to Anton, whose admin/partner gate decides who may take the\n// GPU; everyone else gets a clear \"limited to admin and partner accounts\"\n// message. Cold starts can take a couple of minutes.\nconst imageGenerationTool: MCPTool = {\n id: \"image-generation\",\n name: \"image_generation\",\n description: \"Generate an image from a text prompt on the Burtson Labs GPU\",\n enabled: true,\n type: \"function\",\n function: {\n name: \"image_generation\",\n description: \"Generate an image from a text prompt on the Burtson Labs GPU\",\n parameters: {\n type: \"object\",\n properties: {\n prompt: { type: \"string\", description: \"Text description of the image to generate\" },\n size: { type: \"string\", enum: [\"1024x1024\", \"1344x768\", \"768x1344\"], description: \"Canvas: square, landscape, or portrait\" }\n },\n required: [\"prompt\"]\n }\n },\n endpoint: \"/mcp/generate-image\",\n method: \"POST\",\n isBuiltIn: true\n};\n\n// Create a downloadable file for the user (stored ~1 hour at a gateway URL).\nconst createFileTool: MCPTool = {\n id: \"create-file\",\n name: \"create_file\",\n description: \"Create a downloadable file for the user (md, txt, csv, json, html, docx, pptx, pdf). Returns a temporary (~1 hour) download link.\",\n enabled: true,\n type: \"function\",\n function: {\n name: \"create_file\",\n description:\n \"Generate a file the user can download. For docx/pptx write well-structured Markdown (headings, lists, tables; use '## ' headings to start each slide). For pdf, prefer complete HTML with inline CSS (branded proposals, print layouts) — Chromium renders it without browser headers/footers; Markdown also works. Returns a short-lived (~1 hour) download URL — tell the user it expires.\",\n parameters: {\n type: \"object\",\n properties: {\n content: { type: \"string\", description: \"The file content (HTML preferred for pdf; Markdown for docx/pptx/pdf; raw text for others).\" },\n filename: { type: \"string\", description: \"Desired filename, e.g. 'report.pdf' or 'notes.md'.\" },\n format: {\n type: \"string\",\n enum: [\"md\", \"txt\", \"csv\", \"json\", \"html\", \"xml\", \"yaml\", \"docx\", \"pptx\", \"pdf\"],\n description: \"File format. Defaults to md.\",\n },\n },\n required: [\"content\", \"format\"],\n },\n },\n endpoint: \"/mcp/create-file\",\n method: \"POST\",\n isBuiltIn: true,\n};\n\nconst defaultTools: MCPTool[] = [healthCheckTool, webSearchTool, webFetchTool, imageGenerationTool, createFileTool];\n\nexport const useMCPToolsStore = create<MCPToolsStore>((set, get) => {\n // Writes custom tools and choices. Built-ins and discovered MCP-server tools\n // are never stored themselves: they come back from code and the gateway.\n const persist = async () => {\n const { tools, choices } = get();\n const customTools = tools.filter((tool) => !tool.isBuiltIn && !tool.mcpServerId);\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: \"mcpTools\",\n tools: customTools,\n choices,\n }, STORE_CONFIGS);\n debugLogger.debug(\"MCP tools saved to IndexedDB\", { toolCount: customTools.length, choices: Object.keys(choices).length });\n };\n\n // Background writes (first run, controller sync) don't touch saveState:\n // \"Saved\" and \"Couldn't save\" describe what the person did.\n const persistQuietly = async () => {\n try {\n await persist();\n } catch (error) {\n debugLogger.error(\"Failed to save MCP tools to IndexedDB\", { error });\n }\n };\n\n return {\n tools: defaultTools,\n isLoaded: false,\n choices: {},\n saveState: \"idle\",\n lastSavedAt: null,\n\n addTool: (toolData) => {\n const newTool: MCPTool = {\n ...toolData,\n id: `tool-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n };\n set((state) => ({\n tools: [...state.tools, newTool],\n }));\n get().saveTools();\n },\n \n updateTool: (id, updates) => {\n set((state) => ({\n tools: state.tools.map((tool) =>\n tool.id === id ? { ...tool, ...updates } : tool\n ),\n }));\n get().saveTools();\n },\n \n deleteTool: (id) => {\n set((state) => ({\n tools: state.tools.filter((tool) => tool.id !== id || tool.isBuiltIn),\n }));\n get().saveTools();\n },\n \n toggleTool: async (id) => {\n const tool = get().tools.find((t) => t.id === id);\n if (!tool) return false;\n const enabled = !tool.enabled;\n set((state) => ({\n tools: state.tools.map((t) => (t.id === id ? { ...t, enabled } : t)),\n choices: { ...state.choices, [id]: enabled },\n }));\n return get().saveTools();\n },\n \n getEnabledTools: () => {\n return get().tools.filter((tool) => tool.enabled);\n },\n \n loadTools: async () => {\n try {\n const data = await indexedDBService.get<PersistedTools>(\"banditConfig\", 1, \"config\", \"mcpTools\", STORE_CONFIGS);\n \n if (data?.tools && Array.isArray(data.tools)) {\n // Choices made in this session before the load finished are newer than the stored ones.\n const choices = { ...readChoices(data.choices), ...get().choices };\n // Built-ins always use their code definition; only the on/off is the person's.\n const savedTools = data.tools as MCPTool[];\n const builtInIds = defaultTools.map(t => t.id);\n const customTools = savedTools.filter(\n (tool) => !tool.isBuiltIn && !builtInIds.includes(tool.id)\n );\n const discovered = get().tools.filter((t) => t.mcpServerId);\n\n set({\n tools: [...defaultTools, ...customTools, ...discovered].map((t) => withChoice(t, choices)),\n choices,\n isLoaded: true\n });\n debugLogger.info(\"MCP tools loaded from IndexedDB\", { \n totalTools: defaultTools.length + customTools.length,\n builtInTools: defaultTools.length,\n customTools: customTools.length,\n choices: Object.keys(choices).length,\n });\n } else {\n // First time, save defaults\n set({ isLoaded: true });\n await persistQuietly();\n debugLogger.info(\"Default MCP tools initialized\");\n }\n } catch (error) {\n debugLogger.error(\"Failed to load MCP tools from IndexedDB\", { error });\n set({ isLoaded: true }); // Mark as loaded even if failed, so UI can render\n }\n },\n \n saveTools: async () => {\n set({ saveState: \"saving\" });\n try {\n await persist();\n set({ saveState: \"saved\", lastSavedAt: Date.now() });\n return true;\n } catch (error) {\n debugLogger.error(\"Failed to save MCP tools to IndexedDB\", { error });\n set({ saveState: \"error\" });\n return false;\n }\n },\n\n syncControllerTools: (controllerTools) => {\n const { choices } = get();\n const next = [...get().tools];\n let changed = false;\n for (const ct of controllerTools) {\n const functionName = (ct.id || ct.name).replace(/[^a-zA-Z0-9_]/g, \"_\");\n const index =\n [\n next.findIndex((lt) => lt.function.name === functionName),\n next.findIndex((lt) => lt.function.name === ct.id),\n next.findIndex((lt) => lt.id === ct.id),\n ].find((i) => i >= 0) ?? -1;\n\n if (index < 0) {\n // A local representation lets the person switch it for the assistant.\n next.push({\n id: `tool-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n name: functionName,\n description: ct.description,\n enabled: ct.isEnabled,\n type: \"function\",\n function: {\n name: ct.id, // the controller id maps back to the tool\n description: ct.description,\n parameters: { type: \"object\", properties: {}, required: [] },\n },\n endpoint: `/mcp/${ct.id}`,\n method: \"GET\",\n isBuiltIn: false,\n });\n changed = true;\n continue;\n }\n const local = next[index]!;\n const enabled = Object.prototype.hasOwnProperty.call(choices, local.id) ? choices[local.id]! : ct.isEnabled;\n if (local.enabled !== enabled) {\n next[index] = { ...local, enabled };\n changed = true;\n }\n }\n if (!changed) return;\n set({ tools: next });\n void persistQuietly();\n },\n\n // Discover the user's connected MCP servers' tools from the gateway and merge\n // them into the tool list (so the model can call them). Replaces any prior\n // MCP-server tools; best-effort — a single unreachable server is skipped.\n loadMcpServerTools: async () => {\n let servers;\n try {\n servers = await listMcpServers();\n } catch (error) {\n debugLogger.warn(\"Could not list MCP servers\", { error: String(error) });\n return;\n }\n\n const collected: MCPTool[] = [];\n for (const server of servers.filter((s) => s.enabled)) {\n try {\n const { tools } = await discoverMcpTools(server.id);\n for (const t of tools) {\n const fnName = sanitizeMcpToolName(`mcp_${server.name}_${t.name}`);\n const schema =\n t.inputSchema && typeof t.inputSchema === \"object\" && (t.inputSchema as { type?: string }).type === \"object\"\n ? (t.inputSchema as MCPTool[\"function\"][\"parameters\"])\n : { type: \"object\" as const, properties: {}, required: [] };\n const id = `mcp-${server.id}-${t.name}`;\n const { choices } = get();\n collected.push({\n id,\n name: fnName,\n description: t.description || `${t.name} (via ${server.name})`,\n enabled: Object.prototype.hasOwnProperty.call(choices, id) ? choices[id]! : true,\n type: \"function\",\n function: {\n name: fnName,\n description: t.description || `${t.name} — provided by the ${server.name} MCP server.`,\n parameters: schema,\n },\n mcpServerId: server.id,\n mcpToolName: t.name,\n });\n }\n } catch (error) {\n debugLogger.warn(\"Failed to discover tools for MCP server\", { server: server.name, error: String(error) });\n }\n }\n\n set((state) => ({\n tools: [...state.tools.filter((t) => !t.mcpServerId), ...collected],\n }));\n debugLogger.info(\"MCP server tools loaded\", { count: collected.length });\n },\n };\n});\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { authenticationService } from \"../auth/authenticationService\";\n\n/**\n * Client for the gateway's MCP host (phase 1 backend at /api/mcp/servers + /invoke).\n * Lets users connect their own remote MCP servers; the gateway holds the configs\n * and proxies discovery/invocation. Mirrors mcpService's gateway-base + bearer\n * conventions (gatewayApiUrl already ends in /api, so paths start with /mcp/...).\n */\n\nexport interface McpServer {\n id: string;\n name: string;\n url: string;\n authType: string;\n hasAuth: boolean;\n headerName?: string | null;\n enabled: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface McpServerInput {\n name: string;\n url: string;\n authType?: \"none\" | \"bearer\" | \"header\";\n authValue?: string;\n headerName?: string;\n enabled?: boolean;\n}\n\nexport interface McpDiscoveredTool {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n}\n\nconst gatewayBase = (): string => {\n const settings = usePackageSettingsStore.getState().settings;\n const url = settings?.gatewayApiUrl?.replace(/\\/$/, \"\");\n if (!url) throw new Error(\"Gateway API is not configured.\");\n return url;\n};\n\nconst authHeaders = (): Record<string, string> => {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n const token = authenticationService.getToken();\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\n return headers;\n};\n\nconst parse = async (res: Response) => {\n const text = await res.text();\n const body = text ? JSON.parse(text) : null;\n if (!res.ok) {\n const message =\n (body && typeof body === \"object\" && (body.error || body.message)) ||\n `Request failed (${res.status})`;\n throw new Error(String(message));\n }\n return body;\n};\n\nexport const listMcpServers = async (): Promise<McpServer[]> =>\n parse(await fetch(`${gatewayBase()}/mcp/servers`, { headers: authHeaders() }));\n\nexport const addMcpServer = async (input: McpServerInput): Promise<McpServer> =>\n parse(\n await fetch(`${gatewayBase()}/mcp/servers`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify(input),\n }),\n );\n\nexport const updateMcpServer = async (\n id: string,\n input: Partial<McpServerInput>,\n): Promise<McpServer> =>\n parse(\n await fetch(`${gatewayBase()}/mcp/servers/${encodeURIComponent(id)}`, {\n method: \"PUT\",\n headers: authHeaders(),\n body: JSON.stringify(input),\n }),\n );\n\nexport const deleteMcpServer = async (id: string): Promise<void> => {\n const res = await fetch(`${gatewayBase()}/mcp/servers/${encodeURIComponent(id)}`, {\n method: \"DELETE\",\n headers: authHeaders(),\n });\n if (!res.ok && res.status !== 204) {\n throw new Error(`Could not remove the server (${res.status}).`);\n }\n};\n\nexport const discoverMcpTools = async (\n id: string,\n): Promise<{ serverId: string; server: string; tools: McpDiscoveredTool[] }> =>\n parse(await fetch(`${gatewayBase()}/mcp/servers/${encodeURIComponent(id)}/tools`, { headers: authHeaders() }));\n"],"mappings":"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","names":[]}
@@ -103,4 +103,4 @@ export {
103
103
  DebugLogger,
104
104
  debugLogger
105
105
  };
106
- //# sourceMappingURL=chunk-KCI46M23.mjs.map
106
+ //# sourceMappingURL=chunk-OCVZVBQQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/services/logging/debugLogger.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\n/**\n * 🔍 Bandit Debug Logger Service\n * \n * Centralized logging service that provides environment-aware debug logging.\n * \n * Features:\n * - Production builds: Only errors and info logs are shown\n * - Development mode: All logs are shown with clear debug prefixes\n * - Consistent formatting for debugging purposes\n * - Clear indication that logs are for debugging\n * \n * Usage:\n * ```typescript\n * import { debugLogger } from './services/logging/debugLogger';\n * \n * debugLogger.debug('LLM processing', { prompt, response });\n * debugLogger.info('User action completed', { action });\n * debugLogger.warn('Performance warning', { timing });\n * debugLogger.error('Operation failed', { error });\n * ```\n */\n\nexport type LogContext = unknown;\n\nclass DebugLogger {\n private isDevelopment: boolean;\n\n constructor() {\n // Check if we're in development mode using multiple detection methods\n this.isDevelopment = this.detectDevelopmentMode();\n }\n\n private detectDevelopmentMode(): boolean {\n // Check if we're in a development environment\n // This uses a safe approach that works in both ESM and CJS contexts\n try {\n // For browser environments using Vite - check the build-time flag\n const globalFlags = globalThis as typeof globalThis & {\n __VITE_IS_PRODUCTION__?: boolean;\n process?: { env?: { NODE_ENV?: string } };\n };\n\n if (typeof window !== 'undefined' && typeof globalFlags.__VITE_IS_PRODUCTION__ !== 'undefined') {\n return !globalFlags.__VITE_IS_PRODUCTION__;\n }\n \n // For Node.js environments - use try-catch to avoid type errors\n const proc = globalFlags.process;\n if (proc && proc.env) {\n return proc.env.NODE_ENV === 'development';\n }\n \n // For runtime detection, we can also check URL patterns in browser\n if (typeof window !== 'undefined' && window.location) {\n const devHosts = ['localhost', '127.0.0.1'];\n const devPorts = ['5173', '5183']; // common Vite dev ports\n return devHosts.includes(window.location.hostname) ||\n devPorts.includes(window.location.port);\n }\n } catch (e) {\n // If any detection fails, default to development for safety in debug scenarios\n }\n \n // Default to development for safety in debug scenarios\n return true;\n }\n\n /**\n * Set development mode manually (useful for testing or runtime configuration)\n */\n setDevelopmentMode(isDev: boolean): void {\n this.isDevelopment = isDev;\n }\n\n /**\n * Debug logs - only shown in development mode\n * These are obfuscated/hidden in production builds\n * DISABLED to prevent console flooding during chat processing\n */\n debug(message: string, context?: LogContext): void {\n // Debug logging disabled to prevent console flooding\n // Can be re-enabled for specific debugging sessions by uncommenting below:\n // if (this.isDevelopment) {\n // const prefix = '🔍 [DEBUG]';\n // if (context) {\n // console.log(`${prefix} ${message}`, context);\n // } else {\n // console.log(`${prefix} ${message}`);\n // }\n // }\n }\n\n /**\n * Info logs - shown in both development and production\n * Used for important user-facing information\n */\n info(message: string, context?: LogContext): void {\n const prefix = this.isDevelopment ? 'ℹ️ [INFO]' : '[INFO]';\n if (context) {\n console.info(`${prefix} ${message}`, context);\n } else {\n console.info(`${prefix} ${message}`);\n }\n }\n\n /**\n * Warning logs - shown in both development and production\n * Used for non-critical issues that should be noted\n */\n warn(message: string, context?: LogContext): void {\n const prefix = this.isDevelopment ? '⚠️ [WARN]' : '[WARN]';\n if (context) {\n console.warn(`${prefix} ${message}`, context);\n } else {\n console.warn(`${prefix} ${message}`);\n }\n }\n\n /**\n * Error logs - always shown in both development and production\n * Used for critical errors that need attention\n */\n error(message: string, context?: LogContext): void {\n const prefix = this.isDevelopment ? '❌ [ERROR]' : '[ERROR]';\n if (context) {\n console.error(`${prefix} ${message}`, context);\n } else {\n console.error(`${prefix} ${message}`);\n }\n }\n\n /**\n * LLM-specific debug logging for RAG and AI features\n * DISABLED to prevent console flooding during chat processing\n */\n llmDebug(operation: string, data: LogContext): void {\n // LLM debug logging disabled to prevent console flooding\n // Can be re-enabled for specific debugging sessions\n }\n\n /**\n * RAG-specific debug logging for knowledge and document processing\n * DISABLED to prevent console flooding during chat processing\n */\n ragDebug(operation: string, data: LogContext): void {\n // RAG debug logging disabled to prevent console flooding\n // Can be re-enabled for specific debugging sessions\n }\n\n /**\n * Memory-specific debug logging for AI memory features\n * DISABLED to prevent console flooding during chat processing\n */\n memoryDebug(operation: string, data: LogContext): void {\n // Memory debug logging disabled to prevent console flooding\n // Can be re-enabled for specific debugging sessions\n }\n\n /**\n * Table logging for development debugging\n * DISABLED to prevent console flooding during chat processing\n */\n table(data: unknown[], message?: string): void {\n // Table logging disabled to prevent console flooding\n // Can be re-enabled for specific debugging sessions\n }\n}\n\n// Export a singleton instance\nexport const debugLogger = new DebugLogger();\n\n// Export the class for testing purposes\nexport { DebugLogger };\n"],"mappings":";AA+BA,IAAM,cAAN,MAAkB;AAAA,EACR;AAAA,EAER,cAAc;AAEZ,SAAK,gBAAgB,KAAK,sBAAsB;AAAA,EAClD;AAAA,EAEQ,wBAAiC;AAGvC,QAAI;AAEF,YAAM,cAAc;AAKpB,UAAI,OAAO,WAAW,eAAe,OAAO,YAAY,2BAA2B,aAAa;AAC9F,eAAO,CAAC,YAAY;AAAA,MACtB;AAGA,YAAM,OAAO,YAAY;AACzB,UAAI,QAAQ,KAAK,KAAK;AACpB,eAAO,KAAK,IAAI,aAAa;AAAA,MAC/B;AAGA,UAAI,OAAO,WAAW,eAAe,OAAO,UAAU;AACpD,cAAM,WAAW,CAAC,aAAa,WAAW;AAC1C,cAAM,WAAW,CAAC,QAAQ,MAAM;AAChC,eAAO,SAAS,SAAS,OAAO,SAAS,QAAQ,KAC1C,SAAS,SAAS,OAAO,SAAS,IAAI;AAAA,MAC/C;AAAA,IACF,SAAS,GAAG;AAAA,IAEZ;AAGA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,OAAsB;AACvC,SAAK,gBAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAiB,SAA4B;AAAA,EAWnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,SAAiB,SAA4B;AAChD,UAAM,SAAS,KAAK,gBAAgB,wBAAc;AAClD,QAAI,SAAS;AACX,cAAQ,KAAK,GAAG,MAAM,IAAI,OAAO,IAAI,OAAO;AAAA,IAC9C,OAAO;AACL,cAAQ,KAAK,GAAG,MAAM,IAAI,OAAO,EAAE;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,SAAiB,SAA4B;AAChD,UAAM,SAAS,KAAK,gBAAgB,wBAAc;AAClD,QAAI,SAAS;AACX,cAAQ,KAAK,GAAG,MAAM,IAAI,OAAO,IAAI,OAAO;AAAA,IAC9C,OAAO;AACL,cAAQ,KAAK,GAAG,MAAM,IAAI,OAAO,EAAE;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAiB,SAA4B;AACjD,UAAM,SAAS,KAAK,gBAAgB,mBAAc;AAClD,QAAI,SAAS;AACX,cAAQ,MAAM,GAAG,MAAM,IAAI,OAAO,IAAI,OAAO;AAAA,IAC/C,OAAO;AACL,cAAQ,MAAM,GAAG,MAAM,IAAI,OAAO,EAAE;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,WAAmB,MAAwB;AAAA,EAGpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,WAAmB,MAAwB;AAAA,EAGpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,WAAmB,MAAwB;AAAA,EAGvD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAiB,SAAwB;AAAA,EAG/C;AACF;AAGO,IAAM,cAAc,IAAI,YAAY;","names":[]}
@@ -36,4 +36,4 @@ function defineCustomElement(name, Component) {
36
36
  export {
37
37
  defineCustomElement
38
38
  };
39
- //# sourceMappingURL=chunk-IXIM7BNO.mjs.map
39
+ //# sourceMappingURL=chunk-P4C5IRM5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/custom-element.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport React from \"react\";\nimport ReactDOM from \"react-dom/client\";\n\ntype AttributeMap = Record<string, string>;\n\nexport function defineCustomElement<Props extends Record<string, unknown>>(\n name: string,\n Component: React.ComponentType<Props>\n) {\n if (customElements.get(name)) return;\n\n class ReactElement extends HTMLElement {\n mountPoint: HTMLDivElement;\n root!: ReactDOM.Root;\n\n constructor() {\n super();\n this.mountPoint = document.createElement(\"div\");\n this.attachShadow({ mode: \"open\" }).appendChild(this.mountPoint);\n }\n\n connectedCallback() {\n this.render();\n }\n\n static get observedAttributes() {\n return [];\n }\n\n attributeChangedCallback() {\n this.render();\n }\n\n render() {\n const props = Object.fromEntries(\n Array.from(this.attributes).map((attr) => [attr.name, attr.value])\n ) as AttributeMap;\n\n if (!this.root) {\n this.root = ReactDOM.createRoot(this.mountPoint);\n }\n\n this.root.render(React.createElement(Component, props as Props));\n }\n }\n\n customElements.define(name, ReactElement);\n}\n"],"mappings":";AAOA,OAAO,WAAW;AAClB,OAAO,cAAc;AAId,SAAS,oBACd,MACA,WACA;AACA,MAAI,eAAe,IAAI,IAAI,EAAG;AAAA,EAE9B,MAAM,qBAAqB,YAAY;AAAA,IACrC;AAAA,IACA;AAAA,IAEA,cAAc;AACZ,YAAM;AACN,WAAK,aAAa,SAAS,cAAc,KAAK;AAC9C,WAAK,aAAa,EAAE,MAAM,OAAO,CAAC,EAAE,YAAY,KAAK,UAAU;AAAA,IACjE;AAAA,IAEA,oBAAoB;AAClB,WAAK,OAAO;AAAA,IACd;AAAA,IAEA,WAAW,qBAAqB;AAC9B,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,2BAA2B;AACzB,WAAK,OAAO;AAAA,IACd;AAAA,IAEA,SAAS;AACP,YAAM,QAAQ,OAAO;AAAA,QACnB,MAAM,KAAK,KAAK,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,KAAK,KAAK,CAAC;AAAA,MACnE;AAEA,UAAI,CAAC,KAAK,MAAM;AACd,aAAK,OAAO,SAAS,WAAW,KAAK,UAAU;AAAA,MACjD;AAEA,WAAK,KAAK,OAAO,MAAM,cAAc,WAAW,KAAc,CAAC;AAAA,IACjE;AAAA,EACF;AAEA,iBAAe,OAAO,MAAM,YAAY;AAC1C;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  debugLogger
3
- } from "./chunk-KCI46M23.mjs";
3
+ } from "./chunk-OCVZVBQQ.mjs";
4
4
 
5
5
  // src/store/modelStore.ts
6
6
  import { create as create3 } from "zustand";
@@ -357,7 +357,7 @@ var usePreferencesStore = create2((set, get) => ({
357
357
  }));
358
358
  get().savePreferences();
359
359
  if (key === "banditModelsEnabled" && prevValue !== value) {
360
- import("./modelStore-FGUGOWTL.mjs").then(({ useModelStore: useModelStore2 }) => {
360
+ import("./modelStore-7XYYDCNC.mjs").then(({ useModelStore: useModelStore2 }) => {
361
361
  useModelStore2.getState().handleBanditPersonalitiesPreferenceChange(value);
362
362
  });
363
363
  }
@@ -877,4 +877,4 @@ export {
877
877
  usePreferencesStore,
878
878
  useModelStore
879
879
  };
880
- //# sourceMappingURL=chunk-WQEBTH2R.mjs.map
880
+ //# sourceMappingURL=chunk-TY5VL3SG.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 * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\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 * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\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 * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\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 * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport { create } from 'zustand';\nimport type { ComponentType } from 'react';\nimport { AIProviderConfig } from '../services/ai-provider/types/common.types';\nimport { FeatureFlagConfig } from '../types/featureFlags';\nimport type { TelemetryOptIn } from '../services/telemetry/otlpExporter';\n\nexport interface ComponentOverrides {\n /** Optional host-provided replacement for the Under Review access gate view. */\n UnderReview?: ComponentType;\n}\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 /**\n * Suppress every \"upgrade\" / \"buy\" call-to-action the engine renders\n * (rate-limit prompt, locked-engine upsell). Set by the native app shell:\n * App Store guideline 3.1.3(f) allows a free companion app to a paid web\n * product only if it contains no purchase flows AND no calls to action\n * pointing at purchases outside the app.\n */\n hideUpgradePrompts?: boolean;\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 // Optional host-renderer overrides for package-owned UI surfaces.\n components?: ComponentOverrides;\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 * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\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 /**\n * The last save's outcome, so settings screens can say \"Saved\" or\n * \"Couldn't save\" instead of leaving people to guess. `idle` until the\n * first save this session.\n */\n saveState: 'idle' | 'saving' | 'saved' | 'error';\n lastSavedAt: number | null;\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 saveState: 'idle',\n lastSavedAt: null,\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<{ preferences?: unknown }>(\"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 set({ saveState: 'saving' });\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 set({ saveState: 'saved', lastSavedAt: Date.now() });\n } catch (error) {\n debugLogger.error(\"Failed to save preferences to IndexedDB\", { error });\n set({ saveState: '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"]}
@@ -3,10 +3,10 @@ import {
3
3
  } from "./chunk-ONQMRE2G.mjs";
4
4
  import {
5
5
  aiProviderInitService
6
- } from "./chunk-ZNK3ELTZ.mjs";
6
+ } from "./chunk-5KBTOCQZ.mjs";
7
7
  import {
8
8
  useMCPToolsStore
9
- } from "./chunk-G5POQT2R.mjs";
9
+ } from "./chunk-O6P37PFR.mjs";
10
10
  import {
11
11
  FeatureFlagProvider,
12
12
  NotificationProvider,
@@ -19,20 +19,20 @@ import {
19
19
  useKnowledgeStore2,
20
20
  useMemoryStore,
21
21
  useProjectStore
22
- } from "./chunk-ODGVCSKV.mjs";
22
+ } from "./chunk-J6SWNO7Z.mjs";
23
23
  import {
24
24
  indexedDBService_default,
25
25
  useModelStore,
26
26
  usePackageSettingsStore,
27
27
  usePreferencesStore
28
- } from "./chunk-WQEBTH2R.mjs";
28
+ } from "./chunk-TY5VL3SG.mjs";
29
29
  import {
30
30
  AUTH_TOKEN_CHANGED_EVENT,
31
31
  authenticationService
32
- } from "./chunk-Q6LXVYTC.mjs";
32
+ } from "./chunk-CQJGUYRW.mjs";
33
33
  import {
34
34
  debugLogger
35
- } from "./chunk-KCI46M23.mjs";
35
+ } from "./chunk-OCVZVBQQ.mjs";
36
36
 
37
37
  // src/chat-provider.tsx
38
38
  import { useEffect, useState } from "react";
@@ -191,4 +191,4 @@ export {
191
191
  ChatProvider,
192
192
  chat_provider_default
193
193
  };
194
- //# sourceMappingURL=chunk-YHSYHU5P.mjs.map
194
+ //# sourceMappingURL=chunk-URZSIL7X.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chat-provider.tsx","../src/chat-provider.css"],"sourcesContent":["/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport React, { useEffect, useState } from \"react\";\nimport { PackageSettings, usePackageSettingsStore } from \"./store/packageSettingsStore\";\nimport { AUTH_TOKEN_CHANGED_EVENT, authenticationService } from \"./services/auth/authenticationService\";\nimport { useConversationStore } from \"./store/conversationStore\";\nimport { useAIQueryStore } from \"./store/aiQueryStore\";\nimport { useMemoryStore } from \"./store/memoryStore\";\nimport { useModelStore } from \"./store/modelStore\";\nimport { usePreferencesStore } from \"./store/preferencesStore\";\nimport { useProjectStore } from \"./store/projectStore\";\nimport { useConversationSyncStore } from \"./store/conversationSyncStore\";\nimport { useKnowledgeStore } from \"./store/knowledgeStore\";\nimport { useMCPToolsStore } from \"./store/mcpToolsStore\";\nimport { useKnowledgeStore as useKnowledgeHook } from \"./chat/hooks/useKnowledgeStore\";\nimport { embeddingService } from \"./services/embedding/embeddingService\";\nimport { aiProviderInitService } from \"./services/ai-provider-init.service\";\nimport brandingService, { BrandingConfigPayload } from \"./services/branding/brandingService\";\nimport indexedDBService from \"./services/indexedDB/indexedDBService\";\nimport { debugLogger } from \"./services/logging/debugLogger\";\nimport { NotificationProvider } from \"./shared/components/NotificationProvider\";\nimport { FeatureFlagProvider } from \"./contexts/FeatureFlagContext\";\nimport { FeatureFlagConfig } from \"./types/featureFlags\";\nimport \"./chat-provider.css\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { StoredBanditConfigRecord } from \"./types/config\";\n\nexport interface ChatConfig {\n packageSettings: PackageSettings;\n /** Feature flag configuration - can override packageSettings.featureFlags */\n featureFlags?: FeatureFlagConfig;\n children?: React.ReactNode;\n}\n\nexport const ChatProvider: React.FC<ChatConfig> = (props) => {\n const { loadDocuments } = useKnowledgeHook();\n const [queryClient] = useState(() => new QueryClient());\n\n // Determine final feature flag configuration\n const featureFlagConfig: FeatureFlagConfig = {\n ...props.packageSettings.featureFlags,\n ...props.featureFlags\n };\n\n useEffect(() => {\n const initializeAsync = async () => {\n // Set package settings first\n usePackageSettingsStore.setState(() => ({\n settings: props.packageSettings,\n }));\n\n // Initialize the new AI provider system early\n try {\n await aiProviderInitService.initializeFromSettings();\n } catch (error) {\n debugLogger.error(\"Failed to initialize AI provider:\", { error });\n }\n\n const token = authenticationService.getToken();\n if (token && !authenticationService.isTokenExpired(token)) {\n authenticationService.setToken(token);\n } else {\n authenticationService.clearToken();\n }\n\n useConversationStore.getState().hydrate();\n useProjectStore.getState().hydrate();\n useAIQueryStore.getState().hydrate();\n useMemoryStore.getState().hydrate();\n \n const isPlaygroundRoute = typeof window !== \"undefined\" && window.location.pathname.includes(\"/playground\");\n const isPlaygroundMode = isPlaygroundRoute || props.packageSettings.playgroundMode === true;\n\n if (isPlaygroundMode) {\n debugLogger.info(\"ChatProvider: Playground mode detected — skipping remote preference and sync initialization\");\n } else {\n // Load preferences, knowledge docs, and MCP tools\n await usePreferencesStore.getState().loadPreferences();\n await useKnowledgeStore.getState().loadDocs();\n await useMCPToolsStore.getState().loadTools();\n // Discover the user's connected MCP servers' tools in the background\n // (best-effort) so the model can call them without delaying chat startup.\n void useMCPToolsStore.getState().loadMcpServerTools();\n await useConversationSyncStore.getState().initialize();\n }\n \n // Initialize models after AI provider is set up\n debugLogger.info(\"ChatProvider about to call initModels - checking for existing branding first\");\n \n // Get existing branding before initModels to protect user-saved branding\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n let existingBranding: StoredBanditConfigRecord[\"branding\"] | null = null;\n try {\n const config = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n if (config?.branding?.userSaved) {\n existingBranding = config.branding;\n debugLogger.info(\"Found user-saved branding to protect during initModels\", {\n hasText: !!existingBranding.brandingText,\n hasLogo: !!existingBranding.logoBase64,\n theme: existingBranding.theme\n });\n }\n } catch (err) {\n debugLogger.warn(\"Could not check existing branding before initModels\", { error: err });\n }\n \n await useModelStore.getState().initModels().catch((err) => {\n debugLogger.error(\"❌ Failed to initialize models:\", { error: err });\n });\n \n // Restore user branding if it was overwritten\n if (existingBranding) {\n try {\n const afterInitModels = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n if (JSON.stringify(afterInitModels?.branding) !== JSON.stringify(existingBranding)) {\n debugLogger.warn(\"ChatProvider: initModels overwrote user branding! Restoring...\");\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", {\n ...afterInitModels,\n id: \"main\",\n branding: existingBranding,\n }, storeConfigs);\n debugLogger.info(\"ChatProvider: User branding restored after initModels\");\n }\n } catch (err) {\n debugLogger.error(\"ChatProvider: Failed to restore branding after initModels\", { error: err });\n }\n }\n\n if (props.packageSettings.brandingConfigUrl) {\n fetch(props.packageSettings.brandingConfigUrl)\n .then((res) => {\n if (!res.ok) {\n throw new Error(`HTTP error ${res.status}`);\n }\n return res.json();\n })\n .then((json: unknown) => {\n if (json && typeof json === \"object\") {\n brandingService.setBrandingFromConfig(json as BrandingConfigPayload);\n }\n })\n .catch((err) => {\n debugLogger.error(\"❌ Failed to fetch or apply branding config:\", { error: err });\n });\n }\n\n if (!isPlaygroundMode) {\n loadDocuments();\n embeddingService.backfillMissingEmbeddings().catch((err: unknown) => {\n debugLogger.error(\"❌ Failed to backfill memory embeddings:\", { error: err });\n });\n } else {\n debugLogger.info(\"ChatProvider: Playground mode skipping knowledge backfill\");\n }\n };\n\n initializeAsync();\n }, [props.packageSettings, loadDocuments]);\n\n useEffect(() => {\n const isPlaygroundRoute = typeof window !== \"undefined\" && window.location.pathname.includes(\"/playground\");\n const isPlaygroundMode = isPlaygroundRoute || props.packageSettings.playgroundMode === true;\n\n if (isPlaygroundMode || !props.packageSettings.gatewayApiUrl) {\n return;\n }\n\n const initializeSyncState = async () => {\n try {\n await useConversationSyncStore.getState().initialize();\n } catch (error) {\n debugLogger.error(\"ChatProvider: deferred sync initialization failed\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n if (typeof window === \"undefined\") {\n return;\n }\n\n const handleAuthTokenChange = () => {\n void initializeSyncState();\n };\n\n window.addEventListener(AUTH_TOKEN_CHANGED_EVENT, handleAuthTokenChange);\n window.addEventListener(\"pageshow\", handleAuthTokenChange);\n window.addEventListener(\"focus\", handleAuthTokenChange);\n\n return () => {\n window.removeEventListener(AUTH_TOKEN_CHANGED_EVENT, handleAuthTokenChange);\n window.removeEventListener(\"pageshow\", handleAuthTokenChange);\n window.removeEventListener(\"focus\", handleAuthTokenChange);\n };\n }, [props.packageSettings.gatewayApiUrl, props.packageSettings.playgroundMode]);\n\n return (\n <QueryClientProvider client={queryClient}>\n <FeatureFlagProvider config={featureFlagConfig}>\n <NotificationProvider>\n {props.children}\n </NotificationProvider>\n </FeatureFlagProvider>\n </QueryClientProvider>\n );\n};\n\nexport default ChatProvider;\n","import styleInject from '#style-inject';styleInject(\"@layer base {\\n *,\\n *::before,\\n *::after {\\n box-sizing: border-box;\\n margin: 0;\\n padding: 0;\\n }\\n a {\\n color: inherit;\\n text-decoration: none;\\n }\\n}\\n:root {\\n --vh: 1vh;\\n --input-offset: 1.5rem;\\n}\\n.bandit-logo-container {\\n display: flex;\\n height: 50vh;\\n margin: auto;\\n}\\n.bandit-logo {\\n margin: auto;\\n display: flex;\\n flex: 1 1 auto;\\n flex-direction: column;\\n align-items: center;\\n width: 90vw;\\n max-width: 640px;\\n height: 55vh;\\n background-size: cover;\\n background-position: center center;\\n background-repeat: no-repeat;\\n transition: opacity 0.6s ease-in-out, transform 0.6s ease-in-out;\\n}\\n.bandit-logo-hidden {\\n opacity: 0;\\n transform: translateY(-10px);\\n pointer-events: none;\\n}\\n.bandit-logo-visible {\\n opacity: 1;\\n transform: translateY(0);\\n}\\n\")"],"mappings":"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","names":["useKnowledgeStore"]}
@@ -24,26 +24,26 @@ import {
24
24
  useNotificationService,
25
25
  useTTS,
26
26
  useVoiceStore
27
- } from "./chunk-R6HMLYKQ.mjs";
27
+ } from "./chunk-WLNZL6SP.mjs";
28
28
  import {
29
29
  brandingService_default,
30
30
  toTitleCase,
31
31
  useAIQueryStore,
32
32
  useConversationStore,
33
33
  useMemoryStore
34
- } from "./chunk-ODGVCSKV.mjs";
34
+ } from "./chunk-J6SWNO7Z.mjs";
35
35
  import {
36
36
  indexedDBService_default,
37
37
  useModelStore,
38
38
  usePackageSettingsStore,
39
39
  usePreferencesStore
40
- } from "./chunk-WQEBTH2R.mjs";
40
+ } from "./chunk-TY5VL3SG.mjs";
41
41
  import {
42
42
  useAIProviderStore
43
- } from "./chunk-Q6LXVYTC.mjs";
43
+ } from "./chunk-CQJGUYRW.mjs";
44
44
  import {
45
45
  debugLogger
46
- } from "./chunk-KCI46M23.mjs";
46
+ } from "./chunk-OCVZVBQQ.mjs";
47
47
 
48
48
  // src/modals/chat-modal/chat-modal.tsx
49
49
  import { useEffect as useEffect5, useLayoutEffect, useRef as useRef3, useState as useState7 } from "react";
@@ -2942,4 +2942,4 @@ export {
2942
2942
  MAX_WINDOWED_HEIGHT,
2943
2943
  chat_modal_default
2944
2944
  };
2945
- //# sourceMappingURL=chunk-OGMXL7BF.mjs.map
2945
+ //# sourceMappingURL=chunk-VBHI4TJC.mjs.map